রুবি স্ট্যান্ডার্ড লাইব্রেরি হল মডিউল এবং ক্লাসের একটি সিরিজ যা রুবির সাথে আসে কিন্তু ভাষার অংশ নয়।
এই ক্লাসগুলো নানা ইউটিলিটি অফার করে যেমন:
- Base64 এনকোডিং
- প্রাইম নম্বর জেনারেশন
- ডিএনএস রেজোলিউশন
এই আর্টিকেলে আমি ৫টি এই ক্লাসকে ব্যবহারিক উদাহরণের সাথে দেখাব।
রুবি Logger ক্লাস
যদি আপনাকে কিছু এরর বা ডিবাগ মেসেজ লগ করতে হয় তবে রুবির Logger ক্লাস আপনার পাশে আছে।
এই ক্লাস লগিং শুরু করার জন্য আপনার যা যা দরকার সব কিছু দিয়ে থাকে!
Logger ক্লাস ব্যবহার করতে আপনি সহজেই একটি Logger অবজেক্ট তৈরি করে সেটিতে একটি আউটপুট স্ট্রিম (বা ফাইলনেম) পাস করতে পারেন। তারপর আপনি বিভিন্ন লগিং লেভেল ব্যবহার করে আপনার মেসেজ রেজিস্টার করতে পারেন।
লগিং লেভেলগুলো হল:
- debug
- info
- warn
- error
- fatal
উদাহরণ:
require 'logger' logger = Logger.new(STDOUT) logger.info 'testing...' logger.warn 'fun with Ruby :)'
এটি নিচের আউটপুট দেবে:
I, [2016-05-14T15:50:21.367590 #12148] INFO -- : testing... W, [2016-05-14T15:50:21.846651 #12148] WARN -- : fun with Ruby 🙂
প্রথম ক্যারেক্টারটি লগিং লেভেলের সংক্ষিপ্ত রূপ (I for Info, W for Warn)… তারপর আছে টাইমস্ট্যাম্প, এবং বর্তমান প্রসেস আইডি (যা রুবিতে Process.pid দিয়ে পাওয়া যায়)।
শেষে আছে পুরো লগিং লেভেল এবং আসল মেসেজ।
আপনি একটি নতুন ফরম্যাটার প্রদান করে এই ফরম্যাট পরিবর্তন করতে পারেন।
প্রাইম নম্বর নিয়ে কাজ করা
হয়তো আপনাকে দিন দিন প্রাইম নম্বর নিয়ে কাজ করতে হয় না, তবে এটা জানা ভালো (বিশেষ করে প্রোগ্রামিং চ্যালেঞ্জ পছন্দ করলে) যে রুবিতে Prime ক্লাসের মাধ্যমে প্রাইম নম্বরের জন্য ভালো সাপোর্ট রয়েছে।
আপনি যখন Prime রিকোয়ার করবেন, এটি Fixnum-এ prime? মেথড যোগ করবে।
উদাহরণ:
require 'prime' 5.prime? # true 11.prime? # true 20.prime? # false
এই ক্লাসে একটি প্রাইম নম্বর জেনারেটরও রয়েছে।
উদাহরণ:
Prime.take(10) # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
StringIO ক্লাস কীভাবে ব্যবহার করবেন
StringIO ক্লাস আপনাকে একটি স্ট্রিং তৈরি করতে দেয় যা IO অবজেক্টের মতো বিয়হেভ করে।
অর্থাৎ আপনি এই স্ট্রিংসহ আপনি ফাইল বা STDIN (স্ট্যান্ডার্ড ইনপুট) থেকে পড়া হয়েছে যেন কাজ করতে পারেন।
এখানে একটি উদাহরণ:
require 'stringio' io = StringIO.new io << 'test' io << 'code' puts io.string # "testcode"
কয়েকটি বিষয় লক্ষ্য করুন:
আপনি যখন আপনার StringIO অবজেক্টে ডেটা যোগ করবেন, এটি স্পেস বা নিউলাইন যোগ করবে না, এবং আসল স্ট্রিং পেতে হলে string মেথড কল করতে হবে।
আপনি রেগুলার স্ট্রিংয়ের মতো অ্যারে ইনডেক্সিং ব্যবহার করে আলাদা ক্যারেক্টার এক্সেস করতে পারবেন না।
এটি কখন কাজে আসে?
কभी কখন আপনি একটি ফাইল বা অন্য IO অবজেক্টকে অন্য একটি অবজেক্ট দিয়ে রিপ্লেস করতে চাইতে পারেন যেটির ওপর আপনার বেশি কন্ট্রোল আছে। উদাহরণস্বরূপ, টেস্টিং এনভায়রনমেন্টে আপনি STDOUT-কে একটি StringIO অবজেক্ট দিয়ে রিপ্লেস করতে পারেন।
রেইলস থেকে একটি রিয়েল ওয়ার্ল্ড উদাহরণ দেখতে পারেন: https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/activesupport/test/logger_test.rb
Base64 এনকোডিং ও ডিকোডিং
Base64 হল একটি এনকোডিং ফরম্যাট যা ইন্টারনেটে খুব সাধারণ।
এটি এমন দেখায়:
"cnVieQ=="
এটি কেন উপকারী?
URL-এ অনুমোদিত ক্যারেক্টারের একটি সীমিত সেট থাকে, কখনো আপনি সেগুলো ইনক্লুড করতে চান এবং Base64 এটা সম্ভব করে দেয়।
এনকোড করার পদ্ধতি:
require 'base64' Base64.encode64("ruby") "cnVieQ=="
ডিকোড করার পদ্ধতি:
require 'base64' Base64.decode64("cnVieQ==") "ruby"
পাথ নিয়ে কাজ করা
Pathname ক্লাস অনেক ফাইলসিস্টেম এক্সপ্লোরিং ইউটিলিটি, যেমন Dir এবং File, একটি আরও পাওয়ারফুল ক্লাসে র্যাপ করে।
মেথড নামগুলো একই হলেও, এগুলো স্ট্রিং বা অ্যারে রিটার্ন না করে Pathname অবজেক্ট রিটার্ন করে। আর এর মানে হল আপনি রেজাল্টগুলো নিয়ে সব ফাইল-রিলেটেড মেথড ব্যবহার করে কাজ চালাতে পারবেন।
এটি একটি দারুণ উদাহরণ:
require 'pathname' Pathname.glob("*").count(&:directory?)
আপনি যদি Dir দিয়ে এটি করতে চান তবে নিচের কোড লিখতে হবে, যা ততো এলিগ্যান্ট নয়।
Dir.glob("*").count { |d| File.directory?(d) }
পরবর্তীবার ফাইলসিস্টেম রিলেটেড টাস্ক করতে হলে একবার ট্রাই করুন 🙂
উপসংহার
আশা করি এই উদাহরণগুলো আপনার কাজে লাগবে! স্ট্যান্ডার্ড লাইব্রেরি 좀 আরও এক্সপ্লোর করুন যাতে আপনি বুঝতে পারেন এটি আপনার জন্য কী কী করতে পারে।
এই পোস্টটি ভালো লাগলে শেয়ার करना ভুলবেন না 🙂