למה הסצנריו ב-Make רץ 19 פעמים - וההבנה שהופכת אותו מקופסה שחורה לכלי שאתה שולט בו
אתם בונים סצנריו ב-Make, והוא רץ 19 פעמים במקום פעם אחת. או שאתם לא מצליחים לחלץ ערך אחד ממערך בלי שלושה מודולים. Make מרגיש כמו קופסה שחורה - עד שמבינים דבר אחד: הכל מתנהג לפי מבני הנתונים מאחורי הקלעים. עוז רוט לימד את זה לעומק: ההבדל בין מערך לאובייקט קובע אם תקבלו בנדל אחד או עשרים, ומי שמבין את זה מפסיק לנחש ומתחיל לשלוט. Make חי ובועט, והעקרונות (מערכים, אובייקטים, iterate מול aggregate) אוניברסליים לכל כלי. 6 הפרומפטים למטה הופכים את Make לשקוף.

הערת הכתבת: המפגש הזה (27.8.2024) עומד יפה מאוד - Make (לשעבר Integromat) חי, פעיל, ואחד מכלי האוטומציה המובילים, וכל מה שעוז מלמד כאן - מבני נתונים, iterators, aggregators, map/get/split, משתנים - נכון בדיוק כמו ביום ההרצאה. יתרה מזו, ההבנה של מערך מול אובייקט ושל "iterate מול aggregate" היא לא ידע על Make בלבד - זה בסיס של כל עבודה עם דאטה, בכל כלי אוטומציה ובכל שפת תכנות. אז גם אם מחר תעברו ל-n8n או לקוד, ההבנה הזו תיסע איתכם. הפרומפט הפתוח למטה עוזר ליישם על הסצנריו שלכם.
כל מי שעבד עם Make מכיר את הרגע המתסכל: הסצנריו רץ, אבל מודול אחד רץ 19 פעמים ואתם לא מבינים למה. או שאתם צריכים לשלוף מייל אחד מתוך רשימה, ונתקעים עם Iterator, Filter ו-Aggregator על משהו שהיה צריך לקחת שנייה. Make מרגיש קסום כשהוא עובד, ומטריף כשלא. במפגש העשירי של אוטוטיוזדיי עוז רוט עשה בדיוק את מה שהכותרת מבטיחה - הפך את Make ל"איזי" - בכך שלימד את מה שמתחת: מבני הנתונים שקובעים כל התנהגות. וברגע שמבינים אותם, Make מפסיק להפתיע.

המסע: 6 תחנות
כל תחנה = מה קרה בסשן + הפרומפט שאורז את זה בשבילכם
המורה למבני נתונים ב-Make
עוז פתח מהיסוד שהכל נשען עליו: מבני הנתונים. הוא עבר על סוגי הנתונים (String במירכאות, Number בלעדיהן, Boolean, תאריך), הסביר מה זה JSON - הפורמט שכל מה ש-Make עושה מאחורי הקלעים נוגע בו - ואז הגיע להבחנה שפותרת חצי מהבלבול: מערך מול אובייקט. מערך ([]) הוא רשימה של ערכים דומים. אובייקט ({}) הוא צמדים של Key ו-Value. והחוק שמסביר את כל התנהגות Make: אם Make מקבל מערך של אובייקטים - הוא מפצל אותם לבנדלים נפרדים, ואם הוא מקבל אובייקט אחד שמכיל מערך - הוא נותן בנדל אחד, וצריך Iterator כדי לפצל. עוז לימד שרק מהסתכלות ב-raw data של מודול אפשר לדעת מראש אם תקבלו בנדל אחד או עשרים. זה ההבדל בין לנחש למבין.
ההמשך המלא של הפרומפט שמור לחברי אוטוטיוזדיי פלוס יחד עם ההקלטה והתמלול המלאים של הסשן
שורות ההמשך כוללות את כל ההנחיות המדויקות והדוגמאות שהוצגו בשידור החי מול הקהילה
מאבחן בעיית 'רץ יותר מדי פעמים'
ואז עוז ניגש ישר לתסכול הכי מוכר: 'המודול רץ 19 פעמים, למה?'. העיקרון שהוא נתן פשוט וחזק: כל מודול שמקבל יותר מבנדל אחד הופך בפועל ל-Iterator - הוא רץ פעם לכל בנדל, ולכן כל מה שאחריו רץ שוב ושוב. אם מודול רץ X פעמים, כמעט תמיד כי המודול שלפניו החזיר X תוצאות. הוא לימד לשאול: מה החזיר המודול הקודם? יש Iterator בתוך Iterator (10 לקוחות כפול משימות = 19)? ואז ההכרעה: אם אתם באמת רוצים שזה ירוץ על כל בנדל - זה פיצ'ר, להשאיר. אם צריך לאחד - הפתרון הוא Aggregator. פתאום 'הבאג המסתורי' הופך להתנהגות צפויה שאתם שולטים בה.
ההמשך המלא של הפרומפט שמור לחברי אוטוטיוזדיי פלוס יחד עם ההקלטה והתמלול המלאים של הסשן
שורות ההמשך כוללות את כל ההנחיות המדויקות והדוגמאות שהוצגו בשידור החי מול הקהילה
שולט ב-source module של אגרגטור
פה עוז פתח את הנושא שהכי מבלבל אנשים ב-Make: האגרגטור, וההגדרה שאיש לא מבין בהתחלה - Source Module. אגרגטור עושה את ההפך מ-Iterator: לוקח כמה בנדלים ומאחד. אבל כמה פעמים הוא רץ? זה נקבע בדיוק לפי ה-Source Module - מספר הריצות = מספר התוצאות של אותו מודול מקור. רוצים תוצאה אחת מאוחדת? בוחרים source שמחזיר בנדל אחד. רוצים דוח נפרד לכל לקוח מתוך 10? בוחרים source שמחזיר 10. עוז גם חשף את 'האזור האפור' - כל הנתונים בין ה-source module לאגרגטור נעולים ולא ניתנים למיפוי בהמשך. ההבנה הזו לבדה פותרת את רוב התסכול מאגרגטורים. זה לא קסם, זו הגדרה אחת שצריך להבין.
ההמשך המלא של הפרומפט שמור לחברי אוטוטיוזדיי פלוס יחד עם ההקלטה והתמלול המלאים של הסשן
שורות ההמשך כוללות את כל ההנחיות המדויקות והדוגמאות שהוצגו בשידור החי מול הקהילה
חילוץ נתונים ממערך עם map ו-get
וכאן עוז לימד את מה שחוסך הכי הרבה מודולים מיותרים: חילוץ נתונים ממערך עם map ו-get, במקום Iterator ו-Filter בזבזניים. הוא עבר על הרמות: שים מערך בשדה שמצפה לערך יחיד ותקבל את האיבר הראשון, הוסף אינדקס בסוגריים ([3]) לאיבר במיקום קבוע, והדרך הנכונה - map, שמקבלת מערך ומחזירה מערך של ערך מסוים לפי ה-Key (לפי ה-raw name, רגיש לאותיות). עוז הראה גם את הכוח הנסתר: אפשר להוסיף Filter בתוך map ('תביא את הערך רק כשה-Key שווה ל-X'), ולסנן בלי Iterator חיצוני. ו-get משלימה - שולפת איבר מתוך מה ש-map החזירה. זה המעבר מ'שלושה מודולים לכל שליפה' ל'ביטוי אחד'. יעילות אמיתית.
ההמשך המלא של הפרומפט שמור לחברי אוטוטיוזדיי פלוס יחד עם ההקלטה והתמלול המלאים של הסשן
שורות ההמשך כוללות את כל ההנחיות המדויקות והדוגמאות שהוצגו בשידור החי מול הקהילה
פיצול String למערך עם split
עוז המשיך לבעיה יומיומית: מערכת מחזירה כמה ערכים דחוסים במחרוזת אחת (רשימת מיילים מופרדת בפסיקים), ואתם צריכים כל אחד בנפרד. הפתרון: פונקציית split. היא מקבלת את המחרוזת ואת ה-separator (התו שלפיו מפצלים), ומחזירה תמיד מערך. עוז הדגיש דקות אחת חשובה - הארגומנט השלישי, keep empty strings: מתי לשמור איברים ריקים? כשצריך לשמור התאמת מיקומים בין שני מערכים מקבילים (לקוחות מול מיילים), שלא יזוז היישור. זו בדיוק הדוגמה של 'פרט קטן שאם תפספס, הכל יתבלבל שלב אחרי'. עוז לימד לא רק את הפונקציה, אלא מתי הדקות שלה משנות.
ההמשך המלא של הפרומפט שמור לחברי אוטוטיוזדיי פלוס יחד עם ההקלטה והתמלול המלאים של הסשן
שורות ההמשך כוללות את כל ההנחיות המדויקות והדוגמאות שהוצגו בשידור החי מול הקהילה
טריק set/get variables בין ראוטרים
ואת הסשן עוז סגר בטריק שמרגיש כמו קסם אבל הוא היגיון טהור: Set/Get Variables בין ענפי ראוטר. הוא פתח בעיקרון ש-Make תמיד עובד ליניארית - שני ענפי ראוטר לעולם לא רצים במקביל, בנדל ראשון מסיים את כל הענפים לפני שהשני מתחיל. הטריק: בענף אחד שמים Set Variable עם שם (למשל total_hours), ובענף אחר Get Variable עם אותו שם - וכך מעבירים נתון בין ענפים, או 'עוקפים' את האזור האפור של אגרגטור. כללי הברזל שעוז נתן: ה-Get חייב לבוא אחרי ה-Set בסדר הריצה, השם חייב להיות זהה בדיוק (copy-paste הכי בטוח), והמשתנה נדרס בכל בנדל חדש. זה הכלי שמוציא אתכם מהפינות שנראות חסומות.
ההמשך המלא של הפרומפט שמור לחברי אוטוטיוזדיי פלוס יחד עם ההקלטה והתמלול המלאים של הסשן
שורות ההמשך כוללות את כל ההנחיות המדויקות והדוגמאות שהוצגו בשידור החי מול הקהילה
🎯 מה עושים עם זה עכשיו?
קראת איך זה נעשה. עכשיו קחו את הכלים ותעשו את זה בעצמכם - כל הפרומפטים של הסשן, מוכנים להריץ על העסק שלכם. פלוס ההקלטה המלאה והתמלול.
הצטרפו לאוטוטיוזדיי+· 49 ש״ח בחודשעוד לא בשלים? בואו ללייב הבא בחינם ←רוצים לעבוד על התמלול הנקי?
העתיקו אותו ותעבדו איתו איך שנוח לכם.
🔒 התמלול המלא שמור לחברי אוטוטיוזדיי+. עם המנוי אתם מעתיקים אותו בקליק ועובדים איתו איך שנוח לכם.
לפתוח את התמלול · 49 ש״ח בחודששאלות ששאלתם (וה-AI ישאל גם)
למה מודול ב-Make רץ הרבה פעמים?
כי המודול שלפניו החזיר כמה תוצאות (בנדלים). כל מודול שמקבל יותר מבנדל אחד הופך ל-Iterator ורץ פעם לכל בנדל. אם רץ 19 פעמים, כנראה קיבל 19 בנדלים.
מה ההבדל בין מערך לאובייקט ב-Make?
מערך ([]) הוא רשימה של ערכים דומים. אובייקט ({}) הוא צמדי Key-Value. מערך של אובייקטים מתפצל לבנדלים נפרדים, אובייקט אחד עם מערך בתוכו נשאר בנדל אחד וצריך Iterator.
איך שולטים בכמה פעמים אגרגטור רץ?
דרך ה-Source Module: מספר הריצות של האגרגטור שווה למספר התוצאות של מודול המקור. בוחרים source שמחזיר בנדל אחד לתוצאה מאוחדת, או source שמחזיר כמה בנדלים לתוצאה נפרדת לכל אחד.
איך מחלצים ערך ממערך בלי Iterator?
עם הפונקציות map (מחזירה ערך מסוים מכל איברי המערך לפי Key) ו-get (שולפת איבר מהמערך). אפשר גם להוסיף Filter בתוך map ולסנן בלי מודול נפרד.
💬 הדיון על הסשן
שאלות, תובנות, מה יישמנו - השרשור של הקהילה.
עוד אין תגובות - תהיו הראשונים לפתוח את הדיון 👇
