ייעוץ בבחירת סטאק טכנולוגי לאתר

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

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

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

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
ייעוץ בבחירת סטאק טכנולוגי לאתר
פשוט
מ- 4 שעות עד 2 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1201
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    619

מדוע הפרויקט נתקע: טעויות בבחירת מחסנית הטכנולוגיה

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

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

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

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

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

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

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

מה נותן סטאק מחושב היטב: מהירות, אמינות, התפתחות

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

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

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

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

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

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

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

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

השוואת גישות: מונוליט, מונוליט מודולרי, הפרדת שכבות

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

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

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

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

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

כיצד אנו בוחרים סטאק: שלבי העבודה ההנדסית

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

  1. ביקורת הפתרון הקיים. בוחנים מה כבר עובד: מבנה הקוד, התלויות, תדירות הסיבות לתקלות, זמן הבנייה והפריסה, צווארי בקבוק בעומס. מתעדים מה נעשה בו שימוש חוזר ומה זול יותר להחליף מאשר להמשיך לגרור.
  2. איסוף דרישות ומגבלות. מנתחים את פרופיל העומס, תרחישי הצמיחה, דרישות לזמינות ואבטחה, הכישורים של הצוות שלכם ותוכניות הגיוס. סטאק שאין מי שיתחזק אותו — זה סיכון, לא טכנולוגיה.
  3. תכנון סכמת הרכיבים. מפרקים את המערכת לשכבות: ממשק, לוגיקה בצד השרת, אחסון, אינטגרציות, מטמון, משימות רקע. עבור כל צומת — אפשרויות וקריטריון בחירה, כך שההחלטה תהיה קריאה גם בלי המחבר.
  4. בדיקת השערות על אב-טיפוס. נקודות שנויות במחלוקת — עומס, אינטגרציות, מהירות תגובה — בודקים על מערך מינימלי, ולא על סמך מילים. ההשערה או שמאושרת במדידות, או שנזרקת לפני תחילת הפיתוח העיקרי.
  5. השוואת חלופות ובחירה. מרכזים את האפשרויות בטבלה לפי לוחות זמנים להוצאת הגרסה הראשונה, עלות הבעלות, סיכונים וסף הכניסה לצוות. בוחרים לא את "החדשני ביותר", אלא את מה שנותן תוצאה צפויה.
  6. תוכנית הטמעה ומיגרציה. קובעים את סדר העבודות, נקודות החזרה לאחור, אופן העברת הנתונים והתאימות למודולים ישנים. בנפרד מפרטים כיצד המערכת מתקיימת בתקופת המעבר.
  7. מסירת תיעוד ותקנונים. מוסרים את סכמת הרכיבים, את הנימוק לבחירה, הוראות בנייה ופריסה, כללי עדכון תלויות ותקנון התמיכה. הצוות שלכם ממשיך לעבוד בלעדינו.

תארו את המשימה — נחזור עם הערכה ותוכנית לכל שלב.

מה הלקוח מקבל לידיו: תצורות, תרשימים, נהלים

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

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

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

מקרה בוחן: כיצד הרכבה מחדש של הסטאק הסירה מחלקת כשלים

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

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

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

מה היה לפני ההרכבה מחדש

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

מה שינו

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

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

מה נהיה

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

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

במה שונה בחירת סטאק לאתר לעומת אפליקציית ווב?

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

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

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

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

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

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

התשובות לשאלות אלו קובעות ישירות אם יש צורך בחלק שרת נפרד, בבסיס נתונים ובתור משימות — או שמספיק סטטי עם טופס יצירת קשר.

ספקות טכניים נפוצים לפני ההתחלה

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

האם הסטאק החדש לא ישבור את התשתית הקיימת?

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

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

האם ניתן לעבור ללא עצירת פעילות האתר?

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

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

מה לעשות עם קוד legacy שמתחזק את האתר הנוכחי?

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

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

כיצד להעריך את סיכוני המעבר מראש?

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

נדון במשימה שלכם ונחזור עם הערכה ותוכנית

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

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

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

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

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