שבעה ימים עם Windows Phone 7 [היום הרביעי]

אלעד אברון החליט ליטול את ה-HTC הישן שלו ולהחליף את אנדרואיד ב-Windows Phone 7. את המעבר החליט לתעד ביומן בן שבוע שמעניק הצצה למערכת ההפעלה של מיקרוסופט. טובה יותר או פחות מהחלופה של גוגל ואפל?

תמונה: יח"צ, מיקרוסופט

<<< לפוסט הקודם בסדרה: אפליקציות פופולאריות (היום השלישי)

קשה לקרוא לי באמת ‘מפתח’. זה יהיה עלבון למפתחים אמיתיים, אנשים שלמדו והשקיעו ויכולים לעשות וליצור דברים מדהימים עם מקלדת ומספיק זמן. אנשים שמשקיעים המון זמן ומאמץ על מנת שיגנבו להם את הקניין הרוחני בסוף היום והם לא יקבלו על זה גרוש. אלה מפתחים. אני סתם חובבן – אבל זה תחום שמסקרן אותי. זה תחום שאם היתה לי סבלנות ויכולת הייתי נכנס אליו באופן מקצועי (אולי בעתיד?), ובינתיים חטאתי בו רק באופן חובבני ביותר של העתקת קוד מגוגל וניסוי וטעיה. פיתחתי מספר אפליקציות קטנות אך שימושיות פה ושם (למשל – מתקן יישור לימין באנדרואיד) אבל קורס מבוא זריז שלקחתי לאחרונה באוניברסיטה הפתוחה הראה לי שגם את זה עשיתי לרוב בצורה לא נכונה ולא יעילה במיוחד. עם זאת, יש משהו מרתק בתחושה של לראות קוד שכתבתם (כמעט לגמרי) במו ידיכם ‘קם לתחיה’ והופך לאפליקציה של ממש, ועוד כזאת שעוזרת לכם. אני מניח שבבוא היום זה יהיה קצת פחות מרגש.

לסביבת הפיתוח של Windows Phone 7 נחשפתי עוד לפני שהטלפון היה קיים, וכבר אז התרשמתי שהיא פשוטה למדי להבנה וניסוי אפילו למפתחים חובבים כמוני. על סביבת הפיתוח שהיא משתמשת בה,  Visual Studio Express, אני לא צריך לספר לכם. מדובר בסביבת הפיתוח הכי נוחה ו-‘מפנקת’ שיש. יש שטוענים שהיא אפילו מעודדת מתכנתים טיפשים ועצלנים. אולי הם צודקים, אבל גם לנו מגיע – לא?

שלב א’ – צורך

אני מתכנת של צורך. כמעט כל התוכנות שאי פעם כתבתי היו מתוך צורך לבצע משהו שאף תוכנה אחרת שמצאתי לא עשתה (לפחות לא ביעילות). הפעם, כפי שסיפרתי לכם בפוסטים קודמים, היתה תוכנה אחת שלא מצאתי ב-WP7, ומה שלא סיפרתי לכם בפוסטים הקודמים (כדי שלא תקדימו אותי ‘למכה’) היא שמדובר בתוכנה לאתר הספורט הפופולארי One. לקחתי השראה מתכנת ה-Ynet שמצאתי, שלא נכתבה על ידי האתר עצמו, והרמתי את הכפפה. למה לא פשוט גלשתי לאתר מהטלפון? אולי בהזדמנות אני אכתוב פוסט על Internet Explorer ב-WP7 וכמה הוא מפגר ביחס לדפדפנים ניידים אחרים.

שלב ב’ – בדיקת השטח

תזרים רסס - הירארכי ולוגיזאת לא פעם ראשונה שאני כותב תוכנה שקוראת תוכן של אתרים. למעשה רוב התוכנות שלי הן כאלו (למרות שמסיבות של נאמנות לעבודה, זכויות יוצרים וכו’ אני לא יכול לפרסם אותן). השיטה בדרך כלל מאד פשוטה: להיכנס לקוד מקור של האתר, לאתר את התוכן הרצוי ואת שיטת השמות של האלמנטים במסמך ה-HTML, ולכתוב קוד שיפריד את האלמנטים הללו. במקרה של One ושל רבים מהאתרים של היום, מדובר במשימה שהופכת קלה הרבה יותר בזכות תזרימי ה-RSS שרבים מהאתרים משתמשים בהם, שמעבירים תוכן ללקוחות באופן מסודר וקל ביותר לניתוח (Parsing, לא מצאתי מילה מתאימה יותר בעברית). מדובר בקבצי XML פשוטים להחריד, והקריאה שלהם פשוטה עוד יותר. הם מספקים כל מה שצריך: כותרת, תוכן, תמונה, לינק ותאריך. מכאן והלאה זה אמור להיות ממש פשוט להפוך את זה לתוכן שיוצג על ידי תוכנה.

כתבתי קוד בסיסי שיקרא את תזרים ה-RSS הראשי של אתר One, כשאני כמובן קורא בגוגל מה הדרך הטובה ביותר לעשות זאת. כמובן שקריאת XML היא משהו כל כך בסיסי בימים אלה, שזה לא מאד מסובך. יצרתי קורא בסיסי שמאכלס רשימה פשוטה ומציג לי אותה, רק כדי לראות אם זה עובד (בינתיים עוד לא נגעתי בעיצוב דרך XAML, אבל נגיע לזה). זה לא עבד.

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

שלב ג’ – צעדים ראשונים ב-WPF

הקוד שמאחורי, הקוד שלפני, והתצוגה המקדימהבסביבת #C רגילה זה לא בעייתי במיוחד לקודד ולפענח תזרים Gzip, אבל ב-Windows Phone, מסתבר, אי אפשר להשתמש בכל ספריית #C רגילה אלא חייבים כאלה שתואמות ל- Silverlight. זה לקח זמן אבל מצאתי ספריית פענוח ZIP מתאימה, השתמשתי בשיטה המאד מתחכמת לקידוד התזרים (שמבחינתי כללה שתי שורות בלבד) והמשכתי הלאה.

השלב הבא היה להמיר את התזרים לתוצאה, ומהר מאד גיליתי את אחד הדברים המרשימים ביותר ב-WPF, הפלטפורמה הוויזואלית שבה משתמשים Silverlight ומערכת ההפעלה הסלולרית של מיקרוסופט. WPF היא Windows Presentation Foundation, שיטה חדשה (יחסית) להצגת תכנים בסביבת חלונות המבוססת – איך לא – על XML. את כל הצד הויזואלי של התוכנה ניתן לכתוב ולתכנן באמצעות קוד טקסטואלי בלבד, והיתרון האדיר בכך (כמו בכל דבר מבוסס XML) הוא לא רק הקלות והלוגיקה ההירארכית שעומדים מאחורי זה, אלא גם הדינמיות של הפלטפורמה. כך למשל ניתן (עקרונית) לכתוב ‘עיצוב’ לתוכנה שלא תלוי ברזולוציה, באוריינטציה או אפילו בשפה של המשתמש. בפועל כמובן זה רחוק מהמציאות, אבל העקרון המנחה הוא חכם וקל מאד ליישום.

אחד הדברים הראשונים שגיליתי והייתי צריך ללמוד מאפס הוא משהו שנקרא Data Binding, שזה בעצם הדרך של WPF להתמודד עם ‘נעלמים’. ספציפית, איך מתמודדים עם עיצוב משהו לא ידוע בפלטפורמה שהיא כולה טקסטואלית וכמעט לגמרי נטולת קוד?

אז מסתבר שהיא לא באמת לגמרי נטולת קוד – אלא שב- WPF יש לכל דבר שתי רמות. רמת ה-XML ורמת הקוד, מה שנקרא באופן לא רשמי “Code-Behind”. גם בסביבת הפיתוח, לכל קובץ XAML (קבצי העיצוב) יש קובץ cs (או vb) המשורשר תחתיו, ובעצם מייצג את הקוד שעומד מאחוריו. זה מאפשר פתח, אם רוצים, לנטוש כמעט לחלוטין את גישת ה-XML של WPF ולהשתמש בקוד בלבד – אבל למרות שזה אפשרי (ולפעמים הכרחי) זו לא השיטה המומלצת או המועדפת.

אז איך מתמודדים עם נעלמים ומשתנים בסביבה של XML? משתמשים ב-Data Binding (קשירת מידע). אני עדיין לא בטוח לגמרי שהבנתי את המבנה התאורטי של השיטה, אבל היישום הוא כזה: אם רוצים נגיד ליצור רשימה של n פריטים בלי לדעת מראש כמה, יוצרים למעשה רק את ה- ‘תבנית’ לפריט ב-XAML. את התוכן המתחלף לא ממלאים אלא ‘מפנים’ למידע מקושר, שאותו מכניסים אח”כ בזמן הריצה. לדוגמא, ב- XAML רושמים:

ובזמן הריצה יוצרים אובייקט עם מאפיינים בשם “Title”, “Summary וכו’, ומוסיפים אותו כפריט של ה- ListBox. מה שיקרה הוא שעבור כל פריט שיתווסף, המערכת תחולל את מה שמופיע בתוך DataTemplate, ותשתמש בערכים המקושרים.

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

שלב ד’ – מתגברים על מגבלות הפלטפורמה

גם בנץ מופתעאחרי שיצרתי רשימה מאוכלסת יחסית פשוטה של כתבות שנשאבו מה- RSS של One, נתקלתי בחומת לבנים. ניסיתי לעשות פעולה די פשוטה – להציג ליד כל כתבה את התמונה המשוייכת אליה, דבר שלא אמור להיות קשה במיוחד לאור העובדה שיש כתובת ישירה של התמונה בחלק מה-XML של ה-RSS.

אך אבוי, שום דבר שניסיתי לא עבד. ניסיתי תמונות מאתר אחר רק בעבור הבדיקה, ולהפתעתי זה עבד. חשבתי בהתחלה שאולי יש פה עוד פעם בעיית GZIP, אבל לא – הרי כבר עקפתי את המגבלה הזאת. בדיקה מהירה הראתה לי שההבדל העיקרי בין התזרימים הוא שב-One משתמשים בתמונות מסוג GIF הארכאי, בעוד בשאר התזרימים שבדקתי השתמשו ב-JPG. היתכן שצריך איזה סוויץ’ מיוחד בשביל לקרוא GIF? זה לא אמור לעבוד על אותה ספריה?

אז התגלה הסוד הנורא – זה לא שצריך לעשות משהו אחר בשביל לקרוא קבצי GIF ב-WP7, אלא פשוט שאי אפשר לעשות את זה. המערכת לא תומכת ולא מכירה בקבצי GIF אלא רק בקבצי JPG ו-PNG. שפשפתי קצת את הראש. איך יתכן שמערכת שלמה לא תומכת בפורמט שלמרות היותו ישן הוא עדיין מאד פופולארי, במיוחד לאחרונה? אז מסתבר שככה זה.

חיפשתי פתרון, ומצאתי משהו שנקרא ImageTools, שאחת הווריאציות שלו היא ל-Silverlight וטלפון חלונות 7, אבל זה פשוט לא עבד. למרות שהקוד שם – הוא פשוט לא עובד כמו שצריך עם קבצים מהאינטרנט (קבצי GIF מקומיים דווקא אין לו בעיה לפתוח). דיווחתי על כך למפתח והוא ענה שזה באג חדש שנובע מהגבלות אבטחה חדשות בפלטפורמת 7.1 של WP (למעשה גרסאות 7.5 ומעלה – שיצר דיפרגמנטציה בגרסאות שעוד אתקל בה שוב מאוחר יותר) ושהוא עדיין לא מצא לזה פתרון. ניסיתי פתרונות אחרים כמו להוריד את הקובץ ולפתוח אותו מקומית (מה שגם לא עבד – שלב ההורדה פשוט כשל – מאותה סיבה), וכששום דבר לא עבד החלטתי לעזוב את זה לבינתיים ולהתקדם הלאה (אחרי שזה שרף לי ימיים שלמים של ‘עבודה’).

האשם העיקרי ברוב הבעיות שליהשלב הבא היה לקרוא את הכתבה שאליה מקשר הלינק מה-RSS ולפענח אותה לכדי קוד שמיש (Parsing). גם זה תהליך יחסית פשוט בדרך כלל שכבר עשיתי מספר פעמים בתוכנות שונות, וזה נעשה אפילו קל יותר עם ספרייה שנקראת HTML Agility Pack שלוקח מסמך HTML וממיר אותו ל-XML הירארכי, שהוא כאמור הרבה יותר קל לשימוש. הבעיה היא שזה לא עבד, וגם הגרסה שמיועדת ל-Silverlight פשוט זרקה לי שגיאה כל פעם כשניסיתי להריץ אותה.

במקום להשתמש בקובץ ה-DLL של הספרייה הורדתי את קוד המקור, בתקווה שהדיבאגר יעצור במקום הנכון ויראה לי מה בדיוק הבעיה – ומהר מאד מצאתי שזה בכלל לא מתקמפל. הסיבה: הספרייה תלויה במשהו מאד בסיסי וחכם לניווט בהירארכית XML שנקרא XPath, ופלטפורמת WP7, בניגוד לכל פלטפורמה אחרת (כולל Silverlight) כך מסתבר, לא תומכת ב-XPath.

למרות שגם כאן שרפתי על זה יומיים שלמים, מצאתי בסוף את הפתרון בדמות ספריית XPath ייעודית לטלפון חלונות 7 (שפותחה על ידי מפתח עצמאי) – ויכלתי לפענח את הכתבה. המגבלה הבאה היתה שהמערכת תומכת רק בשני סוגי קידוד, UTF8 ו- Unicode, וכאן מצאתי פתרון אלגנטי למדי שעליו תוכלו לקרוא כאן. בסופו של דבר התגברתי על המגבלות הטכניות העיקריות והגעתי למצב שבו אחרי כמה ימים (ועבודת נמלים) היתה לי תוכנה עובדת.

שלב ה’ – עיצוב ערכת נושא

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

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

אחרי יום שלם של התעסקות, שכלל הורדת תוכנות דוגמה (שבהן זה כן עבד – עם אותו קוד בדיוק) וכתיבת פוסטים מתוסכלים בבלוגים ופורומים כאלה ואחרים, גיליתי את מקור הבעיה: מסתבר שב-WP7 (הגרסאות הראשונות של המערכת) היה ‘באג’ במה שקשור להצגת צבעים, כשהמפתחים ש-‘דרסו’ ערכות נושא בעצם השתמשו בבאג מבלי לדעת (לפחות לפי מייקרוסופט). בגרסה 7.1 מיקרוסופט ‘תיקנו’ את ה-‘באג’ (מקש המרכאות שלי מתחיל להתעייף) וכל השיטות שהיו ידועות עד לאותו רגע לדריסת ערכת נושא הפכו ללא שימושיות בעליל. מצאתי מדריך שמסביר איך להתגבר על ‘התיקון’ (שינויי Syntax בעיקר ודריסת הגדרות בזמן ריצה), יצרתי כמה גרפיקות, ובסוף הכל (כמעט) עבד. יש כמה ערכים שפשוט מסרבים לשנות צבע, אבל בינתיים החלטתי לא לדפוק את הראש בקיר יותר מדי כי מדובר בערכים של אלמנטים לא מאד חשובים בתוכנה שנראים טוב ככה או ככה. אחרי מספר תיקונים, שיפוצים, ותהליכים כאלה ואחרים – יש לי תוכנה מוכנה ועובדת.

סיכום

בטח ציפיתם שאחרי כל זה אפרסם פה את התוכנה, אבל היא עדיין לא מוכנה לשחרור למרות כל הכתוב לעיל. יש עוד כמה דברים חשובים שאני חייב לעשות לפני שאני יכול לשחרר אותה, כשהחשוב ביותר הוא קבלת אישור מ-One (אני אולי היחידי שעושה את זה, אבל אני מאמין גדול בקבלת אישור לשימוש בקניין רוחני). מעבר למגבלות שציינתי למעלה תהליך הפיתוח היה מלווה בעוד כל מיני מכשולים כאלה ואחרים שלא פירטתי כי הם לא קשורים לפלטפורמה אלא יותר ל(חוסר) ידע ול(חוסר) ניסיון שלי כמפתח, אבל גם על מכשולים אלה התגברתי לבסוף. חלק מהתהליך, למשל, היה שפתאום קלטתי שמבלי לשים לב את רוב הקוד כתבתי ב- #C (ב- CodeBehind) ויצרתי אובייקטים רבים בזמן ריצה במקום להשתמש בתבניות, אז המרתי את זה חזרה לתבניות מה שלקח קצת זמן. מכשולים נוספים שנתקלתי בהם היו קשורים בעיקר בצורה שבה אתר One מציג חומר, אבל לאט לאט למדתי את המקרים השונים והתאמתי את הקוד. זה עדיין לא מושלם, יש לי רשימה של דברים שאני חייב ‘לסגור’ לפני שאני משחרר את האפליקציה – אבל כל זה, כמובן, בהנחה שאקבל אישור.

עוד בעיה שעדיין לא החלטתי איך להתמודד איתה היא שהאלמנט הבסיסי ביותר של התצוגה במערכת ההפעלה – Pivot Control, מתחרבש לגמרי כשמציגים אותו מימין לשמאל, ואם הוא משמאל לימין אז הוא נגלל לכיוון הלא נכון אם האלמנט הראשי שלו הוא מימין לשמאל (אפשר להתגבר על זה באמצעות עיגון האוביקט מימין לשמאל בתוך אוביקט משמאל לימין – אבל למעשה כל קביעת אלמנט כ- ‘מימין לשמאל’ הופכת את כל הלוגיקה של העיצוב). זה נכון לעכשיו באג ידוע במערכת, ואם אתם בעלי חשבון Microsoft Connect אני מפציר בכם להצביע לו כאן.

מלבד ולמרות כל הכתוב לעיל, בסך הכל ההתנסות שלי היתה מאד חיובית. הפלטפורמה החינמית של מיקרוסופט, Visual Studio Express בשילוב עם Expression Blend היא נוחה וחכמה, וכמתכנת חובבן היה לי קל מאד לקפוץ למים וללמוד את הגישה של WP7 לפיתוח, גישה שתהיה מיושמת בצורה הרבה יותר דומיננטית במערכת ההפעלה חלונות 8. כמובן שרוב הזמן נעזרתי בגוגל כדי ללמוד דברים שלא ידעתי, אבל רוב התשובות – במפתיע או שלא – הגיעו דווקא ממיקרוסופט.

וזוהי השורה התחתונה: מיקרוסופט רוצים שתפתחו אפליקציות ל-Windows Phone 7. הם עושים את זה קל במיוחד (גם אם יש מכשולים כאלה ואחרים, אבל חשוב לזכור כמה המערכת הזאת צעירה ביחס לאחרות), נגיש וזול במיוחד – והכי חשוב, גמיש. קהילת מפתחים גדולה ונאמנה היא הדבר אולי הכי משמעותי מאחורי הקלעים של כל מערכת הפעלה, ולמרות ש-WP7 אולי עדיין לא כוללת תמיכה כזאת רחבה של הקהילה, העובדה שהיא משתמשת בקוד #C וספריות Silverlight הופכות אותה למטרה הרבה יותר קלה ל-‘המרה’ של משאבים קיימים. למעשה, רבות מהתוכנות העצמאיות שנכתבו למערכת, כולל WazeWP7 אותה סקרתי בפוסטים הקודמים, הן בליבתן קוד שנכתב עבור מערכות אחרות ורק ‘הומר’ ל-WP7 (עם שיפוצים ותוספות).

אם וכאשר אקבל אישור להפיץ את התוכנה, אעדכן על כך כאן. בינתיים, שיהיה לכולם שבוע נפלא.

הפוסט פורסם לראשונה בבלוג Ambious בקדמת הטכנולוגיה.

Avatar

אלעד אברון

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

הגב

3 תגובות על "שבעה ימים עם Windows Phone 7 [היום הרביעי]"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 

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

סידור לפי:   חדש | ישן | הכי מדורגים
SocialEbola
Guest

אני שמח שמצאת את הפרסר שימושי. ;)

רון
Guest

איך אפשר ליצור קשר עם אלעד?
מה המייל שלו בבקשה?

חיים
Guest

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

wpDiscuz

תגיות לכתבה: