• Является ли фрилансер, не подающий декларацию о своих заработках налоговым уклонистом?

    Да, является. За сокрытие сумм налогов (за все время) выше определенного предела (то ли 100к, то ли 500к, то ли выше) грозит уголовная ответственность до 5 лет лишения свободы. Все написано в законах, + штраф за незаконное предпринимательство, ибо если вы не подаете деклараций, вы скорее всего физик (предпринимателю такого просто не позволят и очень быстро) со всеми вытекающими.

    Выше написали, что не является, если он платит налоги. Но налоги без налоговой декларации платить невозможно.

    Жить можно, конечно, и при стечении обстоятельств очень долго, но при этом ничего крупного не купить + всегда есть риск спалиться.
    Ответ написан
    1 комментарий
  • Является ли фрилансер, не подающий декларацию о своих заработках налоговым уклонистом?

    Знаю, что если на твое имя в банках будет крутиться сумма более 1500к в год, то тогда тобой точно заинтересуются.

    Но вряд ли простой фрилансер может столько зарабатывать
    Живи спокойно себе
    Ответ написан
    5 комментариев
  • Какой фреймворк/технологию выбрать для web проекта?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Чтобы нанять команду мне нужно понимать на чем лучше писать проект.
    Это неправильная предпосылка. Сначала вам нужно нанять команду/человека, которые вам спланируют грамотную архитектуру исходя из требований. А уже под эту конкретную архитектуру вы будете искать команду.

    Ну или просто сразу выбирать команду, не глядя на то, какие технологии они используют - то, что вы описали, можно реализовать на любом стеке одинаково плохо и одинаково хорошо.

    Желательно искать людей, которые понимают, что такое стартап и MVP, чтобы не оказалось через год, что вы наконец-то зарелизили никому не нужный продукт.

    И экономить на первом шаге (формулировании требований, архитектуры и roadmap'а) нельзя ни в коем случае. Лучше нанять программистов попроще, которые неидеально реализуют грамотно спроектированный прототип, чем несколько месяцев платить "спецам", которые будут работать без вектора. Конечно, может оказаться так, что вам попадётся реально грамотная команда, в которой спецы будут без кавычек, но нанять одного архитектора на проектировку проще и дешевле.

    Иначе, вы выбросите свои деньги в пустоту и не получите никакого результата, кроме набитых шишек и горького опыта.
    Ответ написан
    7 комментариев
  • Какова связь между Бэк-эндом и параллельным программированием?

    @AlexSku
    не буду отвечать из-за модератора
    Есть 4 вида параллельности:
    1) нити (threads). Хотя это многозадачность, т.к. куски нитей прогоняются последовательно через процессор.
    2) несколько ядер (допустим, 4). Бывает, что компилятор вам помогает и сам пропускает нити через разные ядра процессора.
    3) сетевые машины: прогоняйте куски программы (куски данных) на нескольких компьютерах одновременно.
    4) графический процессор (несколько сотен ядер). Тут узкое место - обмен данными между CPU и GPU.
    Вот и читайте про эти возможности.
    Плюс у каждого языка программирования есть свои методы параллельных расчётов.
    Ответ написан
    Комментировать
  • Как правильно парсить сайт для Android приложения?

    littleguga
    @littleguga
    Не стыдно не знать, а стыдно не интересоваться.
    1. Если Ваш сайт, то не надо так делать. Сделайте нормальный API, который будет отдавать json.
    2. Если это не Ваш сайт, то как вариант поискать API того сайта.
    3. Если это не Ваш сайт и API нет, то лучше сделать отдельно свой сервер с API(сервер будет парсить сайт и отдавать в JSON приложению). Почему так? Парсинг на клиенте(особенно мобильном) будет кушать много ресурсов(причем заметно), это снижает заряд батареи, тормозит и много других неприятностей.
    Ответ написан
    Комментировать
  • Дефрагментатор - встроенный или сторонний?

    Foolleren
    @Foolleren
    Компас есть, копать не люблю...
    емнип встроенный дефрагментатор имеет такой алгоритм работы
    1) фрагменты размером более 64 мб не объединяет (действительно а зачем? для кусков 64+ мб скорость чтения уже линейная)
    2)оставляет свободные места после файлов некоторых расширений - запас на увеличение размера
    3)при необходимости дефрагментировать отдельный файл - если он есть в списке служб префеч и суперфетч складывает их ближе к началу если нет ближе к концу оставляя середину диска свободной для записи
    как результат работает быстро результат твёрдая четвёрка
    остальные дефрагментаторы работают таким образом что процесс дефрагментации занимает больше времени
    при этом зачастую после них диск начинает фрагментироваться быстрее ( забывают оставить место для расширения),
    а вообще надо правильно пользоваться корзиной удалять сожержимое только при нехватке места и перед дефрагментацией тогда не будет "дыр" в которые можно записать файл, и держать свободным 20% диска - тогда у ос будет место где выделить место под файл целиком, как результат дефрагментация проходит со скоростью близкой к линейному чтению и заключается в освобождении свободного пространства в центре диска.
    Ответ написан
    Комментировать
  • Путь программиста.Стоит ли?

    Andrey_Pletenev
    @Andrey_Pletenev
    Pletenev.com
    Есть 2 способа получения образования:
    1) Методом push - это когда в тебя запихивают, хотя оно не лезет и ты сопротивляешься. Этот подход используют все формальные структуры образования школы, училища, вузы.
    2) Методом pull - это когда ты сам с жадностью ищешь и изучаешь то, что тебе действительно интересно и нужно.
    Судя по "Образование в школе не очень", "пытаться" и "бал", история "в хороший вуз на бюджет" - кончится обычным "куда угодно лишь бы диплом" или "клянчить деньги с родителей" на платное. Поскольку ты этого не хочешь - рекомендую тебе опцию 2.
    Ответ написан
    Комментировать
  • Как автоматизировать наложение текста на рандомное изображение?

    dima11221122
    @dima11221122
    Разработчик программного обеспечения
    Посмотри в сторону ImageMagick
    Ответ написан
    Комментировать
  • Путь программиста.Стоит ли?

    machine_messiah
    @machine_messiah
    http://CodeFlex.co
    Умные люди вузы не заканчивают

    Ответ написан
    Комментировать
  • Путь программиста.Стоит ли?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Не важен путь, который выберете вы. Важно то, как вы его пройдете.
    Самообразование - ключ к любой профессии. Никто и никогда вас не станет ничему учить. Забудьте об этом, все только сами.
    Как, по-вашему люди из самых запдрыпанных мест становятся великими? Трудом.
    Учитесь тому, что интересно. Хотите GameDev? Без проблем. Сейчас осень, впереди зима и весна. Садитесь за Java или Swift. Напишите к лету приложение и разместите его в магазине. Будет настоящий незаменимый опыт. Потом еще и еще. Не сразу, но начнете на этом зарабатывать. Было бы желание, остальное приложится.
    И к экзаменам тоже можно подготовиться. И сдать их на отлично самому. Не смотрите на ленивцев вокруг. Они вас кормить не станут. Они так и дальше будут сосать пиво из бутылочки и сидеть на шее у родителей до последнего.
    Или вы тоже хотите пойти на стройку, чтобы зарабатывать на пиво? Тогда вперед.
    Ответ написан
    Комментировать
  • Действительно ли важно правильное питание для мозга программиста (с точки зрения науки)?

    DmitryITWorksMakarov
    @DmitryITWorksMakarov
    По своему опыту скажу: вот когда на каком-нибудь мероприятии выпьешь так от души (не один бокал красного, а побольше), дня 3-4 нормально не соображается. Я могу кодить. Но придумывать красивые абстракции и писать отличный код, вряд ли. Мозг функционирует на каком-то самом верхнем уровне.
    Также заметил, что если не принимаю витамины, то все время хочется спать. Весь день сонный. Домой приходишь, поужинал и вырубился. Никаких домашних дел, личной жизни, хобби. С витаминами сил как-то больше. Витамины - обычный Компливит.

    По поводу других людей. Люди же разные. У кого-то изначально здоровья побольше, у кого-то соображаловки, у кого-то мозги по другому устроены и конкретно в этой задаче они могут даже в состоянии жёсткого похмелья решать вопросы, которые для других запредельно сложны, у кого-то учителя были отличные и они уже сейчас умеют делать то, до чего ты дойдешь лет через 5...7 своей головой и руками.
    Но это все не значит, что они через десять лет будут также продуктивны, что они будут способны угнаться за прогрессом, который в нашей области деятельности более чем стремителен.

    А вообще в таких вопросах нет четкого конкретного ответа: если будешь бухать Золушка, то ровно в 12 часов твоя голова превратится в тыкву. Тут правильнее говорить о корреляции. Чем менее правильный образ жизни ведешь, тем больше вероятности ты получишь проблемы и тем раньше.
    Ответ написан
    4 комментария
  • Какие Вы знаете источники знаний о PHP?

    @RadialAdmin
    myblaze.ru/php_lessons

    Но лучше взять неспешный проект и по php.net/manual/ru его сделать бесплатно людям. И им польза будет и вы научитесь "по ходу дела"
    Ответ написан
    3 комментария
  • Куда подать идею сайта для совместной разработки?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Как гласит старая американская поговорка:
    1$ тому кто придумал
    10$ тому кто сделал
    100$ тому кто продал
    Ответ написан
    3 комментария
  • Android: Qt vs Java. Что лучше использовать?

    @dplsoft
    Посмею оспорить ход рассуждений lorus ( Android: Qt vs Java. Что лучше использовать? ).
    Итог у нас почти один, но как в математике - когда ход рассуждений ошибочен - даже если ответ верен - то задача не решена. Возможно во много субъективно, но выскажусь, на правах личного мнения человека, который любит и писал и на Qt, и на Android с его "родным" Java тоже.
    На Qt для Android не писал, потому что на момент начала последнего проекта технология была сырая.

    И так: Не агитка за Qt но несколько слов в защиту Qt.

    Забегая вперед скажу: топикстартеру - если есть небольшой опыт разработки под Андроид, вы не работали ранее с Qt, и вам не важна переносимость исходного кода между всем и вся - продолжайте осваивать Android SDK ( Java ) .
    По крайней мере, сейчас.
    Хорошее знание хотя бы одного инструмента, лучше чем посредственное знание двух. ;)
    C Qt под Андроид потом разберетесь. Да и "пообкатаннее" оно будет.


    1. Qt - это всё-таки C++. Разрабатывать на нём существенно сложнее, чем на Java. То есть дольше и с большим количеством ошибок.

    Надо отличать "просто С++" и С++\Qt. В первую очередь, Qt - это фактически диалект языка С++. Например в объявлении Qt-класса появляются дополнительные секции signal и slots, а в процессе сборки существует фаза мета-компиляции, которая делает C++ код под вашу платформу. Не удивлюсь, если для андроида генерируется сместь Java и C++ кода которая потом скармливается Android NDK.

    Во вторых, Qt - это _самодостаточный_ фреймворк. Никаких STL или "чего-что-ещё что представляют себе в комплекте с C++" типичные сторонние разработчики.
    Многих проблем, которые приводят к сложности разработки "на простом C++" в "С++\Qt" просто нет "by design".

    Например в Qt заложен замечательный механизм предотвращения от выхватывания "null-poiunter" - "сигнал-слоты". Это в разы упрощает и делает надежнее работу как с GUI, так и с например, объектами, работающими в разных потоках. В Qt это все сделать разы проще, чем городить аналогичные стандартные механизмы на Java. Я не говорю в итоге оно будет эффективнее - тут надо выяснять и можно поспорить - но вот то, что в Qt многие вопросы работы с потоками и межпоточным взаимодействием продуманы лучше а механизмы удобнее - на мой вгляд это факт.
    (Хотя вот такого классного механизма аки runnable, в Qt нет. Но ждем 11-го стандарта С++.)

    В третьих - "С++\Qt" - это хорошо продуманный фреймворк едва-ли не с лучшим дизайном классов, продуманными методлами, единым стилем решения проблем.

    Как человек писавший на Qt 4.0-4.6 и сейчас закончивший первывый коммерческий проект для Android - могу выставить в сторону Java много минусов (в сравнении с Qt4/Qt5.) Просто потому, что Java - как в первую очередь коммерческая технология, был вынужден набирать нелогичности ради совместимости с предыдущими версиями - едва-ли не из первых версий Java. Посомтрите вопросы к сертификации - много вопросов, которые когда начинаешь разбирать "почему так" - уходят корнями в далекое темное прошлое развития Java. И в итоге - современная Java - это часто нелогичное, лоскутное одеяло, где в разных классах для решения одной и той-же задачи применяется если не разный подход и стиль, то как минимум разные имена методов. Ну вот зачем это?)))

    Да Java детально описан, и в технически прогнозируем - но его надо зубрить, тупо зубрить все исключения и проблемы наследования логики первых версий, и зубрить где используется put(), а где add()....
    ... а Qt-можно _понять_ и не зубрить, понять и только изредка заглядывать в документацию. И в итоге писать на нем - легче.

    К слову: дизайн классов гуглековских классов - хотя и очень-очень-оченьсвоеобразен и местами диковенен, но он, имхо, достаточно "строен" и в общей совокупности, не страдает такой уж сильной лоскутностью логики, какая имеется в стандартных классах Java. С какого-то момента ты понимаешь "как думали в гугле" и все становится несколько проще.

    Ещё к слову про миф "на Java писать проще чем на C++"(если сравнивается Java под DalvikVM и C++\Qt5):
    Не забывайте - DalvikVM - это вам не JavaVM.
    В DalvikVM вы легко отхватите "null-pointer-exception" если вы вдруг наивно думаете, что коли у вас есть в локальной переменной ссылка на фрагмент, активити или вью - то машина не уничтожит объект "когда ей вздумается", а у вас ваша переменная не об-null-ится.

    На понимание того, какие привычки десктопного написания и дизайна приложений нельзя переносить во фреймворки Android SDK и на перестройку собственного мышления - у вас уйдет несколько месяцев. А вы _начнете_ это понимать и отхватывать такие проблемы - как только начнете писать что-то бОольшее, чем набор разрозненных активити да пары фрагментов из учебных курсов.
    И в итоге - первый ваш серьезный проект на Андроиде - может влететь вам в хорошие переработки.
    Например, в том числе и потому что нет в Android SDK v17 жизненного цикла для класса Application. Нет механизмов для созранения состояния singleton-окружения и тд.и тп.

    А когда вы пишете на Qt - у вас гарантирована поддержка единых механизмов для всех платформ.
    Вам не надо перекраивать мозг, выработанные решения и отлаженные и проверенные паттерны.
    В итоге - писать на Qt - может статься и будет быстрее. В ряде случаев.
    Но из Qt - может быть сложно поиметь доступ к сугубо-андроидным сервисам типа поставщика данных.

    В общем я к чему. нет тут однозначного ответа что лучше а что хуже.
    Каждый инструмент достаточно мощный и у него много плюсов, минусов, и особенностей.

    2. Инструментарий разработки для C++ однозначно хуже такового для Java в силу, опять-таки, особенностей языка.

    Простите, но тоже малообоснованное утверждение. См пункт 1.

    Кроме того, отмечу:
    Qt-шный инструментарий позволяет вам получать одинаковое поведение на всех поддерживаемых платформах. Включая поведение GUI, Форм и одинаковую для всех систем архитектуру приложения. В идеале - с Qt - вы можете писать под Андроид так, как будто вы пишете под десктоп - не меняя архитектуру и структуру приложения.

    А когда вы пишете под Android на Java - вы всегда пишете кусок кода работающий в колнтексте DalvikVM и должны жить по предусмотренным данной машиной паттернам и сценариям, причем многие аспекты того "как это работает" - явно мало где прописаны. И если вдруг вы отсутпаете от стандартных шаблонов фреймворка Dalvik-машины - вы рискуете отгрести непонятные, трудно отловимые косяки, причем _вне_ вашего контроля, которые вы не можете корректно перехватить и обработать. Кто не знает - попробуйте уничтожить ViewGroup, id которого вы использовали как контейнер для размещения внутри него фрагмента. Как только вы делаете FragmentTransaction.commit() - вы ставите машине задачу, которую она будет выполнять "когда-то позже", вне вашего контроля, и не соизволит позволить вам корректно обработать исключение. Вплоть до возникновения ситуации, когда фрагмент пытается быть добавленным в Activity который уже отработал стандартные процедуры по Activity.finush(). Ладно бы оно выкинуло код ошибки куда, и тихо проигнорило - но это же Java - она выкинет исключение. А обернуть это дело в try...catch - вы не сможете - это не ваш кусок кода. Максимум что вы сможете - это "поймать перед смертью" Thread.UncaughtExceptionHandler. И все.
    (если я не прав - поправляйте меня, я же тоже не инженер гугля)

    3. Java - родная платформа для Android. Отсюда потенциальные проблемы с совместимостью у Qt.

    Вот зачем вы занимаетесь запугиванием?
    Android NDK (для разработки на С++) такой же родной как как и Android SDK (для разработки на Java).

    И с совместимостью у Qt с платформой Android проблем не больше, чем у любого другого приложения, которое использует вставки C++ кода и разработано с использованием стандартного Android NDK.

    --------------------------------------------
    Резюмируя: автору надо просто взвесить что зачем и как он собирается использовать.
    Если автору нужно одинаковое поведение на различных платформах - включая огрызочные поделия, Linux, разные Windows RT недопланшеты - то выбор ознозначен - курите Qt. Это возхитительнейший, ясный, хорошо продуманный и максимально логичный фреймворк, который не побоялись пересоздать с нуля ради устранения накопленных сложностей (вспоминайте переход с Qt3 на Qt4) Лично я приходил в восторг, когда работал с ним (2005-2009 гг)

    Но - в части Андроидного приклада : подозреваю, могут быть "технические риски" с использованием каких-либо особых "мобильных кусков" типа "работа со звонками, "работа с контактами", "работа с почтой" или "поставщиками контента", и пр.
    Я отошел от мира Qt когда Qt был 4.8 и я не искал там классы которые этим занимаются. Думаю что-то потомки троллей должны были создать в 5.2, но лучше проверить.
    В крайнем случае - может потребоваться стыковка с джава-объектами, и тут вам потребуется изучать Android NDK, и возможно даже писать немного оберточного кода на Java.

    Если же вам _нужна_ обязательная работа с описанными выше функциями, а на переносимость исполняемого кода - наплевать, или же у вас _уже_ есть опыт разработки с Android SDK - то конечно писать лучше на Java.

    Но в этом случае бутьте готовы к тому, что это не JavaVM, и сохранности ссылок _для_ряда_классов_ вам никто не обещает, а т.к. Java не предполагает наличия деструктора - вы _будете_ иметь определенные архитектурные сложности при построении сложных приложений.
    Например то, что в десктоп-приложении вы решили бы "простым" "синглтон-объектом" с простой функциональностью типа записал-прочитал из файла - тут вам _придется_ решать путем построения "поставщика контента" и т.п. - что значительно повышает "порог входа" для тех кто погруждается в разработку для Android.

    Но - надо отдать должное инженерам гугля - у них _были_ весомые основания поступать итак, и они максимально вас обезопасили от попадания в многие проблемы - если, конечно, вы используете фреймворк именно так, как это предполагается. И сделали многие механизмы достаточно элегантными, и приятными в использовании. Дизайн гуглековских классов мне в большей части нравится. В общем не забывайте понимать почему в примерах делается именно так как делается, а не иначе.
    Ответ написан
    5 комментариев
  • Закон Деметры. Нужен ли?

    NightTiger
    @NightTiger
    Попробую и я ответить. Закон применять надо всегда, если есть возможность его применить.

    Немного лирики: та тонна бизнес-кода 20-30 разработчиков, которая прошла через меня позволила познать тот самый дзен Clean Code, не могу сказать, что у нас все везде хорошо, но за последние несколько лет мы так улучшили его общее состояние, что с ним становится приятно работать — и это передается от разработчика к разработчику, вселяя уверенность, понимание и осознание каждого участка кода.

    При чем здесь правило Деметры? Оно и дает эти возможности. Как вы думаете, почему так популярен IoC и DIC Symfony2 на его основе? Своей популярностью он как раз обязан тем, что использует неявно правило Деметры для всех создаваемых сервисов: каждый сервис в контейнере получает только свои зависимости и не лезет через них к другим, более того, сам контейнер зависимостей — отражение правила Деметры, потому что он пользуется исключительно своими методами для создания инстансов сервисов, обращению к параметрам.

    Идем дальше, слои приложения. Если кто не знает — учите мат.часть. Но если кратко, то слой данных не должен содержать бизнес-логики и взаимодействует с уровнем сервисов. Уровень сервисов содержит необходимую логику и предоставляет API наружу для контроллеров, веб-сервисов и других, но не отвечает за поддержку различных форматов запросов/ответов. Уровень контроллеров позволяет распаковывать запросы/упаковывать ответы, работая только с уровнем сервисов, не делая никаких предположений об источнике данных. Где здесь правило Деметры? Ответ очевиден: везде. Если мы соблюдаем это правило, то мы можем независимо менять реализацию кажого из слоев, не волнуясь о том, что сломается что-то в слое, который мы не трогаем сейчас.

    Следующий пункт: уровень детализации участка кода. Если вы проводили ревью кода, то как часто вам приходилось думать о том, что делает конкретный участок кода с этой цепью вызовов внутри? Есть простой факт, что мы можем держать в голове эффективно около 7 объектов, когда идет ревью кода, то каждый уровень цепочки обязует загрузить себе в память лишний класс, потому что только так вы поймете что происходит в конечном счете. Проведем легкую арифметику: если у нас есть класс, он же сервис, в который инжектятся три других сервиса, то у нас пока в памяти 4 сущности, которые мы легко понимаем. Дальше идет вызов метода с аргументами, если этот метод принимает три параметра и работает только с прямыми зависимостями на один уровень, то все хорошо: 7 объектов, но все еще понятно, как оно работает. Но как только начинаются запросы вида $this->service->createResult($request)->translate($mapping); приходится материться, так как такой код не помещается со всеми зависимостями в наше ОЗУ — мозг эффективно. Отсюда вывод — каждый участок кода отвечает за свой уровень детализации, позволяя более низким сервисам раскрывать детали. Если мне понадобятся детали — я дойду до них, но они не должны мне мешать понимать текущий код уровнем выше, а для этого надо вызывать только свои соседей, делегируя детали все ниже и ниже.

    Надеюсь, мои мысли подтолкнут вас к добрым намерениями )
    Ответ написан
    2 комментария
  • Закон Деметры. Нужен ли?

    @StepEv
    А ваш пример закон не нарушает.

    В $user->getPosts()->getLast()->getComments(); каждый объект обращается только к одному знакомому ему объекту:

    posts = user.getPosts();
    lastPost = posts.getLast();
    comments = lastPost.getComments();

    Так что не переживайте, всё в порядке. Выше понаписали какой-то ереси, честно говоря.

    Нарушением было бы что-то типа $user.posts.last->getComments();

    Здесь получается что user знает о том, как устроен posts, а это не хорошо.

    Вообще-то по вашей же ссылке на википедии это всё хорошо расписано, даже с примерами.
    Ответ написан
  • Закон Деметры. Нужен ли?

    everzet
    @everzet
    Допустим вы хотите купить молоко:

    дом->лестница->машина_Opel->магазин->кассир_Люба->купить_молоко();

    Так как вы уважающий себя software developer который не видит смысла в законе Деметры, вы это скорее всего напишете в 10 разных местах системы.

    2 недели назад вы продали свой Opel и купили BMW. Вы теперь должны в 10 разных местах поменять код на:

    дом->лестница->машина_BMW->магазин->кассир_Люба->купить_молоко();

    Теперь, допустим вы начали переживать об экологии и хотите ездить за молоком не на машине, а на велосипеде. Вы теперь должны в 10 разных местах поменять код на:

    дом->лестница->велосипед->магазин->кассир_Люба->купить_молоко();

    Через пару дней Любу уволили и на работу взяли нового кассира Клаву? Меняем в 10 разных местах код на:

    дом->лестница->велосипед->магазин->кассир_Клава->купить_молоко();

    Через другую пару дней в вашем доме поставили лифт и вы не хотите бегать по лестнице за молоком? Меняем в 10 разных местах код на:

    дом->лифт->велосипед->магазин->кассир_Клава->купить_молоко();

    Мораль: этих всех замен можно мыло бы избежать, если бы для покупки молока вы использовали абстракцию:

    магазин->купить_молоко();
    Ответ написан
    8 комментариев
  • Задачи на Java

    javenue
    @javenue
    Вот еще хороший сервис — acm.timus.ru/authedit.aspx
    После решения нескольких десятков задач на Тимусе многие задачи из реальных проектов кажутся просто смешными.
    Ответ написан
    Комментировать