הבלוג של ינון פרק

טיפים קצרים וחדשות למתכנתים

סיכום וובינר: איך לכתוב אפליקציות ל ChatGPT

10/11/2025

הי חברים,

בחמישי האחרון העברתי וובינר על פיתוח אפליקציות ChatGPT במסגרת קבוצת מדברים AI. היה מעניין לשמוע מה כולם חושבים על אפליקציות בתוך מסך ה Chat ומה אפשר לעשות איתן.

בעונה הנוכחית של מדברים AI אני מנסה להוסיף סיכומי וידאו לכל מפגש. בנושא פיתוח אפליקציות הסיכום המוקלט עלה בשני חלקים, חלק ראשון מסביר איך לכתוב שרת MCP ולחבר אותו ל ChatGPT:

https://youtu.be/KvUVtKRs9EU?si=FJXSGtHBM91dkXwQ

וחלק שני מסביר איך להוסיף רכיבי ממשק משתמש לשרת ה MCP הזה כדי להפוך אותו לאפליקציה:

https://youtu.be/h0uQUfrv2oA?si=fz4e-pmM6uE7CxT6

במפגש עצמו כשהראיתי את האפליקציה היא לא עבדה בגלל תקלה זמנית ב ChatGPT. לשמחתי התקלה נפתרה ועכשיו הכל עובד שוב.

דוגמת הקוד מהמפגש כבר נמצאת בגיטהאב יחד עם דף סיכום טקסטואלי בקובץ markdown הכל בקישור הזה:

https://github.com/ynonp/mcp-server-demo-deno

מקווה שתהנו אם פספסתם את המפגש או גם אם הייתם ורוצים לראות את הקוד בפעולה. חמישי הבא נדבר על Vibe Coding אפשר למצוא את כל הפרטים בדף הקבוצה:

https://www.tocode.co.il/talking_ai

טיפ רובי: אופרטור חללית עובד גם על מערכים

09/11/2025

אופרטור חללית הוא אחד האופרטורים החמודים של שפות תכנות. הוא גלגול של פונקציית strcmp עוד משפת C ותפקידו לקבל שני דברים ולהחזיר מה גדול יותר. מה שיפה בחללית הוא ערך ההחזר - 1 אם הדבר הראשון גדול יותר, 0 אם הם שווים ו -1 אם הערך השני גדול יותר. והוא נקרא חללית בגלל איך שהוא נראה.

הנה כמה דוגמאות על מספרים:

3.3.5 :004 > 2 <=> 3
 => -1
3.3.5 :005 > 3 <=> 3
 => 0
3.3.5 :006 > 5 <=> 3
 => 1

ועל מחרוזות:

3.3.5 :011 > 'a' <=> 'b'
 => -1
3.3.5 :012 > 'b' <=> 'b'
 => 0
3.3.5 :013 > 'c' <=> 'b'
 => 1

במחרוזות "גדול מ..." אומר שהדבר נמצא אחרי הדבר השני בסדר מילוני.

ועכשיו לחלק הכיפי - מסתבר שהחללית עובדת גם עם מערכים. כשמשווים מערכים רובי ישווה אותם איבר איבר. כך נוכל לכתוב:

3.3.5 :019 > [1, 2, 3] <=> [1, 5, 3]
 => -1

וזה מעולה כשיש לי כמה משתנים להשוות במכה אחת לדוגמה כשמשווים מספרי גירסה:

3.3.5 :023 > [major, minor, build] <=> [10, 4, 2]
 => 0

נ.ב. לפי ChatGPT אופרטור החללית עובדת בדיוק באותו אופן על מערכים גם ב PHP, C++, Groovy ו Elixir. בקלוז'ר הפונקציה compare אימצה את ההתנהגות וגם היא מטפלת במערכים באותה צורה.

הפתרון הנכון לא חייב להיות מסובך

08/11/2025

האם גם פתרון שנראה "קל מדי" או "לא מספיק גנרי" ראוי להיקרא הפיתרון הנכון? ומה בכלל החשיבות של השמות האלה?

טום ניק משווה בין "התיקון הקל" ל"פתרון הנכון" וטוען שלפעמים עדיף לבחור בתיקון הקל. הוא נותן דוגמה של ארכיטקטורה בה יש תיקון קל שפותר את הבעיה עכשיו אבל משאיר פחות אפשרויות לגמישות בעתיד בעוד שהפתרון הנכון פותר את הבעיה הנוכחית בצורה שגם תהיה קלה להרחבה בעתיד לפיצ'רים נוספים.

אבל אולי יותר נכון להסתכל על הדברים הפוך. אולי בסיפור של טום "התיקון הקל" הוא בעצם הפתרון הנכון. אולי הפתרון הנכון לא חייב להיות מסובך. הסיפור בפוסט עוסק בהודעות שגיאה ובאיזה פרטים בדיוק לשמור ב DB מתוך הודעת השגיאה. הפתרון הקל הציע לשמור רק את מה שעכשיו צריך ורק על השגיאה האחרונה והפתרון הנכון הציע לשמור את כל ההיסטוריה והסיפור של כל הודעה. ברור שאפשר לעשות הרבה יותר אם שומרים יותר מידע, אבל באותה נשימה אנחנו גם יודעים להגיד שלשמור יותר מדי מידע מנפח את ה DB, מקשה על גיבויים, מגדיל עלויות, מאט שליפות ומכריח אותנו לעבוד יותר קשה בתחזוקה.

הפתרון הנכון לא חייב להיות מסובך. כשמחזקים ארון עם יותר מדי ברגים זה לא הופך אותו לחזק יותר זה רק מסבך את הייצור ללא צורך אמיתי. הפתרון הנכון בתוכנה הוא הפתרון שדורש הכי מעט משאבים כדי לפתור את הבעיה שנמצאת אצלנו מול העיניים ומייצר הכי פחות משקל עודף - כלומר אילוצים שיסבכו אותנו במימוש פיצ'רים עתידיים.

לא לכל בעיה יש פתרון קל ואלגנטי אבל כשיש אחד כזה שווה להשתמש בו ולא להסתנוור מפתרונות של בעיות אחרות גדולות יותר.

באגים בקוד של אחרים

07/11/2025

הבאגים הכי מתסכלים הם באגים בקוד של אחרים, ובמיוחד בקוד של אחרים כשאין לך גישה לקוד המקורי או לסביבת הריצה שלהם.

כשהתוכנה שלי צריכה בשביל לעבוד למשוך מידע מ X אבל אותו X החליט היום בבוקר שהוא מחזיר מידע בפורמט שונה ממה שהחזיר עד עכשיו זה אני שצריך להתאים את הקוד לפורמט החדש. ואם אותו X מתחיל להחזיר שגיאות על בקשות שעד היום עבדו זאת המערכת שלי שלא תעבוד עד ש X יחזור לעבוד.

כשאמזון יורדת כל האינטרנט יורד איתה, כי כולם משתמשים בתשתיות הענן של אמזון בתור בסיס למערכות שלהם. אם שירות ענן מפסיק להגיב כל המערכות שתלויות באותו שירות ענן יפסיקו לעבוד.

וכך נולדה שרשרת האמון שאנחנו צריכים לתעד בכל מערכת שנבנה:

  1. קוד שלי - אמון הכי גבוה, אני רואה את הקוד ושולט בסביבת הריצה.

  2. קוד של ספריה שמשולב בקוד שלי - דורש קצת יותר זהירות, אני שולט בסביבת הריצה ויש לי גישה לקוד ובכל זאת לא אני כתבתי ואולי תיקון שאני אכניס ייצור קונפליקט עם פיתוח עתידי של אותה ספריה.

  3. מערכת צד שלישי שרצה אצלי On Prem - עוד יותר זהירות, הפעם הקוד בשפה שאני לא מכיר ולא בטוח שיש לי גישה אליו, אבל לפחות אני שולט בסביבת הריצה. במקרה חירום אני יכול להעלות או להוריד גירסה ובכל מקרה אני מחליט מתי לשדרג.

  4. מערכת צד שלישי שרצה על מחשב של מישהו אחר - זו תשתית הענן של אמזון. אלה המערכות שצריך להיות הכי חשדנים לגביהם כי כשמשהו נשבר אנחנו תקועים.

הבעיה שאין התאמה בין רמת האמון הנדרשת לכמה קל להתחיל להשתמש במוצר: הכי קל לשלב מוצר ענן חדש במערכת שלי (הרבה פעמים זו רק קריאת API). להתקין ספריה חיצונית יהיה יותר קשה, לכתוב לבד עוד יותר קשה ולהתקין מערכת חדשה On Prem דורש לא רק קוד אלא גם משאבי מחשוב נוספים וניטור מה שהופך את זה לאופציה הכי פחות נגישה. וכמובן AI מסבך עוד יותר את התמונה כי עכשיו אני לא יודע מי כותב את הקוד ומה האיכות.

מה עושים? קל להגיד קשה לממש: לומדים לקודד, בונים מערכות טובות, משתמשים במעט שירותי ענן ובוחרים שירותים אמינים, מבקרים קוד AI שנכתב, משלבים תלויות חיצוניות רק כשאנחנו מבינים מי כותב את הספריה ומי מפקח על גירסאות חדשות. וכדאי לזכור שזה תהליך, לא להיות קשים עם עצמנו שהמערכת שלנו היום לא כזאת. ה GDPR כן עשה משהו טוב בזה שהוא הכריח אותנו למפות את כל המערכות צד-שלישי שאנחנו מתחברים אליהן. עכשיו תוסיפו למיפוי הזה דירוג אמינות, בחרו מערכות יציבות שלא נופלות ונסו להבין אם באמת אתם צריכים מערכת צד-שלישי לפיצ'ר הזה במערכת או שאתם תעשו את זה טוב יותר In House.

טיפ JavaScript - ההבדל בין trunc ל floor

06/11/2025

כשאנחנו רוצים להפוך מספר עם נקודה עשרונית ב JavaScript למספר שלם ולמחוק את החלק שאחרי הנקודה העשרונית יש מספר פונקציות שיכולות לעזור:

parseInt(...)
Math.floor(...)
Math.round(...)
Math.trunc(...)
``

הבדלים? נשים לב:

1. פונקציית Math.trunc לדעתי הכי מומלצת. היא מוחקת את החלק שאחרי הנקודה העשרונית, יודעת לעבוד על מחרוזות ומחזירה שגיאה אם המחרוזת היא לא מספר כלומר:

```language-javascript
ynonp@ynons-MacBook-Air ~/tmp $ node
> Math.trunc(4.5)
4
> Math.trunc(4.8)
4
> Math.trunc(-4.8)
-4
> Math.trunc(-4.2)
-4
> Math.trunc("4.9")
4
> Math.trunc("4.9a")
NaN
>
  1. החברות שלה Math.round ו Math.floor מתנהגות דומה לגבי מחרוזות אבל ישנו לכם את המספר בשליליים או כשהמספר קרוב לקצה:
> Math.round(2.3)
2
> Math.round(2.8)
3
> Math.floor(4.2)
4
> Math.floor(4.8)
4
> Math.floor(-4.8)
-5
>
  1. החברה האחרונה parseInt לא תשנה את המספר אבל עלולה להתנהג מוזר אם תעבירו לה מחרוזת שמתחילה במספר ובאופן כללי עשויה להיות יותר איטית:
> parseInt(3.4)
3
> parseInt(-3.4)
-3
> parseInt(-3.8)
-3
> parseInt(3.8)
3
> parseInt("2 apples")
2

לכן הטיפ היום כשהופכים שבר למספר שלם ב JavaScript מומלץ להשתמש ב Math.trunc. הכי מהירה והכי מדויקת.

ה AI כותב יותר מדי קוד

05/11/2025

שואל המתכנת הצעיר: "ה AI כותב יותר מדי קוד ומשתמש בספריות שאני בכלל לא מכיר. איך אתם מספיקים לקרוא ולהבין את הכל?"

עונה המתכנת הזהיר: "ה AI באמת כותב המון קוד, בגלל זה אני דואג לארכיטקטורה טובה. אני סוגר את הקוד ש AI מייצר במודולים וקלאסים כדי שיהיה לי קל להחליף אותו במימושים טובים יותר כשאגלה את הבעיות".

ומתקן המתכנת החכם: "גם אנשים יכולים לכתוב יותר מדי קוד. בדיוק בשביל זה יש לנו הנדסת תוכנה. כשהמערכת כתובה נכון כל פיצ'ר ימומש ב PR קטן. אם ה AI או הבן אדם כותב המון קוד זה סימן לבעיה בארכיטקטורה של המערכת."

תרגילי JavaScript למתחילים

04/11/2025

יש לכם חברים או ילדים שמתחילים ללמוד תכנות מאפס ואתם רוצים לעזור להם לתרגל? הנה דף לא מאוד ארוך של תרגילים בסיסיים שמתאימים לכל מי שמתחיל או מתחילה ללמוד תכנות. הדף כתוב בשפת JavaScript אבל אפשר בקלות להשתמש בו גם לשפות אחרות. אל תפספסו את פרומפט העזר בסוף הדף שיגרום ל ChatGPT להיות המורה הפרטי שלכם.

המשך קריאה

תסביר לי כאילו אני בן 5

03/11/2025

אחד הפרומפטים שהכי כיף לכתוב ל AI - תסביר לי מהר, תסביר לי במלים קלות, תסכם לי את זה, תסביר לי כאילו אני בן 5.

הבעיה שבן 5 לא יצליח לעשות את מה שצריך לעשות כדי להתקדם.

ככל שיותר קל להגיע לידע כך קל לנו לשכוח את החשיבות שלו. כן זה עדיין חשוב לקרוא מסמכי איפיון לפרטי פרטים, זה עדיין חשוב להבין את כל הסעיפים בחוזה. ככל של AI יהיה יותר קל לעשות את הדברים הפשוטים לנו יהיה יותר זמן לקבל החלטות. ונחשו מה? עם ידע של בני 5 לא יהיו לכם את הכלים לקבל את ההחלטות הנכונות.

כשאני יושב על גיט של פרויקט היום אני מגלה שהרבה יותר קל להגיע לאינפורמציה: תסביר לי למה השורה הזאת שם, מי שם אותה, למה הם לא השתמשו בתבנית ההיא, איזה Issues הביאו לכתיבה של הקומיט הזה, איפה עוד בקוד משתמשים בדבר הזה ולמה. היכולת לדבר עם AI שיש לו גישה לכל היסטוריית הפרויקט, לכל ה Issues, לכל היסטוריית הדיונים על הפרויקט ולכל פרויקט אחר בעולם פותחת דלת להבנה שמעולם לא היתה לנו. אל תאמלק - תחפור.

פוסט נוסטלגי: הצגת XML עם XSLT בדפדפן

02/11/2025

לאחרונה נשמעים קולות שקוראים להפסיק לתמוך בהצגת XML באמצעות XSLT בדפדפנים וזו הזדמנות טובה להיזכר בסטנדרט שאף אחד לא משתמש בו אבל עדיין עובד בכל הדפדפנים והיה נשמע כמו רעיון טוב לפני בערך 20 שנה.

באזור שנת 2000 האינטרנט הגיע למיצוי. פיירפוקס ייוולד רק ב 2004 וכרום עוד 4 שנים אחריו ב 2008. דפדפן האינטרנט שכולם השתמשו בו נקרא Internet Explorer. גירסה 5 שלו יצאה ב 1999 וב 2001 גירסה 6 שנחשבה אלמותית. באותו הזמן מפתחים ראו באינטרנט הזדמנות ליצירת אפליקציות מבוזרות ולחבר בין מערכות שונות, בלי קשר לדפדפן. כלומר כל מערכת תשלח ותקבל קבצי מידע מסוג XML ובאמצעותם תחובר למערכות אחרות, כך שלדוגמה מערכת להזמנת טיסות תכיל שרת שישלח XML-ים עם המידע לתוכנת צד לקוח שתדע להציג את ה XML-ים האלה. וכן היתה טכנולוגיה בשם Java Applets שאפשרה לכתוב קוד Java ולהפיץ אותו באמצעות דפדפן אינטרנט.

בתוך העולם הזה היה נשמע רק הגיוני לאפשר לדפדפנים להציג קבצי XML, אך מאחר ודפדפנים ידעו להציג רק קבצי HTML ו XML הוא פורמט כללי שבו אין מגבלה על שמות התגים עלה הצורך למפות בין תגיות XML לתגיות HTML. בדוגמה של אתר הזמנת הטיסות אם כבר יש לך מערכת להזמנת טיסות שמוציאה קבצי XML לתוכנות ול Applets שרצים אצל הלקוחות, תוכל להוסיף קובץ מיפוי שיראה לדפדפן איך לעבור מקובץ נתוני הטיסות שלך ל HTML וכך גם הדפדפן יוכל להציג את המידע לפחות לקריאה.

ואיך זה נראה? האמת שדי פשוט. ניקח קובץ XML לדוגמה מאתר של ספריה שמכיל רשימה של 3 ספרים:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="demo.xsl"?>

<librairie>
  <livre>
    <titre>Le Petit Prince</titre>
    <auteur>Antoine de Saint-Exupéry</auteur>
    <prix>8.50</prix>
  </livre>
  <livre>
    <titre>1984</titre>
    <auteur>George Orwell</auteur>
    <prix>9.90</prix>
  </livre>
  <livre>
    <titre>Harry Potter à l'école des sorciers</titre>
    <auteur>J.K. Rowling</auteur>
    <prix>12.00</prix>
  </livre>
</librairie>

חוץ מהצרפתית שימו לב לשורה השנייה בקובץ, שמצביעה לקובץ מיפוי. זה תוכנו:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- Le résultat sera du HTML -->
  <xsl:output method="html" encoding="UTF-8" indent="yes"/>

  <!-- Modèle de transformation principal -->
  <xsl:template match="/">
    <html>
      <head>
        <title>Liste des livres</title>
        <style>
          body { font-family: Arial, sans-serif; margin: 40px; }
          table { border-collapse: collapse; width: 60%; }
          th, td { border: 1px solid #999; padding: 8px; text-align: left; }
          th { background-color: #f2f2f2; }
        </style>
      </head>
      <body>
        <h2>Ma librairie</h2>
        <table>
          <tr>
            <th>Titre</th>
            <th>Auteur</th>
            <th>Prix (€)</th>
          </tr>
          <!-- Boucle sur chaque livre -->
          <xsl:for-each select="librairie/livre">
            <tr>
              <td><xsl:value-of select="titre"/></td>
              <td><xsl:value-of select="auteur"/></td>
              <td><xsl:value-of select="prix"/></td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

קובץ המיפוי מכיל תבנית HTML שבתוכה פקודת for-each שאחראית לשתול את המידע מה XML לתוך התבנית. עכשיו הקסם מתחיל:

  1. שימו את שני הקבצים באותה תיקיה.

  2. הפעילו משורת הפקודה בתיקיה:

npx local-server
  1. כנסו בדפדפן ל localhost:8000 ותוכלו לראות את רשימת הספרים בטבלה - כאילו בנינו קובץ HTML עם הרשימה.

תהנו מזה כל עוד זה עובד. הדיבור הוא להוריד את התמיכה עד סוף 2026 אבל נחכה ונראה: https://developer.chrome.com/docs/web-platform/deprecating-xslt

הכלל הראשון של סוכני קידוד

01/11/2025

מישהו פרסם רשימה של 10 כללים של סוכני קידוד. כבר הראשון שבהם מעורר מחלוקת:

Your Agent is not going to have a better idea about what you want to achieve than you do. In other words, if you don’t have a clear idea about what you want, your agent won’t either.

והבעיה היא המילה what במשפט. כמפתחים חלק חשוב מהעבודה שלנו הוא לתרגם דרישות לקוח בשפה טבעית לשפת מכונה ואותו תרגום כולל קבלת החלטות וגם ניחושים לגבי העתיד. אם הלקוח שלי זיהה שטבלה מסוימת לא מציגה את הנתונים כמו שהוא רוצה לראות אותם אני כמפתח יכול לבחור אם אני רוצה לשנות רק את התצוגה באותה טבלה או לבנות תשתית לבחירת אופן התצוגה שתעזור לי גם לתקן את הטבלה וגם אולי לתקן מקומות אחרים בעתיד (אם הלקוח יבקש אותם) או לשנות את מבנה בסיס הנתונים. לכל אופציה יתרונות וחסרונות שתלויים בכל הסיטואציה של המערכת והתוכניות לעתיד. ברור שלסוכן קידוד אין את הכלים להחליט איזה משלושת האופציות היא הכי טובה לטיפול בדרישה זו.

מה שסוכן קידוד כן יודע לעשות ומאוד טוב זה לייצר רעיונות. אז באותה סיטואציה של דרישת לקוח לתקן טבלה אני יכול להיעזר בסוכן קידוד כדי לקבל מפה רחבה של האפשרויות שלי - מפה שלעולם לא הייתי מקבל מ Junior Engineer בצוות. פרומפטים לדוגמה:

לקוח ביקש לשנות את מבנה הטבלה. אני מתלבט אם צריך לשנות רק את התצוגה או גם את הנתונים בבסיס הנתונים. הצג לי את היתרונות והחסרונות של כל גישה.

לקוח ביקש לשנות את מבנה הטבלה ואני חושד שהוא יבקש שינויים דומים בעתיד. מפה במערכת את כל המקומות שעשויים להרוויח מיצירת תשתית גנרית לבחירת אופן תצוגה של נתונים אלה.

לקוח ביקש לשנות את מבנה הטבלה. סרוק את כל ה Issues מהשנה האחרונה ושער מה יהיו השינויים הבאים שהלקוח יבקש על טבלה זו. נמק באמצעות דוגמאות מ Issues קודמים.

לקוח ביקש לשנות את מבנה הטבלה. הצע 5 דרכים שונות לביצוע השינוי, החל משינוי נקודתי בתצוגה ועד שינוי גורף במבנה בסיס הנתונים.

אני רוצה לשנות את מבנה הטבלה דרך שינוי התצוגה. למה חשוב לשים לב כשכותבים את השאילתות מבחינת ביצועים ושימוש בזיכרון?

ההצעה להתיחס לסוכן קידוד בתור Junior Engineer נכונה לפרויקטים מסוימים בעיקר פרויקטים חדשים. בפרויקטים וותיקים כשהקידוד הוא לא צוואר הבקבוק אנחנו מעדיפים להשתמש ב AI כמכונת רעיונות שמחזקת ומגבירה את החשיבה. כן הוא בהחלט יודע יותר ממני ואני שמח לסחוט כל טוקן של אינפורמציה לפני שאני ניגש לשבור את הקוד.