<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Savichhh</title><author><name>Savichhh</name></author><id>https://teletype.in/atom/it_guru</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/it_guru?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/it_guru?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-29T16:45:54.917Z</updated><entry><id>it_guru:yhzyUj7AeDZ</id><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru/yhzyUj7AeDZ?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><title>Как составить резюме IT-специалисту, которое точно запомнится</title><published>2023-06-04T13:47:36.144Z</published><updated>2023-06-04T13:47:36.144Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/4d/c3/4dc3982f-5915-46b0-823a-31fa3b18aa6d.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/76f1703b-458f-4a9f-b3c7-62bd0f29adb3.jpg&quot;&gt;Резюме помогает составить первое впечатление тем, кто нанимает вас как специалиста. Рекрутеры и HR просматривают сотни анкет, поэтому хорошее резюме — залог того, что кандидата заметят и предложат работу.</summary><content type="html">
  &lt;figure id=&quot;PUcg&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/76f1703b-458f-4a9f-b3c7-62bd0f29adb3.jpg&quot; width=&quot;890&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Fhl7&quot;&gt;Резюме помогает составить первое впечатление тем, кто нанимает вас как специалиста. Рекрутеры и HR просматривают сотни анкет, поэтому хорошее резюме — залог того, что кандидата заметят и предложат работу.&lt;/p&gt;
  &lt;p id=&quot;Cu0z&quot;&gt;В статье рассмотрим, как составить резюме, что стоит выделить, а на чем не заострять внимание. Еще вы узнаете о видеорезюме как оригинальном способе рассказать о себе.&lt;/p&gt;
  &lt;h2 id=&quot;HDBf&quot;&gt;Основные правила хорошего резюме в IT&lt;/h2&gt;
  &lt;p id=&quot;RUf6&quot;&gt;Резюме — это краткая информация о специалисте. Оно должно быть емким и отражать ваши умения и опыт.&lt;/p&gt;
  &lt;p id=&quot;GOxI&quot;&gt;На что работодатель смотрит в первую очередь:&lt;/p&gt;
  &lt;ul id=&quot;moCE&quot;&gt;
    &lt;li id=&quot;C8Rc&quot;&gt;Компании, с которыми вы сотрудничали. Важно раскрыть, чем вы занимались и какие задачи решали. Простого упоминания крупных и известных компаний недостаточно.&lt;/li&gt;
    &lt;li id=&quot;lMhM&quot;&gt;Перечень навыков и умений. Укажите, какими программами вы владеете и на каком уровне. В технических вакансиях особое внимание уделяют перечню технологий и программ, которые специалист должен знать. Имеет смысл при новом отклике эти навыки выделять отдельно.&lt;/li&gt;
    &lt;li id=&quot;2A8k&quot;&gt;Достижения. Напишите, чем вы гордитесь и что делаете лучше всего. Данный пункт отражает, что вам важно, что происходит в компании. Например: «Я представил систему оценки, которая все еще используется всем подразделением».&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;sxho&quot;&gt;Выделим моменты, которые необходимо учитывать перед составлением резюме.&lt;/p&gt;
  &lt;h3 id=&quot;0zKb&quot;&gt;Объем&lt;/h3&gt;
  &lt;p id=&quot;zB4t&quot;&gt;У рекрутеров нет времени, чтобы детально изучать каждое резюме. Они закроют документ, составленный на три-четыре страницы, и перейдут к следующему кандидату. Оптимальный объем резюме — одна-две страницы. Иногда HR могут просматривать и пять-шесть страниц при условии, что указана важная информация о кандидате.&lt;/p&gt;
  &lt;h3 id=&quot;zQSz&quot;&gt;Форматирование&lt;/h3&gt;
  &lt;p id=&quot;p9gz&quot;&gt;Весь текст необходимо разбивать на смысловые блоки — это позволит рекрутеру быстро изучить резюме и «выудить» самое важное. Используйте не более двух цветов и не слишком много шрифтов. Не забудьте про подзаголовки и выделение перечней списками. Контакты обычно размещают отдельным блоком.&lt;/p&gt;
  &lt;h3 id=&quot;YnPo&quot;&gt;Сопроводительное письмо&lt;/h3&gt;
  &lt;p id=&quot;NB7a&quot;&gt;Письмо направляют вместе с резюме. Сообщение не должно быть шаблонным — это не вызывает доверия, а лишь отталкивает.&lt;/p&gt;
  &lt;p id=&quot;8WbJ&quot;&gt;Необходимо представиться и указать на какую вакансию вы откликаетесь. Далее добавьте краткое описание опыта и навыков. Однако это не пересказ резюме: пишите с учетом требований к должности, на которую претендуете. Цель сопроводительного письма — обратить на себя внимание и указать, почему вы подходите на данную должность.&lt;/p&gt;
  &lt;figure id=&quot;Oiea&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/15da0c29-6341-4758-86ce-8755c7bd6688.jpg&quot; width=&quot;1004&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;77Jh&quot;&gt;Структура резюме IT-специалиста&lt;/h2&gt;
  &lt;p id=&quot;CXy7&quot;&gt;Остановимся на важных составляющих.&lt;/p&gt;
  &lt;h2 id=&quot;nVo0&quot;&gt;Образование&lt;/h2&gt;
  &lt;p id=&quot;yDah&quot;&gt;Указывайте любое образование, даже не профильное и не соответствующее вакансии. Дополнительно пропишите пройденные курсы.&lt;/p&gt;
  &lt;figure id=&quot;jsii&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/15252378-7577-407c-86c8-5de2178ca328.jpg&quot; width=&quot;522&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;G3NY&quot;&gt;Опыт&lt;/h2&gt;
  &lt;p id=&quot;qtCo&quot;&gt;Соблюдайте хронологию и четкость при описании предыдущих мест работы. Можно начинать с раннего опыта, заканчивая последним местом работы. Но хронологию выстраивают и в обратном порядке. Если у специалиста богатый опыт, то рассказывать подробно про каждое место работы не обязательно: о самых ранних этапах можно написать кратко и объединить информацию в один абзац.&lt;/p&gt;
  &lt;p id=&quot;TMjA&quot;&gt;Стандартно пишут так: период работы (месяц и год) — название компании — наименование должности — перечень обязанностей.&lt;/p&gt;
  &lt;p id=&quot;2k23&quot;&gt;Последний пункт можно раскрывать подробнее и писать развернуто. Выберите показательные проекты, которыми вы гордитесь.&lt;/p&gt;
  &lt;figure id=&quot;jsv0&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/eb1b6ab1-449c-42fa-b9a9-b0ccea8bd34a.jpg&quot; width=&quot;560&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;IWeP&quot;&gt;Ключевые навыки&lt;/h2&gt;
  &lt;p id=&quot;i2yU&quot;&gt;К этому блоку можно подойти формально и не расписывать подробно. Уровень владения ПО или языком программирования часто указывают схематично. Выделяйте ключевые навыки одним блоком, чтобы рекрутер мог одним взглядом оценить ваши профессиональные умения.&lt;/p&gt;
  &lt;figure id=&quot;cdUb&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/29ebe14d-52d5-4cca-b0cc-de0d5d6ae8c9.jpg&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rW8d&quot;&gt;Как может выглядеть список навыков&lt;/p&gt;
  &lt;h2 id=&quot;QBbk&quot;&gt;Личные качества&lt;/h2&gt;
  &lt;p id=&quot;4vJQ&quot;&gt;Обычный перечень качеств, который можно взять в интернете, не добавляет плюсов к резюме. Но если оформить их грамотно, то можно смотреться выигрышно на фоне других кандидатов. Лучший способ — к описываемым качествам добавлять примеры из профессиональной сферы. Если говорите о своей внимательности, то покажите это примером. Например, «три года работал ретушером — это деятельность, требующая высокой скрупулезности».&lt;/p&gt;
  &lt;p id=&quot;Q47u&quot;&gt;К «Личным качествам» можно отнести еще хобби и дополнительные умения. Идеально, если они косвенно связаны с будущей деятельностью. Допустим, вы — заядлый любитель компьютерных игр и устраиваетесь в компанию, которая разрабатывает курсы на основе Minecraft. Об этом стоит упомянуть.&lt;/p&gt;
  &lt;p id=&quot;ruft&quot;&gt;Структуру можно менять на своё усмотрение. Например, кандидаты иногда заменяют пункт про личные качества на абзац «О себе».&lt;/p&gt;
  &lt;figure id=&quot;WMhw&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/62821365-65ba-4e5e-8322-52581c4f1639.jpg&quot; width=&quot;556&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;GyJI&quot;&gt;Фотография&lt;/h2&gt;
  &lt;p id=&quot;tToa&quot;&gt;Фотография специалиста не влияет на принятие решения о найме человека. Но она персонализирует резюме. Выбирайте сдержанный снимок, где хорошо видно лицо. Если удачных кадров не найти, можно устроить фотосессию или вовсе не добавлять фотографию.&lt;/p&gt;
  &lt;figure id=&quot;dP6x&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/23e3825a-2fa8-4e78-8e79-ebc84bc5bf68.jpg&quot; width=&quot;1000&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jmM9&quot;&gt;Разница в резюме при наличии и отсутствии фотографии&lt;/p&gt;
  &lt;p id=&quot;4YZQ&quot;&gt;Резюме можно дополнить контактами лиц, которые готовы подтвердить вашу квалификацию — руководителя с прошлого места работы или бывших коллег.&lt;/p&gt;
  &lt;h2 id=&quot;p11T&quot;&gt;Видеорезюме как оригинальный способ проявить себя IT-специалисту&lt;/h2&gt;
  &lt;p id=&quot;y4Bp&quot;&gt;Помимо традиционного резюме в электронном виде, крупные компании зачастую просят прислать видеовизитку. Это помогает HR-специалисту быстрее принять решение, приглашать ли кандидата на следующий этап отбора. Еще видеорезюме показывает, насколько грамотная у кандидата речь, приятный и коммуникабельный ли человек, какая манера общения и поведения.&lt;/p&gt;
  &lt;p id=&quot;q8mM&quot;&gt;Рекомендации для проведения съемки:&lt;/p&gt;
  &lt;ul id=&quot;GtB7&quot;&gt;
    &lt;li id=&quot;sZtY&quot;&gt;выбирайте нейтральный или однотонный фон;&lt;/li&gt;
    &lt;li id=&quot;mIv2&quot;&gt;во время записи не должно быть постороннего и отвлекающего шума;&lt;/li&gt;
    &lt;li id=&quot;9P67&quot;&gt;продумайте одежду и прическу — лучше выбирать деловой или нейтральный стиль;&lt;/li&gt;
    &lt;li id=&quot;OLvM&quot;&gt;перед съемкой составьте сценарий;&lt;/li&gt;
    &lt;li id=&quot;Yo4j&quot;&gt;устанавливайте камеру на уровне глаз и не снимайте слишком близко (лучше, когда человека видно по пояс).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;yyDL&quot;&gt;Оптимальная длина видео — не более двух минут. Необязательно покупать петличку или микрофон, используйте обычные наушники с микрофоном.&lt;/p&gt;
  &lt;p id=&quot;m3fa&quot;&gt;Сначала представьтесь и расскажите о релевантном опыте работы. Ответьте на вопрос, почему вы откликнулись на вакансию и компания должна выбрать вас. В конце видео попрощайтесь.&lt;/p&gt;
  &lt;p id=&quot;w7CC&quot;&gt;&lt;strong&gt;Посмотрите, как может выглядеть видеорезюме:&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;SOwh&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=KUzxA57-PV4&amp;t=24s&quot; target=&quot;_blank&quot;&gt;Видеорезюме&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;ntbz&quot;&gt;При наличии опыта в монтаже видеороликов можно выбирать продвинутые видеоредакторы. Часто они имеют платные подписки, зато перечень функционала впечатляет.&lt;/p&gt;
  &lt;p id=&quot;QOQb&quot;&gt;Однако для съемки видеовизитки не нужны спецэффекты. В редакторе должна быть возможность отрегулировать громкость речи и убрать неудачные эпизоды. Например, программа ВидеоМОНТАЖ — &lt;a href=&quot;https://video-editor.su/prostoy-videoredaktor.php&quot; target=&quot;_blank&quot;&gt;самый простой видеоредактор&lt;/a&gt;, в котором пользователи быстро разбираются.&lt;/p&gt;
  &lt;p id=&quot;RX5i&quot;&gt;На примере ВидеоМОНТАЖа рассмотрим, как составить видеорезюме:&lt;/p&gt;
  &lt;p id=&quot;8xJG&quot;&gt;1. Скачайте программу с официального сайта и следуйте подсказкам установщика.&lt;/p&gt;
  &lt;p id=&quot;PJ4E&quot;&gt;2. Запустите видеоредактор и щелкните «Новый проект» → «Проект с нуля».&lt;/p&gt;
  &lt;figure id=&quot;meyp&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/09081d1f-cd1b-4202-9303-fbd138e0886d.jpg&quot; width=&quot;1243&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mh4c&quot;&gt;3. Добавьте записанное видео на монтажный стол. Чтобы облегчить редактирование видеоряда, разделите его на фрагменты. Используйте инструмент «Разделить».&lt;/p&gt;
  &lt;figure id=&quot;UqSq&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/adfd3656-3a11-4053-a244-fba3403eff94.jpg&quot; width=&quot;1245&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Qw9L&quot;&gt;4. Для обрезки выделите эпизод и нажмите иконку с ножницами. Чтобы сократить видеоряд по краям, можно действовать по старинке: наведите курсором на границы выделенного эпизода и сдвигайте влево или вправо.&lt;/p&gt;
  &lt;figure id=&quot;Ehju&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/d22c402b-bd6b-4d40-9e6e-f6d205f9a1fb.jpg&quot; width=&quot;1244&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;yObv&quot;&gt;5. Для плавной склейки фрагментов задействуйте переходы или оставьте смену кадров более резкой.&lt;/p&gt;
  &lt;figure id=&quot;mJHq&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/c2822d30-a176-4830-9c17-0a6f47db2af5.jpg&quot; width=&quot;1244&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;kLyU&quot;&gt;6. Вы можете добавить текст в любую часть экрана, отрегулировать яркость и насыщенность видео. Есть возможность записать звук с микрофона. Пригодится, если какой-то фрагмент не получился, а записывать себя заново не хочется.&lt;/p&gt;
  &lt;p id=&quot;PwZe&quot;&gt;7. Сохраните видеовизитку в подходящем формате. Можно настроить качество видео и размер кадра.&lt;/p&gt;
  &lt;figure id=&quot;SudP&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/56da297b-6459-40cf-b407-1885f16fbc04.jpg&quot; width=&quot;694&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;SXj7&quot;&gt;Чек-лист запоминающегося резюме IT-специалиста&lt;/h2&gt;
  &lt;p id=&quot;0jK6&quot;&gt;Резюме — это страницы с информацией, в которых описано, чему вы научились к сегодняшнему моменту. Но важно превратить их в свою визитную карточку.&lt;/p&gt;
  &lt;p id=&quot;4DJI&quot;&gt;Что указать:&lt;/p&gt;
  &lt;ul id=&quot;3AH8&quot;&gt;
    &lt;li id=&quot;gzOo&quot;&gt;данные о себе — Ф.И.О., возраст и контактную информацию (номер телефона и электронная почта);&lt;/li&gt;
    &lt;li id=&quot;0pMA&quot;&gt;образование;&lt;/li&gt;
    &lt;li id=&quot;R1Qz&quot;&gt;описание опыта работы и достижений (с перечнем весомых рабочих проектов);&lt;/li&gt;
    &lt;li id=&quot;ThLh&quot;&gt;личные и профессиональные качества.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;Zm6N&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/84b0c8c5-476e-4db6-8122-39eda45cabe7.jpg&quot; width=&quot;1600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6XIl&quot;&gt;Примеры оформления резюме&lt;/p&gt;
  &lt;h2 id=&quot;8YMv&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;ADeW&quot;&gt;С нашими рекомендациями вы сможете доработать или улучшить резюме. Информация о себе должна быть релевантна вакансии, на которую откликаетесь. Поэтому к резюме периодически придется возвращаться.&lt;/p&gt;
  &lt;p id=&quot;4hGj&quot;&gt;Представляйте себя на месте рекрутера и проанализируйте, какая информация поможет принять решение в вашу пользу, а какая представит в невыгодном свете. Наравне с классическим резюме, задумайтесь над созданием видеорезюме. Это новый и интересный способ рассказать о себе и заинтересовать компанию своей кандидатурой.&lt;/p&gt;

</content></entry><entry><id>it_guru:ecC7NfK5qPk</id><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru/ecC7NfK5qPk?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><title>10 инструментов для CSS: анимация, сетки и дизайн</title><published>2023-06-04T13:44:22.323Z</published><updated>2023-06-04T13:46:42.548Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c5/06/c50601b3-da5e-4851-9f1b-ef09b6067d2d.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/9c19bb35-f0b9-4ae7-95b3-e6a076e0b421.png&quot;&gt;Веб-разработчику может быть сложно идти в ногу с новейшими технологиями и трендами веб-дизайна.</summary><content type="html">
  &lt;p id=&quot;GcNL&quot;&gt;Веб-разработчику может быть сложно идти в ногу с новейшими технологиями и трендами веб-дизайна.&lt;/p&gt;
  &lt;p id=&quot;q0hs&quot;&gt;Однако, поскольку CSS является фундаментальной частью интерфейсной веб-разработки, доступ к нужным инструментам CSS может существенно повлиять на производительность и креативность разработчика.&lt;/p&gt;
  &lt;p id=&quot;yorP&quot;&gt;В этой статье мы рассмотрим некоторые из самых популярных инструментов CSS, которые помогут вам идти в ногу со временем и вывести свои навыки CSS на новый уровень.&lt;/p&gt;
  &lt;h2 id=&quot;qDqI&quot;&gt;Неоморфизм&lt;/h2&gt;
  &lt;p id=&quot;WElC&quot;&gt;&lt;a href=&quot;https://neumorphism.io/#e0e0e0&quot; target=&quot;_blank&quot;&gt;Neumorphism.io&lt;/a&gt; — это веб-сайт, на котором можно сгенерировать блоки в стиле неоморфизма. Это мягкий пользовательский интерфейс, который также называют неоскевоморфизмом.&lt;/p&gt;
  &lt;p id=&quot;6LSP&quot;&gt;Сайт генерирует стили CSS с программным интерфейсом, используя тени.&lt;/p&gt;
  &lt;figure id=&quot;xseM&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/9c19bb35-f0b9-4ae7-95b3-e6a076e0b421.png&quot; width=&quot;1904&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;YqON&quot;&gt;Animista&lt;/h2&gt;
  &lt;p id=&quot;9G2G&quot;&gt;&lt;a href=&quot;https://animista.net/play&quot; target=&quot;_blank&quot;&gt;Animista&lt;/a&gt; — это коллекция анимаций CSS и пресетов, которые можно легко настроить и применить к веб-элементам.&lt;/p&gt;
  &lt;figure id=&quot;saKs&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/257a4bb6-2eca-4cb8-84ed-032f3d06a3ab.png&quot; width=&quot;1904&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;ZjWl&quot;&gt;Анимированный фон&lt;/h2&gt;
  &lt;p id=&quot;616H&quot;&gt;&lt;a href=&quot;https://wweb.dev/resources/animated-css-background-generator&quot; target=&quot;_blank&quot;&gt;Wweb.dev&lt;/a&gt; — генератор анимированных фонов CSS. Он позволяет создавать и настраивать анимированные фоны для своих веб-проектов.&lt;/p&gt;
  &lt;figure id=&quot;dYP9&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/513cf5a7-1fbf-46b2-a03e-3d6673494782.png&quot; width=&quot;1904&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;o4bb&quot;&gt;Spin Kit&lt;/h2&gt;
  &lt;p id=&quot;eXrz&quot;&gt;&lt;a href=&quot;https://tobiasahlin.com/spinkit/&quot; target=&quot;_blank&quot;&gt;Spin Kit&lt;/a&gt; — это коллекция анимаций загрузки на CSS, созданная Тобиасом Ахлином.&lt;/p&gt;
  &lt;p id=&quot;8qM4&quot;&gt;На сайте есть простые и настраиваемые анимации, которые можно легко интегрировать в веб-проекты.&lt;/p&gt;
  &lt;figure id=&quot;wyBl&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/7db7c061-d221-4f9b-a626-6b86d47e2117.png&quot; width=&quot;1904&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;MtlJ&quot;&gt;Flexplorer&lt;/h2&gt;
  &lt;p id=&quot;9S2O&quot;&gt;&lt;a href=&quot;https://bennettfeely.com/flexplorer/&quot; target=&quot;_blank&quot;&gt;Flexplorer&lt;/a&gt; — это онлайн-инструмент веб-разработчика Беннета Фили, который помогает разработчикам изучать и экспериментировать с макетами CSS flexbox. Flexbox позволяет быстро создавать гибкие и адаптивные макеты.&lt;/p&gt;
  &lt;figure id=&quot;4XFx&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/873d9b60-1d60-46eb-bb06-524c203d5c1c.png&quot; width=&quot;1904&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;ynOy&quot;&gt;Генератор сетки&lt;/h2&gt;
  &lt;p id=&quot;Rgfd&quot;&gt;&lt;a href=&quot;https://cssgrid-generator.netlify.app/&quot; target=&quot;_blank&quot;&gt;CSS Grid Generator&lt;/a&gt; — это веб-инструмент, который помогает разработчикам создавать сложные макеты сетки с помощью CSS Grid. Это мощный способ создания гибких и адаптивных дизайнов веб-страниц.&lt;/p&gt;
  &lt;figure id=&quot;dKv2&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/af967ad6-8453-40a3-bab0-49bf2a18e268.png&quot; width=&quot;1904&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;smW1&quot;&gt;Генератор макетов&lt;/h2&gt;
  &lt;p id=&quot;lCjl&quot;&gt;&lt;a href=&quot;https://layout.bradwoods.io/&quot; target=&quot;_blank&quot;&gt;CSS Layout Generator&lt;/a&gt; — это веб-инструмент, который позволяет разработчикам создавать стили макетов CSS и экспериментировать с ними. Он предоставляет визуальный интерфейс для разработки и настройки компонентов макета.&lt;/p&gt;
  &lt;figure id=&quot;qMIW&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/7ebd8c00-623c-4600-a9c6-c86baeb0c43a.png&quot; width=&quot;1904&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;UKOw&quot;&gt;Shadows Brumm&lt;/h2&gt;
  &lt;p id=&quot;wKl9&quot;&gt;&lt;a href=&quot;https://shadows.brumm.af/&quot; target=&quot;_blank&quot;&gt;Shadows Brumm&lt;/a&gt; — это веб-инструмент для создания CSS-эффектов теней. У сайта простой интерфейс, который позволяет создавать сложные и красивые тени, используя множество параметров и опций.&lt;/p&gt;
  &lt;figure id=&quot;iJ5d&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/144893d9-ff10-4633-9f94-e3de7397fc09.png&quot; width=&quot;1904&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;sfb2&quot;&gt;Глассморфизм&lt;/h2&gt;
  &lt;p id=&quot;SUSb&quot;&gt;&lt;a href=&quot;https://hype4.academy/tools/glassmorphism-generator&quot; target=&quot;_blank&quot;&gt;Glassmorphism&lt;/a&gt; — это направление в дизайне, в котором используются прозрачные и размытые «стеклянные» фоны.&lt;/p&gt;
  &lt;figure id=&quot;8jjp&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/af9caa69-8d51-46ce-a4d9-a7ef1ef75d2f.png&quot; width=&quot;1904&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;K2w3&quot;&gt;Cubic-Bezier&lt;/h2&gt;
  &lt;p id=&quot;KQ1a&quot;&gt;&lt;a href=&quot;https://cubic-bezier.com/#.17,.67,.83,.67&quot; target=&quot;_blank&quot;&gt;Cubic-Bezier &lt;/a&gt;— это веб-инструмент, который позволяет пользователям создавать собственные кривые для плавных анимаций и переходов.&lt;/p&gt;
  &lt;figure id=&quot;gXjV&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/06/5c076e9f-b8dd-491a-8c1f-e0480710aa8d.png&quot; width=&quot;1904&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;UEpj&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;NuOf&quot;&gt;Инструменты CSS нужны разработчикам, которые хотят создавать визуально привлекательные и отзывчивые веб-сайты. Правильный набор инструментов сильно повышает производительность разработчиков и экономит время.&lt;/p&gt;
  &lt;p id=&quot;uVYv&quot;&gt;Не забывайте экспериментировать и находить решения, которые подходят для ваших проектов: правильные инструменты CSS помогут вам выйти на новый уровень.&lt;/p&gt;

</content></entry><entry><id>it_guru:H9npGOaqMRm</id><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru/H9npGOaqMRm?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><title>Bose — фреймворк для создания веб-ботов, который проще Selenium</title><published>2023-06-04T13:31:43.696Z</published><updated>2023-06-04T13:31:43.696Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/05/01/05018561-d3e1-478a-b1da-e653f7735bcf.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/e771a3e1-4faa-41c9-9242-1e29aa37be30.png&quot;&gt;Разработка ботов — это сложно.</summary><content type="html">
  &lt;p id=&quot;FeBB&quot;&gt;Разработка ботов — это сложно.&lt;/p&gt;
  &lt;p id=&quot;7tBG&quot;&gt;Детекторы ботов вроде Cloudflare готовы защищать сайты от наших ботов. Настройка Selenium с помощью ChromeOptions слишком громоздкая, а на Windows становится совсем кошмарной. Отладка ботов через журналы — тоже слишком сложно.&lt;/p&gt;
  &lt;p id=&quot;DF0H&quot;&gt;Как решить эти боли, не жертвуя скоростью и удобством разработки? Попробуйте Bose.&lt;/p&gt;
  &lt;p id=&quot;vPOE&quot;&gt;Bose, как уверяют разработчики фреймворка, — это первая среда разработки ботов, которая максимально упрощает разработку ботов. Фреймворк основан на на Selenium и предлагает ряд функций, упрощающих разработку.&lt;/p&gt;
  &lt;p id=&quot;tsct&quot;&gt;GitHub — omkarcloud/bose: The Ultimate Web Scraping Framework&lt;/p&gt;
  &lt;p id=&quot;zMbA&quot;&gt;github.com&lt;/p&gt;
  &lt;h2 id=&quot;4IQd&quot;&gt;Настраиваем Bose&lt;/h2&gt;
  &lt;p id=&quot;mPCO&quot;&gt;Первым делом, скопируем изначальный шаблон.&lt;/p&gt;
  &lt;pre id=&quot;rP2o&quot;&gt;git clone https://github.com/omkarcloud/bose-starter my-bose-project&lt;/pre&gt;
  &lt;p id=&quot;YCxD&quot;&gt;Затем перейдите в скачанный каталог, установите зависимости и запустите проект:&lt;/p&gt;
  &lt;pre id=&quot;Ct7m&quot;&gt;cd my-bose-project
python -m pip install -r requirements.txt
python main.py&lt;/pre&gt;
  &lt;p id=&quot;NHAJ&quot;&gt;Первый запуск займет некоторое время. Всё потому, что он загружает исполняемый файл драйвера Chrome. Следующие запуски будут гораздо быстрее.&lt;/p&gt;
  &lt;h2 id=&quot;BKQu&quot;&gt;Основные особенности Bose Framework&lt;/h2&gt;
  &lt;p id=&quot;Wqah&quot;&gt;Добавляет мощные методы, чтобы сделать работу с Selenium намного проще.&lt;/p&gt;
  &lt;p id=&quot;okwc&quot;&gt;Применяет лучшие практики, чтобы избежать обнаружения ботов Cloudflare и PerimeterX.&lt;/p&gt;
  &lt;p id=&quot;FPJc&quot;&gt;Сохраняет HTML, снимок экрана и сведения о выполнении для каждой задачи, что упрощает отладку.&lt;/p&gt;
  &lt;p id=&quot;MMCb&quot;&gt;Вспомогательные компоненты для записи очищенных данных в виде файлов JSON, CSV и Excel.&lt;/p&gt;
  &lt;p id=&quot;Gcn9&quot;&gt;Автоматически загружает и инициализирует правильный драйвер Chrome.&lt;/p&gt;
  &lt;p id=&quot;dawV&quot;&gt;Быстро и удобно для разработчиков.&lt;/p&gt;
  &lt;h2 id=&quot;g5La&quot;&gt;Работаем с Bose&lt;/h2&gt;
  &lt;p id=&quot;lA2U&quot;&gt;Допустим, вы хотите начать парсинг веб-сайта. Если бы вы использовали Selenium, вам пришлось бы обрабатывать задачи по открытию и закрытию драйвера следующим образом:&lt;/p&gt;
  &lt;pre id=&quot;AfcC&quot;&gt;from selenium import webdriver

driver_path = &amp;#x27;path/to/chromedriver&amp;#x27;

driver = webdriver.Chrome(executable_path=driver_path)

driver.get(&amp;#x27;https://www.example.com&amp;#x27;)

driver.quit()&lt;/pre&gt;
  &lt;p id=&quot;A4Lj&quot;&gt;Однако Bose Framework использует декларативный и структурированный подход. Вам нужно только написать код ниже, а драйвер Bose сам создаст драйвер, передаст его методу run и закроет работу.&lt;/p&gt;
  &lt;pre id=&quot;L78c&quot;&gt;from bose import *

class Task(BaseTask):
    def run(self, driver):
        driver.get(&amp;#x27;https://www.example.com&amp;#x27;)&lt;/pre&gt;
  &lt;h2 id=&quot;UCLe&quot;&gt;Конфигурация Bose&lt;/h2&gt;
  &lt;p id=&quot;qGNY&quot;&gt;В Selenium, если вы захотите настроить параметры вроде профиля, пользовательского агента или размера окна, нужно будет написать много кода:&lt;/p&gt;
  &lt;pre id=&quot;6R67&quot;&gt;from selenium.webdriver.chrome.options import Options
from selenium import webdriver

driver_path = &amp;#x27;path/to/chromedriver.exe&amp;#x27;

options = Options()

profile_path = &amp;#x27;1&amp;#x27;

options.add_argument(f&amp;#x27;--user-data-dir={profile_path}&amp;#x27;)

user_agent = &amp;#x27;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.37&amp;quot;)&amp;#x27;
options.add_argument(f&amp;#x27;--user-agent={user_agent}&amp;#x27;)

window_width = 1200
window_height = 720
options.add_argument(f&amp;#x27;--window-size={window_width},{window_height}&amp;#x27;)

driver = webdriver.Chrome(executable_path=driver_path, options=options)&lt;/pre&gt;
  &lt;p id=&quot;0vlW&quot;&gt;Bose Framework упрощает конфигурацию, инкапсулируя её в свойстве &lt;code&gt;BrowserConfig&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;iikC&quot;&gt;from bose import BaseTask, BrowserConfig, UserAgent, WindowSize

class Task(BaseTask):
    browser_config = BrowserConfig(user_agent=UserAgent.user_agent_106, window_size=WindowSize.window_size_1280_720, profile=1)&lt;/pre&gt;
  &lt;h2 id=&quot;30SX&quot;&gt;Обработка исключений&lt;/h2&gt;
  &lt;p id=&quot;tCe9&quot;&gt;Исключения — это боль при работе с Selenium.&lt;/p&gt;
  &lt;p id=&quot;APwW&quot;&gt;В Selenium, если возникает исключение, драйвер автоматически закрывается, оставляя вам только журналы для отладки.&lt;/p&gt;
  &lt;p id=&quot;cLKb&quot;&gt;В Bose, когда в задаче парсинга возникает исключение, браузер остается открытым. Вы можете отслеживать состояние браузера в момент возникновения исключения, что очень помогает при отладке.&lt;/p&gt;
  &lt;figure id=&quot;gpzV&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/e771a3e1-4faa-41c9-9242-1e29aa37be30.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;SCcf&quot;&gt;Отладка в Bose Framework&lt;/h2&gt;
  &lt;p id=&quot;5KvV&quot;&gt;При веб-скрапинге часто возникают ошибки вроде неправильных селекторов или страниц, которые не загружаются. При отладке в Selenium вам, возможно, придется отсматривать журналы, чтобы найти, какая возникла проблема.&lt;/p&gt;
  &lt;p id=&quot;XjQZ&quot;&gt;Bose упрощает отладку, сохраняя информацию о каждом запуске.&lt;/p&gt;
  &lt;p id=&quot;HxRo&quot;&gt;После каждого запуска в задачах создается каталог, содержащий три файла, перечисленных ниже:&lt;/p&gt;
  &lt;pre id=&quot;g58d&quot;&gt;task_info.json&lt;/pre&gt;
  &lt;p id=&quot;NTKk&quot;&gt;Файл содержит информацию о выполнении задачи: продолжительность выполнения задачи, IP-адрес задачи, пользовательский агент, размер окна и профиль, который использовался для выполнения задачи.&lt;/p&gt;
  &lt;pre id=&quot;QDmd&quot;&gt;final.png&lt;/pre&gt;
  &lt;p id=&quot;9YVB&quot;&gt;Это снимок экрана, сделанный до закрытия драйвера.&lt;/p&gt;
  &lt;pre id=&quot;glVL&quot;&gt;page.html&lt;/pre&gt;
  &lt;p id=&quot;MC0a&quot;&gt;Это исходный HTML-код, полученный до закрытия драйвера. Код страницы полезно знать, если селекторам не удалось выбрать элементы.&lt;/p&gt;
  &lt;pre id=&quot;t0mg&quot;&gt;error.log&lt;/pre&gt;
  &lt;p id=&quot;YHQX&quot;&gt;В случае, если ваша задача рухнула из-за исключения, Bose сохраняет &lt;code&gt;error.log&lt;/code&gt; с ошибкой, из-за которой задача рухнула.&lt;/p&gt;
  &lt;h2 id=&quot;yN1b&quot;&gt;Вывод данных&lt;/h2&gt;
  &lt;p id=&quot;8s3m&quot;&gt;После выполнения парсинга веб-страниц нужно сохранить данные в формате JSON или CSV. Как правило, этот процесс подразумевает написание огромного объёма императивного кода:&lt;/p&gt;
  &lt;pre id=&quot;o4YQ&quot;&gt;import csv
import json

def write_json(data, filename):
    with open(filename, &amp;#x27;w&amp;#x27;) as fp:
        json.dump(data, fp, indent=4)

def write_csv(data, filename):
    with open(filename, &amp;#x27;w&amp;#x27;, newline=&amp;#x27;&amp;#x27;, encoding=&amp;#x27;utf-8&amp;#x27;) as csvfile:
        fieldnames = data[0].keys()  # get the fieldnames from the first dictionary
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()  # write the header row
        writer.writerows(data)  # write each row of data

data = [
    {
        &amp;quot;text&amp;quot;: &amp;quot;\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d&amp;quot;,
        &amp;quot;author&amp;quot;: &amp;quot;Albert Einstein&amp;quot;
    },
    {
        &amp;quot;text&amp;quot;: &amp;quot;\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d&amp;quot;,
        &amp;quot;author&amp;quot;: &amp;quot;J.K. Rowling&amp;quot;
    }
]

write_json(data, &amp;quot;data.json&amp;quot;)
write_csv(data, &amp;quot;data.csv&amp;quot;)&lt;/pre&gt;
  &lt;p id=&quot;IWlH&quot;&gt;Bose упрощает процесс, инкапсулируя данные в модуль вывода для чтения и записи данных. Просто метод &lt;code&gt;write&lt;/code&gt; для файла, который вы хотите сохранить.&lt;/p&gt;
  &lt;p id=&quot;IQBS&quot;&gt;Все данные будут сохранены в папке &lt;code&gt;output/&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;Yn1W&quot;&gt;from bose import Output

data = [
    {
        &amp;quot;text&amp;quot;: &amp;quot;\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d&amp;quot;,
        &amp;quot;author&amp;quot;: &amp;quot;Albert Einstein&amp;quot;
    },
    {
        &amp;quot;text&amp;quot;: &amp;quot;\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d&amp;quot;,
        &amp;quot;author&amp;quot;: &amp;quot;J.K. Rowling&amp;quot;
    }
]

Output.write_json(data, &amp;quot;data.json&amp;quot;)
Output.write_csv(data, &amp;quot;data.csv&amp;quot;)&lt;/pre&gt;
  &lt;h2 id=&quot;13dF&quot;&gt;Локальное хранилище&lt;/h2&gt;
  &lt;p id=&quot;tQGt&quot;&gt;В современных браузерах есть локальный модуль хранения, и Bose перенял эту концепцию.&lt;/p&gt;
  &lt;p id=&quot;yKSJ&quot;&gt;Вы можете импортировать объект &lt;code&gt;LocalStorage&lt;/code&gt; из Bose, чтобы сохранять данные при запуске браузера, что чрезвычайно полезно при очистке больших объемов данных.&lt;/p&gt;
  &lt;p id=&quot;DCtB&quot;&gt;Данные хранятся в файле &lt;code&gt;local_storage.json&lt;/code&gt; в корневом каталоге проекта. Вот как можно его использовать:&lt;/p&gt;
  &lt;pre id=&quot;xr3W&quot;&gt;from bose import LocalStorage

LocalStorage.set_item(&amp;quot;pages&amp;quot;, 5)
print(LocalStorage.get_item(&amp;quot;pages&amp;quot;))&lt;/pre&gt;
  &lt;h2 id=&quot;4OJY&quot;&gt;Другие возможности&lt;/h2&gt;
  &lt;p id=&quot;eZQW&quot;&gt;Драйвер, полученный при запуске задачи — это расширенная версия Selenium, в которую добавлены мощные методы, упрощающие работу.&lt;/p&gt;
  &lt;p id=&quot;dtQv&quot;&gt;Вот некоторые из популярных методов, добавленных в драйвер:&lt;/p&gt;
  &lt;figure id=&quot;LO7v&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/8a32df2f-06fa-4e94-a2a9-33640be6fccd.png&quot; width=&quot;842&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;0AzF&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;6nKL&quot;&gt;Bose — отличный фреймворк, упрощающий скучные части Selenium и парсинга веб-страниц.&lt;/p&gt;
  &lt;p id=&quot;OVCw&quot;&gt;Желаем вам удачи и счастливой разработки ботов с помощью Bose Framework!&lt;/p&gt;

</content></entry><entry><id>it_guru:uH7n-CLNULK</id><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru/uH7n-CLNULK?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><title>Решаем задачи, которые многих ставят в тупик</title><published>2023-05-30T13:11:49.739Z</published><updated>2023-05-30T13:16:12.539Z</updated><summary type="html">Перед нами 2 комнаты, в которых низкие потолки. В комнате под номером 1 висит три лампочки накаливания, а во второй комнате имеется три переключателя.</summary><content type="html">
  &lt;h2 id=&quot;PL3l&quot;&gt;№1. Включаем лампочки&lt;/h2&gt;
  &lt;p id=&quot;NFnh&quot;&gt;Перед нами 2 комнаты, в которых низкие потолки. В комнате под номером 1 висит три лампочки накаливания, а во второй комнате имеется три переключателя.&lt;/p&gt;
  &lt;p id=&quot;AEH2&quot;&gt;&lt;strong&gt;Вопрос&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;zf3g&quot;&gt;Как понять, к какому именно переключателю подведена каждая лампочка, если в первую комнату позволяется войти всего один раз, но переключатели можно нажимать сколько захочется?&lt;/p&gt;
  &lt;h2 id=&quot;LW7j&quot;&gt;№2. Сколько лет мальчику?&lt;/h2&gt;
  &lt;p id=&quot;hXXR&quot;&gt;Во время обилечивания пассажира кондуктор спросил, сколько лет его сыну. Но мужчина ответил следующее:&lt;/p&gt;
  &lt;p id=&quot;7xSa&quot;&gt;– Мой сын в 5 раз старше моей дочери и младше моей жены в 5 раз. Моя жена в 2 раза младше меня, а бабушке моих детей сегодня исполнился 81 год – это столько лет, сколько мне, дочке, сыну и моей жене всего вместе.&lt;/p&gt;
  &lt;p id=&quot;Qj6X&quot;&gt;&lt;strong&gt;Вопрос:&lt;/strong&gt; Сколько мальчику лет?&lt;/p&gt;
  &lt;h2 id=&quot;6Ao5&quot;&gt;№3. Как найти нужную баночку?&lt;/h2&gt;
  &lt;p id=&quot;sRRF&quot;&gt;Всего имеется 20 баночек с таблетками. Во всех, кроме единственной, каждая таблетка весит по 1 гр, но в одной – по 1,1 гр. Мы имеем кухонные весы, которые способны просчитать все до грамма.&lt;/p&gt;
  &lt;p id=&quot;GjT9&quot;&gt;&lt;strong&gt;Вопрос:&lt;/strong&gt; Как найти ту самую баночку, где каждая таблетка весит по 1,1 гр, если взвесить разрешено лишь 1 раз?&lt;/p&gt;
  &lt;h2 id=&quot;r70s&quot;&gt;№4. Набираем воду&lt;/h2&gt;
  &lt;p id=&quot;n95N&quot;&gt;Есть 2 ведра – одно на 5 л, а второе – на 9 л. Из реки требуется набрать 3 литра воды.&lt;/p&gt;
  &lt;p id=&quot;2r8m&quot;&gt;&lt;strong&gt;Вопрос:&lt;/strong&gt; Как это можно сделать, если мы можем воспользоваться только этими двумя ведрами.&lt;/p&gt;

</content></entry><entry><id>it_guru:JJgrVeQw8PM</id><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru/JJgrVeQw8PM?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><title>Какую программу выбрать для создания игры?  </title><published>2023-05-30T12:43:18.717Z</published><updated>2023-05-30T12:56:29.223Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/99/35/9935de07-780a-4d03-95ad-5d0ec393f27b.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/98/9e/989ea820-9cfc-44c2-bd8c-f08a96d1e2fa.jpeg&quot;&gt;Все что связано с созданием игр очень интересно и привлекательно, особенно для геймеров. Кто из любителей поиграть в какую-то интересную игру с закрученным сюжетом не хотел бы реализовать собственную?</summary><content type="html">
  &lt;p id=&quot;HlCE&quot;&gt;Все что связано с созданием игр очень интересно и привлекательно, особенно для геймеров. Кто из любителей поиграть в какую-то интересную игру с закрученным сюжетом не хотел бы реализовать собственную?&lt;/p&gt;
  &lt;p id=&quot;v11G&quot;&gt;Всегда кажется, что “у меня получилось бы лучше”, но на практике многие так и не начинают свой путь. А зря! Игровая индустрия – это огромные инвестиции и деньги. А если есть еще и личная мотивация создать свою собственную игру, процесс обучения и реализации задуманного будет гораздо быстрее и проще. Давайте рассмотрим 5 движков, с помощью которых можно воплотить в жизнь все свои идеи.&lt;/p&gt;
  &lt;h2 id=&quot;qWEa&quot;&gt;Unreal Engine Или Unity: Битва Титанов&lt;/h2&gt;
  &lt;p id=&quot;QWAE&quot;&gt;Сегодня в мире гейм индустрии есть две самые главные компании, которые занимают львиную долю рынка и уже долго конкурируют друг с другом, чтобы заработать любовь, как можно большего количества людей. Это Unity и Unreal Engine. Про них слышали даже те, кто никогда не был частью сферы игр. За время своего существования они полюбились миллионам, а игры, созданные с их помощью, стали настоящими хитами.&lt;/p&gt;
  &lt;figure id=&quot;pROj&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/98/9e/989ea820-9cfc-44c2-bd8c-f08a96d1e2fa.jpeg&quot; width=&quot;1003&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;POM8&quot;&gt;&lt;a href=&quot;https://itproger.com/course/unreal-engine&quot; target=&quot;_blank&quot;&gt;Unreal Engine&lt;/a&gt;: Надежный и Технологичный&lt;/h2&gt;
  &lt;p id=&quot;Nclc&quot;&gt;Unreal Engine — это мощный игровой движок, принадлежащий компании Epic Games. В 2014 году был признан самым успешным игровым движком. У него очень много наград, а общий успех спокойно можно заносить в книгу рекордов Гиннеса. Несмотря на то, что создан был Unreal Engine еще в 1998 году, он опережает многие технологии и постоянно стремится к расширению функциональности.&lt;/p&gt;
  &lt;p id=&quot;Z3pH&quot;&gt;Unreal Engine славится своей впечатляющей графикой и рендерингом. Он обладает высокой степенью реалистичности и производительности, благодаря использованию мощного графического движка, известного как Unreal Engine 4.&lt;/p&gt;
  &lt;figure id=&quot;8E3G&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/20/2d/202d34a8-2b1b-4ee0-8a4f-1915b3c0dea3.jpeg&quot; width=&quot;1125&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9nlT&quot;&gt;Движок позволяет использовать игры для различных платформ, включая ПК, консоли, мобильные устройства и даже виртуальную реальность. Но для мобильных игр и VR его применение не всегда позволяет добиться желаемых результатов.&lt;/p&gt;
  &lt;p id=&quot;D5r1&quot;&gt;Что же касается технологичности, у UE имеется визуальная система программирования под названием Blueprints, которая позволяет разработчикам создавать игровую логику без необходимости писать код. Это крайне полезно для тех, кто не имеет опыта в программировании, но все же хочет создавать свои игры.&lt;/p&gt;
  &lt;p id=&quot;3e5a&quot;&gt;Unreal Engine предоставляет все необходимые инструменты и ресурсы для создания игр любого жанра и масштаба, от небольших инди-проектов до крупных 2D и 3D игр. Движок был использован даже в кинематографе и очень ценится везде, где нужна качественная графика и эффекты. Он сочетает в себе комплексную разработку (IDE), которая насчитывает широкий спектр инструментов для разработки игр, включая редактор уровней, редактор материалов, средства моделирования и оформления, а также многое другое. Поэтому не удивительно, что Unreal Engine обожаем множеством разработчиков по всему миру.&lt;/p&gt;
  &lt;h2 id=&quot;J8Ya&quot;&gt;&lt;a href=&quot;https://itproger.com/course/unity-3d&quot; target=&quot;_blank&quot;&gt;Unity&lt;/a&gt;: Перспективный и Мобильный&lt;/h2&gt;
  &lt;p id=&quot;BnqJ&quot;&gt;Unity – это многоплатформенный игровой движок, разработанный компанией Unity Technologies в 2005 году. И хотя изначально его создавали для работы на Mac OS X, сегодня его применяют на 30 различных платформах. И если UE для мобильных игр подходит, но не очень, то Unity – это незаменимый гуру мобильной разработки.&lt;/p&gt;
  &lt;p id=&quot;WDJH&quot;&gt;Движок имеет интуитивно понятный интерфейс и простоту в освоении. Поэтому изучить его не составит труда. У него также есть большой магазин ассетов (Asset Store), где разработчики могут приобретать готовые модели, текстуры, аудио файлы и другие ресурсы для использования в своих проектах, что значительно сокращает время разработки и повышает производительность. Всего доступно порядка 15 000 бесплатных и платных ассетов.&lt;/p&gt;
  &lt;p id=&quot;ahgM&quot;&gt;Unity поддерживает один языков программирования – C#, который необходим разработчикам для создания игровой логики.&lt;/p&gt;
  &lt;figure id=&quot;y6Sa&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/99/2d/992d1393-4ec2-4dca-a424-f06d9f9fcad4.jpeg&quot; width=&quot;1125&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bZvw&quot;&gt;В движке есть все инструменты и ресурсы для создания игр различных жанров, от 2D-платформ до 3D-шутеров, а также поддерживает разработку игр с использованием дополненной реальности. В VR он также преуспел, поэтому активно используется в этих целях разными компаниями.&lt;/p&gt;
  &lt;h2 id=&quot;p9GR&quot;&gt;&lt;a href=&quot;https://itproger.com/course/godot&quot; target=&quot;_blank&quot;&gt;Godot Engine&lt;/a&gt;: Дружелюбный и Функциональный&lt;/h2&gt;
  &lt;p id=&quot;SBmA&quot;&gt;Godot Engine – это бесплатный движок с открытым исходным кодом, выпущенный в 2014 году. Он поддерживает различные платформы, включая ПК, мобильные устройства (Android и iOS), консоли, веб, а также имеет версию Raspberry Pi. Это означает, что вы можете создавать игры для различных платформ и устройств без необходимости переписывать код с нуля.&lt;/p&gt;
  &lt;p id=&quot;WGcC&quot;&gt;Godot Engine доступен бесплатно для скачивания и использования, поэтому вы можете получить полный доступ к исходному коду движка. С его помощью можно реализовывать 2D и 3D игры, при этом взаимодействуя с нужными инструментами для работы с графикой, анимацией, физикой, звуком и другими аспектами игрового процесса. А благодаря интуитивно понятному интерфейсу и простоте использования, движок освоит даже новичок. Он предлагает простую систему узла и сцены, которые позволяют легко управлять играми и создавать сложные игровые механики.&lt;/p&gt;
  &lt;figure id=&quot;vGyW&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://itproger.com/img/news/1591880111.jpg&quot; width=&quot;1500&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PET6&quot;&gt;Этот движок предоставляет множество готовых модулей и функций. Все они помогают реализовывать различные игровые механики, эффекты, системы физики, искусственный интеллект и многое другое. Godot Engine также поддерживает скрипты на нескольких языках, включая GDScript (язык, созданный разработчиками Godot), C#, Python и VisualScript.&lt;/p&gt;
  &lt;p id=&quot;Bc4W&quot;&gt;Кроме того, движок очень дружелюбный. У него есть активное сообщество, где каждый сможет получить поддержку, задать вопросы и получить ответы.&lt;/p&gt;
  &lt;h2 id=&quot;9cas&quot;&gt;&lt;a href=&quot;https://itproger.com/course/gamemaker-rpg&quot; target=&quot;_blank&quot;&gt;GameMaker Studio&lt;/a&gt;: Удобный и Дорогой&lt;/h2&gt;
  &lt;p id=&quot;KdNf&quot;&gt;GameMaker Studio (GMS) — это объединенная среда разработки (IDE) и игровой движок, созданные компанией YoYo Games. Несмотря на понятный интерфейс и свой простой язык программирования, что делает его хорошим выбором для новичков в разработке игр, он значительно отстает от других движков. Так, для 3D игр его использовать нельзя, а кроссплатформенность открывает доступ далеко не ко всем устройствам.&lt;/p&gt;
  &lt;p id=&quot;tRVW&quot;&gt;Но! GMS – это отличный движок для реализации проектов в 2D графике, особенно в инди-сегменте. Он использует расширенные инструменты для создания анимации, коллизий, уровней и других элементов игры. Их собственный язык программирования GameMaker дает возможность разработчикам контролировать логику игры и создавать собственные функции и классы.&lt;/p&gt;
  &lt;figure id=&quot;Xu2H&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://itproger.com/img/courses/1505555017.jpg&quot; width=&quot;425&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4PQn&quot;&gt;Для инди-игр не удасться найти движка лучше, чем GameMaker Studio. А еще движок предлагает визуальную систему программирования, называемую Drag and Drop, которая позволяет разработчикам создавать игровую логику, перетаскивая и соединяя готовые блоки. Простые игры можно разрабатывать без необходимости написания кода. А также можно учить язык программирования прямо во время создания игр, ведь множество кусков кода уже написаны.&lt;/p&gt;
  &lt;h2 id=&quot;t27v&quot;&gt;CryEngine: Мощный и “Живой”&lt;/h2&gt;
  &lt;p id=&quot;Vqyp&quot;&gt;CryEngine – это мощный игровой движок, принадлежащий немецкой компании Crytek и созданный в 2002 году. Многие знают его по первой игре – Far Cry. Он известен своим фотореалистичной графикой. Все, что связано с графическими эффектами – это нечто. Он поддерживает реалистичное освещение, теневые эффекты, отражение, анимацию, физику и другие визуальные элементы. У него имеется собственный движок, который создает реалистичную симуляцию физических эффектов, включая коллизии, разрушения, взрывы и т. д. А с помощью интересного пользовательского интерфейса, можно осуществить редактирование ландшафта, размещение объектов, управление освещением и другие функции.&lt;/p&gt;
  &lt;figure id=&quot;Ngct&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://itproger.com/img/news/1683962731.jpg&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;I3yA&quot;&gt;Для работы потребуются знания С++, довольно мощный ПК и некоторое время для детального ознакомления с CryEngine. Как результат, вы получите крутую игру с “живой” графикой.&lt;/p&gt;

</content></entry><entry><id>it_guru:dqxi4mk7rlt</id><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru/dqxi4mk7rlt?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><title>Как обучить ChatGPT на личных данных</title><published>2023-05-30T10:50:32.213Z</published><updated>2023-05-30T10:50:32.213Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/6e/95/6e952952-dc49-419c-b0dd-6bac33369f87.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/ac8db18d-a310-4700-802b-fbb3fadf8906.png&quot;&gt;В этой статье мы поговорим об архитектуре LLM и требованиях к данным для создания «частного ChatGPT», который использует ваши собственные данные. Мы изучим преимущества этой технологии и то, как вы можете преодолеть её ограничения.</summary><content type="html">
  &lt;h1 id=&quot;ajlp&quot;&gt;С появлением больших языковых моделей (LLM), таких как ChatGPT и GPT-4, многие задаются вопросом, можно ли создать частный ChatGPT, обучив модель на личных или корпоративных данных. Осуществимо ли это? Могут ли такие языковые модели предложить эти возможности?&lt;/h1&gt;
  &lt;p id=&quot;9HEy&quot;&gt;В этой статье мы поговорим об архитектуре LLM и требованиях к данным для создания «частного ChatGPT», который использует ваши собственные данные. Мы изучим преимущества этой технологии и то, как вы можете преодолеть её ограничения.&lt;/p&gt;
  &lt;p id=&quot;LHjz&quot;&gt;Это перевод статьи «How to create a private ChatGPT with your own data» от автора Mick Vleeshouwer. Здесь и далее повествование ведётся от лица автора.&lt;/p&gt;
  &lt;p id=&quot;uBhw&quot;&gt;&lt;strong&gt;Отказ от ответственности:&lt;/strong&gt; в этой статье представлен обзор архитектурных концепций, которые не относятся к Azure, но проиллюстрированы с использованием служб Azure, поскольку я — Solution Architect в Microsoft.&lt;/p&gt;
  &lt;figure id=&quot;fyBo&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/ac8db18d-a310-4700-802b-fbb3fadf8906.png&quot; width=&quot;1617&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;JSYS&quot;&gt;1. Недостатки тонкой настройки LLM на личных данных&lt;/h2&gt;
  &lt;p id=&quot;0UD4&quot;&gt;Часто люди называют тонкую настройку (то есть обучение) хорошим решением, которое позволяет добавить собственные данные поверх уже обученной модели.&lt;/p&gt;
  &lt;p id=&quot;vwEy&quot;&gt;Однако у такого подхода есть недостатки: у модели могут быть сбои в ответах, она может выдавать нерелевантную запросу информацию. У GPT-4 такое явление назвали &lt;a href=&quot;https://openai.com/research/gpt-4&quot; target=&quot;_blank&quot;&gt;риском галлюцинаций&lt;/a&gt;. Всё потому, что GPT-4 обучался только на данных до сентября 2021 года.&lt;/p&gt;
  &lt;p id=&quot;E2HN&quot;&gt;Недостатки при тонкой настройке LLM:&lt;/p&gt;
  &lt;ol id=&quot;hvpK&quot;&gt;
    &lt;li id=&quot;ffPW&quot;&gt;Можно отследить, из какого датасета берется ответ.&lt;/li&gt;
    &lt;li id=&quot;B1lN&quot;&gt;Нельзя ограничить доступ к документам с информацией для отдельных пользователей.&lt;/li&gt;
    &lt;li id=&quot;1NaT&quot;&gt;Добавление новой информации для LLM требует переобучения модели.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;4anG&quot;&gt;Эти проблему делают почти невозможным использование тонкой настройки для персональных ответов на вопросы.&lt;/p&gt;
  &lt;p id=&quot;Me7A&quot;&gt;Как преодолеть ограничения и по-прежнему получать выгоду от LLM?&lt;/p&gt;
  &lt;h2 id=&quot;liCq&quot;&gt;2. Отделите свои знания от вашей языковой модели&lt;/h2&gt;
  &lt;p id=&quot;A8Y2&quot;&gt;Чтобы пользователи получали точные ответы, нам нужно отделить нашу языковую модель от нашей базы знаний. Это позволит пользователям получать наиболее актуальную информацию. Отделить данные можно в режиме реального времени, и обучение модели не требуется.&lt;/p&gt;
  &lt;p id=&quot;h3KV&quot;&gt;Будет хорошей идеей передавать все документы в модель во время выполнения. Однако это сложно сделать из-за ограничения количества символов (&lt;a href=&quot;https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them&quot; target=&quot;_blank&quot;&gt;измеряемого в токенах&lt;/a&gt;), которые могут быть обработаны за один раз.&lt;/p&gt;
  &lt;p id=&quot;eNOA&quot;&gt;Например, GPT-3 поддерживает токены до 4 КБ, GPT-4 — до 8 КБ или 32 КБ. Поскольку цены указаны за 1000 токенов, использование меньшего количества токенов также может помочь сократить расходы.&lt;/p&gt;
  &lt;p id=&quot;kI3n&quot;&gt;Вот, каким будет алгоритм:&lt;/p&gt;
  &lt;ol id=&quot;fweS&quot;&gt;
    &lt;li id=&quot;4EA5&quot;&gt;Пользователь задает вопрос.&lt;/li&gt;
    &lt;li id=&quot;xOL0&quot;&gt;Приложение находит наиболее релевантный текст, который (скорее всего) содержит ответ.&lt;/li&gt;
    &lt;li id=&quot;V9ni&quot;&gt;LLM отправляется краткая подсказка с соответствующим текстом документа.&lt;/li&gt;
    &lt;li id=&quot;xLLR&quot;&gt;Пользователь получит ответ или ответ «Ответ не найден».&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;Wt0L&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/502004a6-620a-4bdc-8995-ad3f10310514.png&quot; width=&quot;2406&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;SzDj&quot;&gt;Этот подход часто называют обоснованием модели. Мы предоставим дополнительный контекст для LLM, чтобы она отвечала на вопросы на основе соответствующих ресурсов.&lt;/p&gt;
  &lt;h2 id=&quot;muKe&quot;&gt;3. Получите наиболее релевантные данные&lt;/h2&gt;
  &lt;p id=&quot;sKPa&quot;&gt;Контекст — это ключевой аспект в настройке.&lt;/p&gt;
  &lt;p id=&quot;EQHE&quot;&gt;Чтобы гарантировать, что языковая модель использует нужную информацию, нам необходимо создать базу данных, которую можно использовать для поиска релевантных документов с помощью семантического поиска.&lt;/p&gt;
  &lt;p id=&quot;1sih&quot;&gt;Так мы предоставим языковой модели правильный контекст, и она сможет генерировать правильный ответ.&lt;/p&gt;
  &lt;h3 id=&quot;7r2u&quot;&gt;3.1 Разбивайте и разделяйте данные&lt;/h3&gt;
  &lt;p id=&quot;UvSU&quot;&gt;Поскольку в подсказке для ответа есть ограничение на токены, нам нужно дробить наши документы на более мелкие куски.&lt;/p&gt;
  &lt;p id=&quot;ShiF&quot;&gt;Можно начать &lt;a href=&quot;https://python.langchain.com/en/latest/reference/modules/text_splitter.html&quot; target=&quot;_blank&quot;&gt;с простого разделения документа на страницы&lt;/a&gt;, чтобы текст страницы был равен длине токена.&lt;/p&gt;
  &lt;p id=&quot;AuKG&quot;&gt;После этого нужно создать поисковые индексы для фрагментов текста, которые можно запрашивать с вопросом пользователя.&lt;/p&gt;
  &lt;p id=&quot;D7DI&quot;&gt;&lt;strong&gt;Вариант 1: Используйте поисковый продукт&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;Fe3v&quot;&gt;Самый простой способ создать индекс семантического поиска — использовать существующую платформу «Поиск как услуга».&lt;/p&gt;
  &lt;p id=&quot;3TF6&quot;&gt;Например, в Azure можно использовать Cognitive Search, который предлагает управляемый конвейер приема документов и &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/search/semantic-ranking&quot; target=&quot;_blank&quot;&gt;семантическое ранжирование&lt;/a&gt; с использованием языковых моделей Bing.&lt;/p&gt;
  &lt;p id=&quot;7cL7&quot;&gt;&lt;strong&gt;Вариант 2: Используйте вложения для создания собственного семантического поиска&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;se0v&quot;&gt;Вложение — это вектор (список) чисел с плавающей запятой. &lt;a href=&quot;https://platform.openai.com/docs/guides/embeddings/which-distance-function-should-i-use&quot; target=&quot;_blank&quot;&gt;Расстояние между двумя векторами&lt;/a&gt;измеряет их родство. Небольшие расстояния предполагают высокое родство, а большие расстояния предполагают низкое родство.&lt;/p&gt;
  &lt;p id=&quot;Bgng&quot;&gt;Если вы хотите использовать новейшие семантические модели и лучше контролировать свой поисковый индекс, вы можете использовать модели встраивания текста от OpenAI. Для всех ваших разделов вам нужно будет предварительно вычислить вложения и сохранить их.&lt;/p&gt;
  &lt;p id=&quot;BYzl&quot;&gt;В Azure можно хранить вложения в управляемой векторной базе данных, такой как Azure Cache для Redis (RediSearch), или в векторной базе данных с открытым исходным кодом, такой как Weaviate или Pinecone.&lt;/p&gt;
  &lt;p id=&quot;2ZLC&quot;&gt;Во время работы приложения вы должны превратить вопрос пользователя во вложение, чтобы сравнить косинусное сходство встраивания вопроса с вложениями документов.&lt;/p&gt;
  &lt;figure id=&quot;ABBf&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/2ad91910-3f8a-4cc5-b2cf-bca8d0a24fe3.png&quot; width=&quot;3248&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;DJM4&quot;&gt;3.2 Повышение релевантности с помощью различных стратегий фрагментации&lt;/h3&gt;
  &lt;p id=&quot;Jsd0&quot;&gt;Чтобы находить наиболее актуальную информацию, важно, чтобы вы понимали свои данные и потенциальные запросы пользователей. Это знание поможет понять, как лучше всего разделить данные на фрагменты.&lt;/p&gt;
  &lt;p id=&quot;Ej6X&quot;&gt;&lt;strong&gt;Общие шаблоны, которые могут улучшить релевантность:&lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;PQmn&quot;&gt;
    &lt;li id=&quot;ucnR&quot;&gt;Фрагментация по странице или по токену может привести к потере контекста. Используйте связанный друг с другом контент во фрагментах, чтобы увеличить выдачу наиболее релевантной информации.&lt;/li&gt;
    &lt;li id=&quot;OJZm&quot;&gt;Обеспечьте больше контекста. Создайте очень структурированный документ с разделами, вложенными в несколько уровней (например, с разделами вида 1.3.3.7). Такой подход будет удачным, поскольку он даёт дополнительный контекст вроде названия главы и раздела.&lt;/li&gt;
    &lt;li id=&quot;535a&quot;&gt;Создайте фрагменты с кратким содержанием более крупного раздела документа. Это позволит включить в ответ самый важный текст и объединить всю информацию в один блок.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;pSnJ&quot;&gt;4. Пишите краткие промпты, чтобы избежать галлюцинаций&lt;/h2&gt;
  &lt;p id=&quot;MfLp&quot;&gt;&lt;a href=&quot;https://platform.openai.com/docs/guides/completion/prompt-design&quot; target=&quot;_blank&quot;&gt;Разработка промптов&lt;/a&gt; — это то, как вы «программируете» модель, обычно предоставляя ей инструкции в промпте или несколько примеров.&lt;/p&gt;
  &lt;p id=&quot;hHGz&quot;&gt;Промпт — это важная часть в работе с ChatGPT для предотвращения нежелательных ответов. Сегодня создание промптов считается новым навыком, и каждую неделю публикуется все больше и больше примеров промптов.&lt;/p&gt;
  &lt;p id=&quot;SdO0&quot;&gt;В промптах вы должны четко указать, что модель должна быть краткой в ответе и использовать только данные из релевантного контекста.&lt;/p&gt;
  &lt;p id=&quot;ZdNn&quot;&gt;Если модель не может ответить на вопрос, она должна дать предопределенный ответ «нет ответа».&lt;/p&gt;
  &lt;p id=&quot;6oOf&quot;&gt;Выходные данные должны включать сноску (цитаты) к исходному документу, чтобы пользователь мог проверить его фактическую точность, просмотрев источник.&lt;/p&gt;
  &lt;p id=&quot;IMlp&quot;&gt;&lt;strong&gt;Пример промпта:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;PyKv&quot;&gt;&amp;quot;You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. &amp;quot; + \
&amp;quot;Use &amp;#x27;you&amp;#x27; to refer to the individual asking the questions even if they ask with &amp;#x27;I&amp;#x27;. &amp;quot; + \
&amp;quot;Answer the following question using only the data provided in the sources below. &amp;quot; + \
&amp;quot;For tabular information return it as an html table. Do not return markdown format. &amp;quot;  + \
&amp;quot;Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. &amp;quot; + \
&amp;quot;If you cannot answer using the sources below, say you don&amp;#x27;t know. &amp;quot; + \
&amp;quot;&amp;quot;&amp;quot;
###
Question: &amp;#x27;What is the deductible for the employee plan for a visit to Overlake in Bellevue?&amp;#x27;
Sources:
info1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.
info2.pdf: Overlake is in-network for the employee plan.
info3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.
info4.pdf: In-network institutions include Overlake, Swedish and others in the region
Answer:
In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].
###
Question: &amp;#x27;{q}&amp;#x27;?
Sources:
{retrieved}
Answer:
&amp;quot;&amp;quot;&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;h5R3&quot;&gt;Такое обучение модели нужно для улучшения качества ответов. Мы предоставляем модели пример того, как нужно обрабатывать вопрос пользователя. Также мы предоставляем источники с уникальным идентификатором и пример ответа, который состоит из текста из нескольких источников.&lt;/p&gt;
  &lt;p id=&quot;nQas&quot;&gt;Во время выполнения &lt;code&gt;{q}&lt;/code&gt;превратится в вопрос пользователя, а &lt;code&gt;{retrieved}&lt;/code&gt; будет заполнен соответствующими разделами из БД для запроса.&lt;/p&gt;
  &lt;p id=&quot;fyUp&quot;&gt;Не забудьте установить низкую температуру в ваших параметрах, если вы хотите получать предсказуемые ответы. Повышение температуры приведет к более неожиданным или творческим ответам.&lt;/p&gt;
  &lt;p id=&quot;A539&quot;&gt;Этот промпт используется для создания ответа через (Azure) OpenAI API.&lt;/p&gt;
  &lt;p id=&quot;x3F2&quot;&gt;Если вы используете gpt-35-turbo (ChatGPT), можно сохранять историю разговора, чтобы была возможность задавать уточняющие вопросы или другие логические задачи (например, резюмирование ответа).&lt;/p&gt;
  &lt;p id=&quot;TY3b&quot;&gt;Отличный ресурс, чтобы узнать больше о проектировании промптов — это &lt;a href=&quot;https://github.com/dair-ai/Prompt-Engineering-Guide&quot; target=&quot;_blank&quot;&gt;dair-ai/Prompt-Engineering-Guide&lt;/a&gt; на GitHub.&lt;/p&gt;
  &lt;figure id=&quot;JbvN&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://i.ytimg.com/vi_webp/E5g20qmeKpg/maxresdefault.jpg&quot; width=&quot;120&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;d8gD&quot;&gt;5. Следующие шаги&lt;/h2&gt;
  &lt;p id=&quot;guap&quot;&gt;В этой статье я обсудил архитектуру и паттерны проектирования, необходимые для реализации личной языковой модели, не вдаваясь в особенности кода.&lt;/p&gt;
  &lt;p id=&quot;gRoa&quot;&gt;Вот, какие проекты вы можете изучить для вдохновения, чтобы приступить к созданию индивидуальной модели.&lt;/p&gt;
  &lt;ol id=&quot;D9W5&quot;&gt;
    &lt;li id=&quot;WOV4&quot;&gt;&lt;a href=&quot;https://github.com/openai/chatgpt-retrieval-plugin&quot; target=&quot;_blank&quot;&gt;Плагин извлечения ChatGPT&lt;/a&gt;, позволяющий ChatGPT получать доступ к актуальной информации. На данный момент плагин поддерживает только общедоступный ChatGPT, но мы надеемся, что в будущем возможность добавления плагинов будет добавлена в ChatGPT API (OpenAI + Azure).&lt;/li&gt;
    &lt;li id=&quot;xe4D&quot;&gt;&lt;a href=&quot;https://github.com/hwchase17/langchain&quot; target=&quot;_blank&quot;&gt;LangChain&lt;/a&gt;, популярная библиотека для объединения LLM и других источников знаний.&lt;/li&gt;
    &lt;li id=&quot;LcjR&quot;&gt;&lt;a href=&quot;https://github.com/Azure-Samples/azure-search-openai-demo&quot; target=&quot;_blank&quot;&gt;Azure Cognitive Search + OpenAI accelerator&lt;/a&gt; для работы с личными данными. Он аналогичен ChatGPT и готов к развертыванию.&lt;/li&gt;
    &lt;li id=&quot;crxr&quot;&gt;&lt;a href=&quot;https://github.com/openai/openai-cookbook/blob/main/examples/Question_answering_using_embeddings.ipynb&quot; target=&quot;_blank&quot;&gt;OpenAI Cookbook&lt;/a&gt;, пример того, как использовать вложения OpenAI для вопросов и ответов в Jupyter (инфраструктура не требуется).&lt;/li&gt;
    &lt;li id=&quot;NXNG&quot;&gt;&lt;a href=&quot;https://devblogs.microsoft.com/semantic-kernel/hello-world/&quot; target=&quot;_blank&quot;&gt;Semantic Kernel&lt;/a&gt;, новая библиотека для смешивания традиционных языков программирования с LLM.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;0Ujj&quot;&gt;Можно улучшить «собственный ChatGPT», связав его с другими системами при помощи LangChain или Semantic Kernel. Возможности безграничны.&lt;/p&gt;
  &lt;h2 id=&quot;igHo&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;ooZ1&quot;&gt;В заключение, полагаться исключительно на языковую модель для создания информационного текста — ошибка.&lt;/p&gt;
  &lt;p id=&quot;0UBp&quot;&gt;Тонкая настройка модели также не поможет, так как она не даст модели никаких новых знаний и не даст вам возможности проверить ее реакцию.&lt;/p&gt;
  &lt;figure id=&quot;Lud8&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/3d14e3bd-8266-423a-9fde-efb53e7fce3e.png&quot; width=&quot;3280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;x779&quot;&gt;Чтобы создать механизм вопросов и ответов поверх LLM, отделите свою базу знаний от большой языковой модели и генерируйте ответы только на основе предоставленного контекста&lt;/p&gt;

</content></entry><entry><id>it_guru:P-hkyoujoyd</id><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru/P-hkyoujoyd?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><title>⠀</title><published>2023-05-28T11:48:26.056Z</published><updated>2023-05-28T11:48:26.056Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/8e/08/8e08ea9e-0f10-4f6f-8eed-42bd7dd153be.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/bebba6b9-ba3e-4305-96de-92ebc347486b.png&quot;&gt;Программное обеспечение с открытым исходным кодом (OSS) — это революция в разработке ПО.</summary><content type="html">
  &lt;h1 id=&quot;zM0K&quot;&gt;Топ-7 лучших проектов с открытым исходным кодом на GitHub 2023&lt;/h1&gt;
  &lt;p id=&quot;aSRy&quot;&gt;Программное обеспечение с открытым исходным кодом (OSS) — это революция в разработке ПО.&lt;/p&gt;
  &lt;p id=&quot;ZOMy&quot;&gt;На GitHub можно найти миллионы проектов с открытым исходным кодом, но их так много, что сложно найти лучшие проекты, соответствующие вашим потребностям.&lt;/p&gt;
  &lt;p id=&quot;2WVG&quot;&gt;В этой статье перечислены 7 самых быстрорастущих open-source репозиториев GitHub, о которых вам следует знать.&lt;/p&gt;
  &lt;h2 id=&quot;tBrG&quot;&gt;1. RLHF + PaLM: альтернатива ChatGPT с открытым исходным кодом&lt;/h2&gt;
  &lt;p id=&quot;WpNi&quot;&gt;RLHF + PaLM — это незавершенная реализация языковой модели. Она сочетает обучение с подкреплением обратной связью от человека (RLHF) и архитектуру PaLM.&lt;/p&gt;
  &lt;p id=&quot;S0KI&quot;&gt;Разработчики создают версию модели, аналогичную ChatGPT, но с дополнительными преимуществами архитектуры PaLM.&lt;/p&gt;
  &lt;p id=&quot;llZk&quot;&gt;К сожалению, для этого решения не предусмотрена предварительно обученная модель.&lt;/p&gt;
  &lt;figure id=&quot;mkty&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/bebba6b9-ba3e-4305-96de-92ebc347486b.png&quot; width=&quot;977&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;tMy9&quot;&gt;GitHub — lucidrains/PaLM-rlhf-pytorch: Implementation of RLHF (Reinforcement Learning with Human Feedback) on top of the PaLM architecture. Basically ChatGPT but with PaLM&lt;/p&gt;
  &lt;p id=&quot;8WO0&quot;&gt;github.com&lt;/p&gt;
  &lt;h2 id=&quot;c544&quot;&gt;2. RATH — альтернатива Tableau с открытым исходным кодом&lt;/h2&gt;
  &lt;p id=&quot;II65&quot;&gt;RATH — это новое решение, у которого одно из самых быстрорастущих сообществ на GitHub.&lt;/p&gt;
  &lt;p id=&quot;YZyT&quot;&gt;Благодаря передовым технологиям, новаторскому подходу к анализу и визуализации данных RATH быстро завоевала популярность среди профессионалов.&lt;/p&gt;
  &lt;p id=&quot;jgEJ&quot;&gt;Сообщество RATH быстро растет: разработчики, Data Scientists и бизнес-аналитики вносят свой вклад в развитие проекта и делятся идеями о том, как максимально использовать его потенциал.&lt;/p&gt;
  &lt;p id=&quot;LDcr&quot;&gt;Являетесь вы опытным аналитиком данных или только начинаете, RATH — это обязательный инструмент для всех, кто хочет улучшить навыки анализа и визуализации данных.&lt;/p&gt;
  &lt;figure id=&quot;kluC&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/e04ba5d0-c1da-49aa-869b-fdabc57c5883.png&quot; width=&quot;3018&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MQDL&quot;&gt;GitHub — Kanaries/Rath: Next generation of automated data exploratory analysis and visualization platform.&lt;/p&gt;
  &lt;p id=&quot;4syp&quot;&gt;github.com&lt;/p&gt;
  &lt;h2 id=&quot;pcC3&quot;&gt;3. Gogs — альтернатива GitHub с открытым исходным кодом&lt;/h2&gt;
  &lt;p id=&quot;xAMW&quot;&gt;Gogs предлагает удобный интерфейс для управления версиями Git, что делает его отличной альтернативой GitHub. У Gogs есть отслеживание проблем, пулл реквесты и вики.&lt;/p&gt;
  &lt;p id=&quot;6ZR5&quot;&gt;Благодаря возможности самостоятельного размещения и настройки Gogs представляет собой гибкое и безопасное решение для совместной работы с Git.&lt;/p&gt;
  &lt;figure id=&quot;KFpW&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/cada477f-7482-415b-a9aa-ce12f948b571.png&quot; width=&quot;2133&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;yqzV&quot;&gt;GitHub — gogs/gogs: Gogs is a painless self-hosted Git service&lt;/p&gt;
  &lt;p id=&quot;BMla&quot;&gt;github.com&lt;/p&gt;
  &lt;h2 id=&quot;0ald&quot;&gt;4. NocoDB — альтернатива AirTable с открытым исходным кодом&lt;/h2&gt;
  &lt;p id=&quot;1C9k&quot;&gt;NocoDB — это гибкая и масштабируемая платформа данных, которая поддерживает SQL, NoSQL и Graph.&lt;/p&gt;
  &lt;p id=&quot;eq2l&quot;&gt;У NocoDB простой, но мощный интерфейс для создания баз данных и управления ими. Также у инструмента есть обновление данных в режиме реального времени.&lt;/p&gt;
  &lt;p id=&quot;SPtb&quot;&gt;NocoDB — отличная альтернатива Airtable для тех, кому нужно больше контроля и настроек для данных.&lt;/p&gt;
  &lt;figure id=&quot;3On9&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/7f449b8a-c382-4105-88f1-aa4bc77353d0.png&quot; width=&quot;1174&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;aHAN&quot;&gt;GitHub — nocodb/nocodb: 🔥 🔥 🔥 Open Source Airtable Alternative&lt;/p&gt;
  &lt;p id=&quot;hW84&quot;&gt;github.com&lt;/p&gt;
  &lt;h2 id=&quot;RD41&quot;&gt;5. Rocket.Chat — альтернатива Slack с открытым исходным кодом&lt;/h2&gt;
  &lt;p id=&quot;uM8m&quot;&gt;Rocket.Chat обеспечивает общение для команд не только текстом, но и голосовыми и видеозвонками, совместным использованием экрана и обменом файлами.&lt;/p&gt;
  &lt;p id=&quot;6SUA&quot;&gt;Он обладает широкими возможностями настройки и может быть развёрнут на сервере самостоятельно или использоваться в качестве облачного решения.&lt;/p&gt;
  &lt;p id=&quot;NgYD&quot;&gt;Благодаря своим мощным инструментам для совместной работы Rocket.Chat является отличной альтернативой Slack.&lt;/p&gt;
  &lt;figure id=&quot;vOqM&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/682127ca-b022-43c1-ad69-e2a72809b0c3.jpg&quot; width=&quot;1838&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;L1QL&quot;&gt;GitHub — RocketChat/Rocket.Chat: The communications platform that puts data protection first.&lt;/p&gt;
  &lt;p id=&quot;gbEC&quot;&gt;github.com&lt;/p&gt;
  &lt;h2 id=&quot;RFfs&quot;&gt;6. Plausible Analytics — альтернатива Google Analytics&lt;/h2&gt;
  &lt;p id=&quot;KUST&quot;&gt;Plausible Analytics — это безопасная аналитика, которая предоставляет подробные отчеты об активности на веб-сайте в режиме реального времени и без сбора личных данных.&lt;/p&gt;
  &lt;p id=&quot;ZNH7&quot;&gt;Она также предлагает простой и интуитивно понятный интерфейс для отображения производительности веб-сайта.&lt;/p&gt;
  &lt;figure id=&quot;wi0D&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2023/05/be499f07-1624-474d-9363-3a9dad756d6f.png&quot; width=&quot;1600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;QLgC&quot;&gt;GitHub — plausible/analytics: Simple, open-source, lightweight (&amp;lt; 1 KB) and privacy-friendly web analytics alternative to Google Analytics.&lt;/p&gt;
  &lt;p id=&quot;l0RC&quot;&gt;github.com&lt;/p&gt;
  &lt;h2 id=&quot;njg1&quot;&gt;7. Mastodon — альтернатива Твиттеру с открытым исходным кодом&lt;/h2&gt;
  &lt;p id=&quot;clAe&quot;&gt;Mastodon — это альтернатива централизованным социальным сетям, таким как Twitter.&lt;/p&gt;
  &lt;p id=&quot;zepe&quot;&gt;Это децентрализованная сеть серверов, которая позволяет пользователям общаться друг с другом, обмениваться контентом и участвовать в онлайн-сообществах.&lt;/p&gt;
  &lt;p id=&quot;Pele&quot;&gt;Она предлагает многие из тех же функций, что и традиционные социальные сети, включая возможность публиковать обновления, обмениваться изображениями и видео, а также взаимодействовать с другими пользователями через лайки, комментарии и репосты.&lt;/p&gt;
  &lt;p id=&quot;JeHi&quot;&gt;Mastodon уделяет большое внимание конфиденциальности, свободе слова и контролю над своей личностью в Интернете, что делает его популярным среди пользователей, которые ценят эти принципы.&lt;/p&gt;
  &lt;p id=&quot;JCnr&quot;&gt;GitHub — mastodon/mastodon: Your self-hosted, globally interconnected microblogging community&lt;/p&gt;
  &lt;p id=&quot;PIcz&quot;&gt;github.com&lt;/p&gt;
  &lt;h2 id=&quot;arEr&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;AMk7&quot;&gt;Эти 7 репозиториев GitHub с открытым исходным кодом — свидетельство активного и процветающего сообщества разработчиков Open Source кода.&lt;/p&gt;
  &lt;p id=&quot;5Hgh&quot;&gt;Они предлагают бесплатные альтернативы проприетарным решениям как для разработчиков или аналитиков данных, так и для бизнеса.&lt;/p&gt;
  &lt;p id=&quot;hYV6&quot;&gt;Используя преимущества открытого исходного кода, эти проекты оказались надежными и эффективными решениями, поэтому они, безусловно, заслуживают изучения и поддержки.&lt;/p&gt;

</content></entry><entry><id>it_guru:khV9jIIsBrY</id><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru/khV9jIIsBrY?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><title>⠀</title><published>2023-05-19T19:04:25.456Z</published><updated>2023-05-19T19:04:25.456Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/cc/0d/cc0d9cdd-abdc-46a2-bd88-84a045140366.png"></media:thumbnail><summary type="html">Собрали для вас несколько простых задач по JavaScript для обучения и тренировки, а также пару теоретических вопросов. Задачи расположены в порядке возрастания сложности.</summary><content type="html">
  &lt;h2 id=&quot;eFCu&quot;&gt;Задачи по JavaScript для начинающих.&lt;/h2&gt;
  &lt;p id=&quot;jkJI&quot;&gt;Собрали для вас несколько простых задач по JavaScript для обучения и тренировки, а также пару теоретических вопросов. Задачи расположены в порядке возрастания сложности.&lt;/p&gt;
  &lt;p id=&quot;Cu9U&quot;&gt;Обратите внимание, что у любой задачи по программированию может быть несколько способов решения. Чтобы посмотреть добавленный нами вариант решения, кликните по соответствующей кнопке.&lt;/p&gt;
  &lt;h2 id=&quot;qzHt&quot;&gt;Задача 1&lt;/h2&gt;
  &lt;p id=&quot;GIZv&quot;&gt;Напишите однострочное решение, которое вычисляет сумму квадратных корней для всех чётных чисел целочисленного массива.&lt;/p&gt;
  &lt;p id=&quot;zT9Q&quot;&gt;Вариант решения:&lt;/p&gt;
  &lt;pre id=&quot;ZY00&quot;&gt;console.log(
 // Входной массив
 [1, 4, 3, 0, 4, 5, 4]
   // Оставляем только чётные числа
   .filter(element =&amp;gt; !(element % 2))
   // Считаем квадратный корень и записываем в аккумулятор
   .reduceRight((accumulator, element) =&amp;gt; accumulator + Math.sqrt(element), 0)
); // 6&lt;/pre&gt;
  &lt;p id=&quot;YHcJ&quot;&gt;Метод &lt;code&gt;reduceRight()&lt;/code&gt; применяет функцию к аккумулятору и каждому значению массива (справа налево), сводя его к одному значению. А метод &lt;code&gt;reduce()&lt;/code&gt; выполняет функцию &lt;code&gt;callback&lt;/code&gt; один раз для каждого элемента, присутствующего в массиве, за исключением пустот, принимая четыре аргумента:&lt;/p&gt;
  &lt;ul id=&quot;ewYV&quot;&gt;
    &lt;li id=&quot;NyOx&quot;&gt;начальное значение (или значение от предыдущего вызова &lt;code&gt;callback&lt;/code&gt;);&lt;/li&gt;
    &lt;li id=&quot;dz2J&quot;&gt;значение текущего элемента;&lt;/li&gt;
    &lt;li id=&quot;iMOL&quot;&gt;текущий индекс;&lt;/li&gt;
    &lt;li id=&quot;Ogrq&quot;&gt;массив, по которому происходит итерация.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;KAjB&quot;&gt;Задача 2&lt;/h2&gt;
  &lt;p id=&quot;Q2Nd&quot;&gt;Напишите функцию, которая пишет в консоль число в заданном диапазоне, в случае, если оно успешно делится или не делится с остатком или без остатка в зависимости от параметров.&lt;/p&gt;
  &lt;p id=&quot;mNhZ&quot;&gt;Вариант решения:&lt;/p&gt;
  &lt;pre id=&quot;qmeL&quot;&gt;function getNumbersModulatordBy(modulus, loggerCallback) {
 // Функция, которая возвращает функцию - это подход из функционального программирования
 // Называется замыканием (Closure)
 return function(start, end) {
   loggerCallback({ message: &amp;quot;Конфигурация&amp;quot;, config: configuration });
   loggerCallback({ message: &amp;quot;Полученный модулятор&amp;quot;, modulus: modulus });
   loggerCallback({
     message: &amp;quot;Полученный start и end&amp;quot;,
     start: start,
     end: end
   });

   while (start &amp;lt;= end) {
     // Стоит обратить внимание:
     // 1. При нестрогом равенстве true == 1 и false == 0
     // 2. Здесь мы обращаемся к глобальному контексту configuration
     // p.s. поле isEntry может меняться
     if (start % modulus == configuration.isEntry) {
       // В данном случае мы используем loggerCallback как middleware
       // Это определит дальнейшую судьбу результата
       // Позволяет убрать side-effect
       loggerCallback(start);
     }
     start++;
   }
 };
}

// Глобальный контекст не имеет блочной видимости
// В данном случае переменная поднимается выше в самое начало кода
// Исполнитель JavaScript видит её в независимости от места инициализации
var configuration = {
 modulus: 10,
 isEntry: false,
 start: 45,
 end: 68
};

var loggerCallback = data =&amp;gt; console.log(data);

let tenNumbersModulator = getNumbersModulatordBy(
 configuration.modulus,
 loggerCallback
);

// Переменные с глобальным контекстом доступны из:
// 1. globalThis (в Node.js)
// 2. window (в браузере)
window.configuration.modulus = 5;

let fiveNumbersModulator = getNumbersModulatordBy(
 configuration.modulus,
 loggerCallback
);

tenNumbersModulator(configuration.start, configuration.end); // 50, 60
tenNumbersModulator(10, 100); // 10, 20, 30, 40, 50, 60, 70, 80, 90, 100

// Так как мы изменили поле isEntry, то теперь:
// Функция вернёт те значения, которые не входят в модуляцию числа
window.configuration.isEntry = true;

fiveNumbersModulator(configuration.start, configuration.end); // 46, 51, 56, 61, 66
fiveNumbersModulator(10, 21); // 11, 16, 21&lt;/pre&gt;
  &lt;h2 id=&quot;56u1&quot;&gt;Задача 3&lt;/h2&gt;
  &lt;p id=&quot;QBXg&quot;&gt;Есть ферма животных, у всех животных есть имена и возраст. Животные бывают разных типов: Кошки, Собаки, Коровы. У каждого животного могут быть дети. Если животное является родителем этих детей, в свою очередь глубина семейного древа может достигать &lt;code&gt;N&lt;/code&gt;либо &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;YZz8&quot;&gt;Опишите структуры данных для фермы животных и напишите функцию, которая делает подсчёт всех возрастов животных и выводит общий возраст для всей фермы.&lt;/p&gt;
  &lt;p id=&quot;e1Yr&quot;&gt;Вариант решения:&lt;/p&gt;
  &lt;pre id=&quot;qo4n&quot;&gt;// Родительский класс для всех животных
class Animal {
 constructor(name, age, childs = null) {
   this.name = name;
   this.age = age;
   this.childs = childs;
 }
}

// Класс Cat - потомок класса Animal
// Имеет те же поля, что и Animal
class Cat extends Animal {
 constructor(name, age, childs = null) {
   super(name, age, childs);
 }
}

// Класс Dog - потомок класса Animal
// Имеет те же поля, что и Animal
class Dog extends Animal {
 constructor(name, age, childs = null) {
   super(name, age, childs);
 }
}

// Класс Cow - потомок класса Animal
// Имеет те же поля, что и Animal
class Cow extends Animal {
 constructor(name, age, childs = null) {
   super(name, age, childs);
 }
}

// Рекурсивная функция для подсчета age
// Обходит все дочерние элементы
function getAnimalsAge(animals) {
 let output = 0;

 if (animals.length &amp;gt; 0) {
   // Использование функции reduce для получения общего age
   // https://learn.javascript.ru/array-iteration
   output += animals.reduce((acc, current) =&amp;gt; {
     // Сумма age всех childs
     let count = 0;
     // Если childs пустой или его нет, тогда нет смысла пробегать по ним
     if (current.childs &amp;amp;&amp;amp; current.childs.length &amp;gt; 0) {
       // Применение рекурсии
       count += getAnimalsAge(current.childs);
     }

     // Возвращаем сумму аккумулятора, текущего животного, сумму age всех childs
     return acc + current.age + count;
   }, 0);
 }

 return output;
}

// Функция для получения определённого количества животных
function generateAnimals(type, count) {
 let output = [];

 for (let i = 0; i &amp;lt;= count; i++) {
   let parameter = {
     name: &amp;#x60;${type} ${i}&amp;#x60;,
     age: i,
     childs: []
   };

   let item = null;

   switch (type) {
     case &amp;quot;Cat&amp;quot;:
       item = new Cat(parameter.name, parameter.age);
       break;
     case &amp;quot;Dog&amp;quot;:
       item = new Dog(parameter.name, parameter.age);
       break;
     case &amp;quot;Cow&amp;quot;:
       item = new Cow(parameter.name, parameter.age);
       break;
   }

   if (item) {
     output.push(item);
   }
 }

 return output;
}

// Добавление childs ко всем переданным животным
function addChildsTo(animals, count, type) {
 animals.forEach(animal =&amp;gt; {
   if (!animal.childs) {
     animal.childs = [];
   }
   // Обратите внимание, что массив - ссылка, поэтому изменяя здесь его поля
   // мы меняем их глобально
   animal.childs = generateAnimals(type, count);
 });
}

let cats = generateAnimals(&amp;quot;Cat&amp;quot;, 5);
addChildsTo(cats, 10, &amp;quot;Cat&amp;quot;);

let dogs = generateAnimals(&amp;quot;Dog&amp;quot;, 3);
addChildsTo(dogs, 3, &amp;quot;Dog&amp;quot;);

let cows = generateAnimals(&amp;quot;Cow&amp;quot;, 7);
addChildsTo(cows, 1, &amp;quot;Dog&amp;quot;);

// Использование оператора Spread (ES6)
// https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Spread_syntax
let animals = [...cats, ...dogs, ...cows];

console.log(getAnimalsAge(animals)) // 411&lt;/pre&gt;
  &lt;h2 id=&quot;xsFr&quot;&gt;Задача 4&lt;/h2&gt;
  &lt;p id=&quot;ukgS&quot;&gt;Перепишите функцию &lt;code&gt;clone&lt;/code&gt; таким образом, чтобы она была способна клонировать переданный как параметр объект.&lt;/p&gt;
  &lt;p id=&quot;XKa1&quot;&gt;Пример проблемы:&lt;/p&gt;
  &lt;pre id=&quot;wsae&quot;&gt;let animal = {
 name: &amp;quot;animal&amp;quot;,
 age: 10,
 childs: [&amp;quot;child 1&amp;quot;, &amp;quot;child 2&amp;quot;]
};

let cat = clone(animal);
cat.name = &amp;quot;cat&amp;quot;;
cat.age = 5;
cat.childs.push(&amp;quot;child 3&amp;quot;);

console.log(cat.name, cat.age); // cat 5
console.log(cat.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

console.log(animal.name, animal.age); // cat 5
console.log(animal.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

function clone(obj) {
 return obj;
}&lt;/pre&gt;
  &lt;p id=&quot;6KLy&quot;&gt;Варианты решения:&lt;/p&gt;
  &lt;h3 id=&quot;3DrA&quot;&gt;Deep copy (глубокое копирование)&lt;/h3&gt;
  &lt;pre id=&quot;Dc6P&quot;&gt;console.log(cat.name, cat.age); // cat 5
console.log(cat.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

console.log(animal.name, animal.age); // animal 10
console.log(animal.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27; ]

// Отличный вариант для JSON-safe объектов
let clone = (obj) =&amp;gt; JSON.parse(JSON.stringify(obj));

// Опасен для рекурсивных объектов или когда имеется конструктор с параметрами
let clone = obj =&amp;gt; {
 if (obj === null || typeof obj !== &amp;quot;object&amp;quot; || &amp;quot;isActiveClone&amp;quot; in obj)
   return obj;

 if (obj instanceof Date) var temp = new obj.constructor();
 //or new Date(obj);
 else var temp = obj.constructor();

 for (var key in obj) {
   if (Object.prototype.hasOwnProperty.call(obj, key)) {
     obj[&amp;quot;isActiveClone&amp;quot;] = null;
     temp[key] = clone(obj[key]);
     delete obj[&amp;quot;isActiveClone&amp;quot;];
   }
 }
 return temp;
};&lt;/pre&gt;
  &lt;h3 id=&quot;vc3b&quot;&gt;Experimental deep copy (экспериментальное глубокое копирование)&lt;/h3&gt;
  &lt;p id=&quot;ZCrH&quot;&gt;Как &lt;a href=&quot;https://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-deep-clone-an-object-in-javascript/10916838#10916838&quot; target=&quot;_blank&quot;&gt;пишут&lt;/a&gt; на Stack Overflow, HTML-стандарт включает в себя &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm&quot; target=&quot;_blank&quot;&gt;алгоритм структурированного клонирования&lt;/a&gt;, который может создавать глубокие копии объектов. Он всё ещё ограничен встроенными типами, но в дополнение к тем типам, что поддерживаются в JSON, поддерживает Dates, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas, Sparse Arrays, Typed Arrays и, вероятно, больше в будущем. Решает также проблемы цикличных и рекурсивных структур, которые ломают JSON.&lt;/p&gt;
  &lt;pre id=&quot;7Hrk&quot;&gt;console.log(cat.name, cat.age); // cat 5
console.log(cat.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

console.log(animal.name, animal.age); // animal 10
console.log(animal.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27; ]

let clone = (obj) =&amp;gt; require(&amp;quot;v8&amp;quot;).deserialize(require(&amp;quot;v8&amp;quot;).serialize(obj));&lt;/pre&gt;
  &lt;h3 id=&quot;4hND&quot;&gt;Shallow copy (поверхностное копирование)&lt;/h3&gt;
  &lt;p id=&quot;pO7V&quot;&gt;Клонирование вложенных свойств по ссылке пропускается, нужно быть осторожным в использовании.&lt;/p&gt;
  &lt;pre id=&quot;hTHj&quot;&gt;console.log(cat.name, cat.age); // cat 5
console.log(cat.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

console.log(animal.name, animal.age); // animal 10
console.log(animal.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

// Копирует значение всех собственных итерируемых элементов объекта
let clone = (obj) =&amp;gt; Object.assign(new Object(), obj);
// Более известен как оператор Spread
let clone = (obj) =&amp;gt; { ...obj };&lt;/pre&gt;
  &lt;h2 id=&quot;GbP9&quot;&gt;Задача 5&lt;/h2&gt;
  &lt;p id=&quot;7vy1&quot;&gt;Выйдите из цикла, изменив только две отмеченные строки. Результат в консоли сейчас останавливается на &lt;code&gt;9 9&lt;/code&gt;. Должен на &lt;code&gt;5 4&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;A3NV&quot;&gt;for (let i = 0; i &amp;lt; 10; i++) { //! Эту строку можно изменить
 for (let j = 0; j &amp;lt; 10; j++) {
   if (i === 5 &amp;amp;&amp;amp; j === 5) {
     //! Эту строку можно изменить
   }

   console.log(i, j);
 }
}&lt;/pre&gt;
  &lt;p id=&quot;mJVu&quot;&gt;Вариант решения:&lt;/p&gt;
  &lt;p id=&quot;kNTC&quot;&gt;Как &lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/label&quot; target=&quot;_blank&quot;&gt;пишут&lt;/a&gt; на MDN web docs, инструкция метки (label) используется вместе с &lt;code&gt;break&lt;/code&gt; или &lt;code&gt;continue&lt;/code&gt; для альтернативного выхода из цикла. Метка добавляется перед блочным выражением в качестве ссылки, которая может быть использована в дальнейшем.&lt;/p&gt;
  &lt;pre id=&quot;TFSN&quot;&gt;cycle: for (let i = 0; i &amp;lt; 10; i++) { //! Эту строку можно изменить
 for (let j = 0; j &amp;lt; 10; j++) {
   if (i === 5 &amp;amp;&amp;amp; j === 5) {
     break cycle; //! Эту строку можно изменить
   }
   console.log(i, j);
 }
}&lt;/pre&gt;
  &lt;h2 id=&quot;etPO&quot;&gt;Задача 6&lt;/h2&gt;
  &lt;p id=&quot;JkXY&quot;&gt;Яблоко стоит 1.15, апельсин стоит 2.30. Сколько они стоят вместе – чему равна сумма 1.15 + 2.30 с точки зрения JavaScript?&lt;/p&gt;
  &lt;p id=&quot;o7am&quot;&gt;Ответ:&lt;/p&gt;
  &lt;p id=&quot;7Iol&quot;&gt;&lt;code&gt;3.4499999999999997&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rYBH&quot;&gt;Число хранится в памяти в бинарной форме, как последовательность бит – единиц и нулей. Но дроби, такие как 1.15, 2.30, которые выглядят довольно просто в десятичной системе счисления, на самом деле являются бесконечной дробью в двоичной форме. Это объяснение взято с сайта Современный учебник JavaScript, там же можно подробно &lt;a href=&quot;https://learn.javascript.ru/number&quot; target=&quot;_blank&quot;&gt;почитать про числа в языке&lt;/a&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;J0Mc&quot;&gt;Задача 7&lt;/h3&gt;
  &lt;p id=&quot;B4zf&quot;&gt;Чему равен &lt;code&gt;typeof null&lt;/code&gt; в режиме &lt;code&gt;use strict&lt;/code&gt;?&lt;/p&gt;
  &lt;p id=&quot;uuWe&quot;&gt;Ответ&lt;/p&gt;
  &lt;p id=&quot;lRUj&quot;&gt;&lt;code&gt;object&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;LVw8&quot;&gt;Как &lt;a href=&quot;https://habr.com/ru/post/200664/&quot; target=&quot;_blank&quot;&gt;пишут&lt;/a&gt; на Хабре:&lt;/p&gt;
  &lt;blockquote id=&quot;cilg&quot;&gt;Все JavaScript-программисты давно привыкли к тому, что &lt;code&gt;typeof null === &amp;#x27;object&amp;#x27;; // true&lt;/code&gt;, хотя фактически null — примитивное значение. Многие знают, что это баг, и лично Брэндан Айк это признаёт. Этот баг, вероятно, никогда не будет исправлен из-за необходимости сохранения обратной совместимости существующего кода с новыми версиями языка.&lt;/blockquote&gt;

</content></entry><entry><id>it_guru:hBXtPatgo8_</id><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru/hBXtPatgo8_?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><title>⠀</title><published>2023-05-19T18:57:49.605Z</published><updated>2023-05-19T18:58:33.706Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/2f/97/2f978477-9bfc-4622-9dd1-8b9ca643dfb3.png"></media:thumbnail><summary type="html">Собрали для вас несколько простых задач по JavaScript для обучения и тренировки, а также пару теоретических вопросов. Задачи расположены в порядке возрастания сложности.</summary><content type="html">
  &lt;h1 id=&quot;5OvM&quot;&gt;Задачи по JavaScript для начинающих от Tproger и GeekBrains&lt;/h1&gt;
  &lt;p id=&quot;r8Qj&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;jkJI&quot;&gt;Собрали для вас несколько простых задач по JavaScript для обучения и тренировки, а также пару теоретических вопросов. Задачи расположены в порядке возрастания сложности.&lt;/p&gt;
  &lt;p id=&quot;Cu9U&quot;&gt;Обратите внимание, что у любой задачи по программированию может быть несколько способов решения. Чтобы посмотреть добавленный нами вариант решения, кликните по соответствующей кнопке.&lt;/p&gt;
  &lt;h2 id=&quot;qzHt&quot;&gt;Задача 1&lt;/h2&gt;
  &lt;p id=&quot;GIZv&quot;&gt;Напишите однострочное решение, которое вычисляет сумму квадратных корней для всех чётных чисел целочисленного массива.&lt;/p&gt;
  &lt;p id=&quot;zT9Q&quot;&gt;Вариант решения:&lt;/p&gt;
  &lt;pre id=&quot;7CiF&quot;&gt;console.log(
 // Входной массив
 [1, 4, 3, 0, 4, 5, 4]
   // Оставляем только чётные числа
   .filter(element =&amp;gt; !(element % 2))
   // Считаем квадратный корень и записываем в аккумулятор
   .reduceRight((accumulator, element) =&amp;gt; accumulator + Math.sqrt(element), 0)
); // 6&lt;/pre&gt;
  &lt;p id=&quot;YHcJ&quot;&gt;Метод &lt;code&gt;reduceRight()&lt;/code&gt; применяет функцию к аккумулятору и каждому значению массива (справа налево), сводя его к одному значению. А метод &lt;code&gt;reduce()&lt;/code&gt; выполняет функцию &lt;code&gt;callback&lt;/code&gt; один раз для каждого элемента, присутствующего в массиве, за исключением пустот, принимая четыре аргумента:&lt;/p&gt;
  &lt;ul id=&quot;ewYV&quot;&gt;
    &lt;li id=&quot;NyOx&quot;&gt;начальное значение (или значение от предыдущего вызова &lt;code&gt;callback&lt;/code&gt;);&lt;/li&gt;
    &lt;li id=&quot;dz2J&quot;&gt;значение текущего элемента;&lt;/li&gt;
    &lt;li id=&quot;iMOL&quot;&gt;текущий индекс;&lt;/li&gt;
    &lt;li id=&quot;Ogrq&quot;&gt;массив, по которому происходит итерация.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;KAjB&quot;&gt;Задача 2&lt;/h2&gt;
  &lt;p id=&quot;Q2Nd&quot;&gt;Напишите функцию, которая пишет в консоль число в заданном диапазоне, в случае, если оно успешно делится или не делится с остатком или без остатка в зависимости от параметров.&lt;/p&gt;
  &lt;p id=&quot;mNhZ&quot;&gt;Вариант решения:&lt;/p&gt;
  &lt;pre id=&quot;lbMp&quot;&gt;function getNumbersModulatordBy(modulus, loggerCallback) {
 // Функция, которая возвращает функцию - это подход из функционального программирования
 // Называется замыканием (Closure)
 return function(start, end) {
   loggerCallback({ message: &amp;quot;Конфигурация&amp;quot;, config: configuration });
   loggerCallback({ message: &amp;quot;Полученный модулятор&amp;quot;, modulus: modulus });
   loggerCallback({
     message: &amp;quot;Полученный start и end&amp;quot;,
     start: start,
     end: end
   });

   while (start &amp;lt;= end) {
     // Стоит обратить внимание:
     // 1. При нестрогом равенстве true == 1 и false == 0
     // 2. Здесь мы обращаемся к глобальному контексту configuration
     // p.s. поле isEntry может меняться
     if (start % modulus == configuration.isEntry) {
       // В данном случае мы используем loggerCallback как middleware
       // Это определит дальнейшую судьбу результата
       // Позволяет убрать side-effect
       loggerCallback(start);
     }
     start++;
   }
 };
}

// Глобальный контекст не имеет блочной видимости
// В данном случае переменная поднимается выше в самое начало кода
// Исполнитель JavaScript видит её в независимости от места инициализации
var configuration = {
 modulus: 10,
 isEntry: false,
 start: 45,
 end: 68
};

var loggerCallback = data =&amp;gt; console.log(data);

let tenNumbersModulator = getNumbersModulatordBy(
 configuration.modulus,
 loggerCallback
);

// Переменные с глобальным контекстом доступны из:
// 1. globalThis (в Node.js)
// 2. window (в браузере)
window.configuration.modulus = 5;

let fiveNumbersModulator = getNumbersModulatordBy(
 configuration.modulus,
 loggerCallback
);

tenNumbersModulator(configuration.start, configuration.end); // 50, 60
tenNumbersModulator(10, 100); // 10, 20, 30, 40, 50, 60, 70, 80, 90, 100

// Так как мы изменили поле isEntry, то теперь:
// Функция вернёт те значения, которые не входят в модуляцию числа
window.configuration.isEntry = true;

fiveNumbersModulator(configuration.start, configuration.end); // 46, 51, 56, 61, 66
fiveNumbersModulator(10, 21); // 11, 16, 21&lt;/pre&gt;
  &lt;h2 id=&quot;56u1&quot;&gt;Задача 3&lt;/h2&gt;
  &lt;p id=&quot;QBXg&quot;&gt;Есть ферма животных, у всех животных есть имена и возраст. Животные бывают разных типов: Кошки, Собаки, Коровы. У каждого животного могут быть дети. Если животное является родителем этих детей, в свою очередь глубина семейного древа может достигать &lt;code&gt;N&lt;/code&gt;либо &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;YZz8&quot;&gt;Опишите структуры данных для фермы животных и напишите функцию, которая делает подсчёт всех возрастов животных и выводит общий возраст для всей фермы.&lt;/p&gt;
  &lt;p id=&quot;e1Yr&quot;&gt;Вариант решения:&lt;/p&gt;
  &lt;pre id=&quot;GQCy&quot;&gt;// Родительский класс для всех животных
class Animal {
 constructor(name, age, childs = null) {
   this.name = name;
   this.age = age;
   this.childs = childs;
 }
}

// Класс Cat - потомок класса Animal
// Имеет те же поля, что и Animal
class Cat extends Animal {
 constructor(name, age, childs = null) {
   super(name, age, childs);
 }
}

// Класс Dog - потомок класса Animal
// Имеет те же поля, что и Animal
class Dog extends Animal {
 constructor(name, age, childs = null) {
   super(name, age, childs);
 }
}

// Класс Cow - потомок класса Animal
// Имеет те же поля, что и Animal
class Cow extends Animal {
 constructor(name, age, childs = null) {
   super(name, age, childs);
 }
}

// Рекурсивная функция для подсчета age
// Обходит все дочерние элементы
function getAnimalsAge(animals) {
 let output = 0;

 if (animals.length &amp;gt; 0) {
   // Использование функции reduce для получения общего age
   // https://learn.javascript.ru/array-iteration
   output += animals.reduce((acc, current) =&amp;gt; {
     // Сумма age всех childs
     let count = 0;
     // Если childs пустой или его нет, тогда нет смысла пробегать по ним
     if (current.childs &amp;amp;&amp;amp; current.childs.length &amp;gt; 0) {
       // Применение рекурсии
       count += getAnimalsAge(current.childs);
     }

     // Возвращаем сумму аккумулятора, текущего животного, сумму age всех childs
     return acc + current.age + count;
   }, 0);
 }

 return output;
}

// Функция для получения определённого количества животных
function generateAnimals(type, count) {
 let output = [];

 for (let i = 0; i &amp;lt;= count; i++) {
   let parameter = {
     name: &amp;#x60;${type} ${i}&amp;#x60;,
     age: i,
     childs: []
   };

   let item = null;

   switch (type) {
     case &amp;quot;Cat&amp;quot;:
       item = new Cat(parameter.name, parameter.age);
       break;
     case &amp;quot;Dog&amp;quot;:
       item = new Dog(parameter.name, parameter.age);
       break;
     case &amp;quot;Cow&amp;quot;:
       item = new Cow(parameter.name, parameter.age);
       break;
   }

   if (item) {
     output.push(item);
   }
 }

 return output;
}

// Добавление childs ко всем переданным животным
function addChildsTo(animals, count, type) {
 animals.forEach(animal =&amp;gt; {
   if (!animal.childs) {
     animal.childs = [];
   }
   // Обратите внимание, что массив - ссылка, поэтому изменяя здесь его поля
   // мы меняем их глобально
   animal.childs = generateAnimals(type, count);
 });
}

let cats = generateAnimals(&amp;quot;Cat&amp;quot;, 5);
addChildsTo(cats, 10, &amp;quot;Cat&amp;quot;);

let dogs = generateAnimals(&amp;quot;Dog&amp;quot;, 3);
addChildsTo(dogs, 3, &amp;quot;Dog&amp;quot;);

let cows = generateAnimals(&amp;quot;Cow&amp;quot;, 7);
addChildsTo(cows, 1, &amp;quot;Dog&amp;quot;);

// Использование оператора Spread (ES6)
// https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Spread_syntax
let animals = [...cats, ...dogs, ...cows];

console.log(getAnimalsAge(animals)) // 411&lt;/pre&gt;
  &lt;h2 id=&quot;xsFr&quot;&gt;Задача 4&lt;/h2&gt;
  &lt;p id=&quot;ukgS&quot;&gt;Перепишите функцию &lt;code&gt;clone&lt;/code&gt; таким образом, чтобы она была способна клонировать переданный как параметр объект.&lt;/p&gt;
  &lt;p id=&quot;XKa1&quot;&gt;Пример проблемы:&lt;/p&gt;
  &lt;pre id=&quot;JTwo&quot;&gt;let animal = {
 name: &amp;quot;animal&amp;quot;,
 age: 10,
 childs: [&amp;quot;child 1&amp;quot;, &amp;quot;child 2&amp;quot;]
};

let cat = clone(animal);
cat.name = &amp;quot;cat&amp;quot;;
cat.age = 5;
cat.childs.push(&amp;quot;child 3&amp;quot;);

console.log(cat.name, cat.age); // cat 5
console.log(cat.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

console.log(animal.name, animal.age); // cat 5
console.log(animal.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

function clone(obj) {
 return obj;
}&lt;/pre&gt;
  &lt;p id=&quot;6KLy&quot;&gt;Варианты решения:&lt;/p&gt;
  &lt;h3 id=&quot;3DrA&quot;&gt;Deep copy (глубокое копирование)&lt;/h3&gt;
  &lt;pre id=&quot;xuk3&quot;&gt;console.log(cat.name, cat.age); // cat 5
console.log(cat.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

console.log(animal.name, animal.age); // animal 10
console.log(animal.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27; ]

// Отличный вариант для JSON-safe объектов
let clone = (obj) =&amp;gt; JSON.parse(JSON.stringify(obj));

// Опасен для рекурсивных объектов или когда имеется конструктор с параметрами
let clone = obj =&amp;gt; {
 if (obj === null || typeof obj !== &amp;quot;object&amp;quot; || &amp;quot;isActiveClone&amp;quot; in obj)
   return obj;

 if (obj instanceof Date) var temp = new obj.constructor();
 //or new Date(obj);
 else var temp = obj.constructor();

 for (var key in obj) {
   if (Object.prototype.hasOwnProperty.call(obj, key)) {
     obj[&amp;quot;isActiveClone&amp;quot;] = null;
     temp[key] = clone(obj[key]);
     delete obj[&amp;quot;isActiveClone&amp;quot;];
   }
 }
 return temp;
};&lt;/pre&gt;
  &lt;h3 id=&quot;vc3b&quot;&gt;Experimental deep copy (экспериментальное глубокое копирование)&lt;/h3&gt;
  &lt;p id=&quot;ZCrH&quot;&gt;Как &lt;a href=&quot;https://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-deep-clone-an-object-in-javascript/10916838#10916838&quot; target=&quot;_blank&quot;&gt;пишут&lt;/a&gt; на Stack Overflow, HTML-стандарт включает в себя &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm&quot; target=&quot;_blank&quot;&gt;алгоритм структурированного клонирования&lt;/a&gt;, который может создавать глубокие копии объектов. Он всё ещё ограничен встроенными типами, но в дополнение к тем типам, что поддерживаются в JSON, поддерживает Dates, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas, Sparse Arrays, Typed Arrays и, вероятно, больше в будущем. Решает также проблемы цикличных и рекурсивных структур, которые ломают JSON.&lt;/p&gt;
  &lt;pre id=&quot;Bek5&quot;&gt;console.log(cat.name, cat.age); // cat 5
console.log(cat.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

console.log(animal.name, animal.age); // animal 10
console.log(animal.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27; ]

let clone = (obj) =&amp;gt; require(&amp;quot;v8&amp;quot;).deserialize(require(&amp;quot;v8&amp;quot;).serialize(obj));&lt;/pre&gt;
  &lt;h3 id=&quot;4hND&quot;&gt;Shallow copy (поверхностное копирование)&lt;/h3&gt;
  &lt;p id=&quot;pO7V&quot;&gt;Клонирование вложенных свойств по ссылке пропускается, нужно быть осторожным в использовании.&lt;/p&gt;
  &lt;pre id=&quot;TaOk&quot;&gt;console.log(cat.name, cat.age); // cat 5
console.log(cat.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

console.log(animal.name, animal.age); // animal 10
console.log(animal.childs); // [ &amp;#x27;child 1&amp;#x27;, &amp;#x27;child 2&amp;#x27;, &amp;#x27;child 3&amp;#x27; ]

// Копирует значение всех собственных итерируемых элементов объекта
let clone = (obj) =&amp;gt; Object.assign(new Object(), obj);
// Более известен как оператор Spread
let clone = (obj) =&amp;gt; { ...obj };&lt;/pre&gt;
  &lt;h2 id=&quot;GbP9&quot;&gt;Задача 5&lt;/h2&gt;
  &lt;p id=&quot;7vy1&quot;&gt;Выйдите из цикла, изменив только две отмеченные строки. Результат в консоли сейчас останавливается на &lt;code&gt;9 9&lt;/code&gt;. Должен на &lt;code&gt;5 4&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;BOYa&quot;&gt;for (let i = 0; i &amp;lt; 10; i++) { //! Эту строку можно изменить
 for (let j = 0; j &amp;lt; 10; j++) {
   if (i === 5 &amp;amp;&amp;amp; j === 5) {
     //! Эту строку можно изменить
   }

   console.log(i, j);
 }
}&lt;/pre&gt;
  &lt;p id=&quot;mJVu&quot;&gt;Вариант решения:&lt;/p&gt;
  &lt;p id=&quot;kNTC&quot;&gt;Как &lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/label&quot; target=&quot;_blank&quot;&gt;пишут&lt;/a&gt; на MDN web docs, инструкция метки (label) используется вместе с &lt;code&gt;break&lt;/code&gt; или &lt;code&gt;continue&lt;/code&gt; для альтернативного выхода из цикла. Метка добавляется перед блочным выражением в качестве ссылки, которая может быть использована в дальнейшем.&lt;/p&gt;
  &lt;pre id=&quot;Ucsz&quot;&gt;cycle: for (let i = 0; i &amp;lt; 10; i++) { //! Эту строку можно изменить
 for (let j = 0; j &amp;lt; 10; j++) {
   if (i === 5 &amp;amp;&amp;amp; j === 5) {
     break cycle; //! Эту строку можно изменить
   }
   console.log(i, j);
 }
}&lt;/pre&gt;
  &lt;h2 id=&quot;etPO&quot;&gt;Задача 6&lt;/h2&gt;
  &lt;p id=&quot;JkXY&quot;&gt;Яблоко стоит 1.15, апельсин стоит 2.30. Сколько они стоят вместе – чему равна сумма 1.15 + 2.30 с точки зрения JavaScript?&lt;/p&gt;
  &lt;p id=&quot;o7am&quot;&gt;Ответ:&lt;/p&gt;
  &lt;p id=&quot;7Iol&quot;&gt;&lt;code&gt;3.4499999999999997&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rYBH&quot;&gt;Число хранится в памяти в бинарной форме, как последовательность бит – единиц и нулей. Но дроби, такие как 1.15, 2.30, которые выглядят довольно просто в десятичной системе счисления, на самом деле являются бесконечной дробью в двоичной форме. Это объяснение взято с сайта Современный учебник JavaScript, там же можно подробно &lt;a href=&quot;https://learn.javascript.ru/number&quot; target=&quot;_blank&quot;&gt;почитать про числа в языке&lt;/a&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;J0Mc&quot;&gt;Задача 7&lt;/h3&gt;
  &lt;p id=&quot;B4zf&quot;&gt;Чему равен &lt;code&gt;typeof null&lt;/code&gt; в режиме &lt;code&gt;use strict&lt;/code&gt;?&lt;/p&gt;
  &lt;p id=&quot;uuWe&quot;&gt;Ответ&lt;/p&gt;
  &lt;p id=&quot;lRUj&quot;&gt;&lt;code&gt;object&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;LVw8&quot;&gt;Как &lt;a href=&quot;https://habr.com/ru/post/200664/&quot; target=&quot;_blank&quot;&gt;пишут&lt;/a&gt; на Хабре:&lt;/p&gt;
  &lt;blockquote id=&quot;cilg&quot;&gt;Все JavaScript-программисты давно привыкли к тому, что &lt;code&gt;typeof null === &amp;#x27;object&amp;#x27;; // true&lt;/code&gt;, хотя фактически null — примитивное значение. Многие знают, что это баг, и лично Брэндан Айк это признаёт. Этот баг, вероятно, никогда не будет исправлен из-за необходимости сохранения обратной совместимости существующего кода с новыми версиями языка.&lt;/blockquote&gt;

</content></entry><entry><id>it_guru:LVWmqS1POS1</id><link rel="alternate" type="text/html" href="https://teletype.in/@it_guru/LVWmqS1POS1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=it_guru"></link><title>⠀</title><published>2023-05-19T18:10:38.501Z</published><updated>2023-05-19T18:10:38.501Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/26/f6/26f6b430-756f-47d9-9f6b-18007aa310ae.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://media.tproger.ru/uploads/2018/02/1013270788.jpg&quot;&gt;Собранные книги по C++ позволят выучить этот непростой язык как новичкам, так и тем программистам, которые ранее изучали другие языки.</summary><content type="html">
  &lt;h1 id=&quot;PUKV&quot;&gt;Книги по C++: исчерпывающая подборка для начинающих&lt;/h1&gt;
  &lt;p id=&quot;3c7S&quot;&gt;Собранные книги по C++ позволят выучить этот непростой язык как новичкам, так и тем программистам, которые ранее изучали другие языки.&lt;/p&gt;
  &lt;p id=&quot;9VMZ&quot;&gt;&lt;/p&gt;
  &lt;ol id=&quot;GGkp&quot;&gt;
    &lt;li id=&quot;WS0S&quot;&gt;Книги на русском&lt;/li&gt;
    &lt;li id=&quot;XZR4&quot;&gt;Книги на английском&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;hoGb&quot;&gt;Книги по C++ на русском&lt;/h2&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;M8xE&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/02/1013270788.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;AJmz&quot;&gt;Программирование. Принципы и практика с использованием C++&lt;/h3&gt;
  &lt;p id=&quot;ZO45&quot;&gt;Книга написана создателем языка C++ — Бьёрном Страуструпом. Материал ориентирован в первую очередь на тех, кто не был знаком с программированием до прочтения этой книги. Она задумана как введение в разработку, а язык C++ играет, скорее, иллюстративную роль. Здесь не удастся найти информацию обо всех возможностях данного языка программирования, зато можно получить полезные советы и рекомендации для более эффективной работы с C++ от человека, который имеет бесценный опыт в программировании и огромное значение в сообществе программистов.&lt;/p&gt;
  &lt;p id=&quot;DyGM&quot;&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;Dg1G&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/02/1011929412.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;Trht&quot;&gt;Язык программирования C++. Лекции и упражнения&lt;/h3&gt;
  &lt;p id=&quot;gOdB&quot;&gt;Оригинал шестого издания был выпущен в далёком 2011 году, поэтому о стандартах 14/17 из этого учебника вы не узнаете. Тем не менее, это всё ещё хороший базис для начинающих. Стивен Прата вложил свой преподавательский опыт в эту книгу. В результате получился монументальный труд, который дружественно относится к читателю и понятным языком объясняет фундаментальные основы данного языка программирования.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;6gmW&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/02/1013134422.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;Q1xc&quot;&gt;Изучаем C++ через программирование игр&lt;/h3&gt;
  &lt;p id=&quot;OMKy&quot;&gt;Пусть эта книга и освещает только базовые элементы языка, её несомненный плюс в том, что она предлагает закреплять полученные знания путём создания небольших игр. В каждой главе дан определённый игровой проект, на примере которого поясняется, как можно использовать «фишки» «плюсов». Книга подойдёт и тем, кто до нее не был знаком с программированием.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;4cQv&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/02/1011421957.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;ZZsa&quot;&gt;Объектно-ориентированное программирование в С++&lt;/h3&gt;
  &lt;p id=&quot;gqYb&quot;&gt;Книга Роберта Лафоре из серии «Классика Computer Science». В ней очень грамотно и полно представлено понятие объектно-ориентированного программирования в C++. Кроме теории, книга предлагает читателю сделать около 100 различных упражнений, которые позволят отточить навык владения ООП. Отлично подходит для начинающих программистов.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;zmxe&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/02/1001831979.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;ij5w&quot;&gt;Как программировать на C++&lt;/h3&gt;
  &lt;p id=&quot;pH3G&quot;&gt;Харви и Пол Дейтелы в своей книге решили отойти от привычного порядка введения в C++ и уже с третьей главы знакомят читателя с основами ООП, тем самым не освещая должным образом структурное и процедурное программирование. Большое внимание уделяется объектно-ориентированному проектированию программных систем с помощью графического языка UML2. Данный учебник является одним из самых популярных в мире по C++.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;I5jV&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/cpp_stl_book.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;dlW8&quot;&gt;Осваиваем C++17 STL&lt;/h3&gt;
  &lt;p id=&quot;Xm53&quot;&gt;Стандарт C++17 удвоил объем библиотеки по сравнению с С++11. Из книги вы узнаете об особенностях 17-го стандарта с примерами, научитесь создавать пулы потоков выполнения, диспетчеры памяти, типы итераторов. В материале рассмотрены отличия полиморфизма, мономорфизма, а также обобщённых алгоритмов. Подойдёт разработчикам, которые уже знают C++, но хотят овладеть особенностями библиотеки C++17 STL и использовать на практике её компоненты.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;itaZ&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/02/1009504581.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;yetv&quot;&gt;Язык программирования C++. Базовый курс&lt;/h3&gt;
  &lt;p id=&quot;N3kW&quot;&gt;Более тысячи страниц подробного введения в C++, которое детально покрывает буквально все аспекты языка в доступном формате. С самого начала книги читателя знакомят со стандартной библиотекой C++, её популярными функциями и средствами, что позволяет в скором времени приступить к написанию программ, даже если не были изучены некоторые нюансы языка. В книге используется стандарт С++11.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;Ohbf&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/cpp_tasks_book.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;0mSv&quot;&gt;Программирование на C++ в примерах и задачах&lt;/h3&gt;
  &lt;p id=&quot;8gxR&quot;&gt;Книга включила набор сведений, необходимых для успешного анализа и составления эффективных программных кодов. Вся информация изложена последовательно и дополняется огромным количеством примеров, задач для практики, а также детальным разбором решений.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;ua0V&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/02/1014001523.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;RPGg&quot;&gt;Эффективное программирование на C++. Практическое программирование на примерах&lt;/h3&gt;
  &lt;p id=&quot;lf2k&quot;&gt;Содержит в себе всё то же самое, что и «Учебник для начинающих: С++», но короче в 4 раза. В основном из-за того, что автор не пытается ввести читателя в программирование, а сразу учит С++ тех, кто пришел из других языков. Может быть немного сложна для понимания, но тем, кто сможет осилить курс, это ещё и здорово сократит время изучения.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;gyZi&quot;&gt;Книги по C++ на английском&lt;/h2&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;MQo8&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/progcpp.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;P5QC&quot;&gt;Fundamentals of Programming C++&lt;/h3&gt;
  &lt;p id=&quot;VUZZ&quot;&gt;Книга содержит огромное количество материала по C++ и явно стремится осветить все основные аспекты языка. В ней вы найдете информацию как о базовых элементах C++, так и об использовании библиотеки STL. Автор регулярно обновляет книгу, благодаря чему в ней представлена актуальная версия языка. Множество примеров кода и того, как работают программы, позволят закрепить пройденный материал.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;WV3S&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/C-Annotations.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;EpvP&quot;&gt;C++ Annotations&lt;/h3&gt;
  &lt;p id=&quot;CCuw&quot;&gt;Книга рассчитана в первую очередь на тех, что уже знает язык Си или Си-подобный язык, например, Java. Поэтому она не рассказывает об общих моментах, которые одинаковы или, по крайней мере, похожи в таких языках, а сразу преподносит материал, присущий только C++. Поэтому если вы изучаете или уже изучили C или Java, то эта книга станет хорошим подспорьем в изучении C++. &lt;/p&gt;
  &lt;p id=&quot;nnPr&quot;&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;Vi8a&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/C-Succinctly.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;h76D&quot;&gt;C++ Succinctly&lt;/h3&gt;
  &lt;p id=&quot;W4jh&quot;&gt;Книга написана специально для C#-разработчиков. Материал по языку C++ даётся с учётом имеющихся у программиста знаний о языке C#. Книга полезна, когда часть проекта на C++, а вы знаете C#. После изучения материала вы сможете писать полноценные программы уже на C++.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;3EIe&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/rooks-guide-cplusplus.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;qrc4&quot;&gt;The Rook&amp;#x27;s Guide to C++&lt;/h3&gt;
  &lt;p id=&quot;7KTS&quot;&gt;Данный учебник является трудом автора и его 25 студентов, большинство из которых — новички в C++. Большая часть книги была написана совместными усилиями примерно за 36 часов. Сам автор признаётся, что будь у него бесконечное количество времени, он бы отполировал книгу до блеска. Всё это сделано с целью удешевления производства книги и, как следствие, выпуска её в свободный доступ для всех желающих. В ней могут быть ошибки, но в целом в книге представлен неплохой материал по языку C++.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;l5YN&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/learn-c-3159805.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;qH4j&quot;&gt;Learn C++&lt;/h3&gt;
  &lt;p id=&quot;mnc3&quot;&gt;В нашу подборку книг затесался сайт. Вы думаете, это какая-то ошибка? Вовсе нет: это онлайн-учебник по всему С++. Его несомненное преимущество в том, что каждая глава проиллюстрирована кодом, так что материал будет легче усвоить. Всё расписано достаточно подробно, но самое главное — книга регулярно дополняется в соответствии с новыми стандартами C++.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;3nbd&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/structured-programming-with-c-plus-plus.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;ANrC&quot;&gt;Structured Programming with C++&lt;/h3&gt;
  &lt;p id=&quot;1wvs&quot;&gt;Книга научит основам структурного программирования. В первую очередь, она стремится донести до читателя, что такое «думать как программист», а уже во вторую — обучить языку C++. Материал представлен в удобочитаемой форме. Как и во многих учебниках, здесь есть материалы для самопроверки в каждой главе с ответами в конце. Автор подчёркивает, что материал фокусируется на решении типовых проблем и задач, возникающих в процессе написания программы.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;C4xh&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/brdavid6.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;xgC9&quot;&gt;Software Design Using C++&lt;/h3&gt;
  &lt;p id=&quot;BrAk&quot;&gt;Ещё одна онлайн-книга, которая даёт материал в соответствии с тремя курсами, которые в американских университетах называются CS 1, CS 2 и «Структуры данных». Новичкам стоит начать именно с курса CS 1, поскольку в нём представлены основы программирования на C++. После переходите к курсу CS 2, а затем — к структурам данных.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;IWBx&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/002b0f19.jpeg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;pd90&quot;&gt;How to Think Like a Computer Scientist&lt;/h3&gt;
  &lt;p id=&quot;85l5&quot;&gt;Цели книги — научить использовать C++ и мыслить, как исследователь. Она делает акцент на использовании языка C++ как удобного инструмента для научных вычислений. Для знакомства с материалом желательна хотя бы математическая подготовка. Вы научитесь чётко формулировать проблему, представлять её решение, и только после этого писать код и проводить тесты.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;wfRD&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/Open-Data-Structures.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;qeuN&quot;&gt;Open Data Structures&lt;/h3&gt;
  &lt;p id=&quot;3Rhd&quot;&gt;Автор книги, Пэт Морин, считает, что студентам компьютерных специальностей необходимо изучать структуры данных, но в большинстве случаев хорошие книги по этой теме стоят немало, и студенты не могут приобрести их ввиду материального положения. Поэтому он решил написать собственный учебник для свободного распространения.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;zVMX&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/03/C3elatest.pdf.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;PCkI&quot;&gt;Data Structures and Algorithm Analysis&lt;/h3&gt;
  &lt;p id=&quot;txwE&quot;&gt;Фокус книги сосредоточен на создании эффективных структур данных и алгоритмов. После её прочтения вы научитесь выбирать или проектировать структуру данных, наиболее подходящую в той или иной части программы.&lt;/p&gt;
  &lt;p id=&quot;GrFj&quot;&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;40Ly&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://media.tproger.ru/uploads/2018/02/12345.jpg&quot; width=&quot;90&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;vM9n&quot;&gt;Упражнения&lt;/h3&gt;
  &lt;p id=&quot;ooYi&quot;&gt;Раздел упражнений расположен на официальном сайте создателя языка, Бьёрна Страуструпа. Его не стали выпускать в печатном виде, поскольку раздел постоянно обновляется. Документ содержит множество упражнений различных уровней. Данный показатель указывается рядом с номером упражнения. Например, уровень (*1) означает, что задачу вполне реально решить за 10 минут, (*2) — за час, а на (*3) вы можете потратить целый день. Конечно, эти показатели не точные и целиком зависят только от вашего опыта, так что дерзайте! Чем больше задач вы решите, тем лучше освоите инструменты C++.&lt;/p&gt;
  &lt;hr /&gt;

</content></entry></feed>