Pages

July 01, 2008

חיפשת ומצאת - אדובה

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

June 02, 2008

OT: דיויד גילמור נזכר בערב ההוא

לא מזמן נפל לחיקי (במצלצלין, טיבין ומתקפלין) ה-DVD שמתעד את ההופעה של דיויד גילמור באלברט-הול, הופעה שנעשתה לאחר צאת האלבום On an island. בין המשתתפים היו ריצ'אד רייט, הידוע יותר בכינויו "אני הקלידן של פינק פלויד", דיויד קרוסבי וגרהאם נאש המוכרים יותר בשילובים של "קרוסבי, סטילס ונאש", דיויד בואי הידוע בכינוי "אתה לא מזדקן, בנאדם?" ועוד כהנה וכהנה, פה ושם, כל מיני זוטרים שקיבלו את תפקיד חייהם.
מעט קשה לי, בתור חובב פינק פלויד ומעריך גדול של דיויד גילמור, לראות חבורת ישישים על במה, שמנסה ללכוד תמונת מצב מלפני 35 שנה פלוס-מינוס. עם זאת, אני מוכרח לציין, שזו אחת ההופעות היחידות של פלויד, או דיויד גילמור, שראיתי והרגשתי כאילו מדובר באמת בהופעה חיה מול קהל, ולא סט של רוטינות מסונכרנות כמו הייתה ההופעה מוקלטת על סיקוונסר.
גילמור מתנקנק בהתחלה, ופותח עם כמה קטעים מ- Dark Side, כאילו להרגיע את הקהל, שזה בסדר, אני עדיין ההוא מפינק פלויד ואתם תקבלו את המנה של הלהיטים שאתם מצפים לה. זה קצת מעציב אותי, לראות אמן בסדר-גודל כמו שלו מהסס לנהל הופעה על חומרים שלו (וברוך השם, יש מספיק) אלא נתמך ע"י העבר שלו בפלויד. אולי יש מקום להעלות את הלהיטים האלו בהדרנים.
הבמה לא גדושה פירוטכניקה ולייזרים, וזה מצויין, כי בנינו, די נשבר הפופיק מההופעות הגרנדיוזיות של פלויד. יש כאן גם איזשהו דו-שיח בין גילמור לקהל, למרות שנשמע מאולץ משהו, עדיין מוסיף לתחושה שמדובר כאן בהופעה חיה למען קהל ולא חזרה גנרלית. אני לא מצפה מגילמור להיות פרפומר ברמה של פרדי מרקיורי, אך מאידך הגיע הזמן שיפתח יותר לאנשים שאוהבים את המוסיקה והקול שלו.
גילמור הוא אמן גיטרה גדול. מעבר לסאונדים והדגש על דינאמיקה, הוא מהלך על הבמה כמו שליט בממלכתו. הוא שולט בכל כלי, מבצע מעברים חלקים בין הקלאסית ל- , Lap Steel Guitar, ל-Fender, הכל אצלו זורם בלי מאמץ מיותר. קרוסבי ונאש גם נותנים את חלקם ועושים את זה כמו שרק הם יודעים. ההרמוניות הקוליות שלהם זה משהו שהוא מעט מעבר לשני קולות שחוברים יחד, מה שמביא את השילוב שלהם עם שיר אדיר כמו On an island, לרמות עונג גבוהות. יש אפילו ביצוע חלקי ל- Echoes, שמבחינתי הוא אחד הקטעים שהכי מזוהים עבורי עם פלויד. אני חושב שזהו הקטע הפסיכודאלי הכי מתון של הלהקה ובכל-זאת, עדיין מצליח לאגד בתוכו את כל מה שפינק פלויד מייצגים עבורי והביצוע לא רע, אם כי מעט חוטא למקור באורך שלו, בסאונד שלו וכו'. אגב, סבלתי בביצוע של Fat Old Sun, שהיה מהיר מדי ובלי הרוגע שכל כך אפיין את השיר הזה.
בשביל הדרן מעלים את דיויד בואי, שאם כל הכבוד המגיע לו, אני לא ממש מבין איך הזיקית הזו קשורה להופעה (אולי בגלל שהוא וסיד די ייצגו את אותו הזרם בתחילת דרכם, לך תדע...), אבל הוא נותן ביצוע נהדר לארנולד-ליין, ואם תשימו לב תראו שכולם די מבסוטים לנגן את שיר הקשיש הזה, אפילו ריצ'רד רייט. את Comfortably Numb אני כבר לא יכול לשמוע, לא משנה באיזו צורה שתהיה, אז וויתרתי.
ומוזר היה לי לראות בחוברת שמגיעה עם ה- DVD שגילמור מתפאר שם בהשיגיו כמו טירון. ייתכן והוא עדיין מנהל עימות עם רוג'ר וואטרס באמצעות המוסיקה שלו? את דיויד גילמור, בנאדם, תרגע.
עוד נותרו לי קטעי הבונוס, אבל בכללי אני יכול לומר שזה לא DVD חובה לאוהבי דיויד גילמור או פלויד. אפשר לחיות גם בלעדיו - פומפיי זה לא. מה שכן, זה נחמד לראות את גילמור מופיע בלי כל ההילה והמחויבות שפלויד מקרינים. הופעה רגילה בלי יותר מדי בלאגן בעיניים נותנת מנוחה לאוזן להקשיב לקטעים ולהבין שגילמור הוא מלחין לא רע בכלל.
זה הכל :).

May 29, 2008

אדובי שוב שוברים מילה

מה קורה? יופי.
בזמנו (פלייר 8 בואך 9) התערמנו על כך שלפלייר חסרה תמיכה מאד בסיסית ומשמעותית ב-Timezones. למי שהנושא הזה זר לו (אשריו), אני אספר שלמעשה מדובר כאן בתמיכה בשני דברים מרכזי: תמיכה בכך ש- Client יוכל לראות זמנים כמו שהם נקבעו בשרת, או בכל מקום אחר ולא לסבול מ"תרגום" לוקאלי לזמן שלו. לדוגמה, אם הסרבר יושב ב- GMT-5 והזמנים שלו בהתאם, אני מעוניין שקליינט בישראל יראה את אותם זמנים (ב- GMT-5) ולא ב-GMT+2 (זמן ישראל). יש עוד נושא שכרגע לא ממש מעניין אותנו והוא התמיכה בסריליזציה והתנהגות עם Timezones באספקט הזה.
אז שברנו את הנשמה עבור הפיצ'ר הזה, ואפילו דיברנו עם אדובי טרם נקטנו פעולות עצמאיות, והם הבטיחו שבפלייר 10 הדבר יתוקן, כי הוא כבר עומד על הפרק (כן... נשמע מוכר... נכון... שנייה... עברית!). הנה הגיע לו פלייר 10 ועמו שלל של זיקוקים ותענוגות, ועכשיו אפשר לקחת ביטמאפ ולרקוד איתו למבדה, אבל תמיכה ב Timezones? כינים.
מיד דיברנו עם אדובי לשאול מדוע, שוב, הם לא מקיימים, והם נתנו לנו כל מיני תירוצים שאם מחברים את האותיות שלהם יחד ומחשבים בגימטריה, זה יוצא: "יהיה לכם בפלייר 11, עזבו אותנו באימא-שלכם".
אז זהו, לכל המשתוממים מתי זה יגיע - פלייר 11 זו התשובה (אולי... מי יודע).
בינתיים? בינתיים נמשיך לכתוב כל מיני utils שעושים את ההמרות הללו.

May 21, 2008

BlazeDS באמת דוחף?

תקראו את זה רגע: The Truth About BlazeDS and Push Messaging.
מדהים הא? מסתבר שאין ממש push ב- BlazeDS כמו שיש ב-LCDS. אני חשבתי לתומי שה- DataManagment זה הדבר היחיד שמפריד בניהן (זה בהחלט מספיק...), אבל מסתבר שלאדובי יש עוד שפנים בכובע.
נו ניחא. שיהיה.

May 16, 2008

Profiler, GC וילקוט הכזבים

בלי הקדמות מיותרות:
  • ה- Garbage Collector של פלאש עובד רע, נורא, גרוע... אם בכלל.
  • הפרופיילר המוצע בפלקס 3 יכול לסמא את עיניו של מומחה ה- performance הגדול ביותר.
  • בדיקות performace אמורות להיעשות רק על נגן רגיל, ולא נגן debug.

בואו נתחיל מהבסיסי.
יש לא הרבה מאמרים על "איך ה GC של פלאש עובד?", והתיעוד של אדובה לא ממש משפר את המצב. מה שכן, אני יכול להעיד (בתור אחד שקרא את רובם בשבועות האחרונים) על דבר אחד: כולם, ללא יוצא מן הכלל, לאחר כל השורות והמילים המפוצצות, אומרים דבר אחד: הוא לא עובד טוב. לא, תנו לנסח מחדש: הוא עובד רע.
מה זה "לא עובד טוב"? למעשה זה אומר שאי אפשר לצפות מתי הוא ירוץ, ומאידך כאשר הוא רץ אי אפשר לבטוח בו שהוא ינקה את כל מה שסומן לניקוי. שיטות סימון האובייקטים לאיסוף הן די סטאנדרטיות לסביבות ריצה (אובייקטים "מרחפים" ללא references) אולם, ה-GC של פלאש פלייר מתקשה לנקות את כולם במכה אחת, ומה גם, שבשביל לשחרר אובייקט לניקוי (כלומר לנקות לו כל קשר לאובייקט אחר בכל צורה שתהיה) זו משימה עבור לוק סקיי ווקר עם הרבה force.
הכל מתחיל מגילוי של נזילת זכרון באפליקציה. זה לא מפתיע, בהתחשב בכך, שאחרי הכל, מדובר בפלאש פלייר שהוא נוזל כמו גג פחון במעברה, אבל אתם יודעים... אמרו שיש שיפורים, שיש מנגנון חדש ל GC, שאמור להיות טוב עכשיו. אם אדובה התכוונו בכך שאם פעם לא היה GC כלל והיום יש, הם צודקים - זה שיפור. אם הם מתכוונים לכך שאפשר לסמוך עליו, שיחזרו למעבדה, שכן אפליקציות עדיין נוזלות ונוזלות קשה. אני מדבר על אפליקציה שרצה לילה שלם ומגיע בקלילות לנפחים של 200-400 MB, ועולה. זה לגמרי לא קביל בעולם ה RIA, ואם אדובה מכוונים לשם, אז כדאי שיתחילו לשים לב לדברים ה"פעוטים" הללו, במקום לספק לנו עוד פילטר שיודע לעשות מימונה לפיקסלים.
אבל זכינו והגענו לזמן הזה, בו יש לנו פרופיילר שיודע לזהות נזילות זכרון ובעיות performance. אין ספק שהשימוש בפרופיילר הוא לא ממש אינטואיטיבי. יש בו רשימות על גבי רשימות של מידע, בו אפשר לעשות drill down, מה שהופך את כל השימוש בו למאד קשה, אלא אם מבודדים את הבעיה בדרכים ושיטות שונות.
הפרופיילר עובד מול SWF שמחזיק בתוכו מידע debug, וכמובן אל מול נגן שתומך ב debug אשר נותן להתחבר אל socket בו. אחרי שבודדנו את הצעדים שגרמו לדעתנו לנזילה ולקחנו כמה snapshots של מצבים והשוונו בניהם, הבחנו בכמה דברים מטרידים:
  • ה GC שנקראבאופן דיפולטי לפני snapshot לא מנקה את כל מה שהוא אמור. את זאת ניתן לבסס על העובדה שיש אובייקטים צפים שאין להם שם reference, ובכל זאת הם עדיין ברשימת האובייקטים המרחפים.
  • יש אינפלציה מאסיבית של אובייקטים מסוג Strings. רובם מוקצעים עבור אובייקטיי UID - זהו id ייחודי שהנגן נותן כמעט לכל אובייקט שנוצר בו אנחנו שמנו לב שעיקר הבעיה שלנו הייתה עם אובייקטים מסוג ArrayCollections).
זה נכון שניתן לפלטר על Packages שמעניינים אותנו, אבל אלו, למרבה הפלא, התנהגו בסדר. האובייקטים בהן טפחו אמנם, אבל נוקו ברגע... שהקומפיילר החליט לנקות אותם - בד"כ, כש Memory Allocation Block הגיע לשיאו ונדרש עוד מקום, שזה רעיון רע לכשעצמו, שכן אם לא מגיעים לשיא הזה, האובייקטים יכולים לחיות לנצח בזכרון למרות שאין להם שום reference.
רעיון הזוי הביא אותנו לנסות להריץ את האפליקציה על פלייר שאינו debug. ומסתבר שפה ממש קבור הכאלב. ריצה של לילה שלם הותירה את הפלייר שלנו די סטאטי מבחינה נפח הזכרון שהיא צרכה. מסתבר שיש הבדל מאד מהותי ומשמעותי בין שני סוגי הנגנים: אחד דולף כמו ח"כ בוועדה והשני רגוע.
זה מעט מטריד... טיפה. שכן הפרופיילר יכול לעבוד רק על... ובכן, גרסת ה debug. זה עקום ברמות די קשות, שאת בדיקות ה performance ניתן לעשות מול נגן שדולף כמו פסיכי (אני מדבר על הבדלים של 50MB בנקל בין שני הנגנים).שלחתי מכתב לגברת אדובה בנושא, ואני רוצה גם לבודד test בכדי לנסות ולהוכיח את ההשערות הללו בצורה נחרצת. מה שכן, כמה מסקנות עבורכם:
  • לבדיקות performance תוודאו שאתם עובדים מול פלייר שאינו debug.
  • כאשר עובדים עם הפרופיילר, כדאי לפלטר החוצה כל מה שאינו קשור במחלקות שלכם. השאר פשוט מקשה מאד ולפעמים מטעה מאד.
  • אי אפשר לסמוך על ה GC של פלאש.
  • אם אתם ממש רוצים להפעיל את ה GC של פלאש בצורה תכנותית, כפויה, שתנקה באמת את הכל (לא כמו בפרופיילר) יש "האק" נחמד שמצא אותו קולגה שלי בקישור הבא: נו באמת... שיהיה.
צריך להוסיף משהו? לא.... לא נראה לי. אני חושב שסיכמתי כאן בצורה די ממצה שבועיים של עצבים (פחות או יותר).
תודה, אדובה, על האפרת השיער.





May 15, 2008

Flash Player 10 Beta יצא

אין צורך להרחיב יותר מדי - לכו תורידו את הגאולה שחיכינו לה, פחות או יותר, מגרסה 4 של פלאש.

לעסק...

April 17, 2008

עוד באג שמביא את השגעת

מה קורה?
איזה יופי שאני פונה אל הבלוג שלי רק שפלקס מצליח לעצבן אותי יותר משקריסטל עצבנה ב"שושלת", הא?
ומה על הפרק היום? התנהגות לא ממש צפויה של ה-DataGrid (מה חדש?) שגרמה לי לאבד כמה שעות טובות, ולמצוא את Workaround הצולע משהו, אבל עובד.
בואו נתחיל מהסימפטומים: יש לכם DataGrid, יש בו Columns, ויש בו מידע. אתם לא מעוניינים שלחיצה על ה- header תבצע sort וגם לא מעוניינים לאפשר גרירה של עמודות וסידורן מחדש. לא כזה, בשמיים, נכון? לא כאילו ביקשנו... נאמר... לרקוד עירומים ליד הצנטרפוגות של אחמדיניג'אד, נכון? אז הנה באנו אל המלאכה, והגדרנו את ה- DataGrid, עם המאפיינים הבאים, כך:

draggablecolumns="false"
sortablecolumns="false"


כי מה? אנחנו פסיכים לרשום על כל עמודה אם היא ניתנת לסידור, אם זה גורף? וודאי שלא. קימפלנו והנה לנו הפתעה - ברגע שאנחנו לוחצים על ה header אנחנו מקבלים תופעה מעניינת - הבחירה שלנו ב DataGrid מתאפסת, כי מסתבר שלחיצה על ה header משחררת ListEvent.CHANGE. נכון שזה מרגש אתכם, כמעט כמו שזה ריגש אותי?
חפירה מהירה בעירמת אותיות שאדובה מכריזים עליה כקוד תגלה שיש תנאי פשוט שבודק, בין היתר, את שני המאפיינים הללו - ואם שניהם false, נחשו מה קורה? זה לא בכוונה, זה פשוט נראה כמו מקרה שלא טיפלו בו, אז ברירת המחדל צצה לה, ומאחר ש header הוא item לכל דבר, הא לכם התוצאות.
פתרון? יש, אבל לא ממש נחמד - מה שצריך לעשות הוא להגדיר מאפיין draggablecolumnsעל DataGrid, ואז להגדיר על כל עמודה שאסור לסדר אותה.
לכל מי שממש מתעניין ,פתחתי באג ב Flex Jira, אתם יכולים לעקוב ולהצביע עבורו - ממש כמו נינט, אבל עם הרבה יותר משמעות. זה ה Key שלו: SDK-15321.
חג שמח וכשר - אל תשכחו לפתוח את הדלת לאליהו הנביא ולהיות נחמדים לדודים ששוב שואלים "מה זה פלקס?"

April 08, 2008

Flex Messaging Consumer מדבר נגוע

מה קורה?
זה פשוט גובל בחוסר אחריות משווע, מה שקורה שם בדומנטציה של פלקס. הנה קחו לכם מקרה שגזל מעבדכם הנאמן זמן רב:
מנגנון ה messaging של פלקס עובד עם שני חברים טובים Producer, ואח שלו Consumer (ניתן לקרא עליהם באחד ה-PDF-ים היותר ארוכים שיצא לי להשתעמם מהם).
Consumer הוא בנדיט לא קטן, שכן אפשר להגדיר לו על איזה subtopics רוצים שהוא יאזין, ומעבר לכך, אפשר לסנן הודעות עפ"י מאפיין שנקרא selector, שהוא למעשה מסנן על ערך מסוים שנמצא ב-header של כל הודעה והודעה. כלומר אם בכל header אני אחזיק מפתח שנקרא לו issue, ואני אתן לו ערך לפי לוגיקה מסויימת, אני אוכל מאוחר יותר לסנן הודעות לפי המפתח הזה. את זה עושים בכך שנותנים ל-selector מחרוזת SQL-ית, שתפקידה להגדיר "פילטר" (או זה או זה או זה וכו'...).
ויודעים מה יותר מגניב? שאפשר לשנות את המחרוזת הזו בזמן ריצה מבלי לדאוג לסנכרון מול FDS, הכל יעשה מאחורי הקלעים ולנו יהיה צ'אט שעובד כמו סמיר שוקרי בחתונה ברהט.
כי... ככה כתוב בדוקומנטציה שלהם.
בלי לדאוג.
מאחורי הקלעים.

מאחורי אחותם!
מסתבר שזה עובד נחמד, לוקאלית, על שרת שיושב לך על הברכיים, אבל נסה עם שרת מרוחק... כינים. כן, מסתבר שזה מקרטע, והקטע הזה גורם לכל צ'אט שתבנו המשתמש במנגנון ה selector, לדדות כמו הומלס בסרט ערבי של יום-שישי. פתאום הודעות לא מגיעות, פתאום הודעות משום מקום צצות כמו רוחות רפאים. שימו עליי את שרשרת השום, כי אני נכנס לממלכת הוודו. מה לעשות, הא...?
או! שיש מה לעשות, והוא להכריח את ה consumer לעשות subscribe שוב, ואז זה עובד.
אני ממש לא נכנסתי כרגע לעומקה של בעיה, אם הרישום המחודש הזה יוצר בעיה אחרת בקטע של ביצועים, זליגת זכרון וכדומה, שיהיה... בכל אופן - זה עובד.
פסח כשר ומזל טוב
:).


April 02, 2008

Cusomizing the RadioButton label

סתם משהו קטן שיכול לפתור לכם הרבה דברים שאדוויל לא.
הדרישה?פשוטה לכאורה - תן לי קונטרול של RadioButton שהכתובית שלו (Label, יא קטנוניים) תתמוך ב-HTML.
הפתרון? גם הוא די פשוט למרות שלא ממש אינטואיבי, שכן RadioButton יורש את Button ושם נעשית כל מלאכת השמת הטקסט אל הכתובית, אבל זה מה שיעצור אותנו? כנראה שלא... אז מה עושים? יוצרים מחלקה המרחיבה את RadioButton ו- override למתודה הנחשית updateDisplayList, בה אנחנו נגדיר שאותו UITExtField של הכפתור ירונדר כ-HMTL:


/**
* Override the updateDisplayList to set the textField of the
* radio button to hold HTML taext in it
*/
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
super.updateDisplayList(unscaledWidth, unscaledHeight);
textField.htmlText = label;
}


בקיצור, זה הסיפור. לא מסובך, נכון?

תבלו.

February 18, 2008

המלחמה על RIA

למדנו מילה חדשה, הא? RIA... פתאום, כולם, כאילו זה היה טרנד ההרזייה החדש או ווב ("בועה") 2.0, מזמרים RIA מבין שפתותיהם.
כן, RIA, או במילים אחרות Rich Internet Applications צמחה להיות הבאז וורד החדשה למרות שהיא כבר מסתובבת פה איזה שנתיים פלוס-מינוס. כל מפתח HTML היום (אפשר לקרא להם ככה? מפתחים?) הוא מפתח RIA. זו המגיפה שבאה עלינו לטובה, ואנחנו מתבשמים בניחוחותיה הירוקים (דולרים, סטלנים, דולרים).
ומיד, כאשר יש טכנולוגיה (או אסופה שלהן, יותר נכון לומר) יש Vendors שמתים לשים עליה את הסטאמפה שלהם. הם המציאו, הם הכי טובים, להם צריך להעלות לעולה ובמקרה של RIA זה לא איחר לבוא.
אז מי בעצם יש לנו בחזית?
אם נקפד ראשן של כל מיני הלצות כמו open laszlo, של-UI שלה יש עוד כברת דרך לא קלה לעבור בכדי להתחרות עם השאר, או השטות של "גם אני! גם אני!" גוגל, אנחנו נגיע לשלוש מרכזיות: Flex של הגברת Adobe, ה- Silverlight של העלמה MS, וכמובן JavaFX של... Sun, כמה מפתיע.
אני חושב שתסכימו איתי, שאדובי קלטה את הקטע די משחר ימיו. עוד כשפלאש היה חוד החנית בתחום, אדובי דחפו ודחפו לעבר אפליקציות ווביות יותר רובסטיות בעלות חווית משתמש עשירה יותר. כל אלו הובילו אל פלקס שלדעתי, וגם לדעת אחרים מותירה את שתי האחרות מאחור. מיקרוסופט נזכרה די מאוחר בכל הוייב ומיהרה להוציא את ה- Flash Killer שלה. זוכרים? אותו מוצר שהודיעו עליו לפני... 4 שנים לערך? ששינה לפחות... 5 שמות על הדרך? זה זה. מוזר דיו, את כל הפרזנטציות למוצר של מיקרוסופט בחרה החברה לערוך ב... כן - פלאש. Silverlight של MS אמורה להיות מאד נוחה לפיתוח בייחוד ע"י מפתחי Net. שסביבת הפיתוח והאינטגרציה עם שאר המוצרים בטכנולוגיה הזו אמורה להיות די שקופה, אמה-מה, כאשר נשאלים מפתחי Net. מדוע הם מפתחים בפלקס הם מודים בפה מלא כי "זה עדיין לא שם". מה גם שלעבוד מול מוצר Silverlight משתמש אמור להוריד סביבת ריצה, שבניגוד ל- Flash Player היא ענקית ולא שכיחה (אנחנו עוד נגע באספקט התפוצה של סביבות הריצה מאוחר יותר)
אצל JavaFX הסיפור מעט שונה. זה נכון שבהיות RIA מה שהיא, רב האפליקציות עובדות על שרתים מבוססי JAVA (כמו Tomcat לצורך העניין). מה גם, שאם נסתכל לרגע על אג'נדת הפיתוח הפלקסית, נראה שהכל מכוון לעבודה מול Java (אם אלו POJO ב- RPC), ובכלל, כל FDS, לימים LCDS, הוא ג'אוואי לחלוטין. האינטגרציה היא כה חזקה בין פלקס ל-Backend ג'אוואי שאפילו עם ההתקנה של פלקס אנחנו מקבלים את jRun בתור Application Server. מכל אלו הרי מתבקש ש- Sun המכובדת, תחל להשקיע מעט בפיתוח UI (מבלי להעליב את ה Swing שלה. טוב, נו, עם להעליב אותו). ואכן - הם עשו זאת. שוב באיחור מה, שכן עושה רושם שעכשיו שפלקס נפתחת כ- OpenSource, פרוטוקול AMF יוצא לחופשי, אין עוד חיוב לעבוד מול שכבות ג'אוואיות. אז מגניב שיש עכשיו כלי פיתוח RIA UI בג'אווה, ואני מניח שהרבה מתכנתי-ג'אוה אפורים יתחילו להזיל ריר, אבל... Sun איחרה במעט את הרכבת. בכל מקרה, אסור לזלזל ב- JavaFX. היא נראית לי כחלופה הראשונה שהייתי לוקח בחשבון לו פלקס לא הייתה בתמונה, וייתכן מאד שבעוד כמה שנים, מערך הכוחות ישתנה, אבל בכדי שהוא ישתנה דבר מאד פשוט אמור לקרות לפני הכל: תפוצת סביבת הריצה.
מישהו פעם ניסה להוריד את ה JRE של ג'אוה? זה תענוג שכמוהו רק טפטוף מים קצוב על מצח במרתף עינויים ישנו. זה לוקח עידן שלם. ותאתחל את המכונה, ורגע... יש לנו עוד איזה רכיב שאתה חייב להתקין ואללא ויוסתור ותעשו לי טובה.
ו-MS? להוריד את ה- Runtime Env שלהם? לא תודה. וסטאטיסטית מי שולט? זה הרי ידוע.
אם עד היום לא ידעתם אז המצב הוא כזה: ל-97% מהמכונות המשתמשים בעולם מותקנת גרסה 9 של נגן פלאש. נקודה. ועם זה קשה מאד להתווכח. כאשר תייצר מוצר שאמור לשרת אירגון ענק, ותגיד ל-IT שלו שאתה עכשיו צריך להתקין בכל מכונות הקצה סביבת ריצה חדשה, סביר להניח שמברגה תרדוף אחריו בדרך החוצה. וזו למעשה הגדולה של אדובי. ע"י כך שהם שמרו על הנגן קטן כל העת הזו (ונכון, ואנחנו שילמנו עם RTL) והפיצו אותו דרך באנרים באתרים ופורטלים ומה לא... הם זכו בשליטה הרחבה הזו שמקנה להם כיום את המקום הראשון כ- Vendor של סביבת פיתוח וטכנולוגית RIA.

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

February 10, 2008

מדוע מתכנתים הם לא קבלנים?

"כי זה ברור שלא".
זו התשובה שאמורה הייתה עכשיו לצאת את גרונכם. מה הקשר בין מיוזעי-הידיים, חובשי הפלסטיק ומסובבי-המפות לבין אנשי המקלדת, רואי הצפונות, "סוף מעשה במחשבה תחילה" שכאלה? מסתבר שיש קשר...
בואו נתחיל מאיזה "אני מאמין" זריז - אי אפשר "לקבלן" עבודת פיתוח כי התוצאה הישירה של "שיטת" עבודה זו היא מספר נכויות לעתיד, כמו: קוד גרוע, יציבות רעועה של מוצר, תחזוקת קוד שתעלה בהמון שעות אדם וצמצום האפשרות לשימוש נוסף בקוד בצורה פשוטה ושקופה (מה קוראים האנשים reusable code).
ברגע שאתה מוצא עצמך, כמתכנת, מדלג על שלבים חשובים כמו Code Design, Code Review, ומאידך מוצא עצמך באופן די תכוף מבצע Re-Factoring לסוגיו, מתקן ריגרסיות וכיו"ב - דע לך שאתה נמצא בנחלת הקבלנים בין אם אתה אוהב את זה או לאו.
אני לא אומר שצריך לקודד עם ראייה עשור קדימה ולעשות Code Review לכל הגדרת משתנה, אבל אסור בא' הידיעה "לקבלן" פיצ'רים. אם אילו לקוחות שבאים עם הדרישה ל"עכשיו ומיד" אפשר להסביר להם שבכדי שמוצר יהיה יותר גמיש לדרישותהם העתידיות, עדיף לשלם עוד מעט זמן כעת, מאשר לשלם בגדול אח"כ. אם זו ההנהלה הדורשת זה הרבה יותר פשוט (או כך לפחות זה אמור להיות). יש להסביר כי קמצנות בזמן פיתוח היום תחזור כבומרנג מאוחר יותר. אין גם על מה להתווכח - זה בדוק, זה קורה, זו המציאות.
זה גם די נורא לראות קוד שהוא ה"בייבי" שלך מקבל טוויסט לצד המעוות והופך לערימה של כיסאות שבורים, המגדל של המלך צב-צב, שכולנו יודעים מה קרה לו בסוף (ומי שלא, בושה...).
מה שכן, אני יודע שאני מתאר כאן עולם די אוטופי, שהרי תמיד יהיו לקוחות גרידיים ותמיד תהיה הנהלה אטומה. מה עושים אם כן? אין לי ממש תשובה... זהו בהחלט דיון שאפשר לנהל פה. בינתיים כל שנותר לי להמליץ עליו הוא להוריד את כובע המגן הפלסטי שכופים עלינו ולהסביר לדורשים שתכנות זה מעט מעבר ל"צריך את הפיצ'ר הזה עד הזמן ההוא". בין אם הם יבינו או לא, זו כבר שאלה אחרת. מה שכן, תמיד צריך לזכור שלמרות שמתכנתים הם לא קבלנים, הם בהחלט פרוצות שילכו לכל המרבה בכסף :).
את זה תמיד טוב לזכור...

February 04, 2008

פידבק מכם, אנשים....

אהלן,
במהלך ההכנות להרצאה על פלקס 3 והחידושים בה, שאשא ב-25 לחודש בכנס פלאשו-קוויקסופט, עלו נושאים רבים השווים איזכור והתעמקות. בעוד תוכן ההרצאה כבר גובש ברובו, הנחתי לעצמי שזה יהיה רעיון טוב לתת פה רשימת נושאים ולקבל מכם (אלו שיבואו, וגם אלו שלא) פידבק לגבי מה יעניין יותר, ועל מה הייתם מעוניינים לשמוע, ואולי לבצע שינויים נכון לתוצאות.
מכיוון שבבלוגר אין פיצ'ר של סקר מובנה (לפחות ממה שאני רואה), החלטתי לפרוש כאן את הנושאים המרכזיים ולתת לכם הזדמנות להגיב ולציין באילו נושאים הייתם רוצים להעמיק יותר:
  • Persistent framework caching - היכולת לצמצם נפח אפליקציות בפלקס 3.
  • Flex Builder productivity enhancements - ריפקטור, פרופיילר וכו
  • Advanced DataGrid - היכולות החדשות של אחד הקונטרולים היותר נפוצים ב- RIA.
  • steps toward open source Flex - הכיוון אליו אדובה הולכת, BlazeDS וכו'.
  • Integration with Creative Suite 3 - אינטגרציה עם פלאש.
נושא AIR בכוונה מושמט, מפני שהרצאה בנושא הספיציפי הזה תינתן ע"י איתן אבגיל.


February 03, 2008

OT: הפוטנציומטר - אפילוג

מה קורה?
בואו ואנסה לקצר את הסיפור:
יום שישי, סאחבק שם פעמיו אל ירושלים המושלגת קלות בכדי לבצע רכישות לשדרוג ענייניו המוסיקאליים. אין ספק שהשלג עורר את השלפוחית ומצאתי את עצמי תר אחר שירותים, או פינה חשוכה. נזכרתי שבבניין-כלל יש חנות מוסיקה וגם שירותים, אז החלקתי לי לשם. בחנות המוסיקה קניתי פוטנציומטר A500K, שזה לא לגמרי מה שאני צריך, אבל יעשה את העבודה, בעוד שסוג B הוא לינארי, סוג A הוא אלגורת'מי (או כך לפחות אומרים), כלומר היחס בין הסיבוב לערך הוא לא ישר. כמה זה עולה אתם ודאי שואלים - 12ש"ח. נכון, זה לא 80ש"ח. אז קניתי שניים. זה גם לא האיכות הכי טובה, אבל זה יעשה את העבודה. האיכות הכי טובה עולה 35ש"ח (נכון, זה עדיין לא 80ש"ח).
משם אל טמבור עבור נייר שיוף עדין, בכדי לנקות כל מיני הלחמות סוררות. משם לחנות אלקט' שם קניתי את כבלים, צינוריות מתכווצות בחום, בלה בלה... ויאללא הביתה.
כמה שעות אחרי זה, והרבה אדי כספית שנשאפו, הגיטרה שלי הפכה לצ'אק נוריס. הוצאתי את קרביה כמובטח, ניקית, הלחמתי הכל הלך כמתוכנן. עכשיו היא לא מרעישה, הווליום עובד נהדר (גם החלפתי את הפוטנציומטר של הטון) וטוב לי על הלב.
את הסופ"ש העברתי בעיקר בנגינה כי אין כמו לגלות מחדש את הסאונד של הגיטרה שלך - כלומר כמה חרא הוא היה לפני-כן, ואיך ניסית לכפר על זה עם אפקטים, מה שגורם לגיטרה שלך עכשיו להישמע מעט מוזר...
ומוסר ההשכל - אל תפחדו לפתוח קרביים, חנויות מוסיקה בר"ג הן גנבים במסווה, אל תשאפו יותר מדי כספית זה וואחד כאב ראש אח"כ.
עלות כל התיקון - בקושי 50ש"ח (אל תשכחו שקניתי שני פוטנציומטרים).
שמחות על ראשיכם.



January 31, 2008

פלאשו וקוויקסופט נותנים בפלקס ו- AIR!

הכו בתופים וצאו במחולות, שהרי מפאגשו של פורום הפלאש "פלאשו" בשיתוף עם "קוויקסופט" יוצא לדרך כמו הוריקן אל טקסס.
דבר ראשון, בואו הרשמו אל המפגש בקישורון הבא: אג'נדה ורישום.
עכשיו ,לאחר שנרשמתם אפשר לדבר... בנינו זה כנראה הולך להיות האירוע הפלקסי/פלאשי הכי גדול שקורה על אדמת הקודש. לראשונה אדובה ונציגתה בארץ מעודדים אקטיבית את קהילת המפתחים והמעצבים הגדולה שרוחשת כשפים פה מזה זמן רב.
אני גם שמח להיות חלק מתוכנית הערב, כשאשא דברים על החידושים של פלקס 3, ואעיף מעט דוגמאות באוויר רק בכדי לתת טעימות.
איתן אבגיל, חבר יקר ומפתח מחונן, יתן הרצאה על הגרסה החדשה של AIR ובכלל יהיו שיגועים, צחוקים והרבה אנשים מוזרים.
שאלה חשובה הנשאלת היא - אם המפגש הזה הולך לדבר על פלקס ו-AIR, מה למפתחי פלאש בו?
שאלה יפה...
ובכן, מעבר לעובדה שפלקס היא "פלאש למתכנתים" והכוח המהותי של AIR נובע מאינטגרציה עם פלאש, אני חושב שמפתחי פלאש צריכים לצאת מעט מהנישה הקטנה וחמימה שלהם ולהסתכל מעט החוצה. הכלים הללו, שיודברו באירוע, הם הולכים כנראה להיות חוד החנית בפיתוח RIA, ואני אפילו אחטא ואומר Web Enterprise Applications. זה תמיד טוב לדעת מה עוד נמצא בשוק, אילו עוד כלים יש, מה עוד ניתן להשיג בעזרת SWF.

בכל מקרה, מאד מקווה לראות אתכם שם.


January 27, 2008

OT: מחווה לפוטנציומטר

יא אללא, אם חשבתי שלפצח את הגנום האנושי זו הייתה משימה קשה, מעט ידעתי על כמה קשה למצוא פוטנציומטר לגיטרה חשמלית.
אל תצעקו - גם אני שכחתי שלכפתור המסובב של הווליום קוראים כך, אבל לך תסביר למוכר בחנות אלקטרוניקה: "נו... הזה של הווליום, שמסובבים". ואז מתחילות השאלות של כמה קילו, כמו היה מדובר בשוק מחנה-יהודה לאזניי בורות הפארדים. כששמתי רגלי בחנות מוסיקה מכובדת (או כך חשבתי לפחות לפני שנכנסתי אליה) מיד שאלו אותי אם סינגל-קוייל או האמבקר, וכל מיני חיריונים שכאלה, עד שהבינו שאני זקוק ל- 500K. כמה זה עולה, אתם שואלים? 80 ש"ח.
רק אלוהים ומלאכי השרת יכולים להבין איך שתי חתיכות מתכת, ופלסטיק בגודל של אגודל, יעלו 80 מטבעות. כששאלתי "למה ככה?", ענו לי שזה של חברה, של ernie ball, שאם הייתם מקשיבים ממש טוב הייתם יכולים לשמוע את השקדים שלי מוחאים כפיים. מעניין לי את המיתר אם זה של חברה - למה אני צריך לשלם כל כך הרבה עבור זה?
בכל מקרה, לך תחפש עכשיו חנות לרכיבי אלקטרוניקה טובה. איפה... אני מכיר רק אחת בירושלים וגם זה בקושי. אומרים בדרום ת"א יש המון, אבל לא ממש מתאים לי להגיע לשם.
תראו - בסוף יהיה, זה בטוח. אני אפתח את קרביה של הגיטרה שלי ואחליף לה אברים, אבל לאט לאט... אני לא ממהר. אני אמצא את החנות הנוצצת. יודעים מה? אולי אפילו אני אתעד את כל התהליך פה ממש. תכלס, מי צריך פלקס שיש מוסיקה?
אם אתם מכירים איזו חנות טובה, אני אשמח לדעת.


January 24, 2008

מפגאשו מקצועי בפברואר

אהלן אהלן,
חלק מכם אולי לא יודעים, אבל עבדכם הנאמן הוא חלק מצוות פורום הפלאש (והפלקס) הישראלי "פלאשו". אולי אני לא אובייקטיבי , אבל אני אומר עם יד על הלב, שאם מפתחי פלאש ופלקס הם כלבים, אזי זו המלונה הכי רצינית בסביבה (כן, אני בוחר את הדימויים שלי בקפידה למי שתהה).
בכל מקרה, בחודש בפרואר, ב-25 בו, יתקיים מפגאשו מקצועי בחסות אדובה (כן, אדובה, יש דבר כזה). בו ידובר על גרסאות פלקס ו AIR החדשות העומדות לצאת אוטוטו, ו... המון הפתעות, סבבה, כיף ו... כן.
כמו כן, סאחבק נתבקש להרצות על פלקס 3, אז יש מצב שאני אהיה שם על הפודיום.
בכל מקרה, כבוד והדר.
הנה, תקראו על זה פה: מפגאשו מקצועי.
שמחות.

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


January 21, 2008

שובו של הג'דיי.... טוב נו, בקטנה.

אני לא חושב שאפשר ממש לקרא לזה כך, אבל מה? אנחנו נתקטנן? אנחנו? מפתחי פלקס/פלאש או סתם חטטנים בלתי נילאים, אנחנו נתקטנן על כותרת זו או אחרת? לעאא....
ולמה אני חוזר, כמו שד משחת, כמו ספיידרמן חיגר, כמו מומיה מהמתים? ברור - בגלל איוולת. שכן, אין מקום יותר טוב למצא בו עברות קוד יותר מאשר פלקסל'ה, והחברה שלו Cairngorm, ובפרק היום: ViewLocator.
למי שמכיר ועוסק ביצור הכלאיים Cairngorm (אם אתם לא מכירים, תגגלו על זה, זה שם, עצלים) ודאי נתקל במחלקה ViewLocator שלכאורה תפקידה נראה כאפוזיציה ל MVC, שהרי לפי MVC, אסור ש-view אחד יכיר את רעהו, מה שלמעשה מספק. המחלקה אומרת "תן לי את שם ה ViewHelper שאתה מחפש, ואני כבר אביא לך אותו ע"י מנגנון רישום views שאני מנהלת.
זה ממש חארבנה, אתם ודאי מבינים... אבל מי מאיתנו לא חטא, והשתמש במחלקה הזו פה ושם על חשבון code design נכון?
לאט לאט החלו לעלות סברות שאין כבר מקום ל- ViewLocator כאשר באים לעשות design נכון לקוד, ברם המחלקה הזו נשארה עודנה תחת Cairngorm, ואני, חמדתי לדעת, למה בדיוק התכוון המשורר שהותיר אותה שם.
מייל אחד לאיש קשר באדובה והכל התחוור אל מול עיניי:
"אדובה ממליצים לא להשתמש בה", הוא אמר... " למעשה היא תהפוך ל deprecated בגרסאות הבאות".
"Deprecated? זאת אומרת, שמחר הקוד שלי לא יעבוד?"
"כן, בדיוק - הוא לא יעבוד".
מגניב, מרענן, משמח-לב.
שימו לב, פושעי-קוד קטנים. חדלו להשתמש בסקביאס התכנותי הזה, ועברו לפתרונות יותר אמינים (יש כאלו לרב, תגגלו... מה, אני עובד אצלכם?)

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




June 24, 2007

Practicing Flex Binding

הנה טיוטת מצגת שכתבתי להבהיר את נושא ה-Binding והשימוש בו. מקווה שתמצאו את זה יעיל עבורכם (צר לי על האנגלית, זה נכתב לצרכי עבודה):



What is "Binding"?
Binding is a Flex mechanism that let us "bind" a property of any sort to a destination. The destination can be a control attribute, a setter function on so forth…

How do I implement binding?
There are 3 main methods to create binding relationships:
1. Use the curly braces inline of the control or object we wish to bind to a source.
2. Use the Binding tag which can enable us to bind many sources to one destination.
3. Use the BindingUtils.bindProperty() method which needs to manually be set. It creates a ChangeWatcher instance that can be used later to control the binding. This method is more elegant than using the ChangeWatcher directly, but basically does the same.

What triggers the Binding?
In the case of curly braces, what first triggers the Binding is the life cycle of the document, like so:

createChildren ()
|
createComponentsFromDescriptors ()
|
BindingManager.ExecuteBinding ()
|
Binding.execute ()

This is different when using the BindingUtils.bindProperty(). When using the BindingUtils.bindProperty(), it should be invoked within a method such as the control initialize phase. This method gives us more control on when to switch the Binding on.

What are the drawbacks of binding?
As apparent the benefits of the Binding mechanism are, there are some big drawbacks to this method of developing.
A lot of code is being executed behind the Binding mechanism and part of it is to prevent runtime exceptions from being thrown when not all the binding conditions are met. This fact mean that a lot of "if" and "try… catch" statements are made in the Binding.as and BindingManager.as classes to ensure that all is good for performing a valid binding process, here are some of the cases that fail silently when using Binding:

// Error #1006: Call attempted on an object that is not a function.
// Error #1009: null has no properties.
// Error #1010: undefined has no properties.
// Error #1055: - has no properties.
// Error #1069: Property - not found on - and there is no default value

Only when an error which is not one of the above occurs that an exception is thrown.
The most common error we get is when setting Binding with curly braces. What happens is the control has binding set to it before it was even initialized. The Binding mechanism tries to bind a property to a destination, but the destination is not valid since its owner (the control itself) is not yet fully created. This causes error #1009 - "null has no properties".
When the Binding mechanism reaches this error it stops from performing the binding but does not alert about it. When we have several properties bound like so, you can see how going through this "if" and "try… catch" statements can effect the application's performance.



What is the best practice for working with Binding?
The best practice is to use the BindingUtils.bindProperty() method when dealing with large components that need to render many objects according to the information received. In this manner we can control the instantiation of the ChangeWatcher to prevent as many "silent failures" as we can and later control it better (switching it on and off). This method also provides a better and more elegant access to setter methods using the bindSetter() method.
When dealing with simple controls attributes, such as Label's text and so on, using the curly braces (or Binding tag) should do fine but still we need to keep an eye on what happens behind the scenes.
Another thing to remember is that once a component is bound to properties, as long as it is alive, the binding will keep working within it even if the component is not visible (!). When dealing with components that draw much data this can mean a real performance slowdown to the application. What you need to do is make sure that once the component is not viewable, stop watching after the bound properties that relate to it. This is simply done using the ChangeWatcher.unWatch(). Since BindingUtils.bindProperty() creates an instance of ChangeWatcher this can be easily done. When the component is up and visible again we can reset the ChangeWatcher instance to the source again, and set the current value for the first time, retrieved from ChangeWatcher. getValue() method.

How to debug and monitor the Binding?
1. Debug the Binding.as and BindingManager.as. This is not very trivial to do since those classes are not reachable, so what you need to do is to set a break point on the control you're binding to and using the "drill down" option of the debugger, reach the classes mentioned above. Once there you can set break points to monitor methods entry points and such.
2. Use the BindingManager.debugBinding() method. Don't bother searching, this jewel is not documented and can't be reached. What it does is to output the errors the Binding Mechanism is throwing. You can look at it as a mere flag to whether trace or not. This method works only on binding with curly braces. What you do is call the method where the single argument is a string made of the control name and the destination within it, like so: BindingManager.debugBinding ("myTextControl.text");

May 27, 2007

Flex 2.0.1 hotfix 2

מה קורה?
אדובי החליטו להוציא את hotfix לגרסאת פלקס 2.0.1, שברגעים אלו ממש אני מתקין אותו, מחזיק אצבעות גם בכפות הרגלים ומנשק שום רק בכדי שתעבוד. את התיקון שבועות הזה לא צריך להתקין מי שכבר רץ אצלו LifeCycle2.5 (זוכרים? FDS החדש...), שזה לכשעצמו מעט אבסורדי מפני שחלק מהתיקונים כלל לא קשורים ל-FDS.
אתם יכולים לקרא על ה- hotfix ב- Tech note הזה וגם להוריד אותו מאותו המקום (158 MB, שזה 6MB יותר מהעדכון של פלקס 2.0 לפלקס 2.0.1, עוד פרט מעניין...). בכל אופן, מה שלכד את תשומת ליבי הוא הדברים הבאים:
1. תיקון זליגת זכרון בקונטרול של ה- Accordion.
2. תיקון זליגת זכרון ב- View Stack (!).
3. אם מסתירים ומראים עמודה אחרונה של DataGrid הסקרול מקבל ג'ננה.
4. Tree אינו מתרנדר נכון לאחר מחיקה של node מסוים.

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

April 30, 2007

Cairngorm 2.2

רגע! רגע, לכל השדים! אתה לא מספיק לנפוח לצד והנה עוד שדרוג יוצא, עוד גרסה, עוד הנפצה. שנייה!
... ואחרי שהוצאתי מעט קיטור, אני גאה לבשר לכם על dot version החדשה של Cairngorm (אם אין לכם מושג מה זה, או שתדפדפו אחור בבלוג, או שאולי לכו לעשות לכם קפה ושכחו מכל העניין). אז מה היה לנו שם?
תכלס, הסירו תלותיות בין Cairngorm לסוויק (swc) של Flex Data Services, למה? כי זה חוסך בנפח הקובץ הסופי. לא ממש גורם לי לקפץ מאושר, אבל סבבה, למה לא. מה עוד מעניין? שינוי שמות אינטרפייסים כמו IModelLocator במקום ModelLocator (ואוו!) ו... משהו באמת מגניב הוא שהוסיפו מתודה חדשה ל CairngormEvent שנקראת dispatch, והיא (למרבה הפלא) מדספצ'ת את האירוע בלי הצורך לקרא ל- CairngormEventDispatcher. נחמד.
אפשר להעיף commands מה-FrontController בזמן ריצה, אבל אני לא רואה בזה כרגע יעילות משמעותית, ועוד פה ועוד שם עליהם תוכלו לקרא פה.
אז אין ברירה, הא? פשוט לשנס מתניים ולבנות עוד פרוייקט עם הגרסה הזאת ולו רק בכדי לחוש את הטעם הצורב שאקבל עם יציאת 2.3, או רחמנא ליצלן 3.0. מה שעושה לצוות התמיכה שלהם טוב.

ביי בינתיים.