1. מבוא
בשיעור ה-Lab הזה תשתמשו ב-Gemini Code Assist, שותף מבוסס-AI ב-Google Cloud, כדי להוסיף בדיקות לאפליקציית אינטרנט קיימת של Python, וגם למצוא ולתקן שגיאות באפליקציה שנחשפה באמצעות הבדיקות. לאחר מכן תוכלו להשתמש ב-Code Assist כדי ליצור בדיקות לפונקציונליות חדשה ולייצר קוד כדי לעבור את הבדיקות האלה ולהרחיב את האפליקציה.
מה עושים...
- כדי להוריד קוד של אפליקציית אינטרנט קיימת, תצטרכו להשתמש ב-Cloud Shell Editor.
- כדי לשאול שאלות כלליות על Google Cloud, תשתמשו ב-Gemini Code Assist Chat ב-Cloud Shell Editor.
- תשתמשו בעזרה עם הקוד של Gemini Code Assist ב-Cloud Shell Editor כדי ליצור בדיקות לאפליקציה, להריץ את הבדיקות, לאתר ולתקן שגיאות. אחר כך תוכלו להרחיב את הפונקציונליות של האפליקציה.
מה תלמדו...
- איך משתמשים ב-Gemini Code Assist לביצוע כמה משימות של פיתוח, כמו יצירת בדיקה ויצירת קוד.
- איך משתמשים ב-Gemini Code Assist כדי ללמוד על Google Cloud.
מה צריך...
- דפדפן האינטרנט Chrome
- חשבון Gmail
- פרויקט בענן שהופעל בו חיוב
- Gemini Code Assist מופעל בפרויקט שלך ב-Cloud
שיעור ה-Lab הזה מיועד למפתחים בכל הרמות, כולל למתחילים. למרות שהאפליקציה לדוגמה היא בשפת Python, לא צריך להכיר תכנות Python כדי להבין מה קורה. נתמקד בהיכרות עם היכולות של Gemini Code Assist למפתחים.
2. הגדרה
כבר צריך להיות לכם פרויקט ב-Cloud עם אפשרות חיוב לשימוש בשיעור ה-Lab הזה. עכשיו נפעיל את Gemini API בפרויקט שלנו ב-Google Cloud. כך תעשו זאת:
- נכנסים לכתובת https://console.cloud.google.com ומוודאים שבחרתם את הפרויקט ב-Google Cloud שאתם מתכוונים לעבוד איתו בשיעור ה-Lab הזה. לוחצים על הסמל של Gemini שמופיע בפינה השמאלית העליונה.
- החלון של מסוף Gemini ל-Cloud ייפתח בצד שמאל של המסוף. לוחצים על הלחצן הפעלה אם הוא מופיע למטה. אם הלחצן הפעלה לא מופיע ובמקום זאת מוצג ממשק Chat, סימן שכבר הפעלתם את Gemini ל-Cloud בפרויקט, ואתם יכולים לעבור ישירות לשלב הבא.
- אחרי שמפעילים את Gemini, אפשר לשאול אותו שאילתה או שתיים כדי לנסות אותו. מוצגות מספר שאילתות לדוגמה, אבל אפשר לנסות משהו כמו מה זה Cloud Run?
תקבלו תשובה מ-Code Assist לשאלה שלכם. אפשר ללחוץ על הסמל בפינה השמאלית העליונה כדי לסגור את חלון הצ'אט של Code Assist.
הפעלת Gemini ב-Cloud Shell Editor
Gemini Code Assist זמין ומתנהג באופן דומה בכמה סביבות פיתוח משולבות (IDE) פופולריות. ב-Codelab הזה משתמשים ב-Google Cloud Shell Editor, שפועל במלואו בדפדפן האינטרנט. כדי להפעיל ולהגדיר את Gemini ב-Cloud Shell Editor, פועלים לפי השלבים הבאים:
- מפעילים את Cloud Shell דרך הסמל שמוצג למטה. ההפעלה של המכונה של Cloud Shell עשויה להימשך דקה או שתיים.
- לוחצים על הלחצן Editor או Open Editor (בהתאם למצב) וממתינים עד שמופיע Cloud Shell Editor. אם מופיע הלחצן רוצה לנסות את העורך החדש?, לוחצים עליו.
- לוחצים על הלחצן Cloud Code – כניסה בשורת הסטטוס התחתונה, כמו שמוצג. מאשרים את הפלאגין לפי ההוראות. אם בשורת הסטטוס כתוב Cloud Code – אין פרויקט, בוחרים את הפרויקט הספציפי ב-Google Cloud מרשימת הפרויקטים שבהם אתם מתכוונים לעבוד.
- אם הסמל של Gemini לא מופיע בשורת הסטטוס בצד שמאל למטה, צריך להפעיל אותו ב-Cloud Code. לפני עושים זאת, צריך לוודא ש-Gemini (שנקרא בעבר Duet AI למפתחים) מופעל בסביבת הפיתוח המשולבת (IDE). לשם כך, עוברים אל Cloud Code Extension → Settings (הגדרות התוסף של Cloud Code) ומזינים את הטקסט Duet AI: Enable כמו שמוצג בהמשך. מוודאים שתיבת הסימון מסומנת. צריך לטעון מחדש את סביבת הפיתוח המשולבת (IDE). כך Gemini יופעל ב-Cloud Code, ושורת הסטטוס של Gemini תופיע בסביבת הפיתוח המשולבת (IDE).
- לוחצים על הלחצן Gemini בפינה השמאלית התחתונה כמו שמוצג ובוחרים את הפרויקט הנכון ב-Google Cloud שעבורו הפעלנו את Cloud AI Companion API.
- אחרי שבוחרים את הפרויקט ב-Google Cloud, חשוב לוודא שאפשר לראות אותו בהודעת הסטטוס של Cloud Code בשורת הסטטוס, ושגם Gemini מופעל בצד שמאל, בשורת הסטטוס שמוצגת כאן:
Gemini Code Assist מוכן לשימוש!
3. הורדת האפליקציה ובדיקתה
בחלון הטרמינל, מריצים את הפקודה כדי לשכפל את המאגר עם קוד ההתחלה ואז עוברים לספרייה החדשה (אם חלון הטרמינל כבר לא פתוח, לוחצים על הלחצן Terminal או Open Terminal כדי לשחזר אותו):
git clone https://github.com/GoogleCloudPlatform/testing-with-duet-ai-codelab.git
cd testing-with-duet-ai-codelab
פותחים את main.py בעורך, ואז פותחים את החלון של Gemini Chat בלחיצה על סמל הצ'אט של Gemini בצד ימין של כלי העריכה. החלון הזה של Gemini Chat נמצא בתוך סביבת הפיתוח המשולבת (IDE), והקוד בסביבת הפיתוח המשולבת זמין כהקשר לדיון. מזינים את ההנחיה הסבר על זה ומעיינים בתשובה:
אפשר לגלול את חלון הצ'אט הזה כדי לראות את התשובה המלאה. לפי ההסבר, אנחנו יכולים להריץ את התוכנית הזו באופן מקומי באמצעות הפקודה python3 main.py
בחלון הטרמינל.
4. הפעלה מקומית
עוברים לספריית המאגר עם cd ~/testing-with-duet-ai-codelab
אם צריך, ומזינים את הפקודה python3 main.py
בחלון הטרמינל:
אפשר ללחוץ על הקישור http://127.0.0.1:8080 כדי לפתוח כרטיסייה חדשה בדפדפן לדף הבית של האפליקציה:
האפליקציה פועלת "באופן מקומי". למעשה, Cloud Shell Editor עשה כאן קצת קסם. האפליקציה פועלת ב-Cloud Shell, ולא במחשב שלכם. כשלוחצים על הקישור, נפתחה כרטיסייה שמפנה לכתובת המקומית בפועל http://127.0.0.1:8080, אלא לשרת proxy שהוגדר על ידי Cloud Shell למטרה הזו בלבד. אפקט זהה לזה שבו מריצים את הקוד באופן מקומי בפועל.
רוצה לנסות? מזינים 25 ולוחצים על המרה!
נכון, 25 הוא XXV במספרים רומיים! חובה לסיים כאן.
כדאי לבדוק עוד כמה מספרים. 25 עבד, ומה לגבי 24?
אולי היינו קצת זריזות לחשוב שהכול בסדר. האם XXIIII היא ההמרה הנכונה ל-24? לא אמור להיות XXIV?
יכול להיות מצב שבו XX2III הוא נכון, אבל זה לא בדיוק מה שאנשים מצפים לקבל. עם זאת, בגלל שהתשובה לא שגויה, שימו לב ששעונים רבים מציגים את הספרה 4 בתור הספרה הרומית IIII, לכן מומלץ להשאיר את הבעיה לשיפור עתידי.
אולי כדאי לנסות מספרים שליליים? אפס? אין דרך לייצג את המספרים האלה בספרות רומיות. נראה ששום דבר לא חזר למשתמש, ונראה שמדובר בשגיאה שצריך לטפל בה.
הבדיקות יכולות לאתר שגיאות ולמנוע אותן, ו-Gemini Code Assist יכול לעזור לנו לכתוב בדיקות ולהשתמש בהן.
5. הוספת בדיקות
חוזרים לחלון של Gemini Chat ושואלים
How can I test the number_to_roman function?
קוראים את התשובה, שכוללת דיון במודול unittest ובמודול pytest.
יכול להיות שתרצו ש-Gemini Code Assist יכתוב את הבדיקות האלה בשבילכם. פותחים את הדף calendar.py, שבו נמצא קוד ההמרה בפועל, חוזרים לחלון Gemini Chat ושואלים שוב
How can I test the number_to_roman function?
התשובה עכשיו יותר ספציפית, גם אם יש מודול שלunittest שאפשר להעתיק או להוסיף לקובץ חדש:
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")
יכול להיות שתראו קוד שונה מהדוגמה שלמעלה. המודלים הבסיסיים של Gemini Code Assist מתעדכנים מדי פעם, כך שהתשובות לא תמיד יהיו זהות. אם מוצגת קבוצה אחרת של קוד, עכשיו אפשר לבחור אם להמשיך עם הדוגמאות שמוצגות ב-Codelab הזה על ידי העתקת הקוד שמוצג כאן. אפשר גם לנסות את התשובה החלופית ש-Gemini Code Assist נותן לך עכשיו. אם יש לכם זמן, תוכלו אפילו לנסות את שני הנתיבים. Gemini Code Assist הוא עוזר דיגיטלי בתכנות שאפשר להשתמש בו לפי הצורך.
לוחצים על החץ שמצביע פעמיים בפינה השמאלית העליונה של החלון של Gemini Chat כדי ליצור קובץ חדש עם הקוד לבדיקת היחידה, או משתמשים בסביבת הפיתוח המשולבת (IDE) כדי ליצור קובץ חדש ומדביקים את הקוד שמוצג בשיעור ה-Lab הזה. מקישים על CTRL-S או CMD-S בחלון זה כדי לשמור אותו וקוראים לקובץ calendar-unittest.py.
חוזרים אל הטרמינל ומקישים על CTRL-C כדי לעצור את שרת האינטרנט שבו הפסקתם לפעול מוקדם יותר ולקבל הנחיית מעטפת. מזינים את הפקודה.
python3 calendar-unittest.py
כדי להריץ את הבדיקות החדשות.
אין פלט. זה לא מה שציפיתי שיקרה. האם הכול עבר בשקט? אתם רוצים לדעת את זה בוודאי. בודקים את התשובה מ-Gemini Code Assist שכוללת את קוד הבדיקה. מתחת לקוד מופיע מידע נוסף על אופן הרצת תרחיש הבדיקה:
כדאי לנסות להריץ את הפקודה המומלצת:
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
. כל הבדיקות שנכשלו היו למקרים דומים. כאשר הבעיה הזו צוינה לראשונה, שיעור ה-Lab אמר, "בגלל שהתשובה לא ממש שגויה (שימו לב שבשעונים רבים רואים את 4
כספרה רומית IIII
), צריך להשאיר את הבעיה הזו לצורך שיפור עתידי."
אפשר לשנות את מקרי הבדיקה כדי לצפות ולקבל את ההודעה "לא ממש שגוי" עונה על הקוד שניתן, או מאשרים שהגיע הזמן ל"שיפור עתידי". בשלב הבא, עליך לתקן את הקוד בעזרת Gemini Code Assist, כדי לתת תשובות מקובלות יותר שהבדיקות מצפים להן.
6. שיפור הקוד
חשוב לזכור שתגובות כמו XXIIII
עבור 24
, במקום XXIV
הנפוצות יותר, הוגדרו כ'לא ממש שגויות' ונפסלו לצורך שיפור עתידי. העתיד הזה נמצא עכשיו. הדפים ש"לא ממש שגויים" התשובות עדיין מעצבנות.
הכלל הראשון למספרים חוזרים על מספרים רומיים הוא: בכל פעם שיש ארבע ספרות זהות ברצף, צריך להחליף אותן באחת מהספרות ואחריהן בספרה הבאה. לכן צריך להחליף את XXIIII
ב-XXIV
. באופן דומה, צריך לשנות את XXXX
ל-XL
, ואת CCCC
צריך להיות CD
.
אפשר לשאול את Gemini Code Assist באופן הזה כדי לשנות את הערך של המשתנה roman לפני שהוא מוחזר על ידי number_to_roman:
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?
ההצעה היא להוסיף קוד בסוף:
אפשר להעתיק, להדביק או להקליד את השורות האלה בעורך, ולבדוק מה קורה:
נוספו עוד שורות ל-Gemini Code Assist כדי לטפל בבקשות תמיכה שיכולות לטפל בהן אחרי ביצוע ההחלפה הראשונה. לדוגמה, המספר 19 יומר ל-XVIIII, לאחר מכן ל-XVIV ולבסוף ל-XIX הנכון.
אם Gemini Code Assist הציע הצעות מועילות, מקישים על Tab כדי לקבל את ההמלצות, לשמור את הקובץ ולהפעיל שוב את שרת האינטרנט. אם לא, מוסיפים כאן את השורות שמוצגות בדוגמה באופן ידני ושומרים את הקובץ. נסה המרה לא פשוטה: 1999:
זה נכון.
כדאי להריץ מחדש את הבדיקות עכשיו. כולם עברו!
נראה שאפליקציית האינטרנט מוכנה לייצור.
7. פריסה ב-Cloud Run
Cloud Run יפעיל עבורכם אפליקציה בקונטיינרים באינטרנט. באפליקציות שנכתבו באמצעות frameworks נפוצות, כמו Flash, הפקודה gcloud run deploy
אפילו תיצור בשבילכם את הקונטיינר לפני הפריסה שלו. מריצים את הפקודה:
gcloud run deploy
במסוף. כשמוצגת השאלה לגבי המיקום של קוד המקור, מקישים על Enter כדי לאשר את המיקום הנכון שהוא מציע. באופן דומה, כשמופיעה בקשה לתת שם לשירות, מקישים על Enter כדי לקבל את ההצעה.
הפקודה עלולה להיכשל כי gcloud לא יכול לקבוע באיזה פרויקט להשתמש. במקרה כזה, מריצים את הפקודה:
gcloud config set core/project <project-id>
כאשר
יוחלף במזהה הפרויקט, שיכול להיות זהה לשם הפרויקט. לאחר מכן מריצים מחדש את הפקודה gcloud run deploy
.
- הפקודה תבקש מכם שממשקי API מסוימים נחוצים ועדיין לא מופעלים. צריך להזין y כדי שהם יופעלו.
- כשמתבקשים לבחור אזור, בוחרים את האזור שנוח לכם. הזנת המספר התואם ל-
us-central1
היא בחירה בטוחה. - כשמוצגת בקשה לעשות זאת, מקישים על Y כדי להמשיך.
- צריך לאפשר הפעלות לא מאומתות של שירות Cloud Run הזה. אפשרות האימות שמשמשת את Cloud Run מתאימה לשימוש של תוכנות שמבצעות קריאה לשירות. מאחר שזהו אתר, לא ייעשה שימוש באימות.
מערכת Google Cloud תיצור את הקונטיינר, תפרס אותו, תנתב אליו תעבורת נתונים ותגדיר מדיניות גישה, ואז תציג את הקישור לדף הבית:
אפשר לעבור לקישור הזה ולגשת לאפליקציה.
מזינים מספר ומקישים על Enter, ואז על tada!
מה!?!
זה עבד במחשב שלכם! למה הסרטון לא הסתיים?
אפשר לגלות. אפשר לשאול את Gemini Code Assist,
Why am I getting an internal server error on cloud run?
נראה ש-Gemini Code Assist יכול לקרוא את קובץ היומן, עם כיתוב דומה. בואו נשאל את Gemini Code Assist באופן עצמאי לגבי יומנים:
עשה זאת. חפשו קווים עם אדום !! סימני שגיאה, כמו בדוגמה הבאה:
בהמשך מופיעות שורות רבות של פירוט על מקבץ השיחות שמקודם כאן, אבל יש עוד:
כשתעיינו בקובץ calendar.py, תוכלו לראות שם את הפונקציה number_to_roman! ואתם יודעים שזה נכון כי זה עבד במחשב שלכם. מה יכול להיות שונה ב-Cloud Run?
התשובה מורכבת. ב-Python3 קיים מודול סטנדרטי שנקרא calendar, בדיוק כמו קובץ ה-calendar.py שבו מוגדרת הפונקציה number_to_roman. במחשב המקומי, כשמערכת Python מחפשת מודול בשם calendar, היא חיפשה קודם בספריית האפליקציות. נראה ש-Python ב-Cloud Run חיפש קודם מודולים סטנדרטיים, ייבא אותם ולא מצא פונקציה number_to_roman.
תמיד יכולים להיות הבדלים כאלה בין סביבות. למרבה המזל, כאשר אפליקציה בקונטיינרים נושאת את הסביבה שלה, היא יכולה לצפות לאותה התנהגות בכל מקום שבו מריצים אותה. אם הייתם מפעילים באופן מקומי את אותה אפליקציה בקונטיינרים שיש ב-Cloud Run, הייתם נתקלים באותה בעיה.
תקן בעיה זו. עליך לשנות את השם של מודול היומן המקומי לשם שאינו שם של מודול סטנדרטי. משנים את השם של הקובץ calendar.py ל-my_calendar.py, ואז משנים את השורות import calendar
ב-main.py וב-calendar-unittest.py ל-import my_calendar
. בסוף, משנים את הקו
roman = calendar.number_to_roman(number)
עד
roman = my_calendar.number_to_roman(number)
אפשר לנסות אותו באופן מקומי, להריץ את הבדיקות ואז לפרוס מחדש:
gcloud run deploy
עכשיו זה עובד:
אתם יכולים לשתף את כתובת ה-URL הזו, וכל מי שזקוק לכלי להמרה של ספרות רומיות יוכל להשתמש בכתובת שלכם.
8. אופציונלי: שיפור המראה
האפליקציה פועלת בצורה תקינה ונגישה לכל אחד באינטרנט. אבל הוא נראה קצת פשוט. לפני שתספר לכולם על הכרטיס, למה לא לבקש מ-Gemini Code Assist לשפר את המראה שלו?
פותחים את הקובץ templates/index.html
. בחלון הצ'אט של Gemini, שואלים:
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 אם רוצים.
Gemini Code Assist מכיר היטב את CSS, ויכול לעזור לך לעצב את דפי האפליקציה במגוון דרכים. זוהי רק ההתחלה.
מכיוון שאתם רוצים לשתף את האפליקציה הזו, חשוב לזכור לפרוס אותה מחדש ב-Cloud Run:
gcloud run deploy
אפשר להעביר את כתובת ה-URL לאנשים שצריכים להמיר למספרים רומיים.
9. מעולה!
כל הכבוד! פעלת בהצלחה עם Gemini Code Assist כדי להוסיף בדיקות לאפליקציה, לתקן שגיאות באפליקציה ולהוסיף פונקציונליות משופרת.
כשתסיימו להשתמש באפליקציה שאתם מפתחים, תוכלו למחוק אותה ממרכז הבקרה של מסוף Cloud כדי להפסיק חיובים עתידיים.