গুগল অ্যান্টিগ্র্যাভিটি দিয়ে নির্মাণ

১. ভূমিকা

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

এই কোডল্যাবে আমরা অ্যান্টিগ্র্যাভিটি ব্যবহার করে বাস্তব অ্যাপ্লিকেশন তৈরি করব। আমরা সাধারণ ওয়েব গবেষণা থেকে শুরু করে ফুল-স্ট্যাক অ্যাপ্লিকেশন এবং এন্টারপ্রাইজ-গ্রেড ইউনিট টেস্ট তৈরি করার দিকে অগ্রসর হব।

পূর্বশর্তসমূহ:

  • Antigravity এবং Antigravity IDE ইনস্টল ও কনফিগার করা হয়েছে।
  • গুগল অ্যান্টিগ্র্যাভিটি সম্পর্কে প্রাথমিক ধারণা থাকা আবশ্যক। “ Getting Started with Google Antigravity” কোডল্যাবটি সম্পন্ন করার পরামর্শ দেওয়া হচ্ছে।

২. ব্যবহারের ক্ষেত্রসমূহ সম্পর্কে

যেহেতু অ্যান্টিগ্র্যাভিটি সম্পর্কে আপনার একটি প্রাথমিক ধারণা আছে, চলুন এর কয়েকটি ব্যবহারিক প্রয়োগ দেখে নেওয়া যাক। উল্লেখ্য যে, অ্যান্টিগ্র্যাভিটি একটি ‘এজেন্ট ফার্স্ট’ প্ল্যাটফর্ম। এর মানে হলো, বেশিরভাগ ক্ষেত্রে আমরা এজেন্টকে কেবল একটি নির্দেশ দিই এবং এজেন্ট তখন নিজে থেকেই তার কাজটি করে, প্রয়োজনে অনুমতি চায়, প্রয়োজনীয় আর্টিফ্যাক্ট তৈরি করে এবং কাজটি সম্পন্ন হলে আমাদের জানায়। এর ফলে, আমরা নিম্নলিখিত প্রতিটি ব্যবহারিক প্রয়োগে এজেন্টের কথোপকথনের প্রতিটি আউটপুট এখানে তুলে ধরতে পারব না। আমরা নির্দেশাবলী এবং প্রত্যাশিত ফলাফলের কয়েকটি প্রয়োজনীয় স্ক্রিনশট শেয়ার করব, কিন্তু আপনার ফলাফল কিছুটা ভিন্ন হতে পারে।

আমরা যে ব্যবহারিক ক্ষেত্রগুলো নিয়ে আলোচনা করব, সেগুলো হলো—বাহ্যিক সাইটগুলোর কয়েকটি কাজ স্বয়ংক্রিয় করা, কোনো প্রকল্পের জন্য ইউনিট টেস্ট কেস তৈরি ও যাচাই করা, এবং একটি পূর্ণাঙ্গ ওয়েবসাইট তৈরি করা। চলুন শুরু করা যাক।

৩. সংবাদের বিশেষ অংশ

এটি একটি সহজ ব্যবহারিক উদাহরণ, কিন্তু এটি এমন একটি ভিত্তি হতে পারে যার মাধ্যমে আপনি ওয়েব ব্রাউজার ব্যবহার করে বিভিন্ন ওয়েবসাইট পরিদর্শন করতে, তথ্য সংগ্রহ করতে, কিছু কাজ সম্পাদন করতে এবং তারপর ব্যবহারকারীকে ডেটা ফেরত দিতে পারবেন।

এক্ষেত্রে, আমরা গুগল নিউজ সাইটটি ভিজিট করে সেখান থেকে কিছু তথ্য সংগ্রহ করব। কিন্তু আপনি সহজেই আপনার পছন্দের কোনো সাইট নিয়ে পরীক্ষা করে দেখতে পারেন যে ফলাফল কেমন হয়।

আমরা ধরে নেব যে আমাদের একটি রুট ফোল্ডার আছে, যার অধীনে আমরা এই কোডল্যাবে দেখা বিভিন্ন প্রজেক্টগুলো তৈরি করব। আমাদের মেশিনে এই রুট ফোল্ডারটির নাম agy2-pprojects

নতুন করে শুরু করার জন্য, প্রথমে উপরের ফোল্ডারটির মধ্যে news-highlights নামে একটি ফোল্ডার তৈরি করুন।

Antigravity চালু করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন। এতে news-highlights ফোল্ডারটি যোগ করুন।

নতুন আমদানি করা news-highlights ওয়ার্কস্পেসে একটি নতুন কথোপকথন শুরু করুন:

58c4419125240f8f.png

তারপর নিম্নলিখিত নির্দেশ দিন: " news.google.com-এ যান এবং এই মুহূর্তের হাইলাইটসগুলো আমাকে এনে দিন। "

69859175cdace3c2.png

এটি এজেন্ট প্রক্রিয়াটি চালু করবে এবং এটি নির্ধারণ করবে যে এটিকে news.google.com সাইটটি পরিদর্শন করতে হবে এবং আপনার অনুমতি চাইতে হবে। এটি ইউআরএল (URL) পড়ার জন্য আপনাকে বেশ কয়েকবার জিজ্ঞাসা করতে পারে এবং আপনি এই প্রকল্পের জন্য এটিকে অনুমতি দিতে পারেন, ইত্যাদি।

85f14eddde22704c.png

আপনার চিন্তন প্রক্রিয়ার প্রতি গভীর মনোযোগ দেওয়া উচিত এবং এজেন্টটি কীভাবে তার কাজ সম্পাদন করে তা লক্ষ্য করা উচিত। এজেন্টটির একটি নমুনা কার্যসম্পাদন নিচে দেখানো হলো:

7be51d200fb1296f.png

চেষ্টা করার মতো জিনিসগুলি

  • একবার বিষয়টি বুঝে গেলে, এমন একটি ওয়েবসাইট বেছে নিন যা সহজলভ্য এবং যেখান থেকে এজেন্ট কিছু ডেটা সংগ্রহ বা সারসংক্ষেপ করবে। এমন কোনো ওয়েবসাইটের কথা ভাবুন যেখানে ড্যাশবোর্ড ও চার্ট আছে বলে আপনি জানেন এবং সেটিকে কয়েকটি মান বেছে নিতে বলুন।
  • নিম্নলিখিত নির্দেশটি অনুসরণ করুন: Visit https://docs.cloud.google.com/release-notes and get me a summary of the release notes, categorized by product.

৪. পাইথন ও ফ্লাস্ক ব্যবহার করে একটি ডাইনামিক ওয়েবসাইট তৈরি করুন

এবার আমরা একটি সম্পূর্ণ ওয়েব অ্যাপ্লিকেশন তৈরি করব। আমরা যে ওয়েব অ্যাপ্লিকেশনটি তৈরি করতে যাচ্ছি, সেটি এমন একটি সাইট যা একটি একদিনের প্রযুক্তিগত অনুষ্ঠান সম্পর্কে তথ্য প্রদান করবে, যেখানে দিনভর একাধিক বক্তা আলোচনা করবেন।

পুনরায়, conference-website নামে একটি নতুন ফোল্ডার তৈরি করুন। নিশ্চিত করুন যে আপনি Antigravity Agent ইন্টারফেসে একটি নতুন প্রজেক্ট তৈরি করেছেন এবং তাতে conference-website ফোল্ডারটি যুক্ত করেছেন।

আপনি নিচে দেখানো নির্দেশটি দিয়ে কথোপকথন শুরু করতে পারেন:

I would like to generate a website that is a 1-day technical conference informational site.

The website should have the following functionality:
        1. A home page that shows the current date, location, schedule and time table.
        2. The 1-day event is a list of 8 talks in total.
        3. Each talk has 1 or 2 max. speakers. 
        4. A talk has an ID, Title, Speakers, Category (1 or 2), Description and time of the talk.
        5. Each speaker has a First Name, Last Name and LinkedIn url.
        6. Allow for users to search by category, speaker, title.
        7. Give a lunch break of 60 minutes.
        8. Use dummy data for events and speakers, come up with a schedule, the event is about Google Cloud Technologies.
        9. Tech Stack: Python and Flask framework on server side. Front-end is basic HTML, CSS and JavaScript. 
        10. Test out the site on your own for all functionality and provide a detailed README on how to setup, run and make any further changes. 
11. Launch the web application for me to review. 

অ্যান্টিগ্র্যাভিটি অনুরোধটি বিশ্লেষণ করবে এবং প্রথমে একটি বাস্তবায়ন পরিকল্পনা তৈরি করবে। এটি implementation_plan.md নামে একটি মূল আর্টিফ্যাক্ট তৈরি করবে, যা আপনাকে পর্যালোচনা করতে হবে। এতে উল্লেখ থাকবে যে, আপনার অনুরোধে উল্লেখিত প্রয়োজনীয়তাগুলো তৈরি ও পূরণ করার জন্য এটি কীভাবে কাজ করার পরিকল্পনা করছে। নিচে একটি নমুনা আউটপুট দেখানো হলো:

8f516fd94f4ad57.png

'এগিয়ে যান' বোতামে ক্লিক করার আগে, বাস্তবায়ন পরিকল্পনাটি দেখে নিন। আপনি হয় উপরে থাকা implementation_plan.md ফাইলের লিঙ্কে ক্লিক করতে পারেন, অথবা উপরের ডানদিকের সহায়ক প্যানেলটি (Auxiliary Pane) টগল করতে পারেন। এটি আপনাকে আর্টিফ্যাক্ট ভিউ (Artifact view) দেখাবে এবং আপনি দেখতে পাবেন যে বর্তমানে বাস্তবায়ন পরিকল্পনাটি আপনার পর্যালোচনার জন্য সেখানে রয়েছে।

e12b6e1270405137.png

আমাদের রানের জন্য তৈরি করা একটি নমুনা বাস্তবায়ন পরিকল্পনা নিচে দেখানো হলো:

5069ec7ab1ae6310.png

আপনি পরিকল্পনাটিতে আপনার মতামত জানাতে পারেন এবং এজেন্টকে পুনরায় জিজ্ঞাসা করতে পারেন, অথবা আপাতত আমরা বাস্তবায়ন পরিকল্পনাটি যেমন আছে তেমনই গ্রহণ করে কথোপকথন ইন্টারফেসে থাকা ' এগিয়ে যান' বোতামে ক্লিক করে সামনে এগিয়ে যেতে পারি।

এজেন্টটি সোর্স কোড ফাইলগুলো তৈরি করার কাজ চালিয়ে যায় এবং আপনি আরও লক্ষ্য করবেন যে এটি 'টাস্ক' নামক আরেকটি আর্টিফ্যাক্ট আপডেট করে। এটি হলো সেইসব কাজ বা অ্যাকশনের একটি তালিকা, যা এজেন্টটি চূড়ান্ত ফলাফল অর্জনের জন্য করণীয় হিসেবে চিহ্নিত করেছে।

আপনি যেকোনো সময় টাস্কটিতে ক্লিক করতে পারেন অথবা টাস্কগুলো দেখার জন্য আর্টিফ্যাক্টগুলোর তালিকাও দেখতে পারেন। নিচে একটি নমুনা তালিকা দেখানো হলো:

caf136694efc222f.png

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

যাচাইকরণ সফল হলে, এটি বিস্তারিত তথ্য তুলে ধরবে এবং এর সাথে 'ওয়াকথ্রু' নামক আরেকটি আর্টিফ্যাক্টও দেবে, যেখানে সম্পন্ন হওয়া ফিচার, টেকনোলজি স্ট্যাক, যাচাইকরণের ফলাফল এবং নির্দেশাবলী বিশদভাবে উল্লেখ থাকবে।

d0f61eb85d348030.png

নীচে একটি নমুনা ওয়াকথ্রু দেখানো হলো:

fb18995f34c286ae.png

ইউআরএল-টিতে ভিজিট করলে চূড়ান্ত ওয়েবসাইটটি নিচে দেখানো হলো:

2b2ee3149d59da7a.png

আপনি যদি তৈরি হওয়া কোডটি দেখতে চান, তাহলে উপরের ডান কোণায় থাকা ‘ Open IDE’- তে ক্লিক করতে পারেন। এটি Antigravity IDE খুলে দেবে, যা ব্যবহার করে আপনি তৈরি হওয়া কোডটি দেখতে পারবেন। নিচে একটি নমুনা স্ক্রিনশট দেখানো হলো:

12798431169dd8cf.png

চেষ্টা করার মতো জিনিসগুলি

  • অ্যাপ্লিকেশনটিতে আপনার পছন্দসই অতিরিক্ত কার্যকারিতা যোগ করুন। এজেন্টকে বিস্তারিত তথ্য দিন এবং লক্ষ্য করুন এটি কীভাবে প্রথমে টাস্ক লিস্ট, তারপর ইমপ্লিমেন্টেশন প্ল্যান ইত্যাদি পরিবর্তন করে তার কাজটি সম্পন্ন করে।
  • ইভেন্ট শিডিউলে অতিরিক্ত তথ্য যোগ করুন। যেমন, Add two more talks to the schedule
  • অ্যাপ্লিকেশনটির জন্য একটি README বা আরও ডকুমেন্টেশন তৈরি করতে এজেন্টকে বলুন।

৫. একটি সহজ প্রোডাক্টিভিটি অ্যাপ তৈরি করুন।

আমরা এখন একটি সাধারণ পোমোডোরো টাইমার ওয়েব অ্যাপ্লিকেশন তৈরি করব।

একটি pomodoro-timer ফোল্ডার তৈরি করুন। নিশ্চিত করুন যে আপনি Agent Manager আছেন এবং pomodoro-timer ওয়ার্কস্পেসটি ইম্পোর্ট ও সিলেক্ট করেছেন। এই প্রম্পটটি দিয়ে শুরু করুন:

Create a productivity app that features a Pomodoro timer. Give a calm and aesthetic look to the application.

লক্ষ্য করুন, এটি কীভাবে বাস্তবায়ন পরিকল্পনা ও করণীয় তালিকা তৈরি করে এবং তারপর সেই অনুযায়ী কাজ করে। কার্যপ্রবাহের দিকে মনোযোগ দিতে থাকুন, এমন পরিস্থিতি আসতে পারে যেখানে এটি আপনাকে পর্যালোচনা করতে বলবে।

ওয়াকথ্রু মেসেজ এবং টাস্ক সহ একটি নমুনা রান নিচে দেখানো হলো:

df0db367ba475db2.png

চূড়ান্ত অ্যাপটি নিচেরটির মতো দেখতে হয়েছে এবং এটি বেশ ভালো।

ef8ac58d0677e56.png

চেষ্টা করার মতো জিনিসগুলি

  • অ্যাপ্লিকেশনটিতে কিছু ছবি যোগ করুন। যেমন, অ্যাপ্লিকেশনটিতে একটি টাইমারের ছবি যোগ করুন।
  • আপনি যে কোনো অ্যাপ্লিকেশন তৈরি করতে চান, তার কয়েকটি ভিন্ন সংস্করণ পরীক্ষা করে দেখুন। স্টাইল ও ছবি নিয়ে পরীক্ষা-নিরীক্ষা করুন, পরিবর্তনের জন্য অনুরোধ করুন, ইত্যাদি।

৬. ইউনিট টেস্ট, মক স্টাব তৈরি করুন এবং টেস্টগুলো যাচাই করুন

এখানে আমরা সর্বশেষ যে ব্যবহারটি চেষ্টা করব, তা হলো আমাদের একটি নির্দিষ্ট কোড ফাইলের জন্য ইউনিট টেস্ট তৈরি করা এবং এজেন্ট দ্বারা সেই টেস্টগুলো সম্পাদন ও যাচাই করা।

এর জন্য, আমরা নিচে দেখানো অনুযায়ী একটিমাত্র পাইথন ফাইলসহ একটি ওয়ার্কস্পেস তৈরি করব:

from typing import Dict

# --- Custom Exceptions ---
class InventoryShortageError(Exception):
    """Raised when there is not enough item stock."""
    pass

class PaymentFailedError(Exception):
    """Raised when the payment gateway rejects the transaction."""
    pass

class InvalidOrderError(Exception):
    """Raised when the order violates business rules."""
    pass

# --- External Service Interfaces (To be Mocked) ---
class InventoryService:
    def get_stock(self, product_id: str) -> int:
        """Connects to DB to check stock."""
        raise NotImplementedError("Real connection required")

    def decrement_stock(self, product_id: str, quantity: int):
        """Connects to DB to reduce stock."""
        raise NotImplementedError("Real connection required")

class PaymentGateway:
    def charge(self, amount: float, currency: str) -> bool:
        """Connects to Stripe/PayPal."""
        raise NotImplementedError("Real connection required")

# --- Main Business Logic ---
class Order:
    def __init__(self, 
                 inventory_service: InventoryService, 
                 payment_gateway: PaymentGateway,
                 customer_email: str,
                 is_vip: bool = False):
        
        self.inventory = inventory_service
        self.payment = payment_gateway
        self.customer_email = customer_email
        self.is_vip = is_vip
        self.items: Dict[str, Dict] = {} # {product_id: {'price': float, 'qty': int}}
        self.is_paid = False
        self.status = "DRAFT"

    def add_item(self, product_id: str, price: float, quantity: int = 1):
        """Adds items to the cart. Rejects invalid prices or quantities."""
        if price < 0:
            raise ValueError("Price cannot be negative")
        if quantity <= 0:
            raise ValueError("Quantity must be greater than zero")

        if product_id in self.items:
            self.items[product_id]['qty'] += quantity
        else:
            self.items[product_id] = {'price': price, 'qty': quantity}

    def remove_item(self, product_id: str):
        """Removes an item entirely from the cart."""
        if product_id in self.items:
            del self.items[product_id]

    @property
    def total_price(self) -> float:
        """Calculates raw total before discounts."""
        return sum(item['price'] * item['qty'] for item in self.items.values())

    def apply_discount(self) -> float:
        """
        Applies business logic:
        1. VIPs get flat 20% off.
        2. Regulars get 10% off if total > 100.
        3. No discount otherwise.
        """
        total = self.total_price
        
        if self.is_vip:
            return round(total * 0.8, 2)
        elif total > 100:
            return round(total * 0.9, 2)
        
        return round(total, 2)

    def checkout(self):
        """
        Orchestrates the checkout process:
        1. Validates cart is not empty.
        2. Checks stock for all items.
        3. Calculates final price.
        4. Charges payment.
        5. Updates inventory.
        """
        if not self.items:
            raise InvalidOrderError("Cannot checkout an empty cart")

        # 1. Check Inventory Logic
        for product_id, data in self.items.items():
            available_stock = self.inventory.get_stock(product_id)
            if available_stock < data['qty']:
                raise InventoryShortageError(f"Not enough stock for {product_id}")

        # 2. Calculate Final Price
        final_amount = self.apply_discount()

        # 3. Process Payment
        try:
            success = self.payment.charge(final_amount, "USD")
            if not success:
                raise PaymentFailedError("Transaction declined by gateway")
        except Exception as e:
            # Catching generic network errors from the gateway
            raise PaymentFailedError(f"Payment gateway error: {str(e)}")

        # 4. Decrement Stock (Only occurs if payment succeeded)
        for product_id, data in self.items.items():
            self.inventory.decrement_stock(product_id, data['qty'])

        self.is_paid = True
        self.status = "COMPLETED"
        
        return {"status": "success", "charged_amount": final_amount}

নিশ্চিত করুন যে আপনার কাছে উপরের পাইথন ফাইলটি ( order_service.py ) স্থানীয়ভাবে একটি নতুন ফোল্ডারে আছে এবং অ্যান্টিগ্র্যাভিটিতে আলোচনার জন্য সেই প্রজেক্টটি খোলা আছে।

এটি একটি সাধারণ অর্ডার সার্ভিস, যার checkout ফাংশনে নিম্নলিখিত প্রধান কার্যকারিতাগুলো রয়েছে:

  1. কার্ট খালি নয় তা যাচাই করা হয়েছে।
  2. সমস্ত পণ্যের মজুত যাচাই করুন।
  3. চূড়ান্ত মূল্য গণনা করে।
  4. চার্জ পরিশোধ।
  5. মজুদ হালনাগাদ করে।

আমরা এজেন্টকে ইউনিট টেস্ট কেস তৈরি করা, মক ইমপ্লিমেন্টেশন সরবরাহ করা এবং টেস্টগুলো সফল হয়েছে কিনা তা নিশ্চিত করার জন্য সেগুলো সম্পাদন করার দায়িত্ব দিতে যাচ্ছি।

আমরা আমাদের নির্দিষ্ট ওয়ার্কস্পেস ফোল্ডারটি খুলব এবং আপনি লক্ষ্য করবেন যে, ফাইলটিকে নির্দেশ করার জন্য আমরা এখন @ চিহ্নটিও ব্যবহার করতে পারি। উদাহরণস্বরূপ, আমরা @order টাইপ করা শুরু করলে order_service.py ফাইলটি দেখানো উচিত।

c4331bee03c5512c.png

আমরা এমন একটি কাজ দিতে পারি যা এই ফাইলটি বুঝতে সাহায্য করবে। নিম্নলিখিত নির্দেশটি দিন:

Explain the @order_service.py file

এখানে এই ফাইলটি কী, তার কিছু ব্যাখ্যা দেওয়া হলো:

269ff8450d813970.png

আমরা প্রম্পটের মাধ্যমে এটিকে আরও ভালো ভিজ্যুয়ালাইজেশন তৈরি করতে বলতে পারি:

Can you visually show this class for better understanding

অ্যান্টিগ্র্যাভিটি উল্লেখ করেছে যে কাজটি সম্পন্ন হয়েছে এবং এটি একটি আর্টিফ্যাক্ট তৈরি করেছে, যার মধ্যে ভিজ্যুয়ালাইজেশনটি রয়েছে:

ea389f494786a9ad.png

আমরা নীচে দেখানো ভিজ্যুয়ালাইজেশনটি দেখে নিতে পারি:

70e6822a86f74de9.png

এবং নিম্নলিখিত বিষয়গুলো:

3ebd94221655a03f.png

আমাদের পরবর্তী পদক্ষেপ হলো ইউনিট টেস্টগুলো তৈরি করা এবং এজেন্টকে তা পরীক্ষা করতে বলা। আমি নিম্নলিখিত নির্দেশটি দিই:

generate unit tests for this module and test it out with mock implementations.

এটি তার কাজ করে গেছে, টেস্টগুলো তৈরি করেছে, সেগুলো চালিয়েছে এবং একটি বাগও ঠিক করেছে। এর আউটপুট নিচে দেওয়া হলো:

788cd07aadd09a4b.png

এর তৈরি করা ফাইলগুলোর মধ্যে টেস্ট ফাইলটিও ছিল। যার একটি স্ক্রিনশট নিচে দেখানো হলো:

7a79d27eb34f0530.png

চেষ্টা করার মতো জিনিসগুলি

আপনার নিজের কোড নিন এবং দেখুন এজেন্টকে দিয়ে আপনি কী কী করাতে পারেন; যেমন—আরও কার্যকারিতা যোগ করা থেকে শুরু করে আপনার কোডের অংশবিশেষ রিফ্যাক্টরিং করা পর্যন্ত।

৭. অভিনন্দন

অভিনন্দন! আপনি সফলভাবে গুগল অ্যান্টিগ্র্যাভিটি ব্যবহার করে নিম্নলিখিত কাজগুলো সম্পন্ন করেছেন:

  • স্বতঃস্ফূর্তভাবে ওয়েবে গবেষণা করুন।
  • ফুল-স্ট্যাক ওয়েব অ্যাপ্লিকেশন তৈরি করুন এবং এর উন্নতি সাধন করুন।
  • মক ব্যবহার করে জটিল ইউনিট টেস্ট লিখুন এবং যাচাই করুন।

এখন আপনি আপনার নিজের প্রোজেক্টের কঠিন কাজগুলো অ্যান্টিগ্র্যাভিটির ওপর ছেড়ে দিতে প্রস্তুত।

রেফারেন্স নথি