Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 41 42 43 44 45 46 [47] 48 49 50   вперед  Ctrl
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
rgreat
Что значит "поломалось"?
Вот такой код
var
  LSeries: TGanttObjectSeries<TObject>;
  LValIdx: Integer;
begin
  .......
  LValIdx := LSeries.AddObject(
    AStart, AEnd, AY, nil, '', clBlack
  );
  LSeries.ValueColor[LValIdx] := clBlack;
на выделенной строке стал валиться List index of bound с мусорными значениями
9 окт 19, 17:19    [21990708]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2312
function TGanttObjectSeries<T>.AddObject(const AStart, AEnd, AY: TChartValue;
  const AObj: T; const AXLabel: string; AColor: TColor): Integer;
begin
  FTempObj := AObj;
  try
    AddGanttColor(AStart, AEnd, AY, AXLabel, AColor);
  finally
    FTempObj := nil;
  end;
end;


А где в этом коде присвоение Result?
10 окт 19, 12:08    [21991160]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62862
Блог
Расскажу, как я лажанулся. Правда, не в Delphi, а в Oracle, но зато это всем лажам лажа.

Общая ситуация: процедура чтения формирует и передаёт клиенту объект, назовём его "конфигурация", описывающий размещение заранее неизвестной кучи объектов разных типов. Можно представить, что речь идёт, например, о плане парка: вот здесь дерево такой-то породы такого-то возраста такой-то высоты, вот здесь лавочка такого-то цвета ориентирована по такому-то азимуту, вот здесь фонарь мощностью столько-то свечей и т. п. Процедура записи получает от клиента новую версию конфигурации, сравнивает её со старой, записывает в БД различия и возвращает клиенту новую версию конфигурации, которую можно редактировать дальше. Бизнес-процесс примерно следующий: дизайнер сажает новое дерево, подтаскивает поближе к нему фонарь, разворачивает лавочку, сохраняет картинку. Начальник ставит на повороте лавочки отметку "к исполнению", на дереве пометку "ну не зимой же? сделаем в следующем году", на фонаре - "пошёл нахрен, не буду я кабеля перекладывать".

Внезапно, когда приложение уже работало в production, один из разработчиков заметил, что если внести сразу кучу изменений, то сохраняются только девять из них. То есть, передвинул восемь лавочек - передвинулись восемь лавочек. Передвинул девять - передвинулись девять. Передвинул десять - передвинулись девять. Передвинул двадцать восемь - всё равно передвинулись девять, остальные прыгнули на старые места. Никакой магической константы "9" в коде, разумеется, нет. Чего он не обнаружил - если бы передвинулись сто лавочек, то передвинулись бы девяносто девять. И если бы передвинулись восемьсот девяносто лавочек - всё равно передвинулись бы только девяносто девять.

Догадались? Тогда рассказываю.

Для внутренних манипуляций в коде использовался тип t_id_map, примерный аналог дельфового TDictionary<ID, ID>. И на своём месте отлично работал. Прикол в том, что в другом месте, где мне потребовался тип наподобие дельфового TArray<ID>, я поленился объявлять отдельный тип, а использовал тот же самый t_id_map, передавая в качестве ключа 0, 1, 2, 3... Ведь ничего страшного, правда?

Теперь идём дальше. Нормальным типом для ID в Oracle является NUMBER. Но есть одна проблема: оракловый TDictionary не поддерживает NUMBER как допустимый тип для ключей. Типы наподобие PLS_INTEGER ограничены 32 битами и потому для ID не годятся. В итоге для ID используется VARCHAR2, то есть дельфовый String.

Ещё раз: когда тип t_id_map используется для поиска значений по ключу, это отлично работает. Но там, где он используется вместо TArray, есть желание пробежать по всем записям. И поскольку в сознании разработчика это TArray, это делается обычным циклом:

for i in data.first .. data.last loop

Методы first и last возвращают, соответственно, минимальный и максимальный индексы. Ага. Минимальный. И максимальный. Среди значений типа String. А потом результат приводится к типу integer и идут итерации.
10 окт 19, 13:26    [21991226]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
Michael Longneck
А где в этом коде присвоение Result?
Проблема в этом. Но еще раз повторюсь - первая версия кода рабочая
10 окт 19, 13:46    [21991253]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Болтаювпт
Member

Откуда:
Сообщений: 74
softwarer
Методы first и last возвращают, соответственно, минимальный и максимальный индексы.
Всегда считал что словарь неупорядочен поэтому last будет возвращать последний по добавлению а не по сортировке индекс (ключ).
10 окт 19, 14:09    [21991295]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62862
Блог
Болтаювпт
Всегда считал что словарь неупорядочен

В Oracle он упорядочен. И правильный метод итерирования по такой коллекции -

i := data.first;
while i is not null loop
...
i := data.next(i);
end loop;
10 окт 19, 14:29    [21991314]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
rgreat
Member

Откуда:
Сообщений: 6078
_Vasilisk_
function TGanttObjectSeries<T>.AddObject(const AStart, AEnd, AY: TChartValue;
  const AObj: T; const AXLabel: string; AColor: TColor): Integer;
begin
  FTempObj := AObj;
  try
    AddGanttColor(AStart, AEnd, AY, AXLabel, AColor);
  finally
    FTempObj := nil;
  end;
end;


Вот такой код
var
  LSeries: TGanttObjectSeries<TObject>;
  LValIdx: Integer;
begin
  .......
  LValIdx := LSeries.AddObject(
    AStart, AEnd, AY, nil, '', clBlack
  );
  LSeries.ValueColor[LValIdx] := clBlack;
на выделенной строке стал валиться List index of bound с мусорными значениями


В указаных кусках кода не вижу связи между FTempObj и LSeries.ValueColor[LValIdx]
И вообще не ясно что это за FTempObj такой.
10 окт 19, 14:35    [21991325]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1152
Я как-то лажанулся так: здесь на форуме обсуждали способы быстрого удаления дерева директорий, я предложил функцию SHFileOperation Программное удаление каталога.
У меня есть проектик для тестирования (несколько на самом деле), в котором я проверяю разные функции и т.п. В нем эта функция, привязанная к какой-то кнопке и осталась. Прошло время, запустил проект по какому-то поводу, думаю, что за кнопка? Нажал. Вроде там какая-то защита (типа вопроса перед выполнением) была (а может и нет), вроде в выборе директории нажал отмена, уже не помню, давно было. Но директория "Мои документы" с подпапками удалилась. Картинка с другого сайта. Хорошо, что я там в общем ничего не держал. Не помню, что удалось восстановить программами для восстановления удаленных файлов, вроде немногое. )
Для меня был урок, что такого рода действия должны обязательно предваряться четкими выделенными предупреждениями и неоднократными. Например что-нибудь типа такого: "Это действие сделает то-то и то-то, вы действительно хотите это сделать? и потом "Сейчас будет сделано это, это действие необратимо. Продолжить?"
10 окт 19, 15:39    [21991404]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3702
Настанет день, который ты запомнишь как очень черный. И узнаешь ты значение слова бакап
10 окт 19, 16:37    [21991475]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62862
Блог
Админы делятся на тех, кто делает бэкапы, и на тех, кто уже делает бэкапы.
10 окт 19, 16:39    [21991480]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31335

10.10.2019 16:39, softwarer пишет:
> Админы делятся на тех, кто делает бэкапы, и на тех, кто уже делает бэкапы.

жЫстоко!

Posted via ActualForum NNTP Server 1.5

10 окт 19, 16:47    [21991495]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 896
softwarer
Админы делятся на тех, кто делает бэкапы, и на тех, кто уже делает бэкапы.
есть еще категория - которые БУДУТ делать бакап )
10 окт 19, 16:59    [21991505]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31335

10.10.2019 16:59, Ghost Writer пишет:
>
> есть еще категория - которые БУДУТ делать бакап )

основная мысля тут в том, что те, которые БУДУТ, те не админы...

Posted via ActualForum NNTP Server 1.5

10 окт 19, 17:01    [21991510]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1152
makhaon
Настанет день, который ты запомнишь как очень черный. И узнаешь ты значение слова бакап Картинка с другого сайта.
Бэкапы конечно делаются, автоматически, но не всего подряд, а папок проектов и других рабочих папок и т.п. Моего компьютера и других компьютеров нашей небольшой компании. А вот дома, увы, только пароли, явки и т.п. бэкаплю в облаке, время от времени.
10 окт 19, 17:10    [21991520]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1152
softwarer
Админы делятся на тех, кто делает бэкапы, и на тех, кто уже делает бэкапы.

Причем бывает, что бэкапы делаются неправильно. Был такой международный буддийский сайт, форумы, lioncity, я был пользователем там.
https://dhammawiki.com/index.php/E-Sangha
Как-то его хакнули. А там делался автоматический ежесуточный бэкап, сайт был кажется на каком-то из стандартных форумных движков. И подошло время бэкапа и бэкап крякнутого сайта переписал файл вчерашнего нормального бэкапа. Сайт так и не восстановили и он перестал существовать.
10 окт 19, 18:09    [21991612]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2262
s62
И подошло время бэкапа и бэкап крякнутого сайта переписал файл вчерашнего нормального бэкапа. Сайт так и не восстановили и он перестал существовать.

Для этого изобрели дифференциальные и инкрементные бэкапы и различные схемы резервного копирования, которые позволяют держать год бэкапов с разумным расходованием свободного места.
10 окт 19, 19:04    [21991644]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1152
alekcvp
s62
И подошло время бэкапа и бэкап крякнутого сайта переписал файл вчерашнего нормального бэкапа. Сайт так и не восстановили и он перестал существовать.

Для этого изобрели дифференциальные и инкрементные бэкапы и различные схемы резервного копирования, которые позволяют держать год бэкапов с разумным расходованием свободного места.
Хорошо, что ты это знаешь, а админы того сайта видимо не знали или просто не озаботились о надежности резервного копирования.
11 окт 19, 12:40    [21992056]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4136
alekcvp
s62
И подошло время бэкапа и бэкап крякнутого сайта переписал файл вчерашнего нормального бэкапа. Сайт так и не восстановили и он перестал существовать.

Для этого изобрели дифференциальные и инкрементные бэкапы и различные схемы резервного копирования, которые позволяют держать год бэкапов с разумным расходованием свободного места.

Ничего не гарантирует. Буквально недавно закончилось место на НАСе. И Acronis Backup самой последней версии расфигачил все имеющиеся там резервные копии к фигам до невозможности их чтения. Благо были копии еще и в облаке. Вот и пользуйся после этого сторонним софтом.
11 окт 19, 12:48    [21992064]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Василий 2
Member

Откуда:
Сообщений: 1016
s62
Хорошо, что ты это знаешь, а админы того сайта видимо не знали или просто не озаботились о надежности резервного копирования.

Они просто знали, что вся нужная инфа хранится в астрале и не парились))
11 окт 19, 15:22    [21992257]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2262
JaDi
И Acronis Backup самой последней версии расфигачил все имеющиеся там резервные копии к фигам до невозможности их чтения. Благо были копии еще и в облаке. Вот и пользуйся после этого сторонним софтом.

Подозреваю что надо было отключить консолидацию резервных копий при удалении старый. Но да, ребята из акрониса - рептилоиды те ещё.
11 окт 19, 17:47    [21992457]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
alekcvp
JaDi
И Acronis Backup самой последней версии расфигачил все имеющиеся там резервные копии к фигам до невозможности их чтения. Благо были копии еще и в облаке. Вот и пользуйся после этого сторонним софтом.

Подозреваю что надо было отключить консолидацию резервных копий при удалении старый. Но да, ребята из акрониса - рептилоиды те ещё.

Как-то к купленной материнской платой прилагалась бесплатная утилита от акронисов, для автоматического создания резервных копий системы... через полгода эксплуатации выяснилось, что у утилиты отсутствует функционал для восстановления из копий...
...или заблокирован, или я "ниасилил и не смог найти".
11 окт 19, 19:09    [21992503]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62862
Блог
ёёёёё
Как-то к купленной материнской платой прилагалась бесплатная утилита от акронисов, для автоматического создания резервных копий системы... через полгода эксплуатации выяснилось, что у утилиты отсутствует функционал для восстановления из копий...

Восстановление платное
11 окт 19, 19:10    [21992505]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4136
alekcvp
JaDi
И Acronis Backup самой последней версии расфигачил все имеющиеся там резервные копии к фигам до невозможности их чтения. Благо были копии еще и в облаке. Вот и пользуйся после этого сторонним софтом.

Подозреваю что надо было отключить консолидацию резервных копий при удалении старый. Но да, ребята из акрониса - рептилоиды те ещё.

Либо проверять наличие свободного места перед записью данных в файл через поток.
11 окт 19, 19:22    [21992518]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2368
Был когда-то давно куплен акронис, но после каких-то проблем пересел на AOMEI. Теперь им пользуюсь
12 окт 19, 02:13    [21992635]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
softwarer
ёёёёё
Как-то к купленной материнской платой прилагалась бесплатная утилита от акронисов, для автоматического создания резервных копий системы... через полгода эксплуатации выяснилось, что у утилиты отсутствует функционал для восстановления из копий...

Восстановление платное

Да, рассказывали, в Египте так было:
- Девушка, хочешь на верблюде прокачу? Бесплатно!
- Конечно, хочу!
...верблюд по команде опускается, согнув ноги, позволяет залезть на него, катаемся...
- Все, я больше не хочу, скажи верблюду, чтобы опустился, я слезу!
- 50$!
12 окт 19, 09:32    [21992663]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 41 42 43 44 45 46 [47] 48 49 50   вперед  Ctrl
Все форумы / Delphi Ответить