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

Ruby on Rails के लिए LiteStack: वन-स्टॉप डेटा प्रबंधन समाधान

पोस्ट की इस श्रृंखला में, हम LiteStack को देखेंगे, एक वन-स्टॉप-शॉप समाधान जो आपके सभी प्रोडक्शन डेटा को एक ही मशीन पर होस्ट और प्रोसेस करता है। LiteStack (जैसा कि नाम से पता चलता है) SQLite का उपयोग करके प्रदान करता है:

  • LiteDB एडाप्टर का उपयोग करके एक डेटाबेस
  • एक ActiveJob बैकएंड (LiteJob)
  • एक ActionCable बैकएंड (LiteCable)
  • एक ActiveSupport::Cache स्टोर (LiteCache)

इस पहले पोस्ट में, हम LiteStack की मूल बातें पेश करेंगे और एक उदाहरण रेल्स एप्लिकेशन सेट अप करेंगे।

शुरू करते हैं!

SQLite का परिचय

SQLITE स्वयं दशकों से कई उद्योगों के लिए गो-टू एम्बेडेड डेटाबेस रहा है। उदाहरण के लिए, यह नेटिव ऐप डेवलपमेंट, टेस्टिंग एनवायरनमेंट, कैशिंग, और अन्य में व्यापक रूप से उपयोग किया जाता है।

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

संयोग से, इसने आपके रेल्स ऐप के लिए SQLite को प्रोडक्शन डेटाबेस के रूप में उपयोग करना एक व्यवहार्य विकल्प बना दिया है। LiteStack जैसे पूर्ण विकसित डेवलपमेंट स्टैक के साथ संयुक्त, यह एक ही मशीन पर होस्ट किए गए ऐप्स को वास्तविकता बनाने का वादा करता है। हम इस परिकल्पना का परीक्षण करने और रास्ते में किसी भी बाधा को इंगित करने के लिए यहां हैं।

ऐसा करने के लिए, हमें एक उदाहरण ऐप की आवश्यकता है जो संभावित कठिनाइयों को सामने लाने के लिए पर्याप्त जटिल हो, लेकिन इस श्रृंखला में फिट होने के लिए पर्याप्त सरल हो।

हमारा उदाहरण रेल्स एप्लिकेशन

हम एक ऐसा ऐप लिखेंगे जो replicate.com पर StableDiffusion का उपयोग करके बच्चों के चित्रों को बदलता है।

एक उदाहरण के रूप में, यहाँ मेरी बेटी द्वारा बनाया गया एक प्यारा टेडी बियर है, कुछ StableDiffusion व्याख्याओं के साथ:

Ruby on Rails के लिए LiteStack: वन-स्टॉप डेटा प्रबंधन समाधान

एक मोटे स्केच के रूप में, हमारा ऐप निम्नलिखित चरणों को कवर करेगा:

  1. उपयोगकर्ता एक छवि को टेक्स्ट प्रॉम्प्ट के साथ अपलोड करता है (हम यहां कुछ उन्नत SQLite तकनीक दिखाएंगे)।
  2. उपयोगकर्ता एक छवि शैली चुनता है (उदाहरण के लिए, "कार्टून", "तेल चित्रकला", "फोटोरियलिस्टिक", "3D रेंडरिंग")।
  3. प्रसंस्करण पृष्ठभूमि में होता है (यह LiteJob-संचालित नौकरी को शुरू करता है)।
  4. जबकि प्रसंस्करण चल रहा है, हम एक प्लेसहोल्डर छवि दिखाते हैं और सर्वर द्वारा भेजे गए लॉग को अपडेट करते हैं। एक बार पूरा होने पर, हम इसे वास्तविक छवि दिखाने के लिए अपडेट करते हैं। यह हमें LiteCable का पता लगाने की अनुमति देता है क्योंकि हम टर्बो स्ट्रीम के माध्यम से छवि को प्रतिस्थापित करते हैं।
  5. हम छवि भविष्यवाणी को संग्रहीत करते हैं।
  6. हम कम्प्यूटेशनली महंगे व्यू को लपेटने के लिए LiteCache का उपयोग करते हैं।

ये चरण इस श्रृंखला के लिए एक मचान प्रदान करते हैं। इस पोस्ट का शेष भाग, हालांकि, ऐप को सेट अप करने से संबंधित होगा।

हम esbuild को अपने जावास्क्रिप्ट बंडलर और SASS को CSS प्रीप्रोसेसर के रूप में उपयोग करके skAItch नामक एक नया रेल्स ऐप बनाकर शुरू करते हैं:


LiteStack इंस्टॉल करें

इसके बाद, हम शिप किए गए जेनरेटर का उपयोग करके LiteStack इंस्टॉल करते हैं:


उसके पूरा होने के बाद, हम सेटअप पूरा करते हैं और विकास सर्वर शुरू करते हैं:


प्रमाणीकरण और टेनेंट्स

इसके बाद, हमें अपने उपयोगकर्ताओं को प्रमाणित करने का एक तरीका चाहिए ताकि प्रॉम्प्ट को उनसे जोड़ा जा सके। Devise जैसे एक मौजूदा का उपयोग करने के बजाय, मैंने एक अलग दृष्टिकोण चुना। authentication-zero जेम एक प्रमाणीकरण प्रणाली को लचीले ढंग से जेनरेट कर सकता है, बजाय इसे एक इंजन के रूप में शामिल करने के। सुविधाजनक रूप से, यह विकल्पों के साथ आता है जैसे:

  • टोकन द्वारा प्रमाणीकरण (API के लिए)
  • टू-फैक्टर ऑथ
  • मल्टीटेनेंसी
  • रेट लिमिटिंग
  • एक OmniAuth इंटरफ़ेस
  • पासवर्डलेस ऑथ

मैंने --tenantable विकल्प जोड़ना चुना क्योंकि अपने डेटाबेस रिकॉर्ड को खातों में स्वचालित रूप से स्कोप करना हमेशा एक अच्छा विचार है। Authentication-zero इसे AccountScoped मॉडल चिंता के साथ प्रदान करता है।


आइए डेटाबेस सीड्स के माध्यम से पहले उपयोगकर्ता को जोड़ें:


Prompt Scaffold

अब हमारे ऐप के केंद्रीय मॉडल को परिभाषित करके वास्तविक एप्लिकेशन तर्क लिखना शुरू करने का समय है: Prompt।

हम चाहते हैं कि हमारे प्रॉम्प्ट में एक शीर्षक, एक विवरण, और इसे बनाने वाले खाते का एक संदर्भ हो। इसके अलावा, SQLite की "फाइल सिस्टम" क्षमताओं का परीक्षण करने के लिए, हम चाहेंगे कि यह प्रॉम्प्ट छवि को बाइनरी रूप में संग्रहीत करे:


एक prompts संसाधन प्रविष्टि को config/routes.rb में भी जोड़ा जाता है। ध्यान दें कि authentication-zero डिफ़ॉल्ट रूप से ApplicationController में before_action जोड़कर उपयोगकर्ता को प्रमाणित करता है।


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


मल्टीटेनेंसी को सक्षम करने के लिए अंतिम चरण के रूप में, हमें प्रॉम्प्ट को बनाए जाने पर एक खाते से जोड़ना होगा। हम इसे PromptsController में करते हैं:


हमारे रेल्स एप्लिकेशन को Replicate.com से जोड़ना

Replicate.com उच्च-प्रदर्शन ग्राफिक्स कार्ड पर AI भविष्यवाणियों को चलाने के लिए एक अग्रणी मंच है। इसमें भविष्यवाणियां बनाने, मॉडल प्रशिक्षित करने और संग्रहीत करने आदि के लिए एक API है। इसका उपयोग करने के लिए, आपको https://replicate.com/account/api-tokens से एक API टोकन प्राप्त करना होगा।

नोट: Replicate पर भविष्यवाणियां चलाने पर शुल्क लगता है।

सौभाग्य से हमारे लिए, आधिकारिक और अनौपचारिक क्लाइंट हैं जो API के साथ इंटरफेस करते हैं। ऐसा ही एक रैपर replicate-rails जेम है, जिसे हम अब इंस्टॉल करेंगे:



अपने API कुंजी को सुरक्षित रूप से संग्रहीत करने के लिए, हम रेल्स क्रेडेंशियल्स का उपयोग करने जा रहे हैं:



इस फ़ाइल को संपादित करना और सहेजना आपके क्रेडेंशियल्स को एन्क्रिप्ट करेगा, और इसे केवल सही RAILS_MASTER_KEY प्रदान करके खोला जा सकता है।

अब, हमें इसे उपयोग में लाना होगा। replicate-rails के README में सुझाव के अनुसार, हम एक इनिशियलाइज़र में Replicate के खिलाफ प्रमाणित करते हैं। हम एक वेबहुक हैंडलर भी परिभाषित करते हैं जो (हमारे मामले में) सिर्फ एक क्लास है जिसे उसी फ़ाइल में डाल दिया गया है। ध्यान दें कि मैंने यहां अपनी कार्यक्षमता के पहले परीक्षण के लिए एक binding.irb ब्रेकपॉइंट जोड़ा है।


Replicate-rails एक डिफ़ॉल्ट वेबहुक कंट्रोलर भी शिप करता है, जो उपरोक्त हैंडलर को कॉल करता है। हमें बस इसे अपने config/routes.rb में माउंट करना है:


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

हालांकि, आपको रेल्स को बताना होगा कि यह आपके टनल के URL को सुन सकता है। इसे सक्षम करने के लिए, इसे config/application.rb में allowed_hosts में जोड़ें:


भविष्यवाणी चलाना

अब हम भविष्यवाणी बनाने का परीक्षण करेंगे। एकमात्र लापता बिट इसे हमारे PromptsController में हुक करना है। सामान्य कार्यप्रवाह इस प्रकार है:

  1. हम Replicate से एक मॉडल प्राप्त करते हैं (हमारे मामले में, stable-diffusion-img2img मॉडल)।
  2. हम भविष्यवाणी के खिलाफ चलाने के लिए एक विशिष्ट संस्करण (हमारे मामले में, नवीनतम) लेते हैं।
  3. हम भविष्यवाणी चलाते हैं, निर्दिष्ट करते हुए:
    • छवि का वर्णन करने वाला एक टेक्स्ट प्रॉम्प्ट (हमारे मामले में, हमारे प्रॉम्प्ट का शीर्षक)।
    • एक छवि प्रॉम्प्ट जिसे हमें Base64-एन्कोडेड डेटा URL के रूप में प्रदान करना होगा।
    • भविष्यवाणी पूरी होने पर पिंग करने के लिए एक वेबहुक (हम इसे replicate-rails द्वारा प्रदान किए गए वेबहुक रूट पर इंगित करते हैं)।

यदि आप https://YOUR_NGROK_URL/prompts/new पर जाते हैं और एक शीर्षक के साथ एक छवि अपलोड करते हैं, तो आप अब एक भविष्यवाणी ट्रिगर करेंगे। जब पूरा हो जाता है, तो यह प्रदान किए गए वेबहुक के माध्यम से वापस कॉल करेगा। क्योंकि हमने वहां एक binding.irb ब्रेकपॉइंट सेट किया है, कंट्रोलर एक्शन REPL में रुक जाता है, और हम चारों ओर देख सकते हैं:


जैसा कि हम देख सकते हैं, हमारी छवि-से-छवि पीढ़ी का पहला रन सफल रहा। भविष्यवाणी मॉडल बनाई गई छवि का URL लौटाता है, जिसे हम स्थानीय रूप से संग्रहीत करना चाहेंगे (उन्हें Replicate पर समय-समय पर हटा दिया जाता है)। हम अगली बार इस पर करीब से नज़र डालेंगे।

अगला: LiteDB डीप डाइव

इस शुरुआती पोस्ट में, हमने LiteStack वातावरण को अपने रेल्स ऐप के सभी घटकों को एक ही मशीन पर होस्ट करने के लिए एक दिलचस्प विकल्प के रूप में पेश किया। हमने इसके अलावा एक उदाहरण ऐप सेट अप किया है जो AI छवि पीढ़ी के लिए Replicate.com से बात करता है।

इस श्रृंखला के अगले भाग में, हम LiteStack के पहले और केंद्रीय तत्व — LiteDB — का अधिक गहराई से पता लगाएंगे। हम कुछ ऐसे लक्षणों को देखेंगे जो इसे विशिष्ट रूप से शक्तिशाली बनाते हैं, सामान्य नुकसान, सीमाएं, और ट्रेडऑफ़।

तब तक, हैप्पी कोडिंग!

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


  1. CSS से गोल बटन कैसे स्टाइल करें? CSS से गोल बटन कैसे स्टाइल करें?

    CSS में border-radius: 50% प्रॉपर्टी का उपयोग करके किसी भी बटन को पूरी तरह गोल (circular) बनाया जा सकता है। नीचे दिए गए उदाहरण में दो अलग-अलग रंगों के गोल बटन बनाए गए हैं जिनमें होवर इफेक्ट भी शामिल है। उदाहरण <!DOCTYPE html> <html> <head> <meta name=viewport content=width=d

  1. पायथन-3 ट्किंटर का उपयोग करके बॉर्डरलेस फुलस्क्रीन एप्लिकेशन कैसे बनाएं? पायथन-3 ट्किंटर का उपयोग करके बॉर्डरलेस फुलस्क्रीन एप्लिकेशन कैसे बनाएं?

    ट्किंटर विंडो को बॉर्डरलेस और फुल-स्क्रीन बनाने के लिए, हम यूटिलिटी मेथड attributes(-fullscreen, True) का उपयोग कर सकते हैं। ट्किंटर विंडोज़ को ट्किंटर लाइब्रेरी में परिभाषित फंक्शन्स और मेथड्स का उपयोग करके कॉन्फ़िगर किया जा सकता है। ट्किंटर द्वारा एप्लिकेशन विंडो को फुल-स्क्रीन बनाने के लिए प्रदा

  1. इम्पीडेंस मिसमैच टेस्ट: निर्धारित करें कि आपका डेटा प्लेटफॉर्म सरल है या अत्यधिक जटिल इम्पीडेंस मिसमैच टेस्ट: निर्धारित करें कि आपका डेटा प्लेटफॉर्म सरल है या अत्यधिक जटिल

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