সফটওয়্যার ডেভেলাপার কোথায় পাব

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

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

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

IMG_3770
তো খাওয়া-দাওয়ার মাঝে কায়কোবাদ স্যার বিভিন্ন গল্প করছিলেন। হঠাৎ আমাকে জিজ্ঞাসা করলেন, “সুবিন, ইন্ডিয়ার সাথে খেলা দেখছ নাকি?”, আমি জবাব দিলাম, “কোন খেলা স্যার?” উনি আর কথা বাড়ালেন না। আসলে খাওয়া-দাওয়ার সময় আমি সেই ম্যাচের কথা আমি মনে করতে চাচ্ছিলাম না। যাই হোক, ভরপেট খাওয়া হলো।

খাওয়ার পরে আমরা বসলাম আড্ডা দিতে। মূল বিষয়, বাংলাদেশের সফটওয়্যার ইন্ডাস্ট্রির অবস্থা (মানে দূরবস্থা আর কী)। বিভিন্ন কোম্পানীর শীর্ষ পদের লোকজন – সবারই এক কথা, ভালো প্রোগ্রামার তো পাই না। তো সবার কথাই শুনছিলাম। দেশে এত এত সিএস গ্রাজুয়েট, কিন্তু ভালো প্রোগ্রামার নাই। মনে পড়ে গেল, মুনির হাসান স্যারের ডায়লগ। একদিন জিজ্ঞাসা করেছিলেন, “সুবিন, বল তো ‘Water water everywhere, but nor any drop to drink’ এটা কে বলে?” জবাব দিলাম, এটা তো Ancient Mariner-এ কবি Coleridge লিখেছেন। মুনির স্যার জিজ্ঞাসা করলেন, কিন্তু এটা কে বলে? আমি বললাম, কে বলে? উনি জবাব দিলেন, থাক আমি আর জবাবটা এখানে লিখলাম না। তো যাই হোক, আরো বেশ কিছু আলোচনা হলো। এমন সময় শাহাদাত স্যার আমাকে ধরলেন। সুবিন, তুমি তো কিছু বলছ না। তোমার কাছ থেকে এবার শুনতে চাই। আমি জিজ্ঞাসা করলাম, “স্যার, চা-কফি’র ব্যবস্থা নাই?” ততক্ষণে দই ও রসমালাই খাওয়া শেষ। পেঁপেঁও ছিল কিন্তু সেটা আর আমার খাওয়া হয়ে ওঠে নাই।

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

ডেনিস রিচি – সি ও ইউনিক্সের জনক

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

ডেনিস রিচি ১৯৪১ সালের ৯ সেপ্টেম্বর নিউইয়র্কের ব্রনস্সভিল শহরে জন্মগ্রহণ করেন। তাঁর পুরো নাম ডেনিস  ম্যাকএলিস্টেয়ার রিচি। তাঁর নামের তিনটি অংশের আদ্যক্ষর নিয়ে তিনি ডিএমআর (DMR) নামের পরিচিত ছিলেন। তাঁর বাবা এলিস্টেয়ার ই. রিচি  ছিলেন বেল ল্যাবের একজন বিজ্ঞানী এবং সুইচিং সার্কিট তত্ত্বের বই “The Design of Switching Circuits”-এর সহ লেখক।

রিচির জন্ম নিউইয়র্কে হলেও তাঁর শৈশবেই তাঁর বাবা-মা নিউ জার্সিতে চলে যান। সেখানকার সামিট হাই স্কুল-এ (Summit High School)  তিনি পড়াশোনা করেন। সেখানকার পড়াশোনার পাঠ শেষ হবার পর তিনি স্নাতক ভর্তি হন জিনিয়াসদের সূতিকাগার হার্ভার্ড বিশ্ববিদ্যালয়ে। সেখানকার পদার্থবিজ্ঞান এবং ফলিত গণিত বিভাগ থেকে স্নাতক শেষ করার পর ১৯৬৭ সালে তিনি যোগদান করেন বেল রিসার্চ ল্যাব-এ। ১৯৬৮ সালে হার্ভার্ড বিশ্ববিদ্যালয় থেকে তিনি “Program Structure and Computational Complexity”  টপিকে প্যাট্রিক সি ফিশারের তত্ত্বাবধানে পিএইচডি ডিগ্রী লাভ করেন। যদিও তিনি অফিসিয়ালি তাঁর পিএইচডি ডিগ্রী কখনো গ্রহণ করেননি।

সি প্রোগ্রামিং ভাষার উদ্ভাবক এবং ইউনিক্স অপারেটিং সিস্টেমের শুরুর দিকের অবদানকারীদের মধ্যে ডেনিস রিচির নাম উল্লেখযোগ্য। তবে রিচি সবচেয়ে বেশি পরিচিত সি প্রোগ্রামিং ভাষার উপর রচিত বই “The C programming Language” বইয়ের সহ লেখক হিসেবে। এই বইয়ের লেখকদ্বয় কার্নিংহাম ও রিচি তাঁদের দুজনের নামের আদ্যক্ষর K&R দিয়েই সুপরিচিত।

সি প্রোগ্রামিং বইয়ের প্রথম সংস্করণের প্রচ্ছদ (ছবি : উইকি কমন্স)
সি প্রোগ্রামিং বইয়ের প্রথম সংস্করণের প্রচ্ছদ (ছবি : উইকি কমন্স)

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

Ken n dennis.jpg
কেন থমসনের সাথে ডেনিস রিচি (ডানে) (ছবি : উইকি কমন্স)

১৯৮৩ সালে রিচি এবং থম্পসন যৌথভাবে  টুরিং পুরস্কার লাভ করেন। তাঁদেরকে জেনেরিক অপারেটিং সিস্টেমের তত্ত্ব বিশেষ করে ইউনিক্সে তা প্রয়োগ করার কারণে” এই পুরস্কারের জন্য মনোনীত করা হয়। পুরস্কার প্রাপ্তিতে রিচি “রিফ্লেকশন অন সফটওয়্যার রিসার্চ (Reflections on Software Research)” নামে বক্তৃতা দেন।

সি প্রোগ্রামিং ভাষার উদ্ভাবন ও ইউনিক্সের উন্নয়নে অবদানের জন্য রিচি ১৯৮৮ সালে আমেরিকার ন্যাশনাল একাডেমি অব ইঞ্জিনিয়ারিং-এ নির্বাচিত হন। একই ক্ষেত্রে অবদানের জন্য রিচি এবং থম্পসন ১৯৯০ সালে ইনস্টিটিউট অফ ইলেকট্রিক্যাল অ্যান্ড ইলেকট্রনিক্স ইঞ্জিনিয়ার্স (IEEE) প্রবর্তিত আইইই রিসার্চ ডব্লিউ হামিং পদক লাভ করেন।

সি প্রোগ্রামিং ভাষা এবং উইনিক্স অপারেটিং উদ্ভাবনের মাধ্যমে কম্পিউটার হার্ডওয়্যার, সফটওয়্যার, নেটওয়ার্কিং, এবং সিমুলেশন ইত্যাদি ক্ষেত্রসমূহে বিশেষ অগ্রগতি লাভ করা সম্ভব হয় এবং এর মাধ্যমে তথ্যপ্রযুক্তির ক্ষেত্রে মার্কিন যুক্তরাষ্ট্র নেতৃত্ব দিতে থাকে। এই অবদানের জন্য খম্পসন ও রিচি ১৯৯৮ সালে আমেরিকার জাতীয় প্রযুক্তি পদকের (National Medal of Technology) জন্য নির্বাচিত হোন। ১৯৯৯ সালের ২১ এপ্রিল আমেরিকার তৎকালীন প্রেসিডেন্ট বিল ক্লিনটন তাঁদের হাতে এ পদক তুলে দেন।

২০০৫ সালে Industrial Research Institute ডেনিস রিচিকে তথ্য প্রযুক্তিতে অবদানের জন্য IRI Achievement Award এ ভূষিত করে।

ইউনিক্স অপারেটিং সিস্টেম উন্নয়নে অগ্রণী ভূমিকা পালনের জন্য ২০১১ সালে রিচি ও থম্পসন তথ্য ও যোগাযোগ প্রযুক্তিতে জাপান পুরস্কার লাভ করেন।

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

লেখক: তামান্না নিশাত রিনি

লুমিয়া ৪৩০ : সবচেয়ে কম মূল্যের উইন্ডোজ স্মার্টফোন

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

প্রায় কয়েক মাস আগে ঘোষণা করা লুমিয়া ৪৩৫ এবং লুমিয়া ৫৩২ এর পর এবার মাইক্রোসফট ঘোষণা করল লুমিয়া ৪৩০। মাইক্রোসফটের দেয়া বিবৃতি মতে, এটি হবে মাইক্রোসফট লুমিয়া সিরিজের সবচেয়ে কম দামি ফোন। দামের দিক দিয়ে এই ফোনের দাম কম হলেও, সুবিধাসমূহ এর দিক থেকে ফোনটি কোনভাবেই পিছিয়ে নেই। যেখানে আগে নকিয়া দাম কম রাখার জন্যে নানা প্রয়োজনীয় ফিচারস বাদ দিয়ে দিত, মাইক্রোসফট এর কোন ভুলই করেনি। তাদের এই নতুন ফোনে প্রায় সকল উল্লেখযোগ্য ফিচারই বিদ্যমান।

লুমিয়ার এই নতুন ফোনটিতে ব্যবহার করা হয়েছে স্ন্যাপড্রাগন ২০০ সিরিজের কর্টেক্স এ৭ ভিত্তিক প্রসেসর এবং সাথে আছে ১ গিগাবাইট র‍্যাম। ফলে উইন্ডোজ স্টোরের প্রায় সকল অ্যাপই এতে চালানো যাবে। এছাড়া অ্যাপ ইন্সটলের জন্যে আরও আছে ৮ গিগাবাইট স্টোরেজ। আর যদি এই স্টোরেজও কম মনে হয় তবে মাইক্রোএসডি কার্ডের মাধ্যমে এর স্টোরেজ ১২৮ গিগাবাইট পর্যন্ত বৃদ্ধি করা যাবে।

লুমিয়া ৪৩০, ছবি: verge.com
লুমিয়া ৪৩০, ছবি: verge.com

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

ব্যাটারির ব্যাকআপের জন্যে এতে আছে ১৫০০ মিলি অ্যাম্পিয়ারের ব্যাটারি। এখানে উল্লেখ্য যে, এই ফোন উইন্ডোজ ৮.১ এর ডেনিম আপডেটে চলে আর মাইক্রোসফট জানিয়েছে উইন্ডোজ ১০ বের হলে এই ফোন তার আপডেট পাবে।ফোনটিতে আরও আছে স্মার্টডুয়াল সিম সাপোর্ট সুতরাং এর ক্রেতা অনায়াসে এতে দুটি সিম ব্যবহার করতে পারবে।

মাইক্রোসফট মুলত ফোনটি উন্নয়নশীল দেশগুলোর জন্যে বের করেছে। ফোনটি আগামী এপ্রিলে এশিয়া, মিডল ইস্ট, আফ্রিকাতে উন্মুক্ত করা হবে। ট্যাক্স এবং অন্যান্য খরচের হিসেব বাদ দিলে এই ফোনের দাম হবে ৭০ ডলার অথবা ৫৪৬৫ টাকা।

লেখক : এহসানুল হক।

ফেসবুক দিয়ে অর্থ আদান-প্রদান

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

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

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

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

অর্থ পাঠানোর ক্ষেত্রে যা করতে হবে-

১। যাকে পাঠাতে চান তার সাথে মেসেঞ্জারে কনভারসেশনটি চালু করুন
২। ‘$’ ডলার এর এই আইকনটিতে ট্যাপ করুন এবং কত অর্থ পাঠাতে চান তা লিখুন
৩। পে নামক অপশনটিতে ট্যাপ করুন এবং ডেবিট কার্ডের তথ্য দিন

অর্থ গ্রহন করতে যা করতে হবে-

১। কনভারসেশনটি খুলুন
২। ডেবিট কার্ডের তথ্য দিয়ে অর্থ গ্রহন করুন

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

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

তবে বর্তমানে ফেসবুক তাদের ব্যবহারকারিদের এ মাধ্যমে ব্যবহারের সময় বৃদ্ধির দিকেই বেশি মনোযোগ দিচ্ছে। ইতোমধ্যে ফেসবুকে গড়ে ২১ মিনিট করে দিনে সময় কাটায় একজন ইউএস ব্যবহারকারী। যা কিনা একজন ইন্টারনেট ব্যবহারকারীর মোট ব্যবহারের ৬%। হিসেবের দিক থেকে ফেসবুক বর্তমানে গুগলের পিছনে দ্বিতীয় অবস্থানে আছে এ দিক দিয়ে। এখন দেখা যাক ফেসবুকের এই নতুন সুবিধা ব্যবহারকারীর সময় ব্যয়ে কী পরিমাণে পরিবর্তন আনতে পারে।

লেখকঃ এহসানুল হক।

সফলতার রহস্য – আর্নল্ড শোয়ার্জেনেগার

লেখাটি আর্নল্ড শোয়ার্জেনেগার-এর একটি বক্তৃতা থেকে অনুবাদ করা। অনুবাদ করেছেন ইমরান হোসেন। আশা করি প্রোগ্রামাররা এটি পড়ে অনুপ্রাণিত হবে।

লোকজন সব সময় আমাকে জিজ্ঞাসা করে সফলতার রহস্য কী?

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

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

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

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

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

ষষ্ঠ নিয়ম হচ্ছে, “কিছু ফিরিয়ে দেয়া”। তুমি যা কিছুই অর্জন করো না কেন, তোমাকে কিছু ফিরিয়ে দিতে হবে, তোমার কমিউনিটি জন্য, তোমার এলাকার জন্য, তোমার দেশের জন্য। তুমি যা কিছু করো না কেন, মানুষকে সাহায্য করে যে পরিমাণ আনন্দ পাবে, অন্য কোন কিছুতে এত আনন্দ পাবে না।

এই ছয় নিয়ম মনে রেখো।

ইউটিউব-এ ৩৬০ ডিগ্রী ভিডিও

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

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

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

অ্যান্ড্রয়েড অ্যাপের ক্ষেত্রে ফোনটি কিভাবে করে ধরা রয়েছে সে বিবেচনায় ভিডিও কোন দিকে যাবে তা নির্ধারণ করবে অপরদিকে ব্রাউজারের ক্ষেত্রে কার্সর দিয়ে দিয়ে নাড়িয়ে দিক পরিবর্তন করা যাবে।

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

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

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

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

লেখকঃ এহসানুল হক।

বিগ ইন্টিজার ২

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

যোগ / বিয়োগ / গুণ / ভাগ করা
দুটি বিগ-ইন্টিজার যোগ করার জন্য আমাদেরকে add() মেথডটি ব্যবহার করতে হবে। ধরা যাক, আমরা a এবং b দুটি সংখ্যা যোগ করে ans নামের একটি ভেরিয়েবলে রাখতে চাই। তাহলে আমাদের লিখতে হবে –
BigInteger ans = a.add(b);

একই ভাবে বিয়োগ করার জন্য subtract(), গুণ করার জন্য multiply(), এবং ভাগ করার জন্য আমাদেরকে divide() মেথড ব্যবহার করতে হবে।

ভাগশেষ বের করা
একটি সংখ্যা কে অপর একটি সংখ্যা দিয়ে ভাগ করার পর অবশিষ্ট ভাগশেষ বা mod ভ্যালু বের করতে চাইলে আমাদেরকে mod() মেথড টি ব্যবহার করতে হবে। যেমন, আমরা যদি একটি সংখ্যা a কে অপর একটি সংখ্যা m দিয়ে mod করতে চাই তাহলে আমাদের লিখতে হবে-
BigInteger ans = a.mod(m);

এছাড়াও remainder() মেথড দিয়েও একই কাজ করা যায়।

তুলনা করা
অন্য সব ডাটা টাইপের মত বিগ ইন্টিজারে আমরা দুটি সংখ্যা তুলনা করার জন্য ==, > বা < ব্যবহার করতে পারি না। দুটি বিগ-ইন্টিজার সমান কিনা তা দেখার জন্য আমাদের equals() মেথড টি ব্যবহার করতে হয়। সংখ্যা দুটি সমান হলে মেথডটি true রিটার্ন করে, তা নাহলে false রিটার্ন করে। দুটি বিগ-ইন্টিজার কম্পেয়ার করার জন্য জাভার BigInteger ক্লাসে compareTo() মেথড আছে। এই মেথডটি একটি ইন্টিজার সংখ্যা রিটার্ন করে। আমরা যখন দুটি সংখ্যা কম্পেয়ার করবো তখন প্রথম সংখ্যাটি যদি দ্বিতীয় সংখ্যার চেয়ে ছোটো হয় তাহলে মেথডটি -1 রিটার্ন করবে, সংখ্যা দুটি যদি সমান হয় তাহলে 0 রিটার্ন করবে এবং প্রথম সংখ্যাটি যদি বড় হয় তাহলে 1 রিটার্ন করবে। নিচের কোডটি রান করে দেখলে বিষয়টি আরো ভালভাবে বুঝা যাবে –

import java.util.*;
import java.math.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner (System.in); 
        BigInteger a, b;
        a = sc.nextBigInteger();
        b = sc.nextBigInteger();
        int cmp = a.compareTo(b);
        if(cmp == -1) 
            System.out.println("a is less than b");
        else if(cmp == 0) 
            System.out.println("a is equal to b");
        else if(cmp == 1) 
            System.out.println("a is greater than b");
    }
}

পাওয়ার বের করা
আমরা চাইলে বিগ-ইন্টিজারের পাওয়ারও বের করতে পারি। এজন্য আমাদেরকে pow() মেথডটি ব্যবহার করতে হবে। তবে এই মেথডটি প্যারামিটার হিসেবে একটি ইন্টিজার গ্রহন করে, তাই পাওয়ার এর মানটি অবশ্যই int ডাটা টাইপের রেঞ্জের মধ্যে হতে হবে। কোনো একটি সংখ্যা n এর পাওয়ার p বের করতে চাইলে আমাদের লিখতে হবে –
BigInteger ans = n.pow(p);

বিগ-মড ভ্যালু বের করা
বিগ-মড বা (n^p)%m এক্সপ্রেশনের মান বের করার জন্য বিগ-ইন্টিজারের modpow() মেথড আছে। মেথডটি প্যারামিটার হিসেবে দুটি BigInteger নিয়ে থাকে। এখন আমরা যদি কোন একটি সংখ্যা n-এর পাওয়ার p-কে অপর একটি সংখ্যা m দিয়ে mod করতে চাই, তাহলে আমাদের লিখতে হবে –

BigInteger ans = n.modPow(p,m);

মডুলার-ইনভার্স ভ্যালু বের করা
মডুলার-ইনভার্স বের করার জন্য বিগ-ইন্টিজারে modInverse() মেথড আছে। তবে এজন্য আমরা যে সংখ্যার মডুলার-ইনভার্স বের করতে চাই এবং যে সংখ্যাটি দিয়ে mod করতে চাই, তাদেরকে অবশ্যই রিলেটিভলি-প্রাইম হতে হবে। এখন আমরা যদি কোনো একটি সংখ্যা n-এর মডুলার-ইনভার্স বের করতে চাই এবং যে সংখ্যাটি দিয়ে mod করবো তা যদি m হয়, তাহলে আমাদের লিখতে হবে –
BigInteger ans = n.modInverse(m);

GCD বের করা
দুটি সংখ্যার Greatest Common Divisor (GCD) অর্থাৎ গসাগু বের করার জন্য বিগ-ইন্টিজারে gcd() মেথডটি আছে। দুটি সংখ্যা a এবং b-এর GCD বের করতে চাইলে আমাদের লিখতে হবে –
BigInteger ans = a.gcd(b);

ম্যাক্সিমাম/ মিনিমাম বের করা
জাভার বিগ-ইন্টিজারে দুটি সংখ্যার মধ্যে বৃহত্তর সংখ্যা বের করার জন্য max() এবং ক্ষুদ্রতর সংখ্যা বের করার জন্য min() মেথড রয়েছে। দুটি সংখ্যার মধ্যে ম্যাক্সিমাম বা মিনিমাম বের করার জন্য আমাদের লিখতে হবে –
BigInteger largest = a.max(b);
BigInteger smallest = a.min(b);

Absolute মান বের করা
কোনো সংখ্যার পরম মান বা Absolute value বের করার জন্য বিগ-ইন্টিজারে abs() মেথড আছে। কোনো একটি সংখ্যা n এর Absolute মান বের করতে চাইলে লিখতে হবে –
BigInteger ans = n.abs();

বিগ ইন্টিজার ৩

সম্ভাব্য-মৌলিক সংখ্যা
আমাদের অনেক সময় প্রাইম নাম্বার বের করার প্রয়োজন হতে পারে। বিশেষ করে ক্রিপ্টোগ্রাফীর জন্য প্রাইম নাম্বার জেনারেট করা অনেক জরুরি। একটি বিগ-ইন্টিজার সম্ভাব্য প্রাইম নাম্বার কি না তাও আমরা বের করতে পারি। এজন্য BigInteger ক্লাসে isProbablePrime() মেথড আছে। মেথডটিতে probabilistic primality টেস্টের জন্য Miller–Rabin অ্যালগরিদম ব্যবহার করা হয়েছে। মেথডটি প্যারামিটারে certainty হিসেবে একটি ইন্টিজার ভ্যালু নিয়ে থাকে এবং একটি বুলিয়ান ডাটা রিটার্ন করে। certainty দিয়ে অসম্ভাব্যতার হার বের করা হয়। তারপর তা থেকে সম্ভাব্যতার হার বের করা হয়। সম্ভাব্যতার হার বের করা হয় (1 – 0.5certainty) এভাবে। কোনো একটি সংখ্যা প্রাইম নাম্বার হবার সম্ভাব্যতা যদি এই মানকে অতিক্রম করে তাহলে মেথড টি true রিটার্ন করে, অন্যথায় false রিটার্ন করে। অর্থাৎ certainty এর মান যত বড় হবে, সম্ভাব্যতার হার তত বাড়বে। আবার অন্য দিকে সম্ভাব্যতার হার যত বাড়বে, প্রোগ্রামের এক্সিকিউশন টাইম ততো বেশি লাগবে। তাই এটা ব্যবহারকারীর উপর নির্ভর করে যে সে কতটুকু সময়ের মধ্যে কত সম্ভাব্যতার প্রাইম নাম্বার চায়।
কোন একটি সংখ্যা n, certainty c-এর সাপেক্ষে প্রাইম কি না, বের করতে হলে আমাদের লিখতে হবে –
boolean flag = n.isProbablePrime(c);

আবার কোনো একটি সংখ্যার পরবর্তি কোন সংখ্যাটি একটি সম্ভাব্য প্রাইম, তা বের করার জন্য বিগ ইন্টিজারে আছে nextProbablePrime() মেথড। মেথডটি একটি সম্ভাব্য প্রাইম নাম্বার রিটার্ন করে এবং রিটার্ন করা নাম্বারটি একটি কম্পোজিট নাম্বার হবার সম্ভাব্যতা থাকে 2-100 এর কম। কোনো একটি সংখ্যা n-এর পরবর্তি সম্ভাব্য প্রাইম সংখ্যাটি বের করতে হলে আমাদের লিখতে হবে-
BigInteger ans = n .nextProbablePrime();

আমাদের অনেক সময় র‍্যান্ডম প্রাইম নাম্বারের দরকার হতে পারে। বিগ ইন্টিজারে র‍্যান্ডম ভাবেও সম্ভাব্য প্রাইম নাম্বার জেনারেট করা যায়। এজন্য বিগ ইন্টিজারে probablePrime() মেথড আছে। মেথডটি প্যারামিটারে bitLength হিসেবে একটি ইন্টিজার এবং rnd হিসেবে একটি র‍্যান্ডম ডাটা নিয়ে থাকে। মেথডটির রিটার্ন করা নাম্বারটি এই bitLength-সংখ্যক বিটের হবে। মেথডটি কল করার সময় এর মান সব সময় 2 বা তার বেশি হতে হবে। আর rnd হচ্ছে একটি র‍্যান্ডম বিট সোর্স, একটি সম্ভাব্য প্রাইম নাম্বার রিটার্ন করার জন্য যার primality টেস্ট করা হয়। মেথডটি একটি সম্ভাব্য প্রাইম নাম্বার রিটার্ন করে এবং রিটার্ন করা নাম্বারটি একটি কম্পোজিট নাম্বার হবার সম্ভাব্যতা থাকে 2^-100 এর কম। এখন আমাদের যদি n সংখ্যক বিটের একটি র‍্যান্ডম সম্ভাব্য প্রাইম নাম্বার বের করতে হয়, তাহলে আমাদের লিখতে হবে –
Random rnd = new Random();
BigInteger ans =  BigInteger.probablePrime(n, rnd);

বিগ ইন্টিজার ৪

Bitwise অপারেশন
বিগ ইন্টিজারেও আমরা বিট-ওয়াইজ অপারেশন করতে পারি। এজন্য BigInteger ক্লাসে কিছু বিল্ট-ইন মেথড রয়েছে।

AND (a&b): বিগ ইন্টিজারের বিট-ওয়াইজ AND ভ্যালু বের করার জন্য রয়েছে and() মেথড। দুটি বিগ ইন্টিজার a এবং b-এর AND ভ্যালু বের করতে চাইলে লিখতে হবে –
BigInteger ans = a.and(b);

OR (a|b): বিগ ইন্টিজারের বিট-ওয়াইজ OR ভ্যালু বের করার জন্য রয়েছে or() মেথড। দুটি বিগ ইন্টিজার a এবং b-এর OR ভ্যালু বের করতে চাইলে আমাদের লিখতে হবে –
BigInteger ans = a.or(b);

XOR (a^b): বিগ ইন্টিজারে xor() মেথড টি দিয়ে বিট-ওয়াইজ XOR বা Exclusive OR ভ্যালু বের করা হয়। দুটি বিগ ইন্টিজার a এবং b এর XOR ভ্যালু বের করতে চাইলে আমাদের লিখতে হবে-
BigInteger ans = a.xor(b);

NOT (~a): বিগ ইন্টিজারের বিট-ওয়াইজ NOT ভ্যালু বের করার জন্য রয়েছে not() মেথড। কোন একটি বিগ ইন্টিজার a এর NOT ভ্যালু বের করতে চাইলে আমাদের লিখতে হবে-
BigInteger ans = a.not();

Shift-Left (a<<n): আমরা চাইলে বিগ ইন্টিজারের বিটগুলোকে শিফটও করতে পারি। বিটগুলোকে বাম দিকে শিফট করার জন্য আমাদেরকে shiftLeft() মেথডটি ব্যবহার করতে হবে। মেথডটি প্যারামিটারে একটি ইন্টিজার সংখ্যা নিয়ে থাকে। একটি নাম্বারের বিটগুলোকে আমরা বাম দিকে কত বিট শিফট করবো এটি হচ্ছে তার মান। কোনো একটি সংখ্যা a-কে আমরা যদি n বিট বামে শিফট করতে চাই, তাহলে লিখতে হবে –
BigInteger ans = a. shiftLeft(n);

Shift-Right (a>>n): বিগ ইন্টিজারের বিট গুলো কে ডান দিকে শিফট করার জন্য আমাদেরকে shiftRight() মেথডটি ব্যবহার করতে হবে। এটি shiftLeft() মেথডটির মতই। কোনো একটি সংখ্যা a-কে আমরা যদি n বিট ডানে শিফট করতে চাই, তাহলে লিখতে হবে –
BigInteger ans = a.shiftRight(n);

Test-Bit (a&(1<<n)): একটি বিগ ইন্টিজারের n-তম বিটটি 0 নাকি 1, তা বের করার জন্য BigInteger ক্লাসে আছে testBit() মেথড। মেথডটি প্যারামিটারে n-এর মান নেয় এবং n-তম বিট 1 হলে true রিটার্ন করে, আর 0 হলে false রিটার্ন করে। এখন আমরা যদি কোনো একটি সংখ্যা a-এর n-তম বিট পরীক্ষা করতে চাই, তাহলে লিখতে হবে-
boolean flag = a.testBit(n);

Clear-Bit (a & ~(1<<n)): একটি বিগ ইন্টিজারের কোনো একটি বিটকে 0 করতে হলে আমাদের clearBit() মেথডটি ব্যবহার করতে হবে। কোনো একটি সংখ্যা a-এর n-তম বিটকে 0 করতে চাইলে আমাদের লিখতে হবে-
BigInteger ans = a.clearBit(n);

Set-Bit (a|(1<<n)): একটি বিগ ইন্টিজারের কোনো একটি বিটকে 1 করতে হলে আমাদের setBit() মেথডটি ব্যবহার করতে হবে। কোনো একটি সংখ্যা a-এর n-তম বিটকে 1 করতে চাইলে আমাদের লিখতে হবে –
BigInteger ans = a.setBit(n);

Flip-Bit (a ^ (1<<n)): একটি বিগ ইন্টিজারের কোনো একটি বিটকে ফ্লিপ করতে হলে অর্থাৎ 0 থাকলে 1 করতে অথবা 1 থাকলে 0 করতে চাইলে আমাদের flipBit() মেথডটি ব্যবহার করতে হবে। কোনো একটি সংখ্যা a-এর n-তম বিটকে ফ্লিপ করতে চাইলে আমাদের লিখতে হবে-
BigInteger ans = a.flipBit(n);

AND-NOT (a & ~b): দুটি বিগ ইন্টিজারের বিট-ওয়াইজ AND-NOT ভ্যালু বের করতে চাইলে andNot() মেথডটি ব্যবহার করতে হবে। দুটি বিগ ইন্টিজার a এবং b এর AND-NOT ভ্যালু বের করতে চাইলে আমাদের লিখতে হবে-
BigInteger ans = a.andNot(b);

Lowest Set Bit (log2(a & -a)): কোনো সংখ্যার সবচেয়ে ছোট কোন বিটে 1 আছে, তা বের করার জন্য বিগ ইন্টিজারে getLowestSetBit() মেথড আছে। কোনো একটি বিগ ইন্টিজার a-এর সবচেয়ে ছোট কোন বিটটি 1 তা বের করতে চাইলে আমাদের লিখতে হবে –
int ans = a.getLowestSetBit();

আরো কিছু প্রয়োজনীয় মেথড
toString(): বিগ ইন্টিজার কে স্ট্রিং এ কনভার্ট করতে ব্যবহার করা হয়।
toByteArray(): বিগ ইন্টিজার কে বাইট-অ্যারে তে কনভার্ট করতে ব্যবহার করা হয়।
negate(): বিগ ইন্টিজারের সাইন পরিবর্তন করতে ব্যবহার করা হয়।
bitCount(): কোন সংখ্যার 2’s complement এ সাইন বিটের বিপরীত কয়টি বিট আছে তা বের করার জন্য ব্যবহার করা হয়।
bitLength(): একটি সংখ্যা কে বাইনারি বেইজে রিপ্রেজেন্ট করতে (সাইন বিট ছাড়া) কয়টি বিটের প্রয়োজন তা জানার জন্য ব্যবহার করা হয়।
signum(): কোন সংখ্যা ধনাত্মক, ঋণাত্মক অথবা শূন্য কি না তা জানার জন্য ব্যবহার করা হয়। ধনাত্মক হলে 1, ঋণাত্মক হলে -1 এবং শূন্য হলে মেথড টি 0 রিটার্ন করে।
intValue(): BigInteger থেকে int ডাটায় কনভার্ট করতে ব্যবহার করা হয়। তবে এ ক্ষেত্রে ডাটা ওভারফ্লো হলে মেথড টি কোন এক্সেপশন থ্রো করে না। এক্ষেত্রে intValueExact() ব্যবহার করলে এই মেথড টি এক্সেপশন থ্রো করে।
longValue(): BigInteger থেকে long ডাটায় কনভার্ট করতে ব্যবহার করা হয়। এই মেথড টি ও ডাটা ওভারফ্লো হলে এক্সেপশন থ্রো করে না। এক্ষেত্রে longValueExact() ব্যবহার করলে এই মেথড টি এক্সেপশন থ্রো করে।
floatValue(): BigInteger থেকে float ডাটায় কনভার্ট করতে ব্যবহার করা হয়।
doubleValue(): BigInteger থেকে double ডাটায় কনভার্ট করতে ব্যবহার করা হয়।
hashCode(): হ্যাশ-কোড বের করার জন্য ব্যবহার করা হয়।
divideAndRemainder(): মেথড টি দুটি সংখ্যার ভাগফল এবং ভাগশেষ এক সাথে একটি BigInteger অ্যারে আকারে রিটার্ন করে। রিটার্ন করা অ্যারে টির [0] ইন্ডেক্সে থাকে ভাগফলের মান এবং [1] ইন্ডেক্সে থাকে ভাগশেষ এর মান।

import java.util.*;
import java.math.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner (System.in); 
        BigInteger a=sc.nextBigInteger();
        BigInteger b=sc.nextBigInteger();
        BigInteger arr[] = a.divideAndRemainder(b); 
        System.out.println("Quotient = "+arr[0]);
        System.out.println("Remainder = "+arr[1]); 
    }
}

এই ছিলো আমাদের BigInteger নিয়ে আলোচনা। Java-তে BigDecimal নামে আরো একটি ক্লাস আছে যা দিয়ে Decimal সংখ্যার হিসাব নিকাশ করা যায়। এটির ব্যবহার BigInteger-এর মতোই।

বিগ ইন্টিজার ১

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

প্রথম পর্ব

আমরা বিভিন্ন প্রোগ্রামিং ভাষায় হিসাব-নিকাশ করার জন্য সাধারণত int (32-bit) বা long (64-bit) টাইপের ডাটা ব্যবহার করে থাকি। এদের মধ্যে int ডাটা দিয়ে খুব বড় সংখ্যাগুলোর হিসাব-নিকাশ করা না গেলেও long ডাটা দিয়ে মোটামুটি 10^18 এর কাছাকাছি সংখ্যাগুলো এক্সেস করা যায়। সমস্যা হয় তখন যখন আমাদেরকে এর চেয়েও অনেক অনেক বড় সংখ্যা নিয়ে কাজ করার দরকার হয়। তখন আমরা কোনো সাধারণ ডাটা টাইপ দিয়ে সরাসরি এদের হিসাব-নিকাশ করতে পারি না, কারণ এতে করে আমাদের ভেরিয়েবলগুলোতে ডাটার ওভারফ্লো হয়।

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

প্যাকেজ ইম্পোর্ট করাঃ
BigInteger ক্লাসটি জাভার math প্যাকেজের অন্তর্ভুক্ত। তাই BigInteger ব্যবহার করার জন্য আমাদেরকে প্রথমেই math প্যাকেজটি ইম্পোর্ট করে নিতে হবে।
import java.math.BigInteger;

ভেরিয়েবল ডিক্লেয়ার করাঃ
বিগ ইন্টিজার ভেরিয়েবল ডিক্লেয়ার করা অন্য সব ডাটা টাইপের মতোই। এখানে মূলত BigInteger ক্লাসের অবজেক্ট তৈরি করা হয়। যেমন, আমরা যদি a, b এবং c নামের তিনটি ভেরিয়েবল ডিক্লেয়ার করতে চাই তাহলে আমাদের এভাবে লিখতে হবে –
BigInteger a, b, c;

ইনপুট ও আউটপুটঃ
BigInteger এর ইনপুট ও আউটপুটও অন্য সব ডাটা টাইপের মতো। যেমন, আমরা যদি একটি ভেরিয়েবলের মান ইনপুট নিয়ে তা আউটপুটে দেখাতে চাই তাহলে আমাদের প্রোগ্রাম টি এভাবে লিখতে হবে –

import java.util.*;
import java.math.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner (System.in);
        BigInteger n;
        n = sc.nextBigInteger();
        System.out.println(n);
    }
}

ভ্যালু অ্যাসাইন করাঃ
আমাদেরকে অনেক সময় এক ভেরিয়েবলের মান অন্য ভেরিয়েবলে অথবা সরাসরি কোন মান একটি ভেরিয়েবলে অ্যাসাইন করার প্রয়োজন হতে পারে। এক ভেরিয়েবল থেকে অন্য ভেরিয়েবলে ভ্যালু অ্যাসাইন করতে আমরা সরাসরি ‘=’ ব্যবহার করতে পারি। যেমন, একটি ভেরিয়েবল b-এর মান অপর একটি ভেরিয়েবল a-তে অ্যাসাইন করতে চাইলে হলে লিখতে হবে –
BigInteger a = b;

কিন্তু সরাসরি যদি কোনো মান একটি ভেরিয়েবলে অ্যাসাইন করতে চাই, তাহলে BigInteger এর কন্সট্রাক্টর ব্যবহার করে ভেরিয়েবলে (যেটি আসলে একটি BigInteger অবজেক্ট) তার মান অ্যাসাইন করতে হবে। BigInteger-এর কন্সট্রাক্টরটি প্যারামিটার হিসেবে একটি নাম্বারের স্ট্রিং নিয়ে থাকে। যেমন –
BigInteger n = new BigInteger(“1234567890123456789”);

আবার আমরা BigInteger.valueOf(int_value) ব্যবহার করে যেকোনো ইন্টিজারকে সরাসরি BigInteger হিসেবে ব্যবহার করতে পারি।

BigInteger অ্যারেঃ
BigInteger এর আবার অ্যারে! অবাক হবার কিছু নেই। বিগ-ইন্টিজারের অ্যারেও আমরা ব্যবহার করতে পারি। এটিও অন্য সব ডাটা টাইপের অ্যারের মতোই।
BigInteger[] array_name = new BigInteger[array_size];

এখন আমরা চাইলে এই অ্যারেটি সর্টও করে ফেলতে পারি। সম্পুর্ন অ্যারে সর্ট করতে চাইলে লিখতে হবে Arrays.sort(array_name);, আর কোনো একটা নির্দিষ্ট রেঞ্জের ভ্যালু গুলো সর্ট করতে চাইলে লিখতে হবে Arrays.sort(array_name, fromIndex, toIndex+1);। সর্ট করার ক্ষেত্রে খেয়াল রাখতে হবে যাতে অ্যারেটির কোনো ইন্ডেক্সে নাল ভ্যালু না থাকে, নইলে আমাদের প্রোগ্রামটি এক্সেপশন থ্রো করবে।

দ্বিতীয় পর্ব

তৃতীয় পর্ব

চতুর্থ পর্ব