Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

सिद्ध तकनीकों के साथ Ruby और Rails बग्स को तेजी से हल करें

सॉफ्टवेयर में एक बग विघटनकारी, मायावी, निराशाजनक, और आक्रामक हो सकता है। वास्तव में, एक डेवलपर को अक्सर किसी मुद्दे को खोजने और ठीक करने के लिए एडिसन की दृढ़ता की आवश्यकता होती है।

लेकिन धैर्य एकमात्र संपत्ति नहीं है जिसकी एक डेवलपर को आवश्यकता होती है। कोड डीबग करने के लिए जानकारी की भी आवश्यकता होती है: मुद्दे के लक्षण और प्रभाव क्या हैं? इसकी आवृत्ति क्या है? व्यापकता? उत्पत्ति? एक बग के साक्ष्य और कलाकृतियाँ — एक कोर डंप, स्टैक ट्रेस, लॉग, या टेस्ट केस — अमूल्य हैं।

आइए 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 एप्लिकेशन आमतौर पर कंप्यूट-इंटेंसिव और (अपेक्षाकृत) लंबे समय तक चलने वाले कार्यों को चलाने के लिए बैकग्राउंड जॉब्स का लाभ उठाता है। बैकग्राउंड जॉब्स असिंक्रोनसली चलते हैं, अनुरोध/प्रतिक्रिया चक्र से डिस्कनेक्टेड। "आउट ऑफ बैंड" प्रोसेसिंग के लिए आदर्श उम्मीदवारों में रिपोर्ट जनरेट करना, ईमेल भेजना, और थर्ड-पार्टी APIs के साथ इंटरैक्ट करना शामिल है। लेकिन जॉब्स की असिंक्रोनस प्रकृति डीबगिंग को भी जटिल बनाती है।

समस्या निवारण को सरल बनाने के लिए, अपने स्थानीय डेवलपमेंट और टेस्ट वातावरण में जॉब्स को तुरंत चलाएं। इमीडिएट मोड में, जॉब्स क्यूड नहीं होते, बल्कि तुरंत निष्पादित होते हैं। "फोरग्राउंड" में चलते हुए, आप ब्रेकपॉइंट सेट कर सकते हैं और स्टेट को इंटरैक्टिवली इंस्पेक्ट कर सकते हैं।

आइए 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 एप्लिकेशन एप्लिकेशन प्रोग्रामिंग इंटरफेस (APIs) का भी उपभोग कर सकते हैं। APIs बाहरी सेवाओं तक पहुंच प्रदान करते हैं, जैसे GraphQL डेटाबेस, ई-कॉमर्स लेनदेन, और सार्वजनिक डेटा स्रोत।

यहां Net::HTTP लाइब्रेरी से HTTP अनुरोधों और प्रतिक्रियाओं को सशर्त रूप से उत्सर्जित करने का एक और उदाहरण है। यदि एनवायरनमेंट वेरिएबल DEBUG_HTTP किसी गैर-खाली मान पर सेट है, तो आउटगोइंग अनुरोध और इनबाउंड प्रतिक्रियाएं STDOUT पर प्रिंट की जाती हैं।



नेटवर्क गतिविधि देखने के लिए, बस कमांड लाइन पर एनवायरनमेंट वेरिएबल परिभाषित करके एप्लिकेशन शुरू करें।



debug? मेथड वास्तविक फ्लैग कार्यान्वयन से कुछ अमूर्तता प्रदान करता है। यह, और इस कोड का बाकी हिस्सा, आपके सभी नेटवर्क अनुरोधों के लिए एक बेस क्लास बना सकता है, जैसा कि इस गिस्ट में दिखाया गया है जो प्रोडक्शन कोड से लिया गया है।

Ruby जेम्स का ब्रह्मांड विशाल है: डीबगिंग के लिए उपलब्ध सभी महान जेम्स को कवर करना असंभव है। इसके बजाय, आइए कुछ ऐसे उपकरण देखें जिन्हें आप आज तत्काल बढ़ावा के लिए जोड़ सकते हैं। आप संभवतः इनमें से प्रत्येक को अपने सभी प्रोजेक्ट्स में जोड़ेंगे।

  • 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 का उपयोग करते हैं, तो इसमें आपके लॉग्स की व्याख्या करने और त्रुटियों के स्रोत को इंगित करने की विशेषताएं हैं। अधिक जानकारी के लिए AppSignal के साथ Ruby में डीबगिंग देखें।

डीबगिंग एक कौशल है

कोड डीबगिंग कुछ हद तक एक कला है, और किसी भी रचनात्मक प्रयास की तरह, जितना अधिक अभ्यास आपके पास होगा, उतना ही बेहतर आप बनेंगे।

किसी अन्य डेवलपर के साथ पेयरिंग करते हुए डीबग करें, विशेष रूप से एक अनुभवी डेवलपर। यदि आपका साथी इच्छुक है, तो एक साथ जोर से सोचें और अनुमानों और अंतर्दृष्टि का आदान-प्रदान करें।

आगे बढ़ें और हैक करें!

P.S. यदि आप Ruby Magic पोस्ट पढ़ना चाहते हैं जैसे ही वे प्रेस से निकलते हैं, तो हमारे Ruby Magic न्यूज़लेटर की सदस्यता लें और कभी भी एक भी पोस्ट मिस न करें!

सिद्ध तकनीकों के साथ Ruby और Rails बग्स को तेजी से हल करें

Martin Streicher

हमारे अतिथि लेखक Martin एक पेशेवर Ruby डेवलपर हैं। उन्होंने Purdue University से कंप्यूटर साइंस में एडवांस्ड डिग्री अर्जित की, पांच साल तक Linux Magazine (US) के एडिटर-इन-चीफ के रूप में कार्य किया, और IBM के पूर्व डेवलपरवर्क्स पोर्टल में प्रकाशित "Speaking in Unix" कॉलम के संस्थापक लेखक थे। जब कोडिंग या कोड के बारे में लिख नहीं रहे होते, तो वे कला एकत्र करते हैं और कई छोटे कुत्तों को संभालते हैं।

Martin Streicher के सभी आलेख

  1. अपने n8n वर्कफ़्लोज़ को सुरक्षित करें: Upstash Redis के साथ रेट लिमिटिंग जोड़ें अपने n8n वर्कफ़्लोज़ को सुरक्षित करें: Upstash Redis के साथ रेट लिमिटिंग जोड़ें

    n8n एक शक्तिशाली वर्कफ़्लो ऑटोमेशन टूल है जो आपको विभिन्न सेवाओं को जोड़ने और जटिल प्रक्रियाओं को स्वचालित करने देता है। लेकिन क्या होता है जब आपके वर्कफ़्लोज़ को बहुत सारे अनुरोध प्राप्त होने लगते हैं? उचित रेट लिमिटिंग के बिना, आप अपने APIs को अभिभूत कर सकते हैं, बाहरी सेवा सीमाओं को हिट कर सकते

  1. HTML DOM console.clear() मेथड HTML DOM console.clear() मेथड

    HTML DOM console.clear() मेथड का उपयोग कंसोल को क्लियर करने के लिए किया जाता है। console.clear() मेथड कंसोल में Console was cleared मैसेज भी लिखेगा और सभी पिछले कंसोल कंटेंट को क्लियर कर देगा। यह मेथड सभी ब्राउज़र्स द्वारा पूरी तरह से सपोर्टेड है।सिंटैक्स (Syntax)console.clear() मेथड का सिंटैक्स:con

  1. JavaScript से दूसरे वेबपेज पर रीडायरेक्ट कैसे करें? JavaScript से दूसरे वेबपेज पर रीडायरेक्ट कैसे करें?

    JavaScript का उपयोग करके दूसरे वेबपेज पर रीडायरेक्ट करने के लिए कोड निम्न है -उदाहरण<!DOCTYPE html> <html> <head> <h1>Redirect to a Webpage Example</h1> <button class="redirectBtn">Redirect</button> <h2>Click the above button to Redirect to a