2024 · per-node xoBranch
לכל צומת חלופות ו־marker משלו. ניווט ב־answer אינו שחזור אטומי של כל העץ.
כתיבה לאינדקס מפורש יכולה להחליף חלופה. אין להסיק מכאן יומן בלתי־משתנה או אטומיות בין הצמתים.
מאובייקט שמחזיק ערך וילדים בו־זמנית, אל זיכרון משותף, אירועים, שירותים וממשקים חיים. מסע בעקבות הקוד, הרעיונות והגבולות שביניהם.
תאריכי קומיטים ומקורות, לא רק תאריך יצירת המאגר. כל תחנה נפתחת לפרטים.
אותו רעיון בסיסי צומח להתמחויות שונות. שמות דומים אינם מבטיחים חוזה זהה בין גרסאות.
קשר ירושה שנבדק בקוד 2024, בכיוון מצאצא לבסיס:
xoBranch → FreshRedis → xoBenedict → benedict
לעומתו, xoDeque יורש ישירות מ־xoBenedict; הדמיון בשם אינו הופך אותו לבסיס של xoBranch.
המפה מבחינה בין מחלקות ירושה היסטוריות, מתאמים ויכולות קומפוזיציה חדשות. שמות חזון כמו xoAtom ו־xoMixo אינם מסומנים כמימוש מלא רק משום שהופיעו במסמך.
דוגמאות קוד לקריאה והשוואה. הן אינן מורצות בדפדפן, ולא נבדקו כאן מול שירותים חיים.
המחשה אינטראקטיבית מוכנה מראש לפי הקוד. אין כאן מנוע XO, חיבור Redis או תוצאה מהרצה.
מתחילים ממצב בסיס שהוכן מראש: תשובה A וטון calm. בשני הצדדים משנים קודם את התשובה, ואחר כך את הטון. בשלב האחרון מפעילים פעולות ניווט שונות: בחירת החלופה הראשונה של התשובה מול ביטול שינוי השורש האחרון. הן אינן API שקול.
לכל צומת חלופות ו־marker משלו. ניווט ב־answer אינו שחזור אטומי של כל העץ.
כתיבה לאינדקס מפורש יכולה להחליף חלופה. אין להסיק מכאן יומן בלתי־משתנה או אטומיות בין הצמתים.
היסטוריית תמונות שורש בתהליך. ה־cursor ההיסטורי וגרסת המצב הנוכחי הם שני דברים שונים.
העתיד הישן נשאר בגרף בזיכרון. אין הבטחה שכל הענפים ישוחזרו לאחר הפעלה מחדש. R הוא סימון יחסי להמחשה, לא גרסה שנמדדה.
מבט מלמעלה אל הקוד של xo.redis: כתיבה, הודעה ועדכון עמית. קריאה נפרדת של הערך היא מסלול רביעי.
זהו הסבר סטטי של תמונת Expando היסטורית, לא הרצת שירות ולא הבטחה שכל גרסת XO עובדת כך. הקטעים למטה נלקחו ממתודות שונות ואינם תכנית עצמאית.
הוק _update_ מסריאל ערך שאינו None ושומר אותו במפתח של הצומת. ה־SET הזה אינו כשלעצמו ארכיון של כל המעברים.
val = pk.dumps(value)
r = self._getRoot()._redis
res = r.set(self._id, val)מיד אחרי SET נקראת PUBLISH עם אותו מטען מסוריאל. אלו שתי קריאות נפרדות; הקובץ אינו עוטף אותן בטרנזקציה משותפת.
r.publish(self._id, val)
return Trueה־handler מאתר נתיב מתוך שם הערוץ, מפענח את מטען ההודעה ומעדכן מקומית עם דגל דילוג על עדכון. כאן הוא אינו מבצע GET לכל הודעה.
res = msg["data"]
res = pk.loads(res)
f._setValue(res, skipUpdate=True)עמידות תלויה גם בתצורת Redis. שמירת ערך והפצת הודעה אינן לבדן הבטחה לסדר עסקאות, היסטוריה מלאה או מסירה בדיוק פעם אחת. תכנון כזה דורש חוזה נפרד לתקלות, שחזור ופערים.
המקור משתמש ב־dill לפענוח נתונים: הוא מניח עמיתים מהימנים, ואינו דוגמה בטוחה לקליטת מטען שרירותי מהאינטרנט. תרחישי הכשל כאן מוסקים מהקוד; הם לא הורצו במחקר.
שלוש תשובות לשאלות שונות. זו הערכה הנדסית מנומקת, לא דירוג שנמדד בבנצ׳מרק.
הפרדת Expando ממתאם Redis מראה כמה מעט נדרש כדי להפוך השמה מקומית למצב משותף. נוסחאות עצלות כבר הופיעו ב־2022.
המחיר: זיהוי תלות לפי טקסט מקור היה שביר. בגרסת Expando מאוחרת נמצאה קריאה לעזר נוסחאות שהגדרתו הוערה החוצה.
ערך וילדים, פונקציה, מנוי ו־Redis נפגשים סביב נתיב והוק שינוי. נקודת 15 בפברואר היא מועמדת חזקה לאלגנטיות מושגית; סוף החודש מציג דמו רחב.
המחיר: הליבה כבר כללה אלפי שורות, תחביר קסום ותופעות לוואי. קריאות מסוימות יוצרות מצב; התראות אינן תמיד אירוע אחרי commit.
אירועים וגרסאות, קומפוזיציית יכולות, מחזור חיים, בדיקות תלויות וניהול כשלי התמדה. פחות הנחות סמויות בין רכיבים.
המחיר: זו אינה תאימות מלאה ל־Benedict או לענפי זיכרון ברמת צומת. יש יותר טקסיות, וסמנטיקת history שונה.
נאספו היסטוריות Git, ענפים ומקורות יישומים. אין כאן טענה שמופו כל עותק, יישום שנמחק או מאגר לא נגיש. ארכיונים פרטיים אינם מוצגים באתר הציבורי.
הפעימות הבאות ירחיבו את מפת הסוגים, דוגמאות השירותים והיישומים, ויבדילו באופן חד יותר בין קוד שהופץ, הרחבות מקומיות וחזון.
הקישורים מובילים למאגרים ציבוריים או לצילומי קוד מתוארכים. ציוני דרך היסטוריים אינם המלצת התקנה.