১. ভূমিকা
এই ল্যাবে, আপনি গুগল ক্লাউডের একটি এআই-চালিত সহযোগী জেমিনি কোড অ্যাসিস্ট ব্যবহার করে একটি বিদ্যমান পাইথন ওয়েব অ্যাপ্লিকেশনে টেস্ট যোগ করবেন এবং সেই টেস্টগুলোর মাধ্যমে উদ্ঘাটিত ত্রুটিগুলো খুঁজে বের করে সমাধান করবেন। এরপর আপনি কোড অ্যাসিস্ট ব্যবহার করে নতুন কার্যকারিতার জন্য টেস্ট তৈরি করবেন এবং সেই টেস্টগুলো পাস করানোর ও অ্যাপটিকে সম্প্রসারিত করার জন্য কোড জেনারেট করবেন।
আপনি যা করবেন...
- আপনি একটি বিদ্যমান ওয়েব অ্যাপ্লিকেশনের কোড ডাউনলোড করতে ক্লাউড শেল এডিটর ব্যবহার করবেন।
- গুগল ক্লাউড সম্পর্কে সাধারণ প্রশ্ন জিজ্ঞাসা করার জন্য আপনি ক্লাউড শেল এডিটর-এ থাকা জেমিনি কোড অ্যাসিস্ট চ্যাট ব্যবহার করবেন।
- আপনি অ্যাপ্লিকেশনটির জন্য টেস্ট তৈরি করতে, টেস্টগুলো চালাতে, ত্রুটি খুঁজে বের করে তা সংশোধন করতে এবং তারপর অ্যাপ্লিকেশনটির কার্যকারিতা প্রসারিত করতে ক্লাউড শেল এডিটরে থাকা জেমিনি কোড অ্যাসিস্ট ইনলাইন কোড অ্যাসিস্ট্যান্স ব্যবহার করবেন।
আপনি যা শিখবেন...
- টেস্ট জেনারেশন এবং কোড জেনারেশনের মতো বিভিন্ন ডেভেলপার টাস্কের জন্য কীভাবে জেমিনি কোড অ্যাসিস্ট ব্যবহার করবেন।
- গুগল ক্লাউড সম্পর্কে জানতে জেমিনি কোড অ্যাসিস্ট কীভাবে ব্যবহার করবেন।
আপনার যা যা লাগবে...
- ক্রোম ওয়েব ব্রাউজার
- একটি জিমেইল অ্যাকাউন্ট
- বিলিং সক্ষম একটি ক্লাউড প্রজেক্ট
- আপনার ক্লাউড প্রজেক্টের জন্য জেমিনি কোড অ্যাসিস্ট সক্রিয় করা হয়েছে।
এই ল্যাবটি নতুনদের সহ সকল স্তরের ডেভেলপারদের জন্য তৈরি করা হয়েছে। যদিও নমুনা অ্যাপ্লিকেশনটি পাইথন ভাষায় তৈরি, তবে কী ঘটছে তা বোঝার জন্য আপনার পাইথন প্রোগ্রামিং সম্পর্কে পরিচিতি থাকার প্রয়োজন নেই। আমাদের মূল লক্ষ্য থাকবে ডেভেলপারদের জন্য জেমিনি কোড অ্যাসিস্ট-এর সক্ষমতাগুলোর সাথে পরিচিত হওয়া।
২. সেটআপ
এই ল্যাবটি ব্যবহারের জন্য আপনার ইতিমধ্যে বিলিং সক্ষম করা একটি ক্লাউড প্রজেক্ট থাকা উচিত। আমরা এখন আমাদের গুগল ক্লাউড প্রজেক্টে জেমিনি এপিআই (Gemini API) সক্ষম করব। নিচে দেওয়া ধাপগুলো অনুসরণ করুন:
- https://console.cloud.google.com-এ যান এবং নিশ্চিত করুন যে আপনি এই ল্যাবের জন্য যে গুগল ক্লাউড প্রজেক্টটি নিয়ে কাজ করতে চান, সেটি নির্বাচন করেছেন। উপরের ডানদিকে দেখতে পাওয়া জেমিনি আইকনটিতে ক্লিক করুন।

- কনসোলের ডানদিকে Gemini for Cloud কনসোল উইন্ডোটি খুলে যাবে। নিচে দেখানো হলে Enable বাটনে ক্লিক করুন। যদি আপনি Enable বাটনটি না দেখে একটি চ্যাট ইন্টারফেস দেখতে পান, তাহলে আপনি প্রজেক্টটির জন্য Gemini for Cloud ইতিমধ্যেই এনাবল করে ফেলেছেন এবং সরাসরি পরবর্তী ধাপে যেতে পারেন।

- একবার এটি চালু হয়ে গেলে, আপনি এক-দুটি প্রশ্ন করে জেমিনি পরীক্ষা করে দেখতে পারেন। কয়েকটি নমুনা প্রশ্ন দেখানো হয়েছে, তবে আপনি ‘ক্লাউড রান কী?’-এর মতো কিছু চেষ্টা করে দেখতে পারেন।

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

- (প্রযোজ্য ক্ষেত্রে) এডিটর বা ওপেন এডিটর বোতামে ক্লিক করুন এবং ক্লাউড শেল এডিটর প্রদর্শিত হওয়া পর্যন্ত অপেক্ষা করুন। যদি আপনি ‘Try the new editor’ বোতামটি দেখতে পান, তবে সেটিতে ক্লিক করুন।

- দেখানো অনুযায়ী নিচের স্ট্যাটাস বারে থাকা ‘ Cloud Code - Sign in’ বোতামটিতে ক্লিক করুন। নির্দেশনা অনুযায়ী প্লাগইনটি অনুমোদন করুন। যদি স্ট্যাটাস বারে "Cloud Code - no project" দেখতে পান, তবে সেটি নির্বাচন করুন এবং তারপরে প্রজেক্টের তালিকা থেকে নির্দিষ্ট গুগল ক্লাউড প্রজেক্টটি বেছে নিন, যেটিতে আপনি কাজ করতে চান।

- যদি আপনি নিচের ডানদিকের স্ট্যাটাস বারে জেমিনি আইকনটি দেখতে না পান, তাহলে আপনাকে ক্লাউড কোডে এটি চালু করতে হবে। এটি করার আগে নিশ্চিত করুন যে আপনার IDE-তে জেমিনি (যা আগে Duet AI for Developers নামে পরিচিত ছিল) চালু আছে। এর জন্য ক্লাউড কোড এক্সটেনশন → সেটিংস- এ যান এবং নিচে দেখানো অনুযায়ী Duet AI: Enable লেখাটি লিখুন। নিশ্চিত করুন যে চেকবক্সটি সিলেক্ট করা আছে। এরপর আপনার IDE রিলোড করুন। এতে ক্লাউড কোডে জেমিনি চালু হয়ে যাবে এবং আপনার IDE-তে জেমিনি স্ট্যাটাস বারটি দেখা যাবে।

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

- আপনার গুগল ক্লাউড প্রজেক্টটি নির্বাচন করার পর, নিশ্চিত করুন যে আপনি স্ট্যাটাস বারের ক্লাউড কোড স্ট্যাটাস মেসেজে সেটি দেখতে পাচ্ছেন এবং নিচে দেখানো ছবির মতো স্ট্যাটাস বারের ডানদিকে জেমিনিও (Gemini) চালু আছে।

জেমিনি কোড অ্যাসিস্ট ব্যবহারের জন্য প্রস্তুত!
৩. অ্যাপ্লিকেশনটি ডাউনলোড করে যাচাই করুন।
টার্মিনাল উইন্ডোতে, প্রারম্ভিক কোড সহ রিপোজিটরিটি ক্লোন করার জন্য কমান্ডটি চালান এবং তারপরে নতুন ডিরেক্টরিতে যান (যদি টার্মিনাল উইন্ডোটি আর খোলা না থাকে, তবে এটি পুনরুদ্ধার করতে টার্মিনাল বা ওপেন টার্মিনাল বোতামে ক্লিক করুন):
git clone https://github.com/GoogleCloudPlatform/testing-with-duet-ai-codelab.git
cd testing-with-duet-ai-codelab
এডিটরে main.py ফাইলটি খুলুন, তারপর এডিটরের বাম দিকে থাকা জেমিনি চ্যাট আইকনে ক্লিক করে জেমিনি চ্যাট উইন্ডোটি খুলুন। এই জেমিনি চ্যাট উইন্ডোটি IDE-এর ভেতরেই থাকে এবং এখানে আলোচনার জন্য IDE-এর কোডটি প্রাসঙ্গিক হিসেবে পাওয়া যায়। "Explain this" প্রম্পটটি লিখুন এবং উত্তরটি দেখুন:

সম্পূর্ণ উত্তরটি দেখতে আপনি এই চ্যাট উইন্ডোটি স্ক্রল করতে পারেন। ব্যাখ্যায় বলা হয়েছে যে, টার্মিনাল উইন্ডোতে python3 main.py কমান্ড দিয়ে এই প্রোগ্রামটি স্থানীয়ভাবে চালানো যায়।
৪. স্থানীয়ভাবে চালান
প্রয়োজনে cd ~/testing-with-duet-ai-codelab ব্যবহার করে রিপোজিটরি ডিরেক্টরিতে যান এবং টার্মিনাল উইন্ডোতে python3 main.py কমান্ডটি প্রবেশ করান:

অ্যাপ্লিকেশনটির হোম পেজে একটি নতুন ব্রাউজার ট্যাব খুলতে http://127.0.0.1:8080 লিঙ্কে ক্লিক করুন:

অ্যাপ্লিকেশনটি 'লোকালি' চলছে। আসলে, ক্লাউড শেল এডিটর এখানে একটু জাদুর মতো কাজ করেছে। অ্যাপ্লিকেশনটি আপনার নিজের কম্পিউটারে নয়, ক্লাউড শেলে চলছে। আপনি যখন লিঙ্কটিতে ক্লিক করেছিলেন, তখন এটি আসল লোকাল অ্যাড্রেস http://127.0.0.1:8080-তে না গিয়ে, ক্লাউড শেল দ্বারা শুধুমাত্র এই কাজের জন্য সেট আপ করা একটি প্রক্সি সার্ভারে একটি ট্যাব খুলেছিল। এর ফলাফল ঠিক তেমনই, যেন আপনি অ্যাপ্লিকেশনটি সত্যিই লোকালি চালাচ্ছেন।
চেষ্টা করে দেখুন। ২৫ প্রবেশ করান এবং কনভার্ট চাপুন!

ঠিক বলেছেন, রোমান সংখ্যায় ২৫ হলো XXV! আপনার কাজ নিশ্চয়ই এখানেই শেষ।
আরও কয়েকটি সংখ্যা যাচাই করে দেখতে পারেন। ২৫ কাজ করেছে, ২৪ হলে কেমন হয়?

সম্ভবত সবকিছু ঠিক আছে ভেবে আমরা একটু তাড়াহুড়ো করে ফেলেছিলাম। ২৪-এর জন্য XXIIII কি সঠিক রূপান্তর? এটা কি XXIV হওয়া উচিত নয়?
বলা যেতে পারে যে XXIIII সঠিক, কিন্তু মানুষ সাধারণত এমনটা আশা করে না। তবে যেহেতু এটা পুরোপুরি ভুলও নয় (লক্ষ্য করুন, অনেক ঘড়িতে ৪-কে রোমান সংখ্যা IIII হিসেবে দেখানো হয়), তাই এই বিষয়টি ভবিষ্যতের কোনো উন্নতির জন্য রেখে দেওয়া যাক।
ঋণাত্মক সংখ্যা দিয়ে চেষ্টা করলে কেমন হয়? শূন্য? রোমান সংখ্যায় এই সংখ্যাগুলো প্রকাশ করার কোনো উপায় নেই। ব্যবহারকারীকে কোনো বার্তা দেখানো হচ্ছে না, যা দেখে মনে হচ্ছে এটি একটি ত্রুটি এবং এর সমাধান করা প্রয়োজন।
টেস্টিং ভুল খুঁজে বের করতে ও দূর করতে সাহায্য করে, এবং জেমিনি কোড অ্যাসিস্ট আমাদের টেস্ট লিখতে ও ব্যবহার করতে সাহায্য করতে পারে।
৫. পরীক্ষা যোগ করা
জেমিনি চ্যাট উইন্ডোতে ফিরে যান এবং জিজ্ঞাসা করুন
How can I test the number_to_roman function?
উত্তরটি ভালোভাবে পড়ুন, যেখানে unittest মডিউল এবং pytest মডিউল নিয়ে আলোচনা অন্তর্ভুক্ত থাকা উচিত।
আপনি চাইলে জেমিনি কোড অ্যাসিস্টকে দিয়ে এই টেস্টগুলো লিখিয়ে নিতে পারেন। এডিটরে calendar.py ফাইলটি খুলুন, যেখানে আসল কনভার্সন কোডটি রয়েছে, জেমিনি চ্যাট উইন্ডোতে ফিরে যান এবং আবার জিজ্ঞাসা করুন।
How can I test the number_to_roman function?
প্রতিক্রিয়াটি এখন আরও সুনির্দিষ্ট, এমনকি এতে একটি ইউনিটটেস্ট মডিউলও অন্তর্ভুক্ত রয়েছে যা আপনি একটি নতুন ফাইলে কপি বা ইনজেক্ট করতে পারেন:
import unittest
import calendar
class NumberToRomanTest(unittest.TestCase):
def test_convert_1(self):
self.assertEqual(calendar.number_to_roman(1), "I")
def test_convert_4(self):
self.assertEqual(calendar.number_to_roman(4), "IV")
def test_convert_9(self):
self.assertEqual(calendar.number_to_roman(9), "IX")
def test_convert_40(self):
self.assertEqual(calendar.number_to_roman(40), "XL")
def test_convert_90(self):
self.assertEqual(calendar.number_to_roman(90), "XC")
def test_convert_400(self):
self.assertEqual(calendar.number_to_roman(400), "CD")
def test_convert_900(self):
self.assertEqual(calendar.number_to_roman(900), "CM")
def test_convert_1990(self):
self.assertEqual(calendar.number_to_roman(1990), "MCMXC")
def test_convert_2023(self):
self.assertEqual(calendar.number_to_roman(2023), "MMXXIII")
আপনি উপরের উদাহরণ থেকে ভিন্ন কোড দেখতে পারেন। জেমিনি কোড অ্যাসিস্ট-এর অন্তর্নিহিত মডেলগুলো সময়ে সময়ে আপডেট করা হয়, তাই উত্তরগুলো সবসময় একই থাকবে না। আপনি যদি ভিন্ন কোনো কোড দেখতে পান, তাহলে আপনি এখন বেছে নিতে পারেন যে, এই কোডল্যাবে দেখানো নমুনাগুলো অনুসরণ করে এখান থেকে কোডটি কপি করে কাজ চালিয়ে যাবেন, নাকি জেমিনি কোড অ্যাসিস্ট এখন যে বিকল্প উত্তরটি দিচ্ছে, সেটি চেষ্টা করে দেখবেন। আপনার হাতে সময় থাকলে, আপনি দুটি পথই চেষ্টা করে দেখতে পারেন। জেমিনি কোড অ্যাসিস্ট হলো একটি কোডিং সহকারী, যা আপনি আপনার সুবিধামতো ব্যবহার করতে পারেন।
ইউনিট টেস্ট কোড সম্বলিত একটি নতুন ফাইল তৈরি করতে জেমিনি চ্যাট উইন্ডোর উপরের ডান কোণায় থাকা দ্বিমুখী তীরচিহ্নে ক্লিক করুন, অথবা IDE ব্যবহার করে একটি নতুন ফাইল তৈরি করে এই ল্যাবে দেখানো কোডটি পেস্ট করুন। ফাইলটি সেভ করার জন্য সেই উইন্ডোতে CTRL-S বা CMD-S চাপুন এবং সেভ করা ফাইলটির নাম দিন calendar-unittest.py।
টার্মিনালে ফিরে যান এবং আগে চালু রাখা ওয়েব সার্ভারটি বন্ধ করতে CTRL-C চাপুন, এবং একটি শেল প্রম্পট পান। কমান্ডটি প্রবেশ করান।
python3 calendar-unittest.py
নতুন পরীক্ষাগুলো চালাতে।
কোনো আউটপুট নেই। এমনটা আশা করা হয়নি। সবকিছু কি নির্বিঘ্নে সম্পন্ন হয়েছে? আপনি বিষয়টি নিশ্চিতভাবে জানতে চাইবেন। জেমিনি কোড অ্যাসিস্টের সেই উত্তরটি আবার দেখুন, যেখানে টেস্ট কোডটি অন্তর্ভুক্ত ছিল। কোডের নিচে টেস্ট কেসটি কীভাবে চালাতে হবে সে সম্পর্কে আরও তথ্য ছিল:

প্রস্তাবিত কমান্ডটি চালানোর চেষ্টা করুন:
python -m unittest discover
যদি আপনার মেশিন python3 কমান্ডকে python হিসেবে অ্যালিয়াস না করে, তাহলে একটি সমস্যা হতে পারে, সেক্ষেত্রে চালান:
python3 -m unittest discover
কমান্ডটি রান হচ্ছে, কিন্তু এটি Ran 0 tests in 0.000s ' রিটার্ন করছে। মডিউলটিতে বেশ কয়েকটি টেস্ট রয়েছে। কী হচ্ছে?
কমান্ডের শেষ শব্দটি, discover , নিয়েই এই সমস্যা। এটি কোথা থেকে এলো? মনে হচ্ছে, Gemini Code Assist আশা করেছিল যে টেস্ট কোডটি discover বা discover.py নামের একটি ফাইলে সেভ করা হবে, কিন্তু সেটাই যে করতে হবে তা নির্দিষ্ট করে বলেনি। যেহেতু আপনি ফাইলটি calendar-unittest.py নামে সেভ করেছেন, তাই এই কমান্ডটি চালিয়ে দেখুন:
python3 -m unittest calendar-unittest
এখন আপনি অনেক আউটপুট দেখতে পাবেন, যা এইরকম কিছু দিয়ে শুরু হয়:
$ python3 -m unittest calendar-unittest
.F.FFFFFF
======================================================================
FAIL: test_convert_1990 (calendar-unittest.NumberToRomanTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/charles_engelke/testing-with-duet-ai-codelab/calendar-unittest.py", line 28, in test_convert_1990
self.assertEqual(calendar.number_to_roman(1990), "MCMXC")
AssertionError: 'MDCCCCLXXXX' != 'MCMXC'
- MDCCCCLXXXX
+ MCMXC
প্রথম লাইনে প্রতিটি পাস করা টেস্টের জন্য একটি ডট (.) এবং প্রতিটি ফেল করা টেস্টের জন্য একটি F দেখানো হয়েছে। বেশিরভাগ টেস্টই ফেল করছে! এরপর এটি ফেল করা টেস্টগুলোকে আলাদাভাবে তালিকাভুক্ত করে, যেখানে প্রত্যাশিত আউটপুট এবং প্রকৃত আউটপুট দেখানো হয়েছে। এই টেস্টগুলো কোন ক্রমে চালানো হয়েছিল তা কিছুটা অস্পষ্ট। এটি টেস্টের নাম অনুসারে বর্ণানুক্রমিকভাবে সাজানো ছিল, ফাইলে টেস্টগুলো যেভাবে আছে সেই ক্রমে নয়। তাই প্রথমে test_convert_1 , তারপর test_convert_1990 , তারপর test_convert_2023 , এবং এভাবেই চলেছে। শুধুমাত্র 1 এবং 2023 এর টেস্ট কেসগুলোই পাস করেছে।
আপনি যখন প্রথম এই কোডটি পরীক্ষা করেছিলেন, তখন লক্ষ্য করেছিলেন যে এটি 24 XXIIII তে রূপান্তর করেছে, যা পুরোপুরি ভুল ছিল না, কিন্তু এটি সেই প্রচলিত রূপও ছিল না যেখানে IIII IV তে রূপান্তর করা হয়। ব্যর্থ হওয়া সমস্ত পরীক্ষাই একই ধরনের ক্ষেত্রে হয়েছিল। যখন এই সমস্যাটি প্রথম নজরে আসে, তখন ল্যাব থেকে বলা হয়েছিল, "যেহেতু এটি আসলে ভুল নয় (লক্ষ্য করুন যে অনেক ঘড়িতে 4 রোমান সংখ্যা IIII হিসাবে দেখানো হয়), তাই এই বিষয়টি ভবিষ্যতের কোনো উন্নতির জন্য রেখে দেওয়া হলো।"
আপনি টেস্ট কেসগুলো এমনভাবে পরিবর্তন করতে পারেন যাতে কোডকে দেওয়া "খুব একটা ভুল নয়" এমন উত্তরগুলোও গ্রহণ করা হয়, অথবা মেনে নিতে পারেন যে এখন সেই "ভবিষ্যৎ উন্নয়নের" সময় হয়েছে। সুতরাং আপনার পরবর্তী পদক্ষেপ হলো, জেমিনি কোড অ্যাসিস্টের সাহায্যে কোডটি ঠিক করা, যাতে এটি টেস্টগুলোর প্রত্যাশিত আরও গ্রহণযোগ্য উত্তরগুলো দেয়।
৬. কোডের মানোন্নয়ন
মনে করে দেখুন যে, 24 এর জন্য প্রচলিত XXIV পরিবর্তে XXIIII মতো উত্তরগুলোকে 'আসলে ভুল নয়' বলে মনে করা হয়েছিল এবং ভবিষ্যতের উন্নতির জন্য স্থগিত রাখা হয়েছিল। সেই ভবিষ্যৎ এখন এসে গেছে। সেই 'আসলে ভুল নয়' উত্তরগুলো এখনও বিরক্তিকর।
রোমান সংখ্যায় পুনরাবৃত্ত অঙ্কের প্রথম নিয়মটি হলো: যখনই পরপর চারটি একই অঙ্ক থাকবে, তখন সেগুলোকে ওই অঙ্কগুলোর যেকোনো একটির পরে তার চেয়ে বড় অঙ্কটি দিয়ে প্রতিস্থাপন করতে হবে। তাই XXIIII XXIV দিয়ে প্রতিস্থাপন করতে হবে। একইভাবে XXXX XL এবং CCCC CD করতে হবে।
number_to_roman দ্বারা রিটার্ন করার ঠিক আগে, roman ভেরিয়েবলের মান কীভাবে এইভাবে পরিবর্তন করতে হয়, তা Gemini Code Assist-কে জিজ্ঞাসা করুন:
If the final value of roman has IIII in it, that should be replaced by IV. Similarly XXXX should be replaced by XL, and CCCC should become CD. How can I make those changes?
পরামর্শটি হলো শেষে কিছু কোড যোগ করা:

এডিটরে ওই লাইনগুলো কপি/পেস্ট বা টাইপ করুন, এবং তারপর দেখুন কী হয়:

প্রথম দফা প্রতিস্থাপন করার পর যে পরিস্থিতিগুলো তৈরি হতে পারে, সেগুলো সামলানোর জন্য জেমিনি কোড অ্যাসিস্ট আরও কিছু লাইন যোগ করেছে। উদাহরণস্বরূপ, 19 প্রথমে XVIIII, তারপর XVIV এবং সবশেষে সঠিক XIX-এ রূপান্তরিত হবে।
যদি জেমিনি কোড অ্যাসিস্ট আপাতদৃষ্টিতে দরকারি পরামর্শ দেয়, তাহলে সুপারিশগুলো গ্রহণ করতে ট্যাব চাপুন, ফাইলটি সেভ করুন এবং ওয়েব সার্ভারটি আবার চালান। অন্যথায়, এখানে উদাহরণে দেখানো লাইনগুলো নিজে হাতে যোগ করুন এবং ফাইলটি সেভ করুন। একটি কঠিন রূপান্তর চেষ্টা করুন: ১৯৯৯:

সেটা সঠিক!
এখন পরীক্ষাগুলো আবার চালান। সবগুলোই পাস করেছে!
ওয়েব অ্যাপ্লিকেশনটি প্রোডাকশনে দেওয়ার জন্য প্রস্তুত বলে মনে হচ্ছে।
৭. ক্লাউড রানে স্থাপন করুন
ক্লাউড রান আপনার জন্য ইন্টারনেটে একটি কন্টেইনারাইজড অ্যাপ্লিকেশন চালাবে। ফ্ল্যাশের মতো সাধারণ ফ্রেমওয়ার্ক ব্যবহার করে লেখা অ্যাপ্লিকেশনগুলির জন্য, gcloud run deploy কমান্ডটি অ্যাপ্লিকেশনটি ডিপ্লয় করার আগে আপনার জন্য সেই কন্টেইনারটি তৈরিও করে দেবে। কমান্ডটি চালান:
gcloud run deploy
টার্মিনালে, সোর্স কোডের অবস্থান জানতে চাইলে, এটি যে সঠিক অবস্থানটি প্রস্তাব করবে তা গ্রহণ করতে এন্টার চাপুন। একইভাবে, সার্ভিসের নাম জানতে চাইলে, প্রস্তাবটি গ্রহণ করতে এন্টার চাপুন।
কমান্ডটি ব্যর্থ হতে পারে কারণ gcloud নির্ধারণ করতে পারে না কোন প্রজেক্টটি ব্যবহার করতে হবে। সেক্ষেত্রে, এই কমান্ডটি চালান:
gcloud config set core/project <project-id>
যেখানে আপনার প্রোজেক্টের আইডি দিয়ে প্রতিস্থাপিত হবে, যা এর নামের মতোই হতে পারে। তারপর gcloud run deploy কমান্ডটি পুনরায় চালান।
- কমান্ডটি আপনাকে জানাবে যে কিছু নির্দিষ্ট API প্রয়োজন কিন্তু এখনও সক্রিয় করা হয়নি। সেগুলোকে আপনার জন্য সক্রিয় করতে 'y' লিখুন।
- অঞ্চল নির্বাচন করতে বলা হলে, আপনার সুবিধামতো একটি বেছে নিন।
us-central1এর সাথে সম্পর্কিত নম্বরটি প্রবেশ করানো একটি নিরাপদ পছন্দ। - জিজ্ঞাসা করা হলে, চালিয়ে যাওয়ার জন্য Y চাপুন।
- আপনি এই ক্লাউড রান পরিষেবাটির প্রমাণীকরণবিহীন ব্যবহারের অনুমতি দিতে চাইবেন। ক্লাউড রান দ্বারা ব্যবহৃত প্রমাণীকরণ বিকল্পটি পরিষেবাটিকে কলকারী প্রোগ্রামগুলির ব্যবহারের জন্য উপযুক্ত। যেহেতু এটি একটি ওয়েবসাইট, তাই আপনি প্রমাণীকরণ ব্যবহার করবেন না।
গুগল ক্লাউড কন্টেইনারটি তৈরি করবে, সেটি স্থাপন করবে, সেটিতে ট্র্যাফিক পাঠাবে, এবং অ্যাক্সেস নীতি নির্ধারণ করবে, এবং তারপর আপনাকে হোম পেজের লিঙ্কটি দেখাবে:

আপনি ওই লিঙ্কে গিয়ে আপনার অ্যাপ্লিকেশনটি অ্যাক্সেস করতে পারবেন।

একটি সংখ্যা টাইপ করে এন্টার চাপুন, আর ব্যস!

কী!?!
এটা তো আপনার মেশিনে কাজ করেছে! এটা শেষ হচ্ছে না কেন?
খুঁজে বের করুন। জেমিনি কোড অ্যাসিস্টকে জিজ্ঞাসা করুন।
Why am I getting an internal server error on cloud run?

স্পষ্টতই, জেমিনি কোড অ্যাসিস্ট লগ ফাইলটি পড়তে পারে, যেখানে একই ধরনের কথা লেখা থাকে। চলুন জেমিনি কোড অ্যাসিস্টকে জিজ্ঞাসা করি, আপনি নিজে কীভাবে লগগুলো দেখতে পারেন:

এগিয়ে যান এবং তা করুন। নীচের মতো, ত্রুটির জন্য লাল !! চিহ্নযুক্ত লাইনগুলি খুঁজুন:

এর পরে এখানে পৌঁছানোর কল স্ট্যাক সম্পর্কে অনেক বিস্তারিত বিবরণ রয়েছে, কিন্তু তারপরে এই জিনিসটি আছে:

আপনি যখন আপনার calendar.py ফাইলটি দেখেন, তখন সেখানেই number_to_roman ফাংশনটি দেখতে পান! এবং আপনি জানেন যে এটি সঠিক, কারণ এটি আপনার মেশিনে কাজ করেছে। ক্লাউড রানে কী ভিন্ন হতে পারে?
উত্তরটি একটু জটিল। পাইথন৩-এর সাথে ক্যালেন্ডার নামে একটি স্ট্যান্ডার্ড মডিউল অন্তর্ভুক্ত আছে, ঠিক যেমন calendar.py ফাইলটিতে number_to_roman ফাংশনটি সংজ্ঞায়িত করা হয়েছে। আপনার লোকাল মেশিনে, পাইথন যখন ক্যালেন্ডার নামের মডিউলটি খুঁজছিল, তখন এটি প্রথমে আপনার অ্যাপ্লিকেশন ডিরেক্টরিতে অনুসন্ধান করেছিল। দৃশ্যত, ক্লাউড রানের পাইথন প্রথমে স্ট্যান্ডার্ড মডিউলগুলো খুঁজেছিল, সেটিকে ইম্পোর্ট করেছিল এবং number_to_roman ফাংশনটি খুঁজে পায়নি।
পরিবেশগত এই ধরনের পার্থক্য সবসময়ই সম্ভব। সৌভাগ্যবশত, যখন কোনো অ্যাপ্লিকেশনকে কন্টেইনারাইজ করা হয়, তখন এটি তার পরিবেশকেও নিজের মধ্যে বহন করে, তাই আপনি যেখানেই এটি চালান না কেন, একই রকম আচরণ আশা করতে পারেন। ক্লাউড রানের কাছে থাকা একই কন্টেইনারাইজড অ্যাপ্লিকেশনটি যদি আপনি স্থানীয়ভাবে চালাতেন, তাহলেও আপনার একই সমস্যা হতো।
এই সমস্যাটি সমাধান করুন। আপনাকে আপনার স্থানীয় ক্যালেন্ডার মডিউলের নামটি পরিবর্তন করে এমন একটি নাম রাখতে হবে যা কোনো স্ট্যান্ডার্ড মডিউলের নাম নয়। calendar.py ফাইলটির নাম পরিবর্তন করে my_calendar.py রাখুন, তারপর main.py এবং calendar-unittest.py ফাইলের import calendar লাইনগুলো পরিবর্তন করে import my_calendar করুন। সবশেষে, লাইনটি পরিবর্তন করুন।
roman = calendar.number_to_roman(number)
থেকে
roman = my_calendar.number_to_roman(number)
স্থানীয়ভাবে এটি পরীক্ষা করে দেখুন, টেস্টগুলো চালান এবং তারপর পুনরায় ডিপ্লয় করুন:
gcloud run deploy
এবং এখন এটি কাজ করে:

আপনি এই ইউআরএলটি শেয়ার করতে পারেন, এবং যাদের রোমান সংখ্যায় রূপান্তরের টুল প্রয়োজন, তারা সবাই আপনারটি ব্যবহার করতে পারবে।
৮. ঐচ্ছিক: এটিকে আরও সুন্দর করে তুলুন
আপনার অ্যাপ্লিকেশনটি ঠিকঠাক চলছে এবং ওয়েবে যে কেউ এটি ব্যবহার করতে পারছে। কিন্তু এর ডিজাইনটা একটু সাদামাটা। সবাইকে জানানোর আগে, এর চেহারা উন্নত করার জন্য জেমিনি কোড অ্যাসিস্টকে অনুরোধ করছেন না কেন?
templates/index.html ফাইলটি খুলুন। জেমিনি চ্যাট উইন্ডোতে জিজ্ঞাসা করুন:
Make this index.html file use material design.
এর প্রতিক্রিয়া হলো বর্তমান ফাইলটিতে সংযোজন করা, যার ফলে নিচের মতো কিছু একটা তৈরি হবে:
<!DOCTYPE html>
<html>
<head>
<title>Roman Numerals</title>
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
</head>
<body>
<h1 class="mdl-typography--title">Roman Numerals</h1>
<form action="/convert" method="post">
<div class="mdl-textfield mdl-js-textfield">
<input class="mdl-textfield__input" type="text" id="number" name="number" required />
<label class="mdl-textfield__label" for="number">Enter a number:</label>
</div>
<button class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">
Convert!
</button>
</form>
</body>
</html>
আইকনটি ব্যবহার করে প্রস্তাবিত কোডটি কপি করুন এবং index.html- এর বর্তমান কন্টেন্টের উপর পেস্ট করুন। টার্মিনালে, python3 main.py রান করুন এবং একটি প্রিভিউ উইন্ডো খোলার জন্য লিঙ্কে ক্লিক করুন। পেজটি এখন কিছুটা কম সাদামাটা:

আপনি চাইলে convert.html ফাইলের ক্ষেত্রেও এটি পুনরাবৃত্তি করতে পারেন।
জেমিনি কোড অ্যাসিস্ট সিএসএস বেশ ভালোভাবেই জানে, এবং আপনি এর সাহায্যে অ্যাপ্লিকেশন পেজগুলোকে নানাভাবে স্টাইল করতে পারেন। এটা তো সবে শুরু।
যেহেতু আপনি এই অ্যাপ্লিকেশনটি শেয়ার করতে চান, তাই এটিকে ক্লাউড রান-এ পুনরায় ডিপ্লয় করতে ভুলবেন না:
gcloud run deploy
যারা রোমান সংখ্যায় রূপান্তর করতে চান, আপনি তাদের কাছে ইউআরএলটি পাঠিয়ে দিতে পারেন।
৯. অভিনন্দন!
অভিনন্দন - আপনি সফলভাবে জেমিনি কোড অ্যাসিস্ট ব্যবহার করে একটি অ্যাপ্লিকেশনে টেস্ট যোগ করেছেন, এর ত্রুটিগুলো সংশোধন করেছেন এবং উন্নত কার্যকারিতা যুক্ত করেছেন।
আপনার তৈরি করা অ্যাপ্লিকেশনটির ব্যবহার শেষ হয়ে গেলে, ভবিষ্যতে কোনো সম্ভাব্য চার্জ এড়ানোর জন্য আপনি ক্লাউড কনসোল ড্যাশবোর্ড থেকে এটি মুছে ফেলতে পারেন।