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

LiteStack: রুবি অন রেলসের জন্য वन-স্টপ ডেটা ম্যানেজমেন্ট সমাধান

এই পোস্ট সিরিজে, আমরা LiteStack-কে দেখব, একটি वन-স্টপ-শপ সমাধান যা আপনার সকল প্রোডাকশন ডেটা একটি মেশিনে হোস্ট ও প্রসেস করে। LiteStack (নামটিই ইঙ্গিত দিচ্ছে) SQLite ব্যবহার করে প্রদান করে:

  • একটি ডাটাবেস LiteDB অ্যাডাপ্টার দিয়ে
  • একটি ActiveJob ব্যাকএন্ড (LiteJob)
  • একটি ActionCable ব্যাকএন্ড (LiteCable)
  • একটি ActiveSupport::Cache স্টোর (LiteCache)

এই প্রথম পোস্টে, আমরা LiteStack-এর বেসিকস পরিচিত করাব এবং একটি উদাহরণ রেলস অ্যাপ্লিকেশন সেটআপ করব।

চলুন শুরু করি!

SQLite-এর পরিচিতি

SQLaze নিজে দশক ধরে অনেক ইন্ডাস্ট্রির গো-টু এম্বেডেড ডাটাবেস। উদাহরণস্বরূপ, এটি নেটিভ অ্যাপ ডেভেলপমেন্ট, টেস্টিং এনভায়রনমেন্ট, ক্যাশিং এবং অন্যান্য অনেক জায়গায় ব্যাপকভাবে ব্যবহৃত হয়।

সম্প্রতি, তবে, এই অ্যাক্সপেরিমেন্ট এবং এক্সটেনশনlere আকৃষ্ট করেছে। সবচেয়ে জনপ্রিয় এক্সটেনশনগুলোতে একটি Litestream, যা S3-কম্প্যাটিবল বাকেটে স্ট্রিম চেঞ্জ রিকভার করতে পারে। এর মানে আপনি আপনার প্রোডাকশন ডাটাবেসের একটি রেপ্লিকা খুব সস্তা দামে পেতে পারেন এবং যেকোনো সময় ফেইলার থেকে রিকভার করতে পারেন।

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

এটা করতে, আমাদের একটি উদাহরণ অ্যাপ দরকার যেটা যথেষ্ট কমপ্লেক্স যাতে পটেনশিয়াল ডিফিকাল্টি সারফেস করতে পারে, কিন্তু এই সিরিজে ফিট হওয়ার জন্য যথেষ্ট সিম্পল।

আমাদের উদাহরণ রেলস অ্যাপ্লিকেশন

আমরা একটি অ্যাপ লিখব যা StableDiffusion ব্যবহার করে replicate.com-এ বাচ্চাদের ড্রইং ট্রান্সফর্ম করবে।

উদাহরণস্বরূপ, এখানে আমার মেয়ের আঁকানো একটি কিউট টেডি বিয়ার, সাথে StableDiffusion-এর কয়েকটি ইন্টারপ্রিটেশন:

LiteStack: রুবি অন রেলসের জন্য वन-স্টপ ডেটা ম্যানেজমেন্ট সমাধান

রফ স্কেচ হিসেবে, আমাদের অ্যাপ নিচের স্টেপগুলো কভার করবে:

  1. ইউজার একটি ইমেজ আপলোড করবে একটি টেক্সচুয়াল প্রম্পটের সাথে (এখানে আমরা কিছু অ্যাডভান্সড SQLite টেকনিক দেখাব)।
  2. ইউজার একটি ইমেজ স্টাইল বেছে নেবে (যেন, "কার্টুন", "ওয়াল পেইন্টিং", "ফটোরিয়ালিস্টিক", "৩ডি রেন্ডারিং")।
  3. প্রসেসিং ব্যাকগ্রাউন্ডে হবে (এটি একটি LiteJob-পাওয়ারড জব কিক-অফ করবে)।
  4. প্রসেসিং চলাকালীন, আমরা একটি প্লেসহোল্ডার ইমেজ দেখাব এবং সার্ভার থেকে পাঠানো লগস আপডেট করব। একবার কমপ্লিট হলে, আসল ইমেজ দেখাতে আপডেট করব। এটি আমাদের LiteCable এক্সপ্লোর করতে দেবে যেহেতু আমরা Turbo Streams দিয়ে ইমেজ রিপ্লেস করব।
  5. আমরা ইমেজ প্রিডিকশন স্টোর করব।
  6. আমরা LiteCache ব্যবহার করব কম্পিউটেশনালি কাস্টলি ভিউ র‍্যাপ করার জন্য।

এই স্টেপগুলো এই সিরিজের জন্য একটি স্ক্যাফোল্ড প্রদান করে। এই পোস্টের বাকি অংশ তবে অ্যাপ সেটআপ নিয়ে কাজ করবে।

আমরা skAItch নামে একটি নতুন রেলস অ্যাপ তৈরি করব শুরু করব, esbuild ব্যবহার করে আমাদের জাভাস্ক্রিপ্ট বান্ডলার হিসেবে এবং SASS সিএসএস প্রিপ্রসেসর হিসেবে:



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-র সাথে ইন্টারফেস করে। একটি যেন রেপ্লিকেট-রেইলস জেম, যা আমরা এখন ইনস্টল করব:



আমাদের 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-এনকোডেড Data URL হিসেবে দিতে হবে।
    • একটি ওয়েবহুক যা প্রিডিকশন কমপ্লিট হলে পিং করবে (আমরা replicate-rails-দ্বারা প্রদত্ত ওয়েবহুক রাউটে পয়েন্ট করব)।

আপনি যদি https://YOUR_NGROK_URL/prompts/new-এ যান এবং একটি ইমেজ টাইটেলসহ আপলোড করুন, তবে আপনি এখন একটি প্রিডিকশন ট্রিগার করবেন। কমপ্লিট হলে, এটি প্রদত্ত ওয়েবহুক কলব্যাক করবে। যেহেতু আমরা সেখানে একটি binding.irb ব্রেকপয়েন্ট সেট করেছি, কন্ট্রোলার অ্যাকশন একটি REPL-এ রুকবে, এবং আমরা চারপাশে লুকিয়ে নিতে পারব:


দেখতে পাচ্ছি, আমাদের ইমেজ-টু-ইমেজ জেনারেশনের প্রথম রান সফল হয়েছে। প্রিডিকশন মডেল তৈরি করা ইমেজের একটি URL রিটার্ন করে, যা আমরা লোকালি স্টোর করতে চাই (Replicate-এ সেগুলো পিরিয়ডিক্যালি ডিলিট হয়)। আমরা এর詳細ে পরবর্তীবার দেখব।

পরবর্তী: LiteDB গভীরে

এই ওপেনিং পোস্টে, আমরা LiteStack এনভায়রনমেন্টকে আপনার রেলস অ্যাপের সকল কম্পোনেন্ট এক মেশিনে হোস্ট করার একটি আকর্ষণীয় অল্টারনেটিভ হিসেবে পরিচিত করিয়েছি। আমরা আরো একটি উদাহরণ অ্যাপ সেটআপ করেছি যা Replicate.com-এর সাথে AI ইমেজ জেনারেশনের জন্য কথা বলে।

এই সিরিজের পরবর্তী পার্টে, আমরা LiteStack-এর প্রথম এবং কেন্ড্রিক এলিমেন্ট—LiteDB—কে আরও গভীরে এক্সপ্লোর করব। আমরা কিছু ট্রেইট দেখব যা এটাকে যুনিকলি পাওয়ারফুল করে, কমন পিটফল, লিমিটেশন, এবং ট্রেড-অফস।

তबতक, হ্যাপি কোডিং!

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

  1. সি++-এ n^2 পজিশনে আইটেম রাখার পদ্ধতি যাতে কোনো সারি/কলামে একটির অধিক না থাকে

  2. অ্যারে রোটেশনের পাইথন প্রোগ্রাম

  3. HTML ondragenter ইভেন্ট অ্যাট্রিবিউট

  4. Android-এ লিংকড লিস্টের মাঝপথের এলিমেন্ট বের করার পদ্ধতি