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 של פלאש.

לעסק...

May 05, 2008

Twitter :OT וגללי-פילים

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