Как отключить финализацию диска
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
-------
Мнение большинства людей всегда ошибочно, ибо большинство людей - идиоты.
~ Эдгар Аллан По ~
Конфигурация компьютера | |
Процессор: Intel Core i5-2500K (-> 4.2 ГГц) | |
Материнская плата: AsRock P67 Pro3 (Socket 1155) | |
Память: 2x4096 МБ DDR3-1333 Kingston (-> 1600 МГц) | |
HDD: Hitachi 2 ТБ + 0,75 ТБ (SATA2), SSD: OCZ Vertex3 (120 ГБ, SATA3) | |
Видеокарта: VTX3D Radeon 7950 | |
Звук: Asus Xonar DS (PCI) | |
Блок питания: Chieftec CTG-550-80P (550 Вт, октябрь 2011) | |
CD/DVD: DVD-RW LiteOn iHAS124 (SATA2) | |
Монитор: Dell U2412M (24", 1920x1200, e-IPS) | |
ОС: Windows 7 Ultimate x64 | |
Индекс производительности Windows: 7.6 | |
Прочее: Кулер Zalman 10X Performa |
Возможно, просто не установлен драйвер для UDF какой-то последней версии. Я без понятия, где его можно взять отдельно, но в комплекте Nero In-CD он должен быть. Попробуйте, вдруг поможет
Конфигурация компьютера | |
Процессор: Intel Core i5-8259U @ 2.30GHz | |
Материнская плата: Intel NUC8BEB | |
Память: Patriot 2400 C15 Series DDR4-2400, 32 GB | |
HDD: Samsung SSD 970 EVO Plus 500 GB, M.2 | |
Видеокарта: Intel Iris Plus Graphics 655 | |
Звук: Behringer UCA222 + M-Audio Studiophile AV 40 | |
Монитор: BenQ G900 (19" LCD, 5:4) | |
ОС: Windows 11 Pro x64 |
Я ещё встречался с такой штукой: на видеорекордере есть два режима записи — в формате DVD и в каком-то своём внутреннем, чтобы можно было делать монтаж, если не ошибаюсь, прямо в этом видеорекордере. Соответственно, DVD-плееры этого второго формата не воспринимают, даже если диск финализирован. Компьютер читает, и то только в плеерах типа MPC.
Без финализации диска сделать образ затруднительно. А почему нельзя финализировать-то?
Чтобы воспроизводить диски на других
устройствах, следует выполнить финализацию
дисков.
Финализация дисков может длиться от
нескольких минут до часа.
Для финализации меньшего по длительности
периода записи потребуется больше времени. Во
время выполнения финализации запрещается
отключать сетевой кабель.
Перед началом финализации
загрузите записываемый диск.
В режиме остановки нажмите
[SETUP].
Выбе рите “Меню DVD”, ис пользуя
[
U \ D], затем нажмит е [ENTER].
Выберите “Завершить”, исполь зуя
[
U \ D], затем нажмит е [ENTER].
Выбе рите “Да”, и с пользуя [
затем нажмите [ENTER].
например) DVD-RW диск в режиме VR
Функция финализации будет активирована.
Отмена финализации (только для
дисков DVD-RW):
нажми те [STOP C]. В ы берите “Да”,
используя [
U \ D] , затем нажмите [ENTER].
Функция финализации отменена и изделие
переведено в режим остановки.
Если при нажатии кнопки [STOP C] на экран е
появится символ
это означает, что
финализация не может быть отменена, т. к.
процесс выполнения этой функции достиг
критической точки.
Если выбрана позиц ия “Нет” и нажата кнопка
[ENTER] или [RETURN], вып олнение
финализации будет продолжено.
Отмена активированной функции
финализации диска DVD-R и DVD+RW/+R
невозможна.
Форматирование завершено.
Рекомендации
• Функция финализации диска в режиме Video и
+VR автоматически создает меню заголовков.
• После финализации диска DVD+RW вы можете
вызвать список за головков, нажав [TOP MENU],
или вы можете вызвать меню заголовков,
нажав [DISC MENU].
• Даже после финализации диска DVD+RW, вы
все еще можете продолжать запись или
редактирование. После финализации диска
DVD-RW/-R или DVD+R редактирование или
запись дополнительного материала на диск
невозможны.
• Для отмены финализации диска выберите
“Отмена завершения” в шаге
• Чтобы отменить финализацию диска DVD+RW,
выполните дополнительную запись на диск.
• Для дисков DVD+RW, если вы добавили или
удалили разделы или скрыли разделы, вы
должны финализировать диск перед тем, как
вы сможете просматривать эти эффекты на
других устройствах. Для воспроизведения
дисков в формате, отличном от DVD+RW, на
других проигрывателях DVD, вам необходимо
финализировать диск.
• Если вы загрузите диск DVD-RW,
финализированный с помощью данного
изделия, на экран будет выведена надпись
“Отмена завершения” вместо “Завершить”.
• НЕ отключайте изделие от сети питания во
время выполнения финализации. Это может
привести к неисправностям в работе изделия.
Автофинализация
Вы можете выполнять автоматическую
финализацию дисков, как только записываемый
диск будет заполнен, если вы настроите эту
функцию в меню Установок.
В режиме остановки нажмите
[SETUP]. Вы берите “Общие
настройки”, и с пользуя [
Кто пользуется программой записи дисков ImgBurn подскажите где в ней включить/отключить финализацию?
Все перерыл нигде не нашел такой опции. Финализирует диски по умолчанию и все тут.
А в Nero есть такая опция
Если можно тоже скриншот приложите
Конфигурация компьютера | |
Процессор: Core 2 Duo E6400 2133MHz | |
Материнская плата: Asus P5B Deluxe | |
Память: Corsair CM2X1024-6400C4 2x1Gb | |
HDD: WD1600JS-00NCB1, 160 Гб, SATA2 | |
Видеокарта: MSI RX1650XT 256Mb | |
Звук: Creative CA20K1 X-Fi Xtreme Fidelity | |
Блок питания: Hiper HPU-4S730-MU, 730W, 09.2007 | |
CD/DVD: ASUS DRW-1814BLT | |
Монитор: BenQ FP93GP, 19' | |
ОС: Windows XP SP2 | |
Прочее: Thermaltake CL-W0040 |
-------
Зачем мне, на***, карате, когда в кармане два ТТ?
Последний раз редактировалось $ancho$, 29-03-2008 в 13:40 .
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Я реально не заинтересован в осуществлении мультисессионной поддержки, как я лично считаю, что это трата времени. Если я хочу, чтобы мои файлы медиа информации, где я смогу держать изменяя их потом я лучше буду использовать USB или, может быть, поиграть с FAT32 диск отформатирован DVDRAM. |
Конфигурация компьютера | |
Процессор: 2 x Intel Xeon E5420 2,5 ГГц | |
Материнская плата: Supermicro X7DA8 (Chipset Intel® 5000X (Greencreek) + Adaptec AIC-7902B Ultra 320 SCSI) | |
Память: 2x2 Гб DDR2 ECC SDRAM | |
HDD: Seagate SCSI320: 3x74 Гб + 2x145 Гб | |
Видеокарта: NVIDIA GeForce 210 | |
Звук: Встроенная Realtek AC97 | |
Блок питания: Supermicro 420 Вт | |
CD/DVD: Sony-NEC Optiarc 7173A + Plextor PX760A | |
Монитор: NEC MultiSync LCD 2090UXi | |
ОС: XP + SP3 |
Duplex Secure's SPTD driver can have a detrimental effect on drive performance. |
Сейчас установил последнюю версию - 2.5.2.0, но ничего не изменилось. Кто-нибудь знает, что это за байда и как лечится?
-------
Свобода не означает вседозволенность.
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz | |
Материнская плата: Gigabyte GA-H67MA-UD2H-B3 | |
Память: Hynix HMT325U6BFR8C-H9 2x2Gb + Hynix HMT351U6BFR8C-H9 2x4Gb | |
HDD: Hitachi HDS721010CLA332 | |
Звук: Realtek ALC889 | |
Блок питания: Asus 500W | |
CD/DVD: Optiarc DVD RW AD-7201S ATA Device | |
Монитор: Acer V243HQAbd | |
ОС: Windows 7 Ultimate x64 SP1 RTM (6.1.7601) | |
Индекс производительности Windows: 5,1 |
Конфигурация компьютера | |
Процессор: 2 x Intel Xeon E5420 2,5 ГГц | |
Материнская плата: Supermicro X7DA8 (Chipset Intel® 5000X (Greencreek) + Adaptec AIC-7902B Ultra 320 SCSI) | |
Память: 2x2 Гб DDR2 ECC SDRAM | |
HDD: Seagate SCSI320: 3x74 Гб + 2x145 Гб | |
Видеокарта: NVIDIA GeForce 210 | |
Звук: Встроенная Realtek AC97 | |
Блок питания: Supermicro 420 Вт | |
CD/DVD: Sony-NEC Optiarc 7173A + Plextor PX760A | |
Монитор: NEC MultiSync LCD 2090UXi | |
ОС: XP + SP3 |
Ни алкоголь, ни даймон тулз на компе не установлены.
За ссылку - спасибо, попробую.
-------
Свобода не означает вседозволенность.
Конфигурация компьютера | |
Процессор: 2 x Intel Xeon E5420 2,5 ГГц | |
Материнская плата: Supermicro X7DA8 (Chipset Intel® 5000X (Greencreek) + Adaptec AIC-7902B Ultra 320 SCSI) | |
Память: 2x2 Гб DDR2 ECC SDRAM | |
HDD: Seagate SCSI320: 3x74 Гб + 2x145 Гб | |
Видеокарта: NVIDIA GeForce 210 | |
Звук: Встроенная Realtek AC97 | |
Блок питания: Supermicro 420 Вт | |
CD/DVD: Sony-NEC Optiarc 7173A + Plextor PX760A | |
Монитор: NEC MultiSync LCD 2090UXi | |
ОС: XP + SP3 |
После переустановки системы проблема исчезла. Нифига себе решеньице!
P.S. Т.к. для каждого конкретного случая приходится использовать индивидуальные настройки ImgBurn-а (в том числе и DVD-привода), логично предположить, что и параметры командной строки будут в каждом случае неодинаковы. По этой причине хотелось бы узнать, можно ли как-то выяснить, как выглядит ImgBurn-овская командная строка к каждом конкретном случае, например, для записи ISO-образа?
-------
Свобода не означает вседозволенность.
Конфигурация компьютера | |
Процессор: 2 x Intel Xeon E5420 2,5 ГГц | |
Материнская плата: Supermicro X7DA8 (Chipset Intel® 5000X (Greencreek) + Adaptec AIC-7902B Ultra 320 SCSI) | |
Память: 2x2 Гб DDR2 ECC SDRAM | |
HDD: Seagate SCSI320: 3x74 Гб + 2x145 Гб | |
Видеокарта: NVIDIA GeForce 210 | |
Звук: Встроенная Realtek AC97 | |
Блок питания: Supermicro 420 Вт | |
CD/DVD: Sony-NEC Optiarc 7173A + Plextor PX760A | |
Монитор: NEC MultiSync LCD 2090UXi | |
ОС: XP + SP3 |
К сожалению, команда /ERASE из командной строки ни в какую работать не хочет, даже если запускать просто ImgBurn.exe /START /ERASE , хотя смысл сего действа прост - стереть диск перед записью. В описании к ImgBurn никаких ограничений в отношении этой команды нет, вроде всё должно работать. Перепробовал всякие варианты, но /ERASE в командной строке словно вообще не работает. Кто-нибудь знает, как заставить команду работать? Не стирать же предварительно всё время диск вручную!
-------
Свобода не означает вседозволенность.
Последний раз редактировалось Nun-Nun, 12-02-2011 в 15:42 .
Конфигурация компьютера | |
Процессор: Socket LGA 1150 Intel Core i5 4690K 3.5GHz+Noctua NH-D14 | |
Материнская плата: Socket LGA 1150 ASRock Z87 Fatal1ity Killer | |
Память: Kingston DDR3L-1600 16384MB PC3-12800 (Kit of 2x8192) HyperX FURY Black (HX316LC10FBK2/16) | |
HDD: Western Digital Blue WD10EZEX / Western Digital Red WD30EFRX / Western Digital Red WD80EFAX / Seagate Barracuda 7200.12 ST2000DM001 | |
Видеокарта: MSI GeForce GTX 1060 Gaming X 3GB GDDR5 | |
Звук: Asus Strix Raid Pro+5.1 Genius SW-HF4500 Wood | |
Блок питания: Seasonic Focus Gold GX-650 650W (SSR-650FX)+APC Back-UPS ES 525VA | |
CD/DVD: ASUS DRW-24B3ST \ PIONEER DVD-RW DVR-221L \ Asus Blu-Ray BD Writer Black (BW-16D1HT/BLK/B/AS) | |
Монитор: LG194WT-BF 19 дюймов / 23.8" Dell S2421H | |
Прочее: Корпус:Chieftec Smart CH-09B-B Black;два корпусных вентилятора один на вдув и один на выдув:Noctua NF-P12-1300;Веб-камера:Logitech WebCam C270;Геймпад:Xbox One Controller Black+Wireless Adapter;Наушники Sony PlayStation 4 Gold Edition Headset 7.1 Black;Мышь:A4Tech X-710BК USB Black; |
Завершение дисков DVD-R/RW, записанных на этом аппарате,
делает возможным воспроизведение дисков на других
проигрывателях DVD. Диски DVD-RW финализируются в
режиме, в котором диски форматировались, позволяя
воспроизведение на совместимых проигрывателях DVD.
Имена заголовков, вводимые в систему навигации базы
данных библиотеки, регистрируются, как имена заголовков, в
меню DVD. (A стр. 64)
Перед финализацией
Можно записывать на свободном пространстве.
Можно вводить имена заголовков. (A стр. 59)
Можно удалять заголовки. (A стр. 57)
Невозможно повторно осуществить запись в записанные
области дисков DVD-R.
Доступное для записи место не увеличится, даже если
записанная программа удаляется с диска DVD-R.
Невозможно записывать или редактировать диски DVD-R/
RW, записанные на других устройствах, даже если они не
были финализированы.
После финализации (Для дисков DVD-R/RW (видео
режим))
Видео и аудио информация, записанная, в соответствии со
стандартом DVD Video, до финализации, позволяет
воспроизводить диски, как диски формата DVD VIDEO.
Хотя диски DVD-R/RW, финализированные на этом
аппарате, можно воспроизводить на проигрывателях DVD,
совместимых с дисками DVD-R/RW, тем не менее,
некоторые диски могут не воспроизводиться, за что
компания JVC не несет ответственности.
Отмеченные точки, маркированные до финализации, будут
удалены, и заголовки будут автоматически разделены на
AглавыB приблизительно по 5 минут каждая. (A стр. 4, 30)
В зависимости от используемых проигрывателей DVD и
дисков DVD-R/RW, а также от условий записи,
воспроизведение дисков может оказаться невозможным. В
этом случае воспроизводите диски на этом аппарате.
Дополнительные записи становятся невозможными.
Завершите диск DVD-R/RW
Перед продолжением выполните действия 1 - 3 раздела
AОтформатируйте диск DVD-RAMB (A стр. 83).
Нажмите клавиши выбора для выбора
нажмите ENTER.
Появляется экран подтверждения. Нажмите клавиши
выбора для выбора
AYESB, затем нажмите ENTER.
Снова появляется экран подтверждения. Нажмите
клавиши выбора для выбора
AOKB, затем нажмите
Для отмены финализации нажмите
По окончанию финализации на экране ТВ появляется
индикация
ACOMPLETEDB. Для возврата к предыдущему
экрану нажмите ENTER.
Для возврата к обычному экрану нажмите SET UP.
Экран меню очищается.
После финализации диска DVD-R/RW (режим видео)
индикация для оригинальной записи и списка
воспроизведения не появляются. После появления
дисплея библиотеки нажмите TOP MENU для выбора
нужного заголовка.
После финализации диска DVD-RW (режим VR) вы
сможете воспроизводить его на проигрывателях DVD,
совместимых с режимом VR.
Отменить финализацию диска
DVD-RW
Чтобы отменить финализацию диска загрузите диск
DVD-RW, и перед продолжением выполните действия 1 - 3
раздела
AОтформатируйте диск DVD-RAMB (A стр. 83).
Нажмите клавиши выбора для выбора
B, затем нажмите ENTER.
Нажмите клавиши выбора для выбора
нажмите ENTER.
После выполнения отмены финализации на экране ТВ
появляется индикация
ACOMPLETEDB. Для возврата к
предыдущему экрану нажмите ENTER.
Для возврата к обычному экрану нажмите SET UP.
Когда финализация диска отменена, возобновляется
режим, в котором диск форматировался, делая диск
пригодным для записи.
Невозможно отменить финализацию диска DVD-R.
Завершение диска
ВНИМАНИЕ:
Ни в коем случае не выключайте аппарат и не
отсоединяйте шнур питания в процессе работы функции
финализации или его отмены.
Вероятно многие встречались с таким вот "партизаном" при старте или завершении приложения:
Если честно, раньше я как-то даже не задумывался по поводу данного исключения, т.к. в моих проектах оно явление редкое, пока однажды у целой череды пользователей не начала воспроизводится именно 217-я ошибка.
Впрочем, даже тогда я не пошел по правильному пути и просто добавил дополнительный уровень логирования в проект, по результатам которого достаточно оперативно нашел причину и исправил ее.
Но, по сути, я просто потратил свое время.
И тратил бы его в дальнейшем, если бы на днях со мной не связался Виктор Федоренков и не рассказал о своих мыслях по поводу ошибки за номером 217.
Теория и анализ проблемы
Без теории нам никуда, иначе можем уткнуться в пределы собственных знаний :)
Поэтому начнем, конечно, с теоретической части.
Для начала я немного освежил мои представления об ошибках в принципе, перечитав часть статьи "Обработка ошибок - глава 1.2.2" за авторством Александра Алексеева, откуда вынес информацию о том, что ошибка 217 будет отображена в том случае, если не инициализирован модуль SysUtils, причем это у Александра проиллюстрированно достаточно наглядно:
На основании данной картинки можно сделать грубый вывод: пока SysUtils жив - все исключения должны отображаться в нормальном виде, о чем идет отдельное упоминание:
Ну что-ж давайте проверим, пишем код, в котором SysUtils должна быть финализирована позже модуля Unit1, в котором искусственно генерируем исключение:
Билдим, запускаем, закрываем форму и. Runtime error 217.
Утверждение о том, что 217 отображается после финализации SysUtils полностью верное, но давайте-ка посмотрим на сам код финализации:
Смотрите что происходит: в процедуре FinalizeUnits вызываются все финализирующие процедуры, адреса которых расположены в массиве InitContext.InitTable^.UnitInfo в том порядке, в котором происходила их инициализация, т.е. самые первые расположены в начале массива (а финализация идет с конца).
Где-то в самом низу расположен и SysUtils + System, ну а мы, с нашим модулем Unit1 где-то в самом верху.
Но вдруг происходит исключение в нашем модуле и "бабах", порядок катарсиса нарушен.
После "бабах" FinalizeUnits вызывается повторно, пропуская наш модуль, вызвавший исключение, вследствие чего разрушается SysUtils и разные, встречающиеся по пути, class destructor-ы, до кучи грохается System с менеджером памяти (сидящий одним из первых в начале списка), после чего идет контрольный выстрел в лоб - RAISE, вот тут-то мы и приплыли - здравствуй 217.
А что если произойдет исключение в секции инициализации любого модуля?
Да все тоже самое:
Делаем вывод: любое необработанное исключение в секциях инициализации или финализации будет приводить к потере описания исключения и приводить к ошибке 217.
Отключаем финализацию модулей
В самом начале обсуждения Виктором был предложен достаточно эффективный способ обхода данной ошибки.
Его анализ заключался в следующем: общая инициализация обработчика исключений производится в процедуре InitExceptions модуля SysUtils, а финализация вызовом DoneExceptions.
Как вариант решения был предложен следующий код, который нужно подключить к файлу проекта самым первым модулем (будет работать начиная с D2005 и выше):
Если честно - аплодировал стоя.
Вот он: хак в самом грязном виде как он есть - такие вещи могут делать только те, кто действительно понимает, чем это грозит :)
И данный модуль вывел работу нашего IT отдела примерно на три часа - это была жесткая дискуссия :)
Но, впрочем, давайте разберем логику работы данного кода:
Суть его проста, необходимо выйти на данные о загруженных модулях (включая BPL) в том виде, в котором их понимает Delphi приложение. Это было сделано посредством доступа к началу однонаправленного списка структур TLibModule. Первым элементом списка будет структура, описывающая текущий образ, откуда нам нужно всего-то и получить данные о структуре UnitInfo, которая содержит в себе данные как о количестве инициализированных модулей, так и об адресах их процедур инициализации и финализации в виде записи PackageUnitEntry.
Блокирование финализации модулей происходит посредством присвоения параметру FInit значения nil у каждой записи PackageUnitEntry.
При обниливании данного параметра FinalizeUnits не сможет произвести вызов обработчика и в итоге тот самый raise, о котором я писал выше, сможет достаточно корректно произвести отображение возникшего исключения.
Но вот дальше все сложнее.
Пытаемся причесать хорошую мысль
Идея здравая и причины понятны, но вот как-же так, ресурсы все-же не освобождены, FastMem перестанет нормально работать (она собирает утечки как раз при финализации), да и совместимости маловато, к примеру, как я и сказал выше, под Delphi 7 данный код вообще работать не сможет.
После первого часа обсуждений в IT отделе мы даже умудрились прийти и к такому выводу: "да и хрен с ними с SysUtils и System - что-то критичного они за собой не несут".
А потом, опять начали спорить - ну не устраивал нас этот подход, вроде все хорошо, но не аккуратненько как-то :)
Рассматривались даже варианты прямого сплайсинга блоков финализации и до кучи деструктора Exception - но дополнительный хак, на уже существующий хак не устраивал вообще никого :)
А выводится оно посредством передачи управления на ExceptHandler, в коде которого нет ничего секретного.
А что мы делаем убирая финализацию модулей?
Правильно, заставляем вызваться его-же.
Попробуем-ка проэмулировать вызов ExceptHandler.
Пишем тестовый юнит и подключаем его к проекту самым первым:
Запускаем на выполнение и.
Встроившись в цикл финализации, мы отобразили произошедшее исключение и продолжили финализацию дальше вызовом Halt(1).
В итоге задача решена, грамотно и документировано, и совместимо с Delphi 7, но.
А не развить ли идею?
Есть такое понятие, как "наведенные ошибки", т.е. ошибки произошедшие из-за того что перед ними тоже произошла ошибка.
Ну к примеру, функция А, которая должна возвращать экземпляр некоего класса и функция Б, использующая этот экземпляр в работе. К примеру в функции А произошло необработанное исключение (например нет доступа к файлу) и она не создала класс, а потом где-то гораздо позже по коду приложения процедура Б выполняет обращение к этому экземпляру и в итоге происходит Access Violation.
Тоже самое может произойти и в процедурах инициализации/финализации, причем исключение, произошедшее в финализации скроет от нас саму причину.
Для демонстрации напишем вот такой код, в котором при инициализации приложения будет создаваться некий логер, в который будут писаться этапы работы приложения, а в финализации будет писаться что приложение завершило работу.
Для генерации исключения заставим логер создаваться по несуществующему пути:
Мало у кого в системе присутствует диск "А" поэтому результатом этого кода будет либо "Runtime error 216" (именно 216, а не 217), либо, если подключим код из предыдущей главы:
Exception EAccessViolation in module Project2.exe at 001B1593.
Access violation at address 005B1593 in module 'Project2.exe'. Read of address 00000000.
А ведь причина то кроется в самом первом исключении, которое нами не отображается и с наскока разобраться в причине ошибки не получится.
Здесь идея проста, функция GetNextException по сути повторяет вызов AcquireExceptionObject, но после своего вызова не теряет ссылку на следующее в очереди исключение, а запоминает адрес следующего фрейма во внешней переменной.
После чего все исключения заносятся в список (самое последнее будет первым в списке) и выводятся программисту с соблюдением очередности, в результате чего нам будет сразу понятно, что сначала произошло вот это:
И уже только после него пошли всякие там AV.
Теперь по поводу остальных кодов ошибок.
Почему я начал именно с "Runtime error 217"?
Ну потому что она наиболее легко воспроизводима, а так технически, используя выше приведенный модуль, мы получим на руки вполне нормальное описание всех возможных Runtime ошибок, коих в наличии у нас вон сколько:
Вот таким небрежным кодом, мы можем получить то, о чем нам не хочет говорить ошибка под кодом 217.
Впрочем, я не думаю что этот подход будет незнаком опытным программистам.
Скорее всего это — здравствуй велосипед, ибо вероятнее всего данная проблема кем-то уже решалась ранее, но я просто не знал о данном решении :)
А если нет — значит буду вторым :)
Отдельный респект соавтору и вдохновителю данной статьи - Виктору Федоренкову.
Читайте также: