কম্পিউটার টিউটোরিয়াল

প্রমাণিত টেকনিক দিয়ে Ruby এবং Rails বাগ দ্রুত সমাধান করুন

সফটওয়্যারের একটি বাগ হতে পারে ডিসরপ্টিভ, Illusive, মэдেনিং, এবং ইনভেসিভ। নিশ্চিতভাবেই, একটি ডেভেলপার প্রায়শই এডিসনের दृঢ়তা প্রয়োজন একটি ইস্যু খুঁজে বের করে ফিক্স করার জন্য।

তবে दृঢ়তা একমাত্র সম্পদ নয় যা একটি ডেভেলপার প্রয়োজন। কোড ডিবাগ করার জন্য ইনফরমেশনও দরকার: ইস্যুর লক্ষণ এবং ইফেক্ট কী? তার ফ্রিকোয়েন্সি? পেরভেসিভনেস? প্রভেন্যান্স? একটি বাগের ইভিডেন্স এবং আর্টিফ্যাক্ট — একটি কোর ডাম্প, স্ট্যাক ট্রেস, লগ, বা টেস্ট কেস — অমূল্য।

চলুন কিছু টেকনিক এবং টুল এক্সপ্লোর করি যেগুলো Ruby এবং Rails ডেভেলপারদের জন্য সহজে উপলব্ধ একটি ইস্যুর ইভিডেন্স জমা এবং তদন্ত করার জন্য। ডেটা दृঢ়তার স্থানে নিতে পারে না, কিন্তু এটি আপনার প্রচেষ্টা ইজ করতে পারে (এবং আপনার ঘুম বাঁচাতে পারে)।

Rails কিছু চমৎকার টুল প্রদান করে একটি রানিং অ্যাপ্লিকেশনের ভিতরে ঝাঁকতে, যার মধ্যে একটি কনফিগারেবল Logger যা নিজস্ব ডায়গনস্টিক্স ক্যাপচার করে এবং যেকোনো আপনি যোগ করতে চান। Rails একটি ভার্বোস কোয়েরি লগও প্রদান করে ডাটাবেস কোয়েরির উৎস পিনপয়েন্ট করতে এবং একটি ভার্বোস এনকিউ লগ যা ব্যাকগ্রাউন্ড জব কোথায় কিউড হচ্ছে সেটি আলোকিত করে। Последние দুটি লগ development এনভায়রনমেন্টে ডিফল্টলি এনাবলড থাকে; আপনি দুটি স্টেটমেন্ট দিয়ে অন্য এনভায়রনমেন্টে উভয়ই এনাবল করতে পারেন।


Rails 7-এ উপলব্ধ একটি কম পরিচিত লগ অপশন হলো প্রতিটি SQL কোয়েরিকে কমেন্টসহ অ্যানোটেট করা। আপনি যদি নিচের কোডটি config/application.rb বা যেকোনো এনভায়রনমেন্ট ফাইলে যোগ করেন:


আপনার কোয়েরি লগ আপনার অ্যাপ্লিকেশন নাম, কন্ট্রোলার নাম, অ্যাকশন নাম, বা ব্যাকগ্রাউন্ড জব নাম দিয়ে অটোমেটিক্যালি অ্যামেন্ডেড হবে। নিচের স্যাম্পল আউটপুট সরাসরি Rails-এর ডিবাগিং গাইড থেকে এসেছে:


আপনি সম্ভবত প্রোডাকশনে এই সব ফিচার এনাবল করতে চাবেন না। লগ জেনারেশন মেমরি এবং টাইমের দিক থেকে কষ্টসাধ্য হতে পারে (একটি লোডের অধীনে অ্যাপ্লিকেশনের জন্য সসীম রিসোর্স)।

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

উদাহরণস্বরূপ, আপনি লগিং এবং ভার্বোসিটি কন্ট্রোল করার জন্য একটি সেট ভেরিয়েবল ডিফাইন করতে পারেন।

সুবিধার জন্য, কনফিগারেশন সেটিংস কোয়েরি করার একটি ছোট ক্লাস তৈরি করুন।


এখন ভেরিয়েবলগুলো এবং কোডটি ব্যবহার করুন config/application.rb-এ লগিং ফিচার সেট করতে:


আপনার শেল, একটি dotenv ফাইল, আপনার কন্টিনিউয়াস ইন্টিগ্রেশন, বা হোস্টিং এবং ডিপ্লয়মেন্ট প্ল্যাটফর্ম ব্যবহার করুন প্রতিটি অপশন সেট করতে। আপনি একটি ফিচার অন-ডিমান্ডও ব্যবহার করতে পারেন। শুধু অ্যাপ্লিকেশনটি কমান্ড লাইনে এনভায়রনমেন্ট ভেরিয়েবল ডিফাইন করে শুরু করুন।



ডেভেলপমেন্টের জন্য Puma টিউন করুন

পূর্বের সেকশনের ওপর নির্মিত, চলুন দেখি কীভাবে এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে আপনার Puma কনফিগারেশন টেইলর করতে পারেন ডেভেলপমেন্ট এনভায়রনমেন্টে ডিবাগিং-এর জন্য।

সাধারণত, Puma কনফিগার করা থাকে প্রোডাকশনে থ্রুপুট Мак্সিমাইজ করার জন্য, একাধিক ওয়ার্কার এবং প্রতি ওয়ার্কার অনেক থ্রেড রান করে। ডেভেলপমেন্টে, আপনি বিপরীত চান: একটি ওয়ার্কার, একটি থ্রেড, এবং একটি খুব লম্বা টাইমআউট যাতে ইন্টারঅ্যাক্টিভ ডিবাগিং অনুমোদিত হয়। उनमें से প্রতিটি একটি প্যারামিটার যা আপনি টিউন করতে পারেন।

config/puma.rb নিচের কোড রিফ্লেক্ট করতে পরিবর্তন করুন।


এখন আপনি তিনটি এনভায়রনমেন্ট ভেরিয়েবল কনফিগার করতে পারেন প্রতিটি এনভায়রনমেন্টে Puma কন্ট্রোল করতে। ডেভেলপমেন্টে, মানগুলো সেট করুন ইন্টারঅ্যাক্টিভ ডিবাগিং-এর জন্য অপ্টিমাইজ করার জন্য।


আপনি যদি আপনার Puma সেটিংস ভ্যালিডেট করতে চান, এনভায়রনমেন্ট ভেরিয়েবল PUMA_LOG_CONFIG=true সেট করুন এবং আপনার অ্যাপ্লিকেশন শুরু করুন। Puma স্টার্টআপে তার এক্টিভ কনফিগারেশন এমিট করে।


সাংঘাতিকভাবে, সবচেয়ে সাম্প্রতিক Rails রিলিজে ডিফল্ট Puma কনফিগারেশন এখানে দেখানোর মতোই (Nate Matykiewicz-এর টিপের জন্য ধন্যবাদ)।

ব্যাকগ্রাউন্ড জব ইনলাইন রান করুন

যেকোনো কমপ্লেক্সিটির একটি Rails অ্যাপ্লিকেশন সাধারণত ব্যাকগ্রাউন্ড জব লিভারেজ করে কম্পিউট-ইনটেনসিভ এবং (আপেক্ষিকভাবে) লং-রানিং টাস্ক রান করার জন্য। ব্যাকগ্রাউন্ড জব অ্যাসিনক্রোনাসলি রান করে, রিকোয়েস্ট/রেসপONSE সাইকেল থেকে ডিসকানেক্টেড। "আউট অফ ব্যান্ড" প্রসেসিং-এর আইডিয়াল ক্যান্ডিডেট شامل রিপোর্ট জেনারেট করা, ইমেইল পাঠানো, এবং থার্ড-পার্টি API-এর সাথে ইন্টারঅ্যাক্ট করা। কিন্তু জবের অ্যাসিনক্রোনাস প্রকৃতিটাও ডিবাগিং জটিল করে।

ট্রাবলশুটিং সিম্পলিফাই করার জন্য, আপনার লোকাল ডেভেলপমেন্ট এবং টেস্ট এনভায়রনমেন্টে জব তৎক্ষণ রান করান। ইমিডিয়েট মোডে, জব কিউড হয় না, বরং instanteously এক্সিকিউট হয়। "ফোরগ্রাউন্ড"-এ রান করলে, আপনি ব্রেকপয়েন্ট সেট করতে পারেন এবং স্টেট ইন্টারঅ্যাক্টিভলি ইন্সপেক্ট করতে পারেন।

Delayed Job ব্যবহার করে একটি উদাহরণ দেখি, Active Job-এর জন্য একটি জনপ্রিয় এবং সহজে ম্যানেজযোগ্য কিউইং ব্যাকএন্ড। Delayed Job একটি সেটিং প্রদান করে কিউইং এনাবল করতে। ডিফল্টভাবে, সেটিং true এবং জব সাধারণ तौर पर কিউড হয়। তবে, যদি false-এ সেট করা হয়, জব তৎক্ষণ রান করে।

নিচের কোডটি আপনার অ্যাপ্লিকেশনে config/initializers/delayed_job.rb-এ যোগ করুন:


যদি DELAYED_JOBS_DISABLE_JOB_QUEUES যেকোনো মান দিয়ে সেট করা হয়, কিউইং ডিসেবল। যদি এনভায়রনমেন্ট ভেরিয়েবল ব্ল্যাঙ্ক বা ডিফাইন করা না থাকে, কিউইং এনাবল।

পরবর্তী, আপনার শেলে, কমান্ড লাইনে, বা আপনার ডট ফাইলগুলিতে, DELAYED_JOBS_DISABLE_JOB_QUEUES প্রয়োজন অনুযায়ী সেট করুন।




এনভায়রনমেন্ট ভেরিয়েবলকে কিছুই না দিয়ে সেট করুন বা ডিলিট করুন কিউইং রিস্টোর করতে।


এনভায়রনমেন্ট ভেরিয়েবল নামকরণের জন্য কোনো রুল নেই। আপনার জন্য অর্থবহ নাম বেছে নিন। ভেরিয়েবল ক্যাটাগরাইজ করার একটি সাহায্যকারী কনভেনশন হচ্ছে একটি প্যাকেজ নাম প্রিফিক্স হিসেবে যোগ করা, যেমন PUMA_ এবং DELAYED_JOB_। पुर्वরটি Puma-কে প্রভাবিত করে ভেরিয়েবল নির্দেশ করে; পরেরটি Delayed Job দ্বারা ব্যবহৃত ভেরিয়েবল নির্দেশ করে।

নেটওয়ার্ক কলের ভিতরে ঝাঁকুন

ব্যাকগ্রাউন্ড জবের মতো, Rails অ্যাপ্লিকেশনও অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস (API) কনসাম করতে পারে। API এক্সটার্নাল সার্ভিসে অ্যাক্সেস প্রদান করে, যেমন GraphQL ডাটাবেস, ই-কমার্স ট্রানজ্যাকশন, এবং পাবলিক ডেটা সোর্স।

এখানে আরেকটি উদাহরণ Net::HTTP লাইব্রেরি থেকে কন্ডিশনালি HTTP রিকোয়েস্ট এবং রেসপONSE ইমিট করার। যদি এনভায়রনমেন্ট ভেরিয়েবল DEBUG_HTTP যেকোনো নন-ব্ল্যাঙ্ক মান দিয়ে সেট করা থাকে, আউটগোইং রিকোয়েস্ট এবং ইনবাউন্ড রেসপONSE STDOUT-এ প্রিন্ট হবে।


নেটওয়ার্ক এক্টিভিটি देखने کے لیے, শুধু অ্যাপ্লিকেশনটি কমান্ড লাইনে এনভায়রনমেন্ট ভেরিয়েবল ডিফাইন করে শুরু করুন।


debug? মেথড একটু অ্যাবস্ট্রাকশন প্রদান করে একচুALSE ফ্ল্যাগ ইমপ্লিমেন্টেশন থেকে। এটি, এবং এই কোডের বাকি, আপনার সব নেটওয়ার্ক রিকোয়েস্টের জন্য একটি বেস ক্লাস তৈরি করতে পারে, যেমন এই gist প্রোডাকশন কোড থেকে নেওয়া।

Ruby জেমের বhireverse বireverse: সব চমৎকার জেম ডিবাগিং-এর জন্য কভার করা অসম্ভব। বদলে, চলুন কিছু টুল দেখি আপনি আজ যোগ করতে পারেন একটি ইনস্ট্যান্ট বুস্টের জন্য। আপনি সম্ভবত আপনার সব প্রজেক্টে এগুলো যোগ করবেন।

  • awesome_print এবং table_print Ruby ডেটা স্ট্রাকচারের সমৃদ্ধ, পঠনযোগ্য ইনস্পেকশন তৈরি করে, Active Record মডেলসহ। আপনি যেকোনো জেম কোডে বা কনসোল থেকে ব্যবহার করতে পারেন।

    এখানে কনসোলে awesome_print-এর দ্বারা ইমিট করা একটি মডেলের উদাহরণ:

    
    

    p-র বদলে ap ব্যবহার করুন এনহান্সড আউটপুট দেখাতে। awesome_print অ্যাট্রিবিউটগুলো আলফাবেটিক্যালি লিস্ট করে, প্রতি লাইনে এক অ্যাট্রিবিউট, অন্যান্য সুবিধার পাশাপাশি।

  • better_errors স্ট্যান্ডার্ড Rails এরর পেজকে একটি এনহান্সড স্ট্যাক ব্যাকট্রেস, প্যারামিটার লিস্ট, এবং একটি ইন্টারঅ্যাক্টিভ কনসোলে রিপ্লেস করে যেখানে আপনি স্ট্যাক ফ্রেম এবং এক্সেপশনের দৃশ্যে ভেরিয়েবল প্রোব করতে পারেন। আপনি সোর্স কোড লিংকও আপনার প্রিয় এডিটরের সাথে টাই আপ করতে পারেন। better_errors-কে Visual Studio Code-এর সাথে টাই আপ করার কোড এখানে:

    
    

    আপনার শেলে export BETTER_ERRORS_EDITOR=vscode রান করুন এবং Rails সার্ভার রিস্টার্ট করুন। এখন ফাইলগুলোর লিংক অটোমেটিক্যালি Visual Studio-এ খুলবে।

  • faker এবং factory_bot জেম (বা তাদের বিকল্প) উভয় টেস্টিং এবং ডেভেলপমেন্ট গ্রুপে Gemfile-এ রাখুন। কনসোলে দ্রুত ডেটা জেনারেট করতে দরকার হলে দুটোই अमূল্য।

    
    

একটি আরো আইডিয়া: আপনি যদি AppSignal আপনার অ্যাপ্লিকেশন মনিটরিং টুল হিসেবে ব্যবহার করেন, এতে ফিচার আছে আপনার লগ ইন্টারপ্রেট করতে এবং এরর সোর্স পিনপয়েন্ট করতে। আরও ডিটেইলস জন্য Debugging in Ruby with AppSignal দেখুন।

ডিবাগিং একটি স্কিল

কোড ডিবাগ করা কিছুটা একটি কালা, এবং যেকোনো ক্রিয়েটিভ এন্ডেভারের মতো, যত বেশি প্র্যাকটিস করবেন, তত ভালো হবেন।

অন্য একটি ডেভেলপারের সাথে পেয়ারিং করে ডিবাগ করুন, বিশেষ করে একজন অভিজ্ঞ ডেভেলপার। আপনার পার্টনার ইচ্ছুক হলে, জর দিয়ে একসাথে চিন্তা করুন এবং হাঞ্চ এবং ইনসাইট এক্সচেঞ্জ করুন।

আগে বাড়ুন এবং হ্যাক করুন!

P.S. আপনি যদি Ruby Magic পোস্টগুলো প্রেস থেকে বের होते হই পড়তে চান, আমাদের Ruby Magic নিউজলেটার সাবস্ক্রাইব করুন এবং কখনো একটি পোস্ট মিস করবেন না!

প্রমাণিত টেকনিক দিয়ে Ruby এবং Rails বাগ দ্রুত সমাধান করুন

Martin Streicher

আমাদের অতিথি লেখক Martin একজন প্রফেশনাল Ruby ডেভেলপার। তিনি Purdue University-এ Computer Science-এ এডভান্সড ডিগ্রি অর্জন করেছেন, Linux Magazine (US)-এর পাঁচ বছর Editor-in-Chief হিসেবে সার্ভ করেছেন, এবং IBM-এর সাবেক developerWorks পোর্টালে পাবলিশড "Speaking in Unix" কলামের ফাউন্ডিং অথর ছিলেন। কোডিং বা কোড নিয়ে লেখা না করার সময়, তিনি আর্ট সংগ্রহ করেন এবং অনেক ছোট কুকুর হ্যান্ডেল করেন।

Martin Streicher-এর সকল আর্টিকেল


  1. CSS এবং জাভাস্ক্রিপ্ট দিয়ে পপআপ চ্যাট উইন্ডো তৈরি

  2. CSS-এ list-style শর্টহ্যান্ড প্রপার্টি

  3. অ্যান্ড্রয়েডে onCreate() এবং onStart() এর পার্থক্য

  4. জাভাস্ক্রিপ্টে File এবং FileReader