אזורי זמן ושעון קיץ: פתרונות מעשיים

נוסף ב-22/08/2007 00:42 על ידי דניאל כץ

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

ניקח לדוגמה מערכת פורום. דוד, מזין הודעה בשעה 13:00 ממחשב בישראל (GMT +2), אלי שגר באנגליה בגריניץ' (GMT) יראה בשעה 11:00 אצלו את ההודעה שזה עתה נוספה לפורום - בעוד שעתיים בשבילו. זה יקרה במקרה שהשרת כשירשום את ההודעה למסד הנתונים, יצרף אליה את שדה "שעת יצירה" לפי שעון ישראל. למרות שגם אם השרת ירשום את השעה לפי שעון גריניץ' עדיין תהיה אי נוחות לדוד לראות שהודעתו צורפה שעתיים לפני שהוא צירף אותה בפועל.

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

Tags: , ,

.NET

למה עברית בדפי Web הופכת לג'יבריש?

נוסף ב-20/08/2007 08:54 על ידי דניאל כץ

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

הפתרון הבא עוסק בזיהוי נכון של קידוד דף הWeb בשימוש במחלקות כמו WebRequest. הבעיה במקרים אלו היא שלא תמיד בוני האתרים טורחים לשלוח עם הדפים שהם כותבים את הHeader (כותרת http) שמזהה את קידוד הדף, ולכן במקרים אלו צריך קודם לקרוא את הדף עד הסוף, ורק אז לשלוף את כותרת הmeta המתאימה מהדף עצמו ולקודד איתה את הדף. עוד...

Tags: , , ,

.NET

קינון SqlTransaction

נוסף ב-20/08/2007 08:52 על ידי דניאל כץ

הבעיה שבה נתקלתי היא, למצוא דרך נוחה להשתמש באותה הפונקציה (בדוגמה שלנו זה ‏BasicPattern‏) בתוך ומחוץ ל‏SqlTransaction‏ בלי לשכתב אותה פעמיים.‏

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

הפתרון שלי בא בצורת מחלקה חדשה שהענקתי לה את השם ‏DbConnection‏. במחלקה קיימים שני ‏Constructorים:

  1. New(ByVal enforceTransaction As Boolean)‎
  2. New(ByVal connection As DbConnection, ByVal enforceTransaction As Boolean)

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

Tags: ,

.NET