Я в детстве изготавливал спутники из медной проволоки и вместе с друзьями запускал их в космос. Для запуска спутник нужно было бросить точно в сторону яркого солнца, тогда он зацеплялся за солнечные лучи и на солнечной энергии улетал на орбиту. Если после запуска спутник удавалось найти, то значит бросок был недостаточно точный и запуск необходимо повторить. Если же найти его не удавалось - значит запуск прошёл в штатном режиме и спутник благополучно достиг орбиты. А однажды, в местах запуска спутников был найден кусок обгоревшей скомканной проволоки, отдалённо напоминающий один из моих давно и успешно улетевших спутников. Это стало надёжным наглядным подтверждением, что мои спутники не только улетают на орбиту, но ещё и иногда успешно оттуда возвращаются в обгоревшем от трения об атмосферу состоянии.
Понравилось ваше структурирование информации! Начиная с уточнения года прямо в названии! (а то часто находишь в сети такую "современную" заметку, а потом оказывается что ей уже 10 лет). И то, как информация разложена по полочкам. Что хотелось бы улучшить: - на тач-экране пример с "Resize Me" не ресайзится, а в примере CONTAINER QUERIES разделитель перемещается коряво, имхо мобильный интернет сейчас популярен и хочется чтобы примеры это учитывали; - в примере VIEW TRANSITIONS кнопки "+", "-" маленькие и расположены так что в режиме 1х их не видно даже при скролинге; - в примере SUBGRID потерялась картинка. А в остальном статья порадовала - спасибо!
Попался ещё способ сделать "дзиньк" японской бензопиле std::string hello = "hello"; std::wstring message = std::format(L"{}", hello);
Здесь вываливается сразу куча ошибок и все эти ошибки ведут внутрь кишков самого format, вместо того чтобы сообщить о том что format не умеет смешивать string c wstring и указать на место где я это попытался смешать. Во всяком случае в MSVC 2022 так, в других компиляторах не проверял.
А можете пояснить как совместить StringTable с модульностью? Если выносить всё строки в ресурсы то становится недостаточно включить/исключить заголовочный файл, надо ещё где то хранить список строк этого модуля и добавлять/удалять их в ресурсах.
PS: это не возражение - реально пробую осилить StringTable.
Недавно экспериментировал с precompiled headers в MSVC 2022 и пришёл к выводу что не зря их теперь там по умолчанию отключили. Сейчас студия предкомпилирует всё подряд и довольно неплохо отслеживает что и когда нужно перекомпилировать, а что нет. Ускорения от включения precompiled headers не заметил.
Заметил сильное замедление от закольцованных взаимных ссылок в заголовочных файлах. Оно иногда проявляется логическими ошибками, но не всегда. Зато явно увеличивает время компиляции и размер ipch файлов.
О - мотивация - понимание почему я что-то готов радостно делать, а от чего-то убегаю - очень интересная тема. Сильно зависит от индивидуальных, нередко противоречивых заморочек. Из экспериментов над собой я выяснил интересное противоречие - мне в спорте важна хорошая компания, наедине с собой мотивация на спорт у меня очень слабая, но при этом традиционно командные виды типа футбола, баскетбола, волейбола меня не радуют. В итоге выбрал акробатическую йогу (акройогу) и уже десять лет как радостно ей занимаюсь. Если сравнивать с качалкой, то в акройоге вместо грузов, брусьев и т.п. используются люди партнёры - это весело. Поэтому с железом качаться у меня не получается, а с людьми кайфую.
Да красивая рекурсия получается :)) Эталонные метры по определению измеряются через эталонные секунды с помощью маятника, а эталонные секунды с помощью того же маятника определяются через эталонную длину маятника... Только почему то мне кажется, что это так не работает :))
Правильный "карманный" эталон может быть технически сложным устройством, главное чтобы: - внутри был кусочек Цезия-133 используемый в таймере для измерения скорости света; - технические (в т.ч. самые коварные - температурные) погрешности самого устройства были минимальны - при цифровом (не аналоговом) исполнении думаю что это вполне реально; - устройство было достаточно компактным, пусть даже не карманным, а хотя бы "чемоданным", главное чтобы не размером с лабораторию или с институт метрологии; - легко тиражируемым на современном технологическом уровне, т.е. оно вполне может быть соизмеримым по сложности с микропроцессором или жёстким диском - это не страшно. В конце концов сочетание "глаз + нервная система + мозг" с помощью которого мы смотрим на метровую линейку тоже писец какая сложная система, но при этом она всегда с собой даже без карманов :))
Получается им бы могло стать нечто похожее на современный карманный лазерный дальномер, с внутренним таймером стабилизированным Цезием-133. И тогда поверки в аж целых институтах метрологии станут наконец неактуальными :))
Только есть нюанс - заплатит за этот клик заказчик рекламы, который запросто может оказаться честным производителем полезного продукта, заинтересованным в том чтобы о нём узнавали именно те, кому этот продукт реально нужен, и никак не заинтересованный в назойливых показах всем подряд. А в назойливую хрень из всех щелей эту информацию превращает уже рекламщик, который как раз получает эти деньги за клики! Т.е. кликая на то что не интересно вы как раз способствуете получению денег теми, кто и проявляет эту назойливость :))
Конечно есть надежда что заказчики, после очередного слива бюджета, наконец поймут бесполезность обращения к этим злобным назойливым "продвигателям". Но тут возникает вопрос - а где им взять честных не назойливых рекламщиков, которые будет доносить информацию адресно? И как этим честным неназойливым рекламщикам понять кому же реально нужно донести эту информацию, когда протестующие против злодеев идут на принцип и также злобно ломают любую систему сбора статистики?
Согласен что с современным назойливым беспределом надо бороться, но блин не так это оказывается просто сделать. В том что полезные бизнесы загибаются потому что просто не смогли донести полезную информацию до заинтересованных в ней людей тоже нет ничего хорошего.
И да, лично мне нравится когда в рекламе вдруг неназойливо всплывает дополнительная информация по теме, которую я искал пару дней назад. Ещё мне нравится когда браузер предлагает мне в ленте подборку статей (с того же самого хабра) в соответствии с моим кругом интересов, который он определил "шпионя" за моими запросами и кликами.
Да, но поверенный инструмент это уже опять эталон вида "кусок железа", от которого и хотели уйти к абстрактному объективному явлению/процессу, легко воспроизводимому где угодно и кем угодно :))
Маятник пожалуй будет наиболее близок к реализации этой идеи, но увы только близок.
Один мой препод по физике в Универе любил говорить, что на многие "почему" можно и нужно отвечать "по определению" и добавлять соответствующее определение :)) Пример с маятником Гюйгенса как раз и является таким определением, обосновывающим π²=g, причём без всяких "приблизительно" :))
Другое дело, что дать именно такое определение позволило как раз случайное совпадение исторически сложившихся величин :))
Ещё порадовал лозунг "даёшь по эталону каждому честному торговцу" в сочетании с метром на основе длины меридиана :)) который даже сами разработчики стандарта смогли измерить лишь частично и не точно :)) Интересно, много ли нынешних честных торговцев носят в кармане устройства, позволяющие получать точные метры и секунды на основе их современных определений :)) И есть ли вообще таковые устройства в компактном исполнении и не вносящие дополнительных конструктивных погрешностей (тепловых и т.п.) в эталонный световой процесс :))
1) VS 2022 уже шибко умная и сама предкомпилирует всё подряд. Соответственно необходимость как то специально настраивать stdafx отпала. Думаю поэтому теперь это и отключено по умолчанию в новых проектах. Я не смог заметить выигрыша от его включения. (Статья написана в 2014г и тогда настройка stdafx имела смысл).
2) На скорость компиляции сильно влияет закольцованное взаимное включение заголовочных файлов (как раз с ним то, как выяснилось, я и боролся). Скорость компиляции может замедлиться, а размер предкомпилированных файлов увеличиться в несколько раз (у меня было в 4-5 раз). - эту закольцованность сложно заметить - глаз легко замыливается; - VS никак не предупреждает о такой закольцованности, (могут быть глюки с тем что компилятор не увидит некоторые объявления, а могут и не быть - всё компилируется без ошибок - просто медленно, а суммарный размер .ipch файлов переваливает за Гигабайт в небольшом проекте); - ни #pragma once, ни настройка stdafx не решают проблему медленной компиляции при закольцованности; - хороший признак, что надо тщательнее искать закольцованность в .h файлах - операция "Перестроить проект" выполняется быстрее, чем "Собрать".
Разобрался. Просто я сразу не понял как редактировать Создать (/Yc) / Использовать (/Yu) для отдельного файла, а не для проекта целиком. После того как нашёл, всё заработало по инструкции из статьи.
Я так и не понял самого главного. Раз есть опции Создать (/Yc) и Использовать (/Yu) то логично сначала создать (а при изменениях в stdafx.h создать заново), а потом использовать. Или я чего-то не так понимаю?
У меня MSVC 2022 в настройках: Предварительно откомпилированный заголовок | Создать (/Yc) Предварительно скомпилированный заголовочный файл | stdafx.h Предварительно скомпилированный заголовочный выходной файл | (IntDir)(TargetName).pch Файлы stdafx.h (содержащий стандартные и системные заголовки) и stdafx.cpp (содержащий только #include "stdafx.h") есть. Во всех файлах проекта первой строчкой включено #include "stdafx.h" Всё компилируется, но что-то у меня большие сомнения в том что ускорение компиляции срабатывает...
Изменяю в настройках студии: Создать (/Yc) на Использовать (/Yu) - по моей логике тут то и должно подключиться ускорение, но вместо него получаю ошибку: Ошибка C1854 нельзя перезаписать данные, сформированные во время создания предкомпилированного заголовка в объектном файле: D:\VS_2022_prj\MyWinTemplate_002\tmp\x64\Release\stdafx.obj MyWinTemplate_002 D:\VS_2022_prj\MyWinTemplate_002\MyWinTemplate_002\stdafx.cpp 1
Исключаю из проекта stdafx.cpp, выбираю Создать (/Yc), затем "пересобрать решение". После этого подключаю обратно stdafx.cpp и выбираю Использовать (/Yu).Теперь всё компилируется и вроде бы как есть ускорение.
Но создавать предкомпилированный заголовок таким танцем с бубном как то странно.
Наиболее известный материальный прибор - эквалайзер на LC или RC фильтрах.
Также запросто можно смешать сигналы от реальных LC/RC генераторов и получить реальный сигнал произвольной формы. Это легко увидеть на осциллографе.
Оптический спектрограф реально выдает распределение энергии по спектру и это активно используется для выявления состава и структуры реального вещества.
В общем заголовок провокационный, но сама статья интересная хоть и не соответствует заголовку.
Ещё хочется добавить что интернет поиск чаще всего выдает старые публикации (это и про книги и про статьи). И если у книг хотя бы есть год издания, то в статьях ещё и не всегда понятно сколько ей лет. Начинаешь их изучать и потом вдруг чисто случайно узнаешь что всё это был давно устаревший стиль и больше так делать не стоит, а как именно надо делать сейчас либо фиг найдешь, либо фиг поймёшь, ибо очень мутно изложено. И запросто можешь нарваться на то что "новый современный стиль" - на самом деле всего лишь очередной эксперимент, который не приживется потому что нежизнеспособен.
В общем всё сложно и непонятно как найти выход. Жёсткие рамки жёстко мешают - по сути они всего лишь один из стилей (скорее всего не самый удачный) просто зафиксированный. А свобода прекрасна, но может вызвать хаос.
Joplin с синхронизацией через Яндекс диск. Импорта из Evernote нет, или я не разобрался. Зато осознал что большая часть накопившегося там хламника устарела и можно её там оставить для истории, а того что стоит перенести не так уж и много. Заодно порядок навёл.
В теории деньги придуманы как абстрактный эквивалент пользы, чтобы уйти от натурального обмена одной пользы на другую, типа прямого обмена пшеницы на трактор для её посева и уборки. Но на практике навыки про "приносить пользу" и навыки про "получать деньги" это очень разные навыки, которые прокачиваются разными подходами. Отсюда и куча бардака в этой сфере.
Очень отзывается! На мой взгляд Мастерство крайне важно в коде, претендующем на частое повторное использование. Например, библиотеках базовых функций, фреймворках и т.п. Это фундамент всего остального и когда он выполнен Мастерски, то даже новичкам и "загнанным коням" не всегда удастся его испортить в конечном продукте. А если этот фундамент кривой, то даже тем кто стремиться к Мастерству приходится на его основе лепить франкенштейнов.
Я в детстве изготавливал спутники из медной проволоки и вместе с друзьями запускал их в космос. Для запуска спутник нужно было бросить точно в сторону яркого солнца, тогда он зацеплялся за солнечные лучи и на солнечной энергии улетал на орбиту. Если после запуска спутник удавалось найти, то значит бросок был недостаточно точный и запуск необходимо повторить. Если же найти его не удавалось - значит запуск прошёл в штатном режиме и спутник благополучно достиг орбиты. А однажды, в местах запуска спутников был найден кусок обгоревшей скомканной проволоки, отдалённо напоминающий один из моих давно и успешно улетевших спутников. Это стало надёжным наглядным подтверждением, что мои спутники не только улетают на орбиту, но ещё и иногда успешно оттуда возвращаются в обгоревшем от трения об атмосферу состоянии.
Понравилось ваше структурирование информации!
Начиная с уточнения года прямо в названии! (а то часто находишь в сети такую "современную" заметку, а потом оказывается что ей уже 10 лет).
И то, как информация разложена по полочкам.
Что хотелось бы улучшить:
- на тач-экране пример с "Resize Me" не ресайзится, а в примере CONTAINER QUERIES разделитель перемещается коряво, имхо мобильный интернет сейчас популярен и хочется чтобы примеры это учитывали;
- в примере VIEW TRANSITIONS кнопки "+", "-" маленькие и расположены так что в режиме 1х их не видно даже при скролинге;
- в примере SUBGRID потерялась картинка.
А в остальном статья порадовала - спасибо!
Попался ещё способ сделать "дзиньк" японской бензопиле
std::string hello = "hello";std::wstring message = std::format(L"{}", hello);
Здесь вываливается сразу куча ошибок и все эти ошибки ведут внутрь кишков самого format, вместо того чтобы сообщить о том что format не умеет смешивать
stringcwstringи указать на место где я это попытался смешать.Во всяком случае в MSVC 2022 так, в других компиляторах не проверял.
А можете пояснить как совместить StringTable с модульностью?
Если выносить всё строки в ресурсы то становится недостаточно включить/исключить заголовочный файл, надо ещё где то хранить список строк этого модуля и добавлять/удалять их в ресурсах.
PS: это не возражение - реально пробую осилить StringTable.
Недавно экспериментировал с precompiled headers в MSVC 2022 и пришёл к выводу что не зря их теперь там по умолчанию отключили. Сейчас студия предкомпилирует всё подряд и довольно неплохо отслеживает что и когда нужно перекомпилировать, а что нет. Ускорения от включения precompiled headers не заметил.
Заметил сильное замедление от закольцованных взаимных ссылок в заголовочных файлах. Оно иногда проявляется логическими ошибками, но не всегда. Зато явно увеличивает время компиляции и размер ipch файлов.
О - мотивация - понимание почему я что-то готов радостно делать, а от чего-то убегаю - очень интересная тема. Сильно зависит от индивидуальных, нередко противоречивых заморочек.
Из экспериментов над собой я выяснил интересное противоречие - мне в спорте важна хорошая компания, наедине с собой мотивация на спорт у меня очень слабая, но при этом традиционно командные виды типа футбола, баскетбола, волейбола меня не радуют.
В итоге выбрал акробатическую йогу (акройогу) и уже десять лет как радостно ей занимаюсь.
Если сравнивать с качалкой, то в акройоге вместо грузов, брусьев и т.п. используются люди партнёры - это весело. Поэтому с железом качаться у меня не получается, а с людьми кайфую.
Да красивая рекурсия получается :))
Эталонные метры по определению измеряются через эталонные секунды с помощью маятника, а эталонные секунды с помощью того же маятника определяются через эталонную длину маятника...
Только почему то мне кажется, что это так не работает :))
Правильный "карманный" эталон может быть технически сложным устройством, главное чтобы:
- внутри был кусочек Цезия-133 используемый в таймере для измерения скорости света;
- технические (в т.ч. самые коварные - температурные) погрешности самого устройства были минимальны - при цифровом (не аналоговом) исполнении думаю что это вполне реально;
- устройство было достаточно компактным, пусть даже не карманным, а хотя бы "чемоданным", главное чтобы не размером с лабораторию или с институт метрологии;
- легко тиражируемым на современном технологическом уровне, т.е. оно вполне может быть соизмеримым по сложности с микропроцессором или жёстким диском - это не страшно. В конце концов сочетание "глаз + нервная система + мозг" с помощью которого мы смотрим на метровую линейку тоже писец какая сложная система, но при этом она всегда с собой даже без карманов :))
Получается им бы могло стать нечто похожее на современный карманный лазерный дальномер, с внутренним таймером стабилизированным Цезием-133. И тогда поверки в аж целых институтах метрологии станут наконец неактуальными :))
Только есть нюанс - заплатит за этот клик заказчик рекламы, который запросто может оказаться честным производителем полезного продукта, заинтересованным в том чтобы о нём узнавали именно те, кому этот продукт реально нужен, и никак не заинтересованный в назойливых показах всем подряд.
А в назойливую хрень из всех щелей эту информацию превращает уже рекламщик, который как раз получает эти деньги за клики!
Т.е. кликая на то что не интересно вы как раз способствуете получению денег теми, кто и проявляет эту назойливость :))
Конечно есть надежда что заказчики, после очередного слива бюджета, наконец поймут бесполезность обращения к этим злобным назойливым "продвигателям". Но тут возникает вопрос - а где им взять честных не назойливых рекламщиков, которые будет доносить информацию адресно?
И как этим честным неназойливым рекламщикам понять кому же реально нужно донести эту информацию, когда протестующие против злодеев идут на принцип и также злобно ломают любую систему сбора статистики?
Согласен что с современным назойливым беспределом надо бороться, но блин не так это оказывается просто сделать. В том что полезные бизнесы загибаются потому что просто не смогли донести полезную информацию до заинтересованных в ней людей тоже нет ничего хорошего.
И да, лично мне нравится когда в рекламе вдруг неназойливо всплывает дополнительная информация по теме, которую я искал пару дней назад. Ещё мне нравится когда браузер предлагает мне в ленте подборку статей (с того же самого хабра) в соответствии с моим кругом интересов, который он определил "шпионя" за моими запросами и кликами.
Да, но поверенный инструмент это уже опять эталон вида "кусок железа", от которого и хотели уйти к абстрактному объективному явлению/процессу, легко воспроизводимому где угодно и кем угодно :))
Маятник пожалуй будет наиболее близок к реализации этой идеи, но увы только близок.
Один мой препод по физике в Универе любил говорить, что на многие "почему" можно и нужно отвечать "по определению" и добавлять соответствующее определение :))
Пример с маятником Гюйгенса как раз и является таким определением, обосновывающим π²=g, причём без всяких "приблизительно" :))
Другое дело, что дать именно такое определение позволило как раз случайное совпадение исторически сложившихся величин :))
Ещё порадовал лозунг "даёшь по эталону каждому честному торговцу" в сочетании с метром на основе длины меридиана :)) который даже сами разработчики стандарта смогли измерить лишь частично и не точно :))
Интересно, много ли нынешних честных торговцев носят в кармане устройства, позволяющие получать точные метры и секунды на основе их современных определений :)) И есть ли вообще таковые устройства в компактном исполнении и не вносящие дополнительных конструктивных погрешностей (тепловых и т.п.) в эталонный световой процесс :))
Итоги моих экспериментов с предкомпиляцией:
1) VS 2022 уже шибко умная и сама предкомпилирует всё подряд. Соответственно необходимость как то специально настраивать stdafx отпала. Думаю поэтому теперь это и отключено по умолчанию в новых проектах. Я не смог заметить выигрыша от его включения. (Статья написана в 2014г и тогда настройка stdafx имела смысл).
2) На скорость компиляции сильно влияет закольцованное взаимное включение заголовочных файлов (как раз с ним то, как выяснилось, я и боролся). Скорость компиляции может замедлиться, а размер предкомпилированных файлов увеличиться в несколько раз (у меня было в 4-5 раз).
- эту закольцованность сложно заметить - глаз легко замыливается;
- VS никак не предупреждает о такой закольцованности, (могут быть глюки с тем что компилятор не увидит некоторые объявления, а могут и не быть - всё компилируется без ошибок - просто медленно, а суммарный размер .ipch файлов переваливает за Гигабайт в небольшом проекте);
- ни #pragma once, ни настройка stdafx не решают проблему медленной компиляции при закольцованности;
- хороший признак, что надо тщательнее искать закольцованность в .h файлах - операция "Перестроить проект" выполняется быстрее, чем "Собрать".
Подскажите можно ли (и если да, то как) использовать умные указатели с Direct2D?
Пример кода без умных указателей:
Разобрался.
Просто я сразу не понял как редактировать Создать (/Yc) / Использовать (/Yu) для отдельного файла, а не для проекта целиком.
После того как нашёл, всё заработало по инструкции из статьи.
Я так и не понял самого главного.
Раз есть опции Создать (/Yc) и Использовать (/Yu) то логично сначала создать (а при изменениях в stdafx.h создать заново), а потом использовать.
Или я чего-то не так понимаю?
У меня MSVC 2022 в настройках:
Предварительно откомпилированный заголовок | Создать (/Yc)
Предварительно скомпилированный заголовочный файл | stdafx.h
Предварительно скомпилированный заголовочный выходной файл | (IntDir)(TargetName).pch
Файлы stdafx.h (содержащий стандартные и системные заголовки) и stdafx.cpp (содержащий только #include "stdafx.h") есть. Во всех файлах проекта первой строчкой включено #include "stdafx.h"
Всё компилируется, но что-то у меня большие сомнения в том что ускорение компиляции срабатывает...
Изменяю в настройках студии: Создать (/Yc) на Использовать (/Yu) - по моей логике тут то и должно подключиться ускорение, но вместо него получаю ошибку:
Ошибка C1854 нельзя перезаписать данные, сформированные во время создания предкомпилированного заголовка в объектном файле: D:\VS_2022_prj\MyWinTemplate_002\tmp\x64\Release\stdafx.obj MyWinTemplate_002 D:\VS_2022_prj\MyWinTemplate_002\MyWinTemplate_002\stdafx.cpp 1
Исключаю из проекта stdafx.cpp, выбираю Создать (/Yc), затем "пересобрать решение". После этого подключаю обратно stdafx.cpp и выбираю Использовать (/Yu).Теперь всё компилируется и вроде бы как есть ускорение.
Но создавать предкомпилированный заголовок таким танцем с бубном как то странно.
Очень даже существует.
Наиболее известный материальный прибор - эквалайзер на LC или RC фильтрах.
Также запросто можно смешать сигналы от реальных LC/RC генераторов и получить реальный сигнал произвольной формы. Это легко увидеть на осциллографе.
Оптический спектрограф реально выдает распределение энергии по спектру и это активно используется для выявления состава и структуры реального вещества.
В общем заголовок провокационный, но сама статья интересная хоть и не соответствует заголовку.
Ещё хочется добавить что интернет поиск чаще всего выдает старые публикации (это и про книги и про статьи). И если у книг хотя бы есть год издания, то в статьях ещё и не всегда понятно сколько ей лет. Начинаешь их изучать и потом вдруг чисто случайно узнаешь что всё это был давно устаревший стиль и больше так делать не стоит, а как именно надо делать сейчас либо фиг найдешь, либо фиг поймёшь, ибо очень мутно изложено. И запросто можешь нарваться на то что "новый современный стиль" - на самом деле всего лишь очередной эксперимент, который не приживется потому что нежизнеспособен.
В общем всё сложно и непонятно как найти выход. Жёсткие рамки жёстко мешают - по сути они всего лишь один из стилей (скорее всего не самый удачный) просто зафиксированный. А свобода прекрасна, но может вызвать хаос.
Joplin с синхронизацией через Яндекс диск. Импорта из Evernote нет, или я не разобрался. Зато осознал что большая часть накопившегося там хламника устарела и можно её там оставить для истории, а того что стоит перенести не так уж и много. Заодно порядок навёл.
В теории деньги придуманы как абстрактный эквивалент пользы, чтобы уйти от натурального обмена одной пользы на другую, типа прямого обмена пшеницы на трактор для её посева и уборки.
Но на практике навыки про "приносить пользу" и навыки про "получать деньги" это очень разные навыки, которые прокачиваются разными подходами. Отсюда и куча бардака в этой сфере.
Очень отзывается!
На мой взгляд Мастерство крайне важно в коде, претендующем на частое повторное использование. Например, библиотеках базовых функций, фреймворках и т.п. Это фундамент всего остального и когда он выполнен Мастерски, то даже новичкам и "загнанным коням" не всегда удастся его испортить в конечном продукте. А если этот фундамент кривой, то даже тем кто стремиться к Мастерству приходится на его основе лепить франкенштейнов.