OberonCore
https://forum.oberoncore.ru/

Грубое упущение в интерфейсе Dates?
https://forum.oberoncore.ru/viewtopic.php?f=23&t=6027
Страница 1 из 1

Автор:  Илья Ермаков [ Понедельник, 13 Март, 2017 16:12 ]
Заголовок сообщения:  Грубое упущение в интерфейсе Dates?

Модуль Dates содержит отдельно процедуры GetDate и GetTime.
Но не содержит GetDateTime для атомарного получения даты!

В итоге, на границе суток есть вероятность, что я получу ещё предыдущую дату, но время вместо 23:59:59 уже 00:00:00. Т.е. отскок назад на сутки.
Это полный п... очень опасный грабль.

Я внезапно вспоминаю один момент ложного срабатывания лиц. защиты нашего ПО, которое вырубалось при обнаружении попытки перевода времени назад. Как бы не с этим было связано.

При этом реализация - хук от HostDialog - содержит одну процедуру GetTime (d, t).
Но в конечном интерфейсе такие вот грабли.

Давайте, коллеги - майнтэйнеры сборок, включим в Dates GetDateTime?
И в документации к модулю пометим сей нюанс.

Автор:  Иван Денисов [ Понедельник, 13 Март, 2017 19:01 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

Внес предложение:
https://forum.blackboxframework.org/vie ... f=41&t=604

Версия для тестирования:
http://blackboxframework.org/unstable/i ... a1.804.zip

Автор:  Info21 [ Понедельник, 13 Март, 2017 23:19 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

Поскольку ББ не проектировался для настолько hard-RT приложений, то "грубым" это упущение называть не вполне правильно.

Но факт интересен как пример того, насколько трудно предусмотреть всякие тонкости, проектируя библиотеки "из общих соображений". Мир всё-таки заковырист мама-не-горюй.

Автор:  Илья Ермаков [ Вторник, 14 Март, 2017 16:11 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

Ну, оно не только для hard-RT.

Любое приложение базы данных.
Завели запись - а она на сутки раньше. Кому-нибудь какое-нибудь пособие не начислилось. И т.п.

Автор:  Иван Денисов [ Вторник, 14 Март, 2017 17:00 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

Для UTC тоже предлагается сделать функцию.

https://redmine.blackboxframework.org/p ... 09ddc6ad20

http://blackboxframework.org/unstable/i ... a1.807.zip

Автор:  prospero78 [ Среда, 15 Март, 2017 16:45 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

По хорошему, момент времени не может быть только годом-месяцем-днём. Туда же и часы-минуты. ещё и микросекунд надо напихать.
И промышленное время только в UTC.
Локальное время -- это для любителей))

Автор:  Artyemov [ Среда, 15 Март, 2017 20:02 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

"Туда же и часы-минуты. ещё и микросекунд надо напихать."
И секунд вполне достаточно ;), а вот с микросекундами геморрой будет возникать :)

Я не ошибаюсь, ЦУП в Королёве ведь не по UTC, не?

Автор:  Alexander Shiryaev [ Среда, 15 Март, 2017 23:11 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

GetEasterDate → GetGregorianEasterDate

https://en.wikipedia.org/wiki/Computus
http://www.tondering.dk/claus/cal/julperiod.php
http://www.tondering.dk/claus/cal/easter.php

Автор:  Иван Денисов [ Четверг, 16 Март, 2017 06:11 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

Новые функции добавлены в Dates в альфа-версию 1.7.1.
http://blackboxframework.org/unstable/m ... a1.809.zip

С переименованием процедуры сложнее, ведь нарушится совместимость с 1.7.
Так что это только на 1.8 возможно планировать.

Автор:  prospero78 [ Четверг, 16 Март, 2017 13:59 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

Artyemov писал(а):
"Туда же и часы-минуты. ещё и микросекунд надо напихать."
И секунд вполне достаточно ;), а вот с микросекундами геморрой будет возникать :)


Если говорить про отсечение микросекунд, то, тогда должен быть асинхронный счётчик на каждую секунду в интервале от 0 до 100 тыс. как минимум.
чтобы этот счётчик наращивался каждую секунду заново и +1 по каждому запросу времени. В противном случае, при попытке разобраться в событиях архивной базе на более-менее приличном предприятии точно можно будет геморрой получить в режиме 24*365,25.
Вообще, интенсивные процессы всегда требуют для учёта тысячных долей.

Автор:  Alexander Shiryaev [ Четверг, 16 Март, 2017 14:11 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

Код:
   (* http://www.tondering.dk/claus/cal/julperiod.php *)
   PROCEDURE DateJulToJDN (IN d: Dates.Date): INTEGER;
      VAR a, y, m: INTEGER;
   BEGIN
      a := (14 - d.month) DIV 12;
      y := d.year + 4800 - a;
      m := d.month + 12 * a - 3;
      RETURN d.day + (153 * m + 2) DIV 5 + 365 * y + y DIV 4 - 32083
   END DateJulToJDN;

   (* http://www.tondering.dk/claus/cal/julperiod.php *)
   PROCEDURE DateGregToJDN (IN d: Dates.Date): INTEGER;
      VAR a, y, m: INTEGER;
   BEGIN
      a := (14 - d.month) DIV 12;
      y := d.year + 4800 - a;
      m := d.month + 12 * a - 3;
      RETURN d.day + (153 * m + 2) DIV 5 + 365 * y + y DIV 4 - y DIV 100 + y DIV 400 - 32045
   END DateGregToJDN;

   (* http://www.tondering.dk/claus/cal/julperiod.php *)
   PROCEDURE BCToDateJulGreg (b, c: INTEGER; OUT date: Dates.Date);
      VAR d, e, m: INTEGER;
   BEGIN
      d := (4 * c + 3) DIV 1461;
      e := c - (1461 * d) DIV 4;
      m := (5 * e + 2) DIV 153;
      date.day := e - (153 * m + 2) DIV 5 + 1;
      date.month := m + 3 - 12 * (m DIV 10);
      date.year := 100 * b + d - 4800 + m DIV 10
   END BCToDateJulGreg;

   (* http://www.tondering.dk/claus/cal/julperiod.php *)
   PROCEDURE JDNToDateJul (jdn: INTEGER; OUT d: Dates.Date);
   BEGIN
      ASSERT(jdn >= 0, 20);
      ASSERT(jdn <= 536838829, 21); (* 1465072.8.11 *)
      BCToDateJulGreg(0, jdn + 32082, d)
   END JDNToDateJul;

   (* http://www.tondering.dk/claus/cal/julperiod.php *)
   PROCEDURE JDNToDateGreg (jdn: INTEGER; OUT d: Dates.Date);
      VAR a, b, c: INTEGER;
   BEGIN
      ASSERT(jdn >= 0, 20);
      ASSERT(jdn <= 536838867, 21); (* 1465102.10.18 *)
      a := jdn + 32044;
      b := (4 * a + 3) DIV 146097;
      c := a - (146097 * b) DIV 4;
      BCToDateJulGreg(b, c, d)
   END JDNToDateGreg;

   (* Gauss *)
   PROCEDURE AlexandrianEasterJul (year: INTEGER; OUT d: Dates.Date);
      VAR a, b: INTEGER;
   BEGIN
      a := (19 * (year MOD 19) + 15) MOD 30;
      b := (2 * (year MOD 4) + 4 * (year MOD 7) + 6 * a + 6) MOD 7;
      IF a + b > 9 THEN
         d.month := 4;
         d.day := a + b - 9
      ELSE
         d.month := 3;
         d.day := 22 + a + b
      END;
      d.year := year
   END AlexandrianEasterJul;

   (* year, d: Gregorian *)
   PROCEDURE GetAlexandrianEasterDate* (year: INTEGER; OUT d: Dates.Date);
   BEGIN
      ASSERT(year >= 326);
      ASSERT(year <= 10900);
(*
      d.year := year; d.month := 3; d.day := 21;
      JDNToDateJul(DateGregToJDN(d), d);
      ASSERT(d.year = year, 100);
*)
      AlexandrianEasterJul(year, d);
      JDNToDateGreg(DateJulToJDN(d), d);
      ASSERT(d.year = year, 101)
   END GetAlexandrianEasterDate;

Автор:  Comdiv [ Четверг, 16 Март, 2017 14:36 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

Alexander Shiryaev писал(а):
GetEasterDate → GetGregorianEasterDate

Зачем вообще такие функции нужны в Blackbox?

Автор:  Илья Ермаков [ Четверг, 16 Март, 2017 16:07 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

Исключать старые, думаю, не стоит. Пометить как не рекомендованные.
Кому нужна только дата - пусть остаются на GetDate..

Автор:  Info21 [ Четверг, 16 Март, 2017 17:06 ]
Заголовок сообщения:  Re: Грубое упущение в интерфейсе Dates?

Comdiv писал(а):
Alexander Shiryaev писал(а):
GetEasterDate → GetGregorianEasterDate

Зачем вообще такие функции нужны в Blackbox?
Да, лучше, наверное, по меньшей мере в отдельном модуле.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/