Mar. 21st, 2013

undup

Mar. 21st, 2013 07:44 pm
thedeemon: (office)
Давно еще заметил: какого бы размера ни был жесткий диск, а все равно довольно скоро на 90% забьется. Недавно к такому состоянию пришли почти все мои внутренние и внешние диски, захотелось немножко навести порядок, в частности, избавиться от дублирования ненужного контента и сильно устаревших бэкапов. Я когда-то давно пытался запускать всякие искалки дубликатов, но все они были какие-то неудобные и мутные: было неочевидно, по какому принципу и что именно они ищут и показывают. Сделал себе утилитку поиска дубликатов с понятными мне правилами и выводом отчетов текстом, но оказалось, что текстом слишком неудобно. Тогда сделал визуализацию результатов, и наступило щастье:



Объекты (файлы и каталоги), у которых существуют похожие на них копии, помечаются цветом. Если у объекта существует более новая версия где-то, то сам он устарел, помечается красным. Если более новых нет, а есть более старые копии, то он сам самый новый, помечается зеленым. Если же есть только идентичные копии, не старее и не новее, то помечается желтым. Весьма наглядно. Можно водить мышой и смотреть что где лежит, сколько занимает. Двойной щелчок по окрашенному объекту выводит подробности. Оформил это дело в виде фриварки (MIT licensed), взять инсталлятор и исходники можно здесь:
https://bitbucket.org/infognition/undup

Написано на D. В этом проекте использовал более заковыристые возможности языка по сравнению с предыдущими, в результате несколько раз напоролся на баги компилятора. В частности, если в данном проекте пытаться сгенерить символьную информацию (pdb), то линкер падает. А без этого ни отладки, ни профайлинга толком.

Один баг (мой собственный, как оказалось) был особенно красивый. Долгие процессы сканирования дисков и поиска дублей вынесены в отдельные потоки. Потоки в Ди, как в эрланге каком, имеют по мэйлбоксу и общаются посылкой сообщений. Вот рабочий поток у меня периодически шлет сообщения главному GUI потоку о том, как у него продвигаются дела. И в какой-то момент появился глюк: сообщение GUI поток получает и успешно обрабатывает, меняет что-то в контролах окошка (прогресс бар там двигает, текст статуса обновляет, кнопки меняет и т.д.), но визуально изменения эти в окошке происходят через раз: то происходят, а то игнорируются. Какие у меня только мысли не возникали по этому поводу. А оказалось, что баг просто классический. Выгребание из мэйлбокса сообщений и их разбор GUI поток у меня производит в обработчике таймера, т.к. сам имеет message loop, не связанный с мэйлбоксом потока (две разных очереди сообщений получаются). Так вот, когда окошко закрывалось, я забыл таймер выключить, а тот продолжал держать живым объект окошка (язык garbage collected, деструкторы не используем). Поэтому когда новое окошко создавалось, там создавался новый таймер, и они оба по-очереди забирали сообщения из мэйлбокса потока, в итоге часть сообщений приводила к обновлению не текущего открытого окна, а старого, закрытого. :)

Profile

thedeemon: (Default)
Dmitry Popov

July 2025

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
27282930 31  

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 18th, 2025 09:12 am
Powered by Dreamwidth Studios