Best practices: Daylight saving time and Timezone

SpirallingTime

שיטות עבודה מומלצות עם DateTime אזורי זמן ושעון הקיץ

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

הנה לכם הוכחה קצרצרה שטיפול לא נכון בנתוני DateTime ב.NET יכול לגרום לכשלים קריטיים דומים. נתבונן בקוד הבא:

static void Main(string[] args)
{
    var start  = new DateTime(2011, 10, 2, 0, 0, 0);
    var finish = new DateTime(2011, 10, 2, 2, 0, 0);

    Console.WriteLine((finish - start).TotalHours); // output: 2 INCORRECT!!
    Console.ReadKey();
}

בשביל ההמחשה נניח שאני צריך לכתוב תוכנה שמחשבת אורך שיחה של לקוחות ספק תקשורת סלולרית. כשלקוח מחייג, אני רושם במשתנה start אז זמן תחילת השיחה (02/10/2011 00:00:00), וכשהוא מנתק, מציב בfinish את זמן סיום השיחה (02/10/2011 02:00:00). בסיום השיחה התוכנה מחשבת את אורך השיחה ומחזירה את מספר השעות שארכה השיחה לצורך חיוב הלקוח. במקרה שלפנינו, בהתחשב בזמני תחילת וסיום השיחה, התוכנה פולטת שהלקוח שלי דיבר במשך שעתיים.

ברוב ימות השנה זו אפילו תהיה התוצאה הנכונה. הבעיה היא, שבדיוק באותו היום ישראל עברה משעון קיץ לשעון חורף. כלומר, בזמן שהלקוח שלי היה באמצע השיחה, החזירו את השעון הישראלי מהשעה 01:59:59 לשעה 01:00:00. נמצא, שכשהתוכנה שלי רשמה את שעת סיום השיחה ב2 לפנות בוקר לפי שעון חורף (שהרגע הוחל) זה בעצם היה ב3 לפנ"ב לפי שעון הקיץ. והלקוח שלי שהתחיל את השיחה לפי שעון הקיץ בעצם דיבר 3 שעות ולא 2!

למרות שמעבר השעון מתרחש בשעות הלילה הפחות פעילות, בעולם שכולו OnLine הסיכוי הוא שגם בשעות האלו התוכנה\אתר\שירות שלכם יהיו פעילים. ואם הם כתובים בצורה לא נכונה - הם יבצעו חישובים ופעולות שגויות! עוד...

קטגוריות: .NET | מדריכים

באג בUpdatePanel וIE בURLים עבריים

כידוע, ASP.NET WebForms משמר את הערכים של הפקדים בדף בין הpostbackים ע"י שימוש בform אחד המכיל, בדרך כלל, את כל שאר התגיות שבדף. בנוסף, בWebForms מקובל שכל דף עושה post לעצמו. כלומר, בדף default.aspx הערך של האטריבוט action של הform יהיה בדרך כלל גם כן default.aspx:

<form method="post" action="default.aspx" id="form1">
    ...
</form>

בנוסף, ASP.NET מבצע אופטימיזציה לURL המופיע בaction שיהיה יחסי לURL הנוכחי. כך למשל בדף הזמין בכתובת /blog/default.aspx הערך של action יהיה default.aspx בלבד.

למה זה חשוב? כנראה, בגלל ש .NET 4.0 היא הגרסה הראשונה של הframework שבה WebForms תומך בRouting, ומאפשר URLים ידידותיים, לא חשבו על תסריט של כתובת URL ידידותיות ובעברית, או לפחות לא בדקו את המימוש בצורה מספיקה.

לגבי מה הדברים אמורים?

נניח שהגדרנו Route כדלהלן:

RouteTable.Routes.MapPageRoute("bug", "באג/{unicode}", "~/default.aspx");

עכשיו, אם נגלוש לכתובת "/באג/בדיקה", נגיע לדף default.aspx כשהערך של הפרמטר unicode הוא "בדיקה". כמו"כ, בדף שיוגש לנו הערך של הaction בform יהיה, כצפוי, "בדיקה".

<form method="post" action="בדיקה" id="form1">
   ...
</form>

כעת אם הדף default.aspx יעשה PostBack לעצמו, השאילתא תתבצע בהצלחה, ותיראה כך:

POST /%D7%91%D7%90%D7%92/%D7%91%D7%93%D7%99%D7%A7%D7%94 HTTP/1.1

עד כאן הכל טוב ויפה. הבעיה מתחילה כשמנסים לבצע CallBack מאותו הדף. עוד...

קטגוריות: .NET 4.0 | IIS | .NET
תגיות: , , , , , ,

מדריך: שינוי מיקום קבצי משתמש בWindows 7

SSD 510 Pretty boxכוננים בתצורת SSD תופסים תאוצה בתקופה האחרונה והופכים לפופולאריים יותר ויותר. הסיבה היחידה המונעת מהם לכבוש את השוק, ולהחליף לגמרי את הכוננים הקשיחים המסורתיים (להלן HDD) היא – מחירם הגבוה.

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

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

הבעיה היא שWindows כברירת מחדל מאחסן את קבצי המשתמשים (תיקייה Users) באותו הכונן. כתוצאה, כל קובץ שתשימו על שולחן העבודה, או באחת התיקיות: מסמכים/תמונות/מוסיקה/סרטי וידאו שלי, כולם יאוחסנו על כונן הSSD. והיות ובד"כ קונים כונני SSD קטנים יחסית (80-120GB) עקב מחירם הגבוה, הדבר מוביל במהרה לניצול כל שטח הכונן ולפגיעה בביצועים ובחוויית השימוש.

לרוע המזל, בWindows 7 בתהליך ההתקנה ולאחריו אין דרך פשוטה להעביר את תיקיות הנתונים של המערכת לכונן אחר, ונותר לקוות שבמיקרוסופט יתנו את הדעת על הנושא בתכנון תהליך ההתקנה של Windows 8, ויהפכו תסריטי התקנה דומים לטריוויאליים יותר.

Move folderכמו שכבר הוזכר, התיקייה Users אינה כמו כל התיקיות האחרות, ולא ניתן פשוט להעביר אותה. אם תנסו, סביר שתתקלו בשגיאה הבאה:

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

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

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

קטגוריות: מדריכים
תגיות: ,

הכירו את Entity Framework 4.1

מבוא

לאלו שלא מכירים, ADO.Net Entity Framework (בהמשך EF) היא המילה האחרונה בתחום הORM מבית מיקרוסופט. EF מאפשר למפתחים להגדיר בצורה נוחה את עולם הישויות שלהם (Conceptual Model) את הטבלאות שלהם (Storage Model) ואת המיפוי ביניהם (Mapping Model) כששלשתם יחד יוצרים את הEDM (ר"ת Entity Data Model). כמו"כ הוא מספק את הממשקים הן לאחזור ישויות מבסיס הנתונים והן לעדכון ושמירה שלהם לבסיס הנתונים בחזרה.

כמו ששמתם לב, בעולם המושגים של EF, המחלקות אינן מייצגות רשומות במסד הנתונים, אלא הנן "ישויות" הממופות לנתונים באמצעות הEDM. בדרך זו, כל ישות יכולה להיות ממופה ליותר מטבלה אחת, וכן לדוגמה להשתמש בStored Procedure לפעולות CRUD (ר"ת Create, Read, Update, Delete).

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

מה התחדש בEF 4.1?

החידושים שבגרסה החדשה כולם נשענים על הAPI החדש שחושפות המחלקות  System.Data.Entity.DbContext וSystem.Data.Entity.DbSet (את הרשימה המלאה תוכלו למצוא בMSDN).

אחד השיפורים המשמעותיים ביותר בEF 4.1 הוא תמיכה בגישת Code First. גישת Code first מאפשרת להגדיר את המודל כולו במחלקות C# או VB.NET רגילות ולהוסיף או לשנות קשרים בין מחלקות ע"י שימוש בAPI של DbContext. והחשוב מכל, EF יידע לבד ליצור מסד נתונים המתאים לשדות והקשרים שהגדרתם באמצעות המחלקות. עוד...

קטגוריות: .NET 4.0

How to remove duplicate HTML5 schema on Visual Studio 2010 SP1

duplicate html5

עם שחרור הVisual Studio 2010, שבגרסתו הראשונה לא כלל תמיכה בHTML5, כמו רבים אחרים התקנתי Add-In של intellisense לHTML5 שמשלים את החסר.

הבעיה היא שכשעדכנתי את הVS שלי לSP1 שכבר מכיל תמיכה מובנית בHTML5, נוצר כפל.

סביבת העבודה שלי מציגה כעת שני סכימות HTML5, האחת שייכת לAdd-In והשנייה לSP1. בנוסף שמתי לב שהסכימה של הAddin מוצגת כ'HTML 5' כשהסכימה שבאה עם SP1 נקראת 'HTML5' (ללא רווח).

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

קטגוריות: Tools

How to extract text from HTML

איך ניתן לחלץ טסקט מתוך HTML

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

כשניגשתי למשימה, בניגוד לרגיל, לא קבעתי לעצמי מראש מה בדיוק קטע הקוד שאני כותב אמור לעשות, במקום זה התחלתי ממה שהוא וודאי אמור לעשות, ואז שיפרתי עד שקיבלתי את התוצאה שרציתי. בגדול, מה שהפונקציה צריכה לעשות הוא לדלג על כל הקטעים בתוכן שנמצאים בין התו < לבין התו > שאלו הם התגים לדוגמה ב: '<span dir="rtl">abc</span>' יישאר רק 'abc'.

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

קטגוריות: .NET

איך באמת לא חשבתי לקרוא לזה ASWIFT?!

היום נתקלתי בבלוג Google Code במאמר הנושא את השם "Your Web, Half a Second Sooner", דרכו הגעתי לווידאו של הרצאה מרתקת שהתקיימה בכנס Velocity 2010 בה איזה בחור מגוגל סיפר על טכניקה "חדשה" שהם המציאו. הם קראו לה ASWIFT. בקצרה, הם (ואני מדבר על צוות של גוגל) "מצאו" פתרון לטעינת קוד javascript של צד ג' בצורה אסינכרונית (שלא נועלת את הדף עד לסיומה) והרצתם תחת הדומיין של הדף המארח (לצורך עקיפת מנגנון Same Origin). במקרה שלהם זה היה עבור הAdSense.

Velocity 2010: Michael Kleber & Arvind Jain, "Don't Let Third Parties Slow You Down"

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

מה אני לומד מזה? האמת היא – לא יודע. אולי הייתי צריך לקרוא לזה ASWIFT?

קטגוריות: טכנולוגיה
תגיות: ,

שימושיות ואבטחה בLogout

השאלה המתבקשת היא: זה Logout, מה כבר יכול להשתבש?! - אז מסתבר שלא מעט. מדובר בדברים פשוטים וברורים מאליהם עד כדי כך, שפשוט לא חושבים עליהם.

את לינק היציאה (או logout) תמצאו ברוב האתרים על הMasterPage. הלינק מוצג רק למשתמשים שמזוהים באתר ע"י ביצוע כניסה (או login), שכן רק עבורם שייכת פעולה זו. השאלה המעניינת היא, מה מתרחש כשלוחצים על הלינק?

ניתן לממש logout בכמה דרכים:

  • כמטפל לאירוע הClick בCode Behind של הMasterPage עצמו.
  • ע"י הפנייה לדף מיוחד (נקרא לו Logout.aspx) שכל מטרתו היא לבצע logout.

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

במקרה של מימוש ע"י מטפל אירוע Click בMasterPage יש שתי בעיות פוטנציאליות:

  1. מטפלי האירועים מבוצעים בשלב מאוחר במחזור חיי הדף. ולכן, תכנים רבים שאמורים להיות מוצגים רק למשתמשים מזוהים, עדיין יוצגו בדף בפעם הראשונה שהדף ייטען לאחר הlogout.
  2. היות ומדובר בMasterPage, ייתכן שהדף שממנו בוצע הlogout נגיש למשתמשים מזוהים בלבד. כתוצאה, לאחר הlogout המשתמש יוקפץ מיידית לדף הכניסה (או login)!!

על אף שלכל אחת מהבעיות הנ"ל קיימים פתרונות פשוטים, אני בחרתי בדרך השנייה: הפנייה לדף נפרד שכל מטרתו היא ביצוע logout. עוד...

קטגוריות: .NET
תגיות: ,

שימוש בWeb.sitemap לשמירת מידע SEO

מפת אתרכולם מכירים את הSiteMap בתור מפת אתר עבור מנגנון הניווט של ASP.NET. אבל, מה אם היה אפשר להוציא ממנו יותר?

במאמר זה אדגים שימוש בWeb.sitemap לשמירת תכנים עבור תגיות המטא description וkeywords. גישה זו תאפשר ניהול נוח של מידע meta של האתר, תוך הפרדה מוחלטת בין לוגיקה ומידע.

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

קטגוריות: .NET
תגיות: , , , ,

פתרון "האתרוג באמצע"

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

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

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

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