December 2007 - Posts
אחרי שהתבשרנו שסופסוף אפשר להפיל את ה - Windows כשרוצים, מיקרוסופט מביאה לנו את הדבר הבא בסדרה "מה ה - Windows שלך יכול לעשות שה - Mac שלי לא?", אז הנה המאמר למי שנתקל בבעיה:
http://support.microsoft.com/default.aspx?scid=kb;en-us;261186
פוסט זה הוא השני בסדרת הפוסטים על יצירת Custom Controls. הבסיס ליצירת Custom Controls הוסבר בפוסט הראשון בסדרה.
בפוסט זה אתמקד בנושא ה - Properties ו - Exceptions.
בפוסט זה ניצור פקד שמטרתו להציג שעה כלשהי (נניח השעה שבה פורום כלשהו התעדכן) בהתאם לאיזור הזמן של המשתמש. לצורך העניין נקרא לפקד הזה TimeOffset, ולהלן האפיון של הפקד:
- פקד זה יוכל לקבל איזור זמן (כ - int), ו - DateTime, ויציג את השעה והתאריך בהתאם לאיזור הזמן.
- אם לא יוגדר איזור זמן, הפקד יתייחס לאיזור הזמן כ - 0.
- אם לא יוגדר DateTime, הפקד יציג את השעה הנוכחית.
- ניתן להחליט האם הפקד יתרנדר כ - div או כ - span.
- ניתן להגדיר את ה - Format שבו יוצג הזמן. (String).
כמובן שעדיין חסרה פונקציונליות לפקד, כמו לדוגמה אם השרת שלנו לא נמצא ב - Time Zone אפס, אבל המטרה היא להסביר איך ליצור פקד ולא איך לגרום לשרת שלכם להציג את השעה הרלוונטית.
נתחיל מיצירת פקד חדש, ניצור Class חדש בשם TimeOffset, ונירש מ - Control.
Properties
Properties או מאפיינים בעברית, הם האפשרויות שאנחנו חושפים למתכנת כשהוא משתמש בפקד שלנו (או ב - Class כלשהו).
לפקד זה יש ארבעה מאפיינים:
- איזור זמן - int
- הזמן שיש להציג - DateTime
- סוג התג שאליו הפקד יתרנדר (אל הסוג אני אגדיר יותר מאוחר)
- Format - String.
ב - .NET 3.0 אפשר ליצור את ה - Properties מבלי להגדיר משתנים פנימיים. אני אציג את זה פה עם משתנים פנימיים למי שעובד עם 2.0 ומטה.
אז נתחיל בהגדרת המאפיינים 1, 2 ו - 4:
public class TimeOffset : Control
{
private int _TimeZone = 0;
private DateTime _TimeToDisplay = DateTime.Now;
private String _Format;
public int TimeZone
{
get { return _TimeZone; }
set { _TimeZone = value; }
}
public DateTime TimeToDisplay
{
get { return _TimeToDisplay; }
set { _TimeToDisplay = value; }
}
public String Format
{
get { return _Format; }
set { _Format = value; }
}
}
המאפיין השלישי צריך לאפשר בחירה בין שתי אפשרויות: div או span. אפשר להשתמש ב - string, ואז לבדוק אותו, אבל הפתרון הזה לא יהיה נוח גם לנו וגם למתכנת שמשתמש בפקד - מכיוון שהוא לא ידע מה האפשרויות שלו. (אלא אם הוא יפנה לדוקומנטציה). הפתרון היותר אלגנטי הוא שימוש ב - enumeration, במקרה כזה בחירה לא נכונה תגרור גם שגיאת קומפילציה ולא רק שגיאת זמן ריצה. נגדיר Enumeration שיכלול את האפשרויות:
public enum RenderingTag
{
div, span
}
ונוסיף את המאפיין השלישי:
private RenderingTag _HtmlTag;
public RenderingTag HtmlTag
{
get { return _HtmlTag; }
set { _HtmlTag = value; }
}
הגדרנו את המאפיינים, נעבור לשלב הבא.
Exceptions
אז למה בעצם אנחנו צריכים Exceptions? מה רע שהפקד שלנו לא יזרוק שגיאות?
בכדי שהפקד שלנו יעבוד בצורה טובה, (במקרה הזה מדובר בפקד פשוט) יש כמה כללים שצריך לעמוד בהם - כמו לדוגמה שה - Time Zone יהיה ואלידי.
הערך של Time Zone צריך להיות בין מינוס 12 ל - 14 (לידע כללי ישראל נמצאת באיזור זמן +2), לכן ב - set של ה - TimeZone נבדוק כי הערך הוא ואלידי, אחרת נזרוק חריגה:
public int TimeZone
{
get { return _TimeZone; }
set
{
if (value > 14 || value < -12)
throw new ArgumentOutOfRangeException("TimeZone",
"The TimeZone must be between -12 and (+)14.");
_TimeZone = value;
}
}
ועכשיו נעבור למתודה Render:
1: protected override void Render(HtmlTextWriter writer)
2: {
3: writer.RenderBeginTag(_HtmlTag.ToString());
4:
5: DateTime DisplayDate = _TimeToDisplay.AddHours(_TimeZone);
6: String DisplayDateString;
7: if (_Format == String.Empty)
8: DisplayDateString = DisplayDate.ToString();
9: else
10: DisplayDateString = DisplayDate.ToString(_Format);
11:
12: writer.Write(DisplayDateString);
13:
14: writer.RenderEndTag();
15: }
להלן הסבר:
בשורה השלישית אנחנו משתמשים במתודה RenderBeginTag של ה - HtmlTextWriter. המתודה הזו מקבלת String או Enum שמגדיר את התג, במקרה שלנו זה div או span כפי שנקבע ע"י המאפיין RenderingTag.
בשורות 5 - 10, אנחנו מוסיפים את ה - Offset לשעה שאנחנו רוצים להציג, ויוצרים את המחרוזת ש"תודפס" באמצעות ה - Format (אם אותחל).
בשורה 12 המתודה Write פשוט תדפיס את המחרוזת שהיא מקבלת.
ובשורה האחרונה המתודה RenderEndTag שלא מקבלת פרמטרים - תסגור את התג האחרון שנפתח.
סיום
מטרת הפוסט הזה הייתה להסביר בפשטות כיצד להשתמש ב - Properties וב - Exceptions. בפוסט הבא בסדרה נדבר על ירושה והרחבה של פקדים קיימים.
מקווה שהחכמתם, ואשמח לתגובות, הערות, הארות והצעות לגבי סדרת הפוסטים הזו.
החלטתי לאמץ את הרעיון של ג'סטין - להעלות תשובות לשאלות שעלו בפורום בתפוז גם לבלוג, מכמה סיבות:
- לא כולם מכירים את פורום תכנות .NET בתפוז, ואם כבר הגענו עד כאן - זה זמן טוב להזכיר את הפורום ולהזמין את מי שעוד לא כותב שם להצטרף.
- לא כ"כ קל לחפש בתפוז ולכן הרבה הודעות נעלמות שם כלא היו.
- הבלוג מאפשר לענות בצורה טובה יותר עם אפשרות להוסיף תמונות, קוד ועוד.
השאלה:
חשבתי על פתרון של ריכוז כל הRegex שבאפליקציה (למשל בדיקת פורמט אי-מייל, סיסמא וכו') בקובץ XML חיצוני כדי להקל על הניהול והתחזוקה שלהם.
אני לא צריך עזרה בלבצע את זה אלא רציתי לשאול אם מישהו עשה פעם כזה דבר ואם זה מומלץ או שמא יש פתרונות טובים יותר.
בגדול ניתן לשמור נתונים מסויימים שרוצים להמנע מלכתוב אותם בתוך הקוד (Hard Coded מה שנקרא) בהמון דרכים שונות. היתרון של זה - הוא ששינוי הערכים האלו - לא דורש חפירה בתוך הקוד - כל הערכים מרוכזים במקום אחד, וניתן לשנותם בקלות (לעתים אף דרך ממשק שהאפליקציה יכולה לספק), או שהערכים האלו נמצאים במספר מקומות (לדוגמה Regex שמאמת תקינות של אימייל יכול להופיע גם בטופס הרשמה לאתר, הצטרפות לרשימת דיוור, שחזור סיסמה ועוד.
הפתרון הראשון הוא להשתמש ב - Global Resources, זהו מנגנון מובנה ב - .NET והוא קל לשימוש.
Global Resources
ניתן לשמור בקבצי Resources "משאבים", החל מערכים של סטרינג ועד קבצים שלמים.
ה - Resources מתחלקים לשני סוגים:
- Global Resources - משאבים המשותפים לאפליקציה כולה
- Local Resources - משאבים המשותפים לדף מסויים או לטופס מסויים.
בפוסט זה אני אסביר על ה - Global Resources בלבד (על אף שהשימוש בשני הסוגים מאוד דומה), בנוסף ה - Resources מאפשרים גם לתמוך בריבוי שפות, אך אני לא ארחיב על כך בפוסט מכיוון שאין זה מטרתו.
Resources הם קבצי XML (הסיומת שלהם היא resx) שיכולים להחזיק ערכים ואף קבצים - והם מתקמפלים עם האפליקציה (בדומה לקבצי ה - Config).
בכדי להוסיף קובץ Resource לאפליקציה שלנו, יש ללחוץ קליק ימני על הפרוייקט, ולבחור ב Add New Item, מתוך החלון שיפתח נבחר ב - Resource File:
לאחר לחיצה על Add, במקרה של אתר ASP.NET יתריע כי אנחנו מנסים להוסיף קובץ מיוחד שעליו להיות בתיקיית App_GlobalResources וישאל האם אנחנו רוצים להוסיף את הקובץ לתייקיה הזו, תאשרו לו לשים את הקובץ בתיקיה זו.
לאחר מכן יפתח העורך של קבצי Resources, המצב הדיפולטי של העורך, הוא עריכה של ה - Strings בקובץ - טבלה עם שלוש עמודות:
- Name - השם של הערך
- Value - הערך עצמו
- Comment - הערות שניתן להוסיף לצרכי תיעוד וכיו"ב.
להלן דוגמה להוספה של ערך לקובץ:
בכדי לגשת לערך, נלחץ על Save ונעבור לקוד כלשהו באפליקציה שלנו שאנחנו רוצים לשלוף בו את הערך הזה.
ה - Resources נמצאים אוטומטית תחת מרחב השמות Resources (שימו לב כי יש מרחב שמות System.Resources שמכיל בתוכו מחלקות של ה - Framework).
שם ה - Class של המשאבים שלנו יהיה זהה לשם הקובץ ללא הסיומת שלו:
ניתן גם לגשת למשאבים דרך דף ה - ASP.NET עצמו בצורה הבאה:
עד כאן על קבצי Resources, ניתן לקרוא עוד על הנושא ב - MSDN, ובאתר asp.net:
שימוש בקבצי XML מותאמים אישית
ניתן לשמור את הנתונים בקבצי XML שאנחנו ניצור שישמרו תחת התקייה App_Data, ולגשת אליהם דרך מחלקות שיגשו לקבצים וישלפו את הערכים.
ב - 4GuysFromRolla יש מאמר מעולה, שמסביר איך ליצור את המנגנון הזה - כולל Caching של קובץ ה - XML (מכיוון שקריאה מקבצים באופן תדיר היא לא יעילה (ולא חכם לעבוד כך)): Using XML to Share Constants Across Projects.
במאמר מוסבר כיצד ליצור את קבצי ה - XML ואת המחלקות שמטפלות ושלופות מהקובץ, איך להתעסק עם ה - Cache וגם איך ליצור גרסאות (כך שניתן בקלות להעלות את הקבצים ל - Testing או ל - Production עם ערכים אחרים מבלי לערוך את הקבצים לפני שמעלים או על השרת).
לשתי השיטות יתרונות וחסרונות משלהן, ה - Resources נותנים יכולות כמו Localization, ובנוסף ניתן לערוך אותם עם עורך פשוט.
קבצי ה - XML מאפשרים ליצור Versions וגם ממשק לעריכה שלהם בזמן ריצה דרך האפליקציה בקלות יחסית (לקבצי ה - Resource יש פורמט טיפל'ה מסובך).
פוסט זה בא בעקבות השתלשלות העניינים שהחלה כשמיכל כתבה על המדדים לקביעת הבלוגרים שיגיעו לטקאד, ופרסומו של הטכנובלוגר (דרור אנגל) - בלוגר איכותי - מיהו? (וכמובן כמות התגובות לעניין זה).
הבעיה בכל הנושא הזה - היא שקשה לקבוע מהו בעצם בלוג איכותי, ומיהו בלוגר איכותי. זה כמו לנסות לתת ציון לספרים ולפיהם לקבוע איזה ספר יותר איכותי \ מעניין \ אחר.
נסו לעשות את הדבר הבא:
תנו ציון לספר הראשון בסדרה של הארי פוטר - הארי פוטר ואבן החכמים. לאחר מכן, נסו בהתאם לציון שנתתם להארי פוטר - לתת ציון למדריך תוכנה וחומרה לטכנאי PC מהדורה 4. האם הספר איכותי יותר מהספר על הארי פוטר? האם הוא מעניין יותר?
קשה לומר.
ובכן הבלוגים לא רחוקים משם, ולא רק זה, לעתים הם גם שונים במהותם, נסו להכניס לרשימת שני הספרים הקודמת גם את עיתון ישראל היום.
אז איך בעצם אפשר לקבוע מהו בלוגר איכותי?
הבעיה נותרה, מי מהבלוגרים יזכה להיות ב - TechEd?
זה קצת פילוסופי, אבל אני סבור שאם לא מגדירים תנאים כמותיים וברי מדידה - אז סביר להניח שהבחירה בשורה תחתונה לא תהיה הוגנת. מה שכן - זה עדיף על הגדרת תנאים כאלו - כמו כמה פוסטים או כניסות היו לבלוגר מסויים.
המדד היחידי שאני יכול להציע הוא: כמה הבלוגר משקיע בבלוג שלו.
נכון - אף אחד לא בדק עד היום כמה זמן כל אחד השקיע בבלוג או משאבים, וגם סביר להניח שאף אחד לא הולך לעשות את זה. מה שכן, ניתן לראות שבלוג הוא מושקע.
אם פתחתם וקראתם את הבלוג של גיא בורשטיין או של ג'סטין אנג'ל - ניתן לראות כי כל פוסט מושקע ומלווה בתמונות והסברים מפורטים, חלקם אף כוללים Web Casts והמון קוד, והם נותנים המון מהניסיון והידע שלהם לקהל הקוראים.
אולם לא חייב להיות מתכנת על בשביל ליצור בלוג איכותי, וכאן אני אכניס לתמונה את הבלוג של הבלוגר החדש יחסית מקסים:
ניתן לראות כי הבלוג של מקסים הוא מסודר וערוך היטב, וכי כל פוסט מושקע ומקורי. (וגם כמות התגובות שהוא זכה להן מראות על כך).
אז כפי שכתבתי - לא ניתן למדוד את ההשקעה בבלוג כלשהו - אך ניתן להעריך ולראות כי יש בלוגרים שמשקיעים המון בבלוגים שלהם - ואלו הם הראויים להערכה לעניות דעתי.
אשמח לשמוע דעתכם בנושא.
ולסיום אוסיף סמיילי, בשביל שאני ארגיש שלם עם העובדה שהתקנתי את ההרחבה של הסמיילים ל - Live Writer:

האמת היא ששמעתי על ה - Live Writer רק בכנס ה - Dev Academy II כשפגשתי את גיא בורשטיין בפינת השתייה בקומה התחתונה. אז אם כבר אני כאן - אני אזכיר את הכלי הזה שוב - כלי מעולה - אם אתם בלוגרים ועוד לא הורדתם אותו - תעשו זה עכשיו.
בכל אופן, ניתן (כפי שציפינו) לכתוב ולהוסיף לכלי זה Extensions (להלן: "ההרחבות"), ומיקרוסופט העמידה לרשותינו את ה - Gallery של ה - Extensions. להלן שתים מההרחבות שהתקנתי ואני משתמש בהן:
- Insert Spaces Emoticons - בעזרתו ניתן להוסיף אמוטיקונים (סמיילים) לבלוג שלכם, כמו זה
. - Insert Code - מיועד למתכנתים, ובעזרתו ניתן להכניס קוד במספר שפות (בינהן C#, HTML, TSQL ועוד), ההרחבה הזו דואגת לצבוע את הקוד בהתאם. בנוסף ההרחבה הזו משתמשת ב - CSS classes כך שהיא לא מזבלת את הפוסט בהרבה קוד מיותר, ואפשר לשים את ה - CSS הזה בהגדרות של הבלוג.
יש גם הרחבה העונה לשם Paste from Visual Studio, עוד לא יצא לי לנסות אותה, אתם מוזמנים לנסות.
מעבר לכך יוסי טאגורי פרסם פוסט על Template Plugin ל Live Writer.
אם אתם משתמשים בהרחבות נוספות שהן טובות לדעתכם - אני בטוח שישמחו לשמוע על כך.
לאחרונה יצא לי להתקל במצב שהייתי צריך להשתמש ב - Struct שיכול להיות null (כמובן שאפשר לעבור ל - class, אבל זו לא הנקודה), על מנת שאוכל לדעת האם הוא מאותחל.
נניח ויש לנו את ה - struct הבא:
public struct NiceStruct
{
public NiceStruct(int _NiceInt, string _NiceString)
{
this._NiceInt = _NiceInt;
this._NiceString = _NiceString;
}
private readonly int _NiceInt;
private readonly string _NiceString;
public int NiceInt
{
get { return _NiceInt; }
}
public string NiceString
{
get { return _NiceString; }
}
}
לא ניתן ליצור מופע של ה - struct שהוא null (מכיוון שטיפוסים שהם Value Type מאותחלים אוטומטית עם הכרזתם, ללא צורך לקרוא ל - constructor, ניתן לקרוא עוד על ההבדלים בין struct ל - class בפוסט של ג'סטין). ברגע שנצהיר על אובייקט מסוג NiceStruct, ה - int יאותחל אוטומטית ויכיל את הערך 0, וה - string יאותחל למחרוזת ריקה. אם ננסה להציב null, נקבל שגיאת קומפילציה.
אז איך מגדירים struct (להלן "המבנה"), שיכול להיות null (להלן "בר איפוס")?
ב - .NET 2.0 מיקרוסופט הציגו את Nullable<T>, (רובכם מכירים את ה - ? שבא אחרי type כלשהו כמו int). ה - Nullable הוא מאוד פשוט:
struct Nullable<T>
{
public bool HasValue;
public T Value;
}
בעזרתו ניתן להגדיר מבנה שיכול להיות בר איפוס, בשני אופנים:
NiceStruct? myNiceStruct;
Nullable<NiceStruct> myOtherNiceStruct;
כעת ניתן לבדוק האם myNiceStruct או myOtherNiceStruct מאותחלים גם בשני אופנים:
1: if (myNiceStruct != null)
2: if (myNiceStruct.HasValue)
בכדי לגשת למתודות או למאפיינים (Properties) של מופע מסויים, יש לגשת ל - Value, לדוגמה - הדפסה של NiceString תראה כך:
Console.WriteLine(myNiceStruct.Value.NiceString);
.csharpcode .lnum { color: #606060; }
ועכשיו תוספת קטנה, האופרטור ?? (הא?
)
אישית, לא ידעתי על האופרטור הזה, עד לפני מספר חודשים, וגם די התפלאתי לשמוע עליו, האופרטור הזה בודק עם ערך מסויים (שבא לפני האופרטור) הוא null, ומחזיר את הערך במידה והוא לא null, אחרת הוא מחזיר את מה שאחרי האופרטור. לא מובן בכלל הא? שורת קוד אחת תסביר לכם:
myOtherNiceStruct = myNiceStruct ?? new NiceStruct(10, "Some text");
הקוד הזה בעצם, בודק אם myNiceStruct אינו null, אם הוא מלא, myNiceStruct יוצב ב - myOtherNiceStruct, אחרת, myOtherNiceStruct יאותחל עם הערכים 10 ו - "Some text".
עד כאן.
אז חנוכה הגיע לו ואפילו לא שמתי לב, ונראה שיש אנשים שרוצים סופגניה, אבל בגלל שאני לא יודע זאמל (XAML), אני אביא לכם סופגניה ב - C# (ככה זה כשעובדים יותר מדי, ראו הוזהרתם):
using System; using System.Pastries; using System.Security.JamInjection;
public class Doughnut : Pastry, IJamSpritzer { public Doughnut(Jam jamToInject); public event EventHandler JamSpritzed; public bool IsKosher { get; } }
|
אז שיהיה לכולם חג חנוכה שמח, אפילו הוספתי איזה Widget לחנוכה של SpringWidgets, אתם יכולים לראות בתפריט בצד ימין ב"חדשות".
חג שמח!
מיכל כבר פרסמה בבלוג שלה את הימי עיון על נגישות באינטרנט, ואני ארחיב על כך בפוסט זה, אבל לפני כן אני אסביר מה זה בכלל הנגשת אתרים, למה צריך את זה, איך זה בכלל קשור אלינו, האם יש באמת סיבה להנגיש אתרים וגם איך עושים את זה (צפו לסדרת מאמרים בקרוב על הנגשת אתרי Web).
אז מה זה נגישות ומהי נגישות באינטרנט?
ויקיפדיה מגדירה נגישות כך:
נגישות (Accessibility) היא מידת התאמתה של מערכת לשימושם של אנשים רבים ככל האפשר, כולל אנשים עם לקויות, שצריכים להשתמש במערכת בעזרת ציוד טכנולוגיה מסייעת (כגון תוכנות להקראה קולית לפלט צג המחשב או כיסאות גלגלים). אין לבלבל בין מונח זה למונח שמישות (Usability), המתאר מידת התאמתה של מערכת לשימושם של אנשים רבים ככל האפשר, כולל אנשים עם לקויות, בלא שאֶלה יצטרכו להשתמש במערכת בעזרת טכנולוגיה מסייעת.
אם נתמקד באינטרנט, נגישות באינטרנט היא מידת ההתאמה של אתר כלשהו לשימושם של אנשים רבים ככל האפשר.
"אנשים עם לקויות" זו הגדרה מאוד רחבה ולא ברורה, ומאוד קשה להבין משלושת המלים האלו למי מתייחסים. בקצרה, לקויות יכולות להתייחס לבעיות רבות, החל בבעיות כמו ADHD ועד לבעיות מוטוריות ובעיות ראיה, עוורון וכיו"ב.
אז בגדול קצת קשה להבין מה בדיוק צריך לעשות בכדי שהאתרים יתאימו לכולם, ולחלק מהאנשים גם קשה להבין איך בכלל אפשר להשתמש במחשב עם בעיות כאלו ("עוורים גולשים באינטרנט? אבל הם לא רואים!") ולעתים גם כשמנסים להנגיש אתר קשה להבין אם הוא באמת נגיש ולנסות לחשוב על איך אנשים מסויימים מנסים להתמודד איתו. איך פועל קורא מסך? איך אנשים שאין להם אפשרות להשתמש בעכבר גולשים באינטרנט? ועוד שאלות רבות ואחרות שעולות כשחושבים על הנושא הזה.
ארגון W3C, שמגדיר סטנדרטים ותקנים לרשת האינטרנט - פועל גם בנושא הנגישות ומפרסם מידע על הנגשת אתרי אינטרנט, ואף מגדיר רמות של הנגשה.
אז, איך בעצם מנגישים אתרים?
חשוב לציין שיש רמות שונות של הנגשת אתרים, אני אתחיל להסביר בסדרת מאמרים שאני אפרסם בקרוב על איך להנגיש אתרים, ואיזה כלים Microsoft נותנת למפתחים ב - ASP.NET בכדי להנגיש אתרים, מה צריך לדעת בכדי להנגיש אתרים, ואילו ספרים ואתרים עוזרים לנו לעשות את זה.
אבל לפני אלו, כפי שמיכל כתבה בבלוג שלה, שני ימי עיון על הנגשת אתרים יתקיימו ב - 20/12/2007 וב - 9/1/2008:
ולמה אני צריך להנגיש אתרים? מה התועלת שלי מכך?
סביר להניח שכבר קראתם על חישובים ועל הפסדים במי שלא מנגיש את האתרים שלו, על כמה קל יותר לתחזק אתרים נגישים (וסביר להניח שנתקלם בכך גם בעניין של ההתאמה לדפדפנים). אני לא הולך לספר לכם מה תרוויחו או תפסידו מהנגשה של האתר שלכם. את החישוב הזה אתם מוזמנים לעשות בעצמכם.
הסיבה שיש להנגיש אתרי אינטרנט, היא:
- אינטרנט הופך להיות חלק אינטגרלי מהחיים בחברה המערבית.
- החברה שואפת להשיג שוויון.
בתי עסק רבים הופכים את המבנים שלהם לנגישים. החל מכריזה במעליות, שילוט והכוונה לעוורים, כניסות מותאמות לכסאות גלגלים ועוד. ובעוד כל אדם - גם בעל מוגבלויות שונות יכול לחיות חיים רגילים באמצעות מה שהחברה מספקת לו - אין שום סיבה שאתרי האינטרנט יפלו את האנשים האלו. אין שום סיבה שתווצר רשת שנייה של חיים (האינטרנט), שתאפשר רק לחלק מהאנשים להשתמש בה.
העלויות של הנגשת אתרים - אינן גבוהות בכלל - ובמקרים מסויימים (ולא מעטים) אף אפסיות. מי שמעוניין ללמוד עוד על הנושא, מוזמן לכנסים שפורסמו כאן, וגם מוזמן לעקוב אחרי הבלוג זה.
תוכלו למצוא עוד מידע במאמר שפורסם באתר Webmaster.org.il.
לאחרונה נאלצתי להריץ קוד מסויים על מכונה שהיה מותקן עליה SQL Server 2005 Express, ולאחר שנתקלתי ב - Exception בהכנסת הנתונים למסד, הפתרון שהייתי צריך הוא Profiler. בגלל שלא היה מותקן על המכונה ה - Profiler (שבא עם SQL Server 2000), עשיתי את דרכי בגוגל ל - Profiler ל - SQL Server 2005 בקוד פתוח: http://sqlprofiler.googlepages.com/
ל - Tool הזה אין אפילו אתר נורמלי (Google Pages?) אבל מההתנסות הקצרה שלי איתו הוא לא אכזב אותי. מדובר על Profiler שמזכיר במראה וב - UI שלו את ה - Profiler של SQL Server 2000, והוא פשוט לשימוש. ניתן ליצור בו Traceים, ולהגדיר עבורם איזה פעולות לנטר, וליצור עבורם פילטרים.
בכל אופן, שווה ניסיון (ואם לא אז לפחות הקלקלה).