לאחרונה חזרתי מכנס פנימי טכנולוגי של מיקרוסופט, והנושא המרכזי בכנס היה ללא ספק מחשוב ענן.
בחפוש שערכתי בשני מנועי חיפוש שונים, לא מצאתי תוצאות למקצועות יועץ ענן או ארכיטקט ענן. בחיפוש באנגלית כבר יכולתי למצוא עבודה חדשה.
אז הנה דוגמא לשינוי ארכיטקטורה מהכנס שהציג David Chappell, ארכיטקט עצמאי מדהים:
אחד העובדים ב New York Times יזם פרוייקט של סריקת הארכיון ל PDF. הצעת המחיר שקיבל עמדה על קרוב למליון דולר שעיקרה חוות שרתים מכובדת. הבחור הלך לאמזון וביצע את זה בחמשה חודשים עבור 200$ לחודש.
דרך אגב, בויקיפדיה כבר יש ערך רציני בעברית - חפשו "ענן מחשוב"
אז מתי אתם עוברים לענן?
סוגיה מעניינת שנתקל בה לקוח שלי ונראה לי שיכולה לעניין גם אחרים...
(הקרדיט לשגיא קרני על הפתרון...)
נניח שיש לי אפליקצית silverlight 2.0, אשר מקבלת משירות מבנה נתונים שאני מעוניין להציג ב - datagrid.
אני מעוניין לבצע binding ל - datagrid אך מספר העמודות לא ידוע לי מראש.
כמובן שהאוביקט הנוח ביותר להכיל מבנה טבלאי עם מספר עמודות גמיש הוא datatable, ואפילו ניתן לבצע לו binding.
אבל...datatable אינו נתמך ב - silverlight.
אי לכך, פתרון לבעייה ניתן לפתור ע"י שימוש ב - xml:
1. נגדיר מבנה xml שמתאר מבנה טבלאי. לדוגמא:
<table>
<columns>
<column name="col1" title="Column 1"/>
<column name="col2" title="Column 2"/>
<columns>
<rows>
<row>
<col1>12</ col1>
< col2>nice column</ col2>
</row>
<row>
<col1>13</ col1>
< col2>very nice column</ col2>
</row>
</rows>
<table>
חשוב - במקרה זה הגדרתי 2 עמודות (col1, col2) אך כמובן שניתן להגדיר כל מספר של עמודות. כמו כן, מספר העמודות לא ידוע מראש.
2. האפליקציה מקבלת מהשירות את מבנה הנתונים כמחרוזת ו"טוענת" את הנתונים לאוביקט XDocument, "חוקרת" את העמודות ב - xml ומייצרת ב - datagrid עמודה מתאימה עם הגדרת binding מתאימה (שימו לב לדוגמא):
בהגדרת ה - binding של העמודה אנו משייכים לה רכיב שמבצע את פירוק הנתונים מתוך הרשומה ומייצר עבור העמודה את הערך שלה מתוך נתוני הרשומה.
3. מבצע binding של ה-"rows" ל - datagrid.
חשוב להגדר ב - datagrid: AutoGenerateColumns=false.
4. אם מעוניינים לאפשר עדכון של מבנה הנתונים מתוך ה-datagrid, יש להוסיף מימוש בפונקציה XmlColumnConverter.Convertback
דוגמא:
private void BindTabledDataToDatagrid(DataGrid dataGrid, string data)
{
//parse the data in xml object
XDocument xmlData = XDocument.Parse(data);
//create list of columns defenitions:
//loop on the columns defenition from the xml
//and for each column create object instance with the column data
var columns = from col in xmlData.Descendants("column")
select new
{
ColumnName = col.Attribute(XName.Get("name")).Value,
Title = col.Attribute(XName.Get("title")).Value
};
//remove all old coluns
dataGrid.Columns.Clear();
//the converter instance that know how to get value form the xml data into datagrid column
IValueConverter columnConverter = new XmlColumnConverter();
//loop on the columns defenitions list and for each column defenition create data grid column
foreach (var columnDef in columns)
{
DataGridTextColumn column = new DataGridTextColumn();
column.Header = columnDef.Title;
//define the binding for this column
column.Binding = new System.Windows.Data.Binding();
//the value that will pass to the binding coverter class
column.Binding.ConverterParameter = columnDef.ColumnName;
column.Binding.Converter = columnConverter;
//add the column to the datagrid
dataGrid.Columns.Add(column);
}
dataGrid.AutoGenerateColumns = false;
dataGrid.ItemsSource = xmlData.Descendants("row");
}
/// <summary>
/// The Binding converter class get XElement row (as value).
/// It handle the column value by geting the element name
/// that represent the column in the "parameter" parameter.
/// </summary>
public class XmlColumnConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (this.Convert((XElement)value, (string)parameter));
}
private string Convert(XElement data, string columnName)
{
return (data.Element(XName.Get(columnName)).Value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
בעקבות פוסט משעשע של Scott Hanselman המתאר את קורותיו בשעות שלפני הרצאה חשובה, החלטתי להתחיל ביוזמה חדשה:
אני מזמין את כל הקוראים, וגם אחרים, לפרסם בהערות לפוסט זה סיפורים משעשעים, ומשעשעים פחות, על פשלות שאירעו להם בהרצאות באירועים גדולים.
בסופו של דבר אני יודע שחלק גדול מהקוראים של בלוג זה מרצים באירועים שונים, ואין מרצה שלא עבר את רגע ה- "OK, מה עכשיו?!" כאשר מסך המחשב קפא, הכחיל, או, באופן כללי, עשה משהו אחר לחלוטין ממה שהיה אמור לעשות, וממה שעשה בצורה מושלמת רק שעה לפני תחילת ההרצאה בבדיקה האחרונה. כמובן שפשלות בהרצאה אינן מעידות מאומה על איכותה - כבר יצא לי להיות בהרצאה (כשומע, לא כמרצה) בה כל ההדגמות קרסו אחת אחרי השניה, ובכל זאת יצאתי ממנה עם הרגשה שלמדתי הרבה.
נקודות בונוס ינתנו למי שיתן קישור להקלטת ההרצאה בה רואים את הפשלה בשידור חי.
כמובן שכיוזם המהלך אך טבעי הוא שאתרום את הסיפור הראשון. אז הנה - קחו שניים:
האירוע הראשון התרחש לפני מספר שנים באירוע .NET Deep Dive שהיה, אם אני זוכר נכון, במלון דן פנורמה בתל אביב. זו היתה הפעם הראשונה שלי כמרצה מול קהל גדול כל כך (כ- 400 משתתפים), והנושא שדיברתי עליו היה Design Time Support ב- VS.NET (זה היה עוד לפני ימי ה- VS 2005). ההרצאה כללה הרבה הדגמות ושימוש נרחב מאוד ב- VS, וכמובן שבדקתי את הקוד שלי חזור ובדוק בימים שלפני ההרצאה וגם ביום ההרצאה עצמה.
ההרצאה התחילה בצורה טובה, עם הדגמה ראשונה שעברה בצורה חלקה, וכבר התחלתי להרגיש נוח ולזרום עם ההרצאה. ואז, בתחילת ההדגמה השניה, התחלתי ליצור פרוייקט חדש ב- VS, ולפתע ראיתי שהמחשב קופא למספר שניות, שלאחריהן נוצר הפרוייקט החדש. על המסך הופיע קובץ ה- cs שאמור להופיע בפרוייקט חדש, אולם במקום להכיל את הגדרת ה- Class הרגילה הוא היה מלא בג'יבריש לא מובן. פשוט כך - גבב של סימנים שלא הזכירו שום קוד בשום שפת תכנות שהיא, וכמובן שלא התקמפלו. זו היתה הפעם הראשונה (וגם האחרונה...) שראיתי דבר כזה, ולקח לי מספר שניות להבין מה אני עושה.
התגובה הראשונית שלי היתה להגיד לקהל משהו כמו "טוב, כנראה שיש לנו בעיה ב- Visual Studio, נפעיל אותו מחדש". סגרתי את ה- VS והפעלתי אותו מחדש, תוך שאני מתפלל שזה יספיק. המחשב שלי באותו זמן היה, איך נאמר בעדינות, לא בשיאו, וידעתי שאם אצטרך לעשות Restart מלא - הלכה רבע שעה מההרצאה. לשמחתי הרבה הפעלת ה- VS מחדש הספיקה, והמשכתי משם ללא תקלות נוספות.
האירוע השני היה משעשע יותר. הוא אירע לפני כחודשיים באירוע ה- Dev Academy III ב- Airport City. העברתי הרצאה עם מתן עצמון, ארכיטקט מצה"ל, בנושא דילמות ארכיטקטוניות שונות שנתקלנו בהן. זו היתה, לכאורה, הרצאה משמיים: רק מצגת, ללא הדגמות, עם שני מרצים שמכירים היטב את החומר. מה כבר יכול להשתבש? למעשה, הייתי כל כך בטוח בעצמי עד שלפני ההרצאה, כאשר מרצה אחר איחל לי בהצלחה, אמרתי לו: "תודה, אבל אני לא מודאג. זה רק Power Point". אך, לו רק ידעתי ...
כדי להבין בדיוק מה קרה שם, כדאי לפתוח את הקישור להרצאה.
שימו לב: אני מתחיל לדבר, כאשר על המסך מופיע השקף הראשון והסמן הוא בצורת העיגול המסתובב של Vista. לאחר 13 שניות, העיגול נעצר. זהו הרגע בו המחשב שלי, ללא שום סיבה נראית לעין, פשוט קפא. הוא לא הריץ תוכנה כלשהי, לא הפעלתי אביזר חומרה כלשהו, למעשה אפילו לא הייתי קרוב אליו - המחשב פשוט הפסיק להגיב. לגמרי. גם לא Ctrl+Alt+Del. נאדה. אני המשכתי לדבר בינתיים, כאשר בזוית העין ראיתי את העיגול העומד וכבר התחלתי להבין ש- "Houston, We Have A Problem"*. לאחר שעברו 3 דקות מתחילת ההרצאה הגיע הזמן להעביר לשקף הבא, ואז הוברר לי כי, ללא כל ספק, המחשב קרס.
רוצים לדעת איך הסתיים האירוע? צפו בהקלטה!
אגב - בתחקיר שלאחר המעשה הסתבר שככל הנראה יש בעיה באחד הצ'יפים של הזיכרון במחשב, והוא זה שגרם לתקיעה (ולעוד תקיעות רבות אחרות שאירעו לאחר מכן...)
אז זהו, אלו הסיפורים שלי. אשמח לשמוע גם את שלכם, וזכרו - קריסות, תקיעות, שגיאות וכו' אינן מעידות על טיב ההרצאה או המרצה. זה קורה לכולם. על ידי צפיה בסיפורים שלכם נוכל כולנו ללמוד בצורה טובה כיצד יש להתמודד עם מקרים כאלו.
נ.ב. כדי לוודא שכולם הבינו את הנקודה - הכוונה היא לאירועים שקרו לכם כמרצים, ולא לאחרים.
=============================================================================================
* המשפט המפורסם, המשוייך לאירוע התקלה של החללית Apollo 13, למעשה לא נאמר מעולם. המשפט המקורי היה: Houston, We've had a problem. ואם כבר במשפטים מפורסמים שמעולם לא נאמרו עסקינן, גם "Elementary, my dear Watson" מעולם לא נאמר על ידי שרלוק הולמס. מצד שני, הפואמה הידועה "הו-הא מה קרה צסק"א אכלה אותה" נאמרה גם נאמרה, ויותר מפעם אחת.