<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Совкомбанк Технологии</title><generator>teletype.in</generator><description><![CDATA[Компания с гибким подходом к работе, инновационными проектами, технологичными решениями и яркой корпоративной культурой]]></description><image><url>https://img1.teletype.in/files/ca/f1/caf1f239-4b7f-499a-b16d-8ed1dcbb4088.png</url><title>Совкомбанк Технологии</title><link>https://teletype.in/@scbt</link></image><link>https://teletype.in/@scbt?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/scbt?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/scbt?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 14 May 2026 10:20:41 GMT</pubDate><lastBuildDate>Thu, 14 May 2026 10:20:41 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@scbt/docks</guid><link>https://teletype.in/@scbt/docks?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt</link><comments>https://teletype.in/@scbt/docks?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt#comments</comments><dc:creator>scbt</dc:creator><title>Документы при приёме на работу: обязательные и дополнительные</title><pubDate>Wed, 04 Oct 2023 11:43:08 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c8/6e/c86ef1ef-7807-45d5-9eb7-a50279fea63f.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/21/d7/21d7b6dd-26f2-4959-b4f3-a023a5ed06c1.png"></img>Привет, наш будущий коллега! Очень рады, что ты скоро присоединишься к команде Совкомбанк Технологии.]]></description><content:encoded><![CDATA[
  <p id="3XrR">Привет, наш будущий коллега! Очень рады, что ты скоро присоединишься к команде Совкомбанк Технологии. </p>
  <p id="jgOx">При приёме на работу нужно предоставить определённые документы. Список таких бумаг небольшой. Более того, бегать по разным инстанциям и собирать их не нужно: как правило, они всегда при себе или спокойно лежат дома.</p>
  <p id="zpdr"></p>
  <figure id="Bgjq" class="m_column">
    <img src="https://img3.teletype.in/files/21/d7/21d7b6dd-26f2-4959-b4f3-a023a5ed06c1.png" width="1200" />
  </figure>
  <p id="KPPi"></p>
  <p id="ngTG">Чтобы закончить твоё оформление в нашу компанию, необходимо предоставить определенные документы, список которых приведен ниже 👇</p>
  <p id="0EqI"></p>
  <h2 id="DRWs">Ждём от тебя сканы или фото: </h2>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="wnZk"><strong>Паспорт (при отсутствии - временное удостоверение) </strong></h3>
    <p id="lFIA">Понадобятся цветные фото полных разворотов страниц, в том числе если страницы <strong>пустые</strong>: <br />2-3 стр. - фото;<br />4-5 стр. - регистрация;<br />12-13 стр. - воинская обязанность;<br />14-15 стр. - семейное положение;<br />16-17 стр. - дети;<br />18-19 стр. - сведения о ранее выданных паспортах.</p>
  </section>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="iRwl"><strong>СНИЛС/АДИ-РЕГ</strong></h3>
    <p id="D8nF">Подойдёт цветное фото одного из документов:<br />- СНИЛС (зеленая карточка);<br />- АДИ-РЕГ с подписью и печатью СФР;<br />- Скрин карточки Страхового Свидетельства Обязательного Пенсионного Страхования из <u>мобильного приложения </u>Госуслуг.</p>
  </section>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="y2aR"><strong>ИНН</strong></h3>
    <p id="vUtX">- Если есть бумажная версия, то понадобится цветное фото полной страницы документа.<br />- Если нет, то подойдёт скриншот полной страницы браузера с Госуслуг или ФНС (<a href="https://service.nalog.ru/inn.do" target="_blank">https://service.nalog.ru/inn.do</a>). Главное, чтобы хорошо читались номер ИНН и твои ФИО.</p>
  </section>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="TsZJ"><strong>Документ(ы) об образовании/квалификации</strong></h3>
    <p id="EgDW">Необходимы цветные фото документа о последнем законченном образовании:</p>
    <p id="NAcz">- Диплом(ы) <u>без вкладыша</u> с оценками (последний или все, если один из них IT);<br />- Аттестат <u>без вкладыша</u> с оценками;<br />- Справка с места учёбы, если еще учишься в ВУЗе. Оригинал понадобится в день приема на работу.</p>
  </section>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="3pbM"><strong>Документы воинского учета</strong></h3>
    <ul id="Cf9x">
      <li id="UBWV"><strong>Для военнообязанных</strong> – военный билет или временное удостоверение/справка, выданные взамен военного билета. <br />Необходимы цветные фото <strong>всех страниц</strong>, где имеются записи:<br />страница с фото, прохождение службы, воинское звание, состав, категория годности, ВУС, постановка на воинский учет.</li>
      <li id="3VYO"><strong>Для призывников</strong> – удостоверение гражданина, подлежащего призыву на военную службу (приписное удостоверение). Необходимы цветные фото всех страниц документа.                                                                                                            <strong>Для получения отсрочки</strong> (при попадании под критерии Минцифры) - фото (позже оригинал) <strong>справки с предыдущих мест работы</strong> из аккредитованных ИТ-компаний за год до начала призывной кампании (с подтверждением аккредитации).</li>
    </ul>
    <p id="5TGx">* <em>Возраст призывников с 01 января 2024 г. - 30 лет включительно</em>.</p>
  </section>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="2Kyp"><strong>Трудовая книжка / СТД-Р</strong></h3>
    <p id="u1Av">- Скан/фото всех заполненных страниц трудовой книжки и <u>следующая пустая страница </u><strong>плюс справка СТД-Р</strong> <u>с отметкой об увольнении</u>(если есть ЭТК).</p>
    <ul id="5saz">
      <li id="hVIA">Сотрудник, который впервые трудоустраивается – ТК предоставлять не нужно.</li>
      <li id="B3xH">Совместитель - заверенная копия трудовой книжки. Если ведется ЭТК, то справка СТД-ПФР и копия ТК.</li>
    </ul>
  </section>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="CptC"><strong>Справка СТД-ПФР</strong></h3>
    <p id="b70f">Её можно запросить на Госуслугах после увольнения с твоего предыдущего места работы. Понадобится электронная версия справки.</p>
  </section>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="meVU"><strong>Документы, которые необходимо предоставить <u>при наличии</u>:</strong></h3>
    <ul id="iEby">
      <li id="JLx8"><strong>Свидетельства о браке/расторжении брака</strong><br />Цветное фото полной страницы документа.</li>
      <li id="wJ88"><strong>Свидетельство о рождении/усыновлении (удочерении) детей*. </strong> Цветное фото полной страницы документа.</li>
    </ul>
    <p id="Qf1z">*<em>Документ предоставляется до 24 лет при обучении детей на очной форме обучения, если планируешь оформление налогового вычета.</em></p>
  </section>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="zwWN"><strong>Документы, которые мы <u>рекомендуем </u>предоставить <br />при их наличии:</strong></h3>
    <ul id="F7t6">
      <li id="NiKC"><strong>Справка (№ 1031н) </strong>медико-социальной экспертизы с указанием группы инвалидности и степени ограничения способности к трудовой деятельности и <strong>индивидуальная программа реабилитации (№ 545н). </strong>Понадобятся скан/фото всех листов со всех сторон.</li>
      <li id="oJjj">Фотография <strong>жетона с личным номером</strong> при наличии в военном билете соответствующей отметки о его присвоении.</li>
    </ul>
  </section>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="IVrQ"><strong>Твоё фото 200*200 px</strong></h3>
    <p id="90gh">Мы хотим поскорее познакомить тебя со всеми твоими новыми коллегами, поэтому делаем внутренние рассылки про всех новичков, которые к нам присоединились.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="a7JG"><strong><u>Что дальше:</u></strong></h3>
    <p id="6QxC">Сканы или фото документов отправь на почту рекрутеру из Совкомбанк Технологии или сотруднику, помогающему с оформлением на работу. <br />Также подойдет ссылка на Google/Яндекс диск, откуда можно скачать сканы/фото документов.</p>
    <p id="az4W">Документы из списка нужно отправить <strong>как можно раньше</strong>, трудовую книжку можно прислать за 1<u> рабочий день до даты приема (до 12.00</u>).</p>
  </section>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="t7mj"><strong><u>В день приема:</u></strong></h3>
    <p id="GM41">Предоставь в отдел кадров все оригиналы документов из списка. <br />До встречи в команде, мы ждём тебя! 👋</p>
  </section>
  <h3 id="xx8U"></h3>
  <hr />
  <p id="jJri">Больше про нас и разные полезности в наши соцсетях:<br /><br />Телеграм — <a href="https://t.me/sovcom_tech" target="_blank">https://t.me/sovcom_tech</a><br />ВКонтакте — <a href="https://vk.com/sovcom_tech" target="_blank">https://vk.com/sovcom_tech</a><br />Нельзяграм — <a href="https://instagram.com/sovcomtech" target="_blank">https://instagram.com/sovcomtech</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@scbt/km2fllFgVWx</guid><link>https://teletype.in/@scbt/km2fllFgVWx?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt</link><comments>https://teletype.in/@scbt/km2fllFgVWx?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt#comments</comments><dc:creator>scbt</dc:creator><title>Привет, давай знакомиться 👋</title><pubDate>Fri, 22 Sep 2023 05:05:09 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/09/d7/09d74064-cc47-461b-80b6-250ed399f190.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/a5/01/a501c6fa-9c13-42ff-9293-f2a2224a5401.png"></img>Мы — Совкомбанк Технологии. Аккредитованная ИТ-компания Группы Совкомбанк. Каждый день развиваем сервисы и приложения, которыми пользуются миллионы людей и мы сами.]]></description><content:encoded><![CDATA[
  <p id="f5XZ">Мы — Совкомбанк Технологии. Аккредитованная ИТ-компания Группы Совкомбанк. Каждый день развиваем сервисы и приложения, которыми пользуются миллионы людей и мы сами. </p>
  <p id="SjIo">Не будем долго писать про нашу корпоративную культуру, ИТ-фесты, коворкинг и атмосферу «Лиги Достижений». Лучше покажем. Налей себе чай или кофе и смотри короткий ролик про Совкомбанк Технологии.</p>
  <p id="wnfs"></p>
  <figure id="fSqf" class="m_column">
    <iframe src="https://www.youtube.com/embed/Aev8VKBizNw?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <h3 id="ym0f"></h3>
  <h3 id="3GFg">Про наши ИТ-фесты</h3>
  <p id="XpD8">ИТ-фесты — это наши традиционные летние вечеринки для сотрудников. География фестов, как гастрольный тур топовых рок-групп. Почти вся Россия. В этом году мы встречались в Хабаровске, Саратове, Санкт-Петербурге, Краснодаре, Уфе, Воронеже, Нижнем Новгороде, Ростове-на-Дону, Москве, Казани, Новосибирске, Череповце, Томске, Екатеринбурге.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="nyCe"><strong>В этом году на фестах затусило более 2000 человек!</strong> Побьём ли в следующем году эту цифру? Даже не сомневайся. Уже начали думать, как сделать следующий сезон фестов ещё ярче.</p>
  </section>
  <p id="8Ryr"></p>
  <figure id="56Wn" class="m_column">
    <iframe src="https://www.youtube.com/embed/GLzn2FuXUog?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <figure id="TO6W" class="m_column">
    <iframe src="https://www.youtube.com/embed/-96a5QmsvJU?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <figure id="1Wx9" class="m_column">
    <iframe src="https://www.youtube.com/embed/KDJNeWH0a4k?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <h3 id="UhxJ"></h3>
  <h3 id="ivH0">Про спорт</h3>
  <p id="x1ux">Он всегда с нами. Регулярно устраиваем чемпионаты по волейболу, турниры по шахматам и настольному теннису, играем в футбол, катаемся на сноуборде, участвуем в марафонах по бегу.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="4ypI">Компенсируем покупку абонемента в фитнес-клуб, занятия групповыми видами спорта, например, тренировки по волейболу, футболу, хоккею, участие во внешних соревнованиях, покупку экипировки для команд.</p>
  </section>
  <h3 id="7sup"></h3>
  <figure id="5TbP" class="m_column">
    <iframe src="https://www.youtube.com/embed/R4oPzisUdMU?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <h3 id="s6Fz"></h3>
  <h3 id="z4ru">Про коворкинг в Сочи</h3>
  <p id="Yr0u">У нас есть собственный коворкинг: 4-х дневная рабочая неделя, дорога туда и обратно, проживание в отеле за счёт компании, командировочные за каждый день. </p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="2wDL">Днём работаем, вечером танцуем, играем в настолки или бьёмся в Mortal Kombat. По выходным едем на экскурсии и посещаем местные достопримечательности.</p>
  </section>
  <p id="78jE"></p>
  <figure id="IjzK" class="m_column">
    <img src="https://img3.teletype.in/files/a5/01/a501c6fa-9c13-42ff-9293-f2a2224a5401.png" width="1339" />
  </figure>
  <figure id="FkJV" class="m_column">
    <img src="https://img1.teletype.in/files/0f/a0/0fa0a7df-618c-429b-a97e-b28d945f52ab.png" width="2328" />
  </figure>
  <figure id="dIXE" class="m_column">
    <img src="https://img2.teletype.in/files/1e/83/1e838367-a0b4-4fd4-bac3-7f7e15133147.png" width="1339" />
  </figure>
  <h3 id="3zgH">Коворкинг на Алтае</h3>
  <p id="5ZUV">Наше место силы. Алтай - это горы, сплавы по бурной реке Катунь, песни под гитару у костра и поездки на «Алтайский марс». А еще это очаровательные, пробирающее до мурашек, виды заходящего солнца.</p>
  <p id="m25c">Как и в коворкинге в Сочи, здесь четырехдневная рабочая неделя. Билеты на самолет, проживание и многие другие приятные “мелочи” берет на себя банк.</p>
  <figure id="udEz" class="m_column">
    <img src="https://img1.teletype.in/files/41/1c/411c14bd-8e59-4ac8-83dc-51e314ae191e.png" width="1080" />
  </figure>
  <figure id="FBrQ" class="m_column">
    <img src="https://img2.teletype.in/files/92/09/92096136-ff45-4741-8852-3d619d30020b.png" width="1080" />
  </figure>
  <figure id="5f7A" class="m_column">
    <img src="https://img2.teletype.in/files/95/0a/950aabe9-7d92-4520-8ea6-c754d8ad3f7a.png" width="1080" />
  </figure>
  <figure id="clQt" class="m_column">
    <img src="https://img4.teletype.in/files/fa/9d/fa9d1b2a-25ab-48a0-9ddb-8ac0ed5d18da.png" width="1080" />
  </figure>
  <figure id="VZ2r" class="m_column">
    <img src="https://img3.teletype.in/files/af/e4/afe4571d-6013-4494-92f7-895e985da341.png" width="1080" />
  </figure>
  <figure id="G8tR" class="m_column">
    <img src="https://img4.teletype.in/files/f6/e1/f6e1e5bc-b8cd-4265-a2c7-cab3b449855c.png" width="1080" />
  </figure>
  <figure id="baCA" class="m_column">
    <img src="https://img2.teletype.in/files/1a/40/1a401af2-c2b7-4e9a-a5da-1f7e6f8dc33b.png" width="1080" />
  </figure>
  <figure id="ykNk" class="m_column">
    <img src="https://img2.teletype.in/files/57/b6/57b67e4f-7513-4412-8384-b529041bfc40.png" width="1080" />
  </figure>
  <figure id="rran" class="m_column">
    <img src="https://img3.teletype.in/files/20/09/200975a1-b0e4-487c-b016-d9096b4df250.png" width="1080" />
  </figure>
  <figure id="KTy9" class="m_column">
    <img src="https://img1.teletype.in/files/88/84/8884c2ac-aee9-442b-9935-a88873c07732.png" width="1080" />
  </figure>
  <figure id="ebWw" class="m_column">
    <img src="https://img4.teletype.in/files/7a/e9/7ae97c2b-a30a-4259-8592-53fa333ea65f.png" width="1080" />
  </figure>
  <h3 id="DgHc">Про офисы</h3>
  <p id="T1rc">Любим работать в комфорте. Все наши офисы современные и стильные, рабочие места удобные и уютные. Кофемашины и игровые комнаты тоже на месте.</p>
  <p id="LzlZ"></p>
  <figure id="G05T" class="m_column">
    <img src="https://img2.teletype.in/files/56/be/56be5544-5d00-46c5-9a13-2289ad08429f.png" width="1618" />
  </figure>
  <figure id="2w5c" class="m_column">
    <img src="https://img1.teletype.in/files/83/21/8321a42f-1760-4e94-bf47-74adef47367a.png" width="2814" />
  </figure>
  <figure id="RVxy" class="m_column">
    <img src="https://img4.teletype.in/files/f0/d0/f0d09328-a3f2-4e21-9b51-8d8326bccd3d.png" width="1619" />
  </figure>
  <figure id="w7EJ" class="m_column">
    <img src="https://img4.teletype.in/files/b5/de/b5deeca8-b428-4c62-9ff4-7501b418617d.png" width="1619" />
  </figure>
  <figure id="QzBc" class="m_column">
    <img src="https://img4.teletype.in/files/f9/c7/f9c7a6f4-2a34-4c2d-bd70-b46c23c91f86.png" width="1123" />
  </figure>
  <h3 id="nQHy"></h3>
  <h3 id="nIEz">Про бонусы сотрудникам</h3>
  <p id="5GC2"><strong>У нас 30+ соцпрограмм</strong> —  заботимся о здоровье сотрудников и их близких, софинансируем отпуска, поддерживаем развитие сотрудников, есть свой Учебный центр, полностью или частично оплачиваем внешнее обучение (семинары, конференции, курсы), предоставляем банковские продукты по льготным условиям и ещё много всего!</p>
  <h3 id="mzys"></h3>
  <hr />
  <p id="tA8W">👉 Еще больше про нас, а так же разные полезности, в нашем Телеграм канале: <a href="https://t.me/sovcom_tech" target="_blank">https://t.me/sovcom_tech</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@scbt/i57NLb2QdPt</guid><link>https://teletype.in/@scbt/i57NLb2QdPt?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt</link><comments>https://teletype.in/@scbt/i57NLb2QdPt?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt#comments</comments><dc:creator>scbt</dc:creator><title>Великое противостояние: Windows против macOS </title><pubDate>Tue, 21 Mar 2023 13:04:16 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d8/f2/d8f266ea-e5a5-44c5-8a3d-29226f439b6a.png"></media:content><description><![CDATA[<img src="https://lh5.googleusercontent.com/5fOh_55r_KDa5BTxPFine2kJinwECTWkIdGKIbf42acpXAKVtN5gZ5yTi67RhgVUzlnM9BSyN7NrBNxpezvvlWGhbLYyQXXvIINiXzasBCpq_k9XEHPF-BN2e3MndIhCTikyKYoPBwnPhjpjqiWxzAw"></img>В этой статье, постараемся беспристрастно сравнить операционные системы Windows и macOS. Сравним их в категориях: свобода выбора «железа» для установки, интерфейс и UX, экосистема, установка сторонних приложений, игры. В конце статьи попробуем сделать вывод. Поехали!]]></description><content:encoded><![CDATA[
  <h3 id="hwK8"><strong>Разбор плюсов и минусов двух самых популярных операционных систем.</strong></h3>
  <p id="A6nM"></p>
  <figure id="UkbY" class="m_column">
    <img src="https://lh5.googleusercontent.com/5fOh_55r_KDa5BTxPFine2kJinwECTWkIdGKIbf42acpXAKVtN5gZ5yTi67RhgVUzlnM9BSyN7NrBNxpezvvlWGhbLYyQXXvIINiXzasBCpq_k9XEHPF-BN2e3MndIhCTikyKYoPBwnPhjpjqiWxzAw" width="1200" />
  </figure>
  <p id="v93L">В этой статье, постараемся беспристрастно сравнить операционные системы Windows и macOS. Сравним их в категориях: свобода выбора «железа» для установки, интерфейс и UX, экосистема, установка сторонних приложений, игры. В конце статьи попробуем сделать вывод. Поехали!</p>
  <p id="sNyC"></p>
  <h3 id="OHR7"><strong>«Железо» для установки</strong></h3>
  <p id="ICFO"><strong>Windows <br /></strong>Полная свобода в отношении оборудование, на которые вы можете установить эту операционную систему. Компьютеры почти любых сборок, ноутбуки разных производителей и даже… холодильники. Да, это не шутка. В 2016 году на выставке потребительской электроники в Берлине компания LG представила холодильник, который работает под управлением операционной системы Windows 10.</p>
  <figure id="h8yY" class="m_column">
    <img src="https://lh3.googleusercontent.com/3N1ao03Wzsdh8CfgvkgtHph-VlZrM9HnxSChQeiSLxoF5P1Ofn8DmUohLZextDXqldzaFRHER3ztA_MRernxnmHjtEodiTkDVXeJmdV7OpiBV3pOuRh3ncj8I_80xEtJ0Beq4Hmbi0Ykuy7IadvCnjQ" width="810" />
    <figcaption>Источник: https://me.pcmag.com/</figcaption>
  </figure>
  <p id="Ue45">Собирая настольный компьютер под Windows, мы получаем широкий выбор комплектующих. Кастомный PC ограничен только бюджетом и теми задачами, под которые он будет собираться. Windows без проблем запуститься как на бюджетных сборках за 20-30 тысяч рублей, так и на игровых мощных машинах, с топовыми процессорами, мощными видеокартами за сотни тысяч рублей. Можно собрать для начала скромную машину, которая будет закрывать базовые задачи, а потом постепенно апгрейдить, улучшая характеристики своего PC.</p>
  <p id="ODNn"><strong>macOS</strong><br />Работает только на Маках. Да, благодаря энтузиастам и Хакинто́ш, можно запускать macOS на компьютерах не от Apple, но в этой статье мы не будем разбирать подобные решения.</p>
  <p id="ltdo"><em>Минусы<br /></em>За «железо» в стационарных компьютерах и ноутбуках от Apple придётся платить. Точнее переплачивать. В современных маках возможности самостоятельного апгрейда минимальны. Вы можете выбрать готовые маки или собрать свой, используя конфигуратор на сайте Apple. Например, если нужно увеличить оперативную память в ноутбуке MacBook Air на M2 с 8 Гб до 16 Гб, будьте готовы доплатить $200. Это официальная цена и в России итоговая стоимость ноутбука будет выше.</p>
  <p id="y5YF"></p>
  <figure id="imyR" class="m_column">
    <img src="https://lh4.googleusercontent.com/37RDPzQJv2wNf-j_AE72YBZWejKkRl9fGdP5DOdavgb9qnMlSv3kMFgShshMiFzXG4EUFYPfGVIJf3ws1H2sf6vfjZ9jLTrYNhLF_DxCQiEM6NlYy3stMcmcWsQeIOcPWa4PgDBiMXS_4XDbXCS_gu4" width="1508" />
    <figcaption>Источник: https://www.apple.com/</figcaption>
  </figure>
  <p id="dySt"><em>Плюсы</em>macOS идеальна ведёт себя на «железе» компьютеров Apple. С переходом Apple на процессоры собственного производства на ARM-архитектуре, компьютеры Apple показывают отличные результаты в различных тестах, а ноутбуки ещё и бьют рекорды по автономности.</p>
  <p id="brv0"></p>
  <blockquote id="CHuF">Если нужна свобода в кастомизации компьютеров, то выбирайте PC на Windows. Нужна автономность ноутбуков без потери производительности — это Apple</blockquote>
  <p id="qlmF"></p>
  <h3 id="koMo"><strong>Интерфейс и UX</strong></h3>
  <p id="HcLM">С выходом Windows 11 операционные системы Windows и macOS стали очень похожи. </p>
  <p id="xJd7"><strong>Например, работа с нескольким рабочими столами:</strong><br /></p>
  <figure id="jM15" class="m_column">
    <img src="https://lh6.googleusercontent.com/PQMFV0ePFJ2jq8pIXRzS9qZCCe4GXnh_05M9OKPzsX_7F9KCYw9qZqxCnAQRYKd3sgFTU1jFNcVeWuAkmEVeOfKLOpgxWvMUZz1_1PGQvFvdVsHXkODtxJIVu8IfGhk8VDdWYq1dB685w_tklGwC9To" width="1044" />
    <figcaption>Источник: https://support.microsoft.com/</figcaption>
  </figure>
  <p id="tvwd"></p>
  <figure id="Fsfo" class="m_column">
    <img src="https://lh5.googleusercontent.com/AOGHT9FDRWLMAutf7oZbDbPKuzlpoW9Eb1j0FqVH4IFDMOy7NzrgO5mI2jXFxCN8LziYrMgq9M07uISphNdVR1WOocqR2vnyb3tqcqkoyr38e82pnbcRinXGCWSX7vqHw6O_6ar_1eTjNxA9enZceBE" width="849" />
    <figcaption>Источник: https://support.apple.com/</figcaption>
  </figure>
  <p id="jlSf"></p>
  <p id="GSxo"></p>
  <p id="tqkQ"><strong>Системный поиск (Spotlight в macOS), который легко вызывается с клавиатуры:</strong></p>
  <p id="jmMv"></p>
  <figure id="jjqr" class="m_column">
    <img src="https://lh5.googleusercontent.com/9EOjQ_1ClJyPHENZnuan0dzPC3Oq1HitrHPCirAMWO5ssmorEDuYoaiL_8KpODQ3aFVZBuuyr80-eRjjdVD186xdREUUJdixdUCBj4zoTWW4LWu0QvfX3WVDYPudP-bTvmMIS23gQ8sI-p93NR7HzCI" width="1600" />
    <figcaption>Источник: https://www.neowin.net/news/closer-look-search-in-windows-11/</figcaption>
  </figure>
  <p id="pnb2"></p>
  <figure id="sL5Y" class="m_column">
    <img src="https://lh6.googleusercontent.com/BY5EQftjoBOyzlKSqkvQ_t3BivAREaN6ujaN0Qhc1Gd3Kvs2IYxQlyXH-pSYBlCBY0bkKkmEz7XszzpoKpSsTby0UVigBcUReo9UpQB6rpd5DcgqV-ec9fPBwF3yWNr5_D55m3I94xuGKgRpHtEbBRE" width="1536" />
    <figcaption>Источник: https://macmagazine.com.br/post/2021/04/10/o-que-e-e-como-usar-o-spotlight-no-mac/</figcaption>
  </figure>
  <p id="yWnP"></p>
  <p id="tOxw"><strong>Размещение приложений, к которым вам нужен быстрый доступ:</strong></p>
  <p id="w1EG">Dock на Mac</p>
  <figure id="NyHP" class="m_column">
    <img src="https://lh4.googleusercontent.com/pD3YunV0faEQAOVxLiN73JCTgEDIRdDvfhFBXoLlAYBGDQc1vzg8Yo2YabVQlhq6gnMAERpfBDvPfV8oc0YBYsS7c1JuIeIxISJCGFO3tio84Z7o57caXzQl7b0JZkWldxv3C2X-0Xpd92dxjpAON5k" width="934" />
    <figcaption>Источник: https://support.apple.com/</figcaption>
  </figure>
  <p id="aUvh"></p>
  <p id="EB81">Панель задач на Windows </p>
  <figure id="QPNW" class="m_column">
    <img src="https://lh5.googleusercontent.com/f6oh9uCi5TsuQxkwdgA9ryhmlEU_tTtl5CEo9cBPm-nnkgbOhU-lpmCi3YCEejFrHq9MEyV0KZ7zTdHozl0aV2RIwmUSDyF0MztJGkUMYJAFO_RyaH_zRgVWXWLKHT-FE5-cYRYX1lbBbXrZJ37kX5Y" width="1100" />
    <figcaption>Источник: https://support.microsoft.com/</figcaption>
  </figure>
  <p id="k73j"></p>
  <p id="bL66"><strong>Файловые менеджеры</strong></p>
  <p id="07FT">Проводник в Windows </p>
  <figure id="UyUD" class="m_column">
    <img src="https://lh3.googleusercontent.com/K09Q4YBDmFxKzpeDmQUaxRTMh2YDuGFqiE7MKFxj0jEMcuEIzO-jzs2h5wV_ZHeClbYS0-0nhIZ1CNPjrU7qNJugeYfq__FTEkYte21wUYY36Yat0Vhz9HhkKvx_hK2KPUQuvNsmsGSW3YJDGX0TWXM" width="1600" />
    <figcaption>Источник: https://windowsreport.com</figcaption>
  </figure>
  <p id="HC56"></p>
  <p id="AeRe">Finder в macOS</p>
  <figure id="nOfn" class="m_column">
    <img src="https://lh4.googleusercontent.com/4VRu6B3CBLCgb7fyoEEfp6OC6MaxIn7NYk6Ly39gKcWn8NyDzXc6Qzpa4O7a2EsLHIyA0qEvoesjdVeJbq9nogaNSk1icpE0D7_FCP2zp7FVOOoOOcJX9AqW5W3UWDo0C4lJdFzbatCD2LSXeOXazS0" width="1280" />
    <figcaption>Источник: https://support.apple.com</figcaption>
  </figure>
  <p id="BIex"></p>
  <p id="zi9W">Обе операционные системы предлагают похожие решения. Но, при более детальном рассмотрении, мы увидим различия в том, какой пользовательский опыт (UX) предлагают Windows и macOS.</p>
  <p id="uJXS">Например, в Windows уже из «коробки» есть удобная система работы с окнами. Система предлагает шесть режимов отображения открытых приложений, каждый из них можно адаптировать для повседневного использования.</p>
  <p id="3qia"></p>
  <figure id="HTxv" class="m_column">
    <img src="https://lh5.googleusercontent.com/yBWeTw5I_1Ozqm1cGg1r3ySVKSptadtkaEJ0rSajvkEeJthSRSHfSHm7O0Ghs26wn5XcOa3PjHFRXeQswIQouq_nrewQG0CPiERnoc-87MtelWNbxW8tjIcKaeSqMHMhoX6k9JDM4gt6EtEal80LBZk" width="1150" />
    <figcaption>Источник: https://thewincentral.com</figcaption>
  </figure>
  <p id="DgEE"></p>
  <p id="1Vd3">macOS предлагает меньше вариантов разделения экрана для работы с несколькими окнами одновременно. Чтобы на маках получить такое же разнообразие отображения окон, придётся ставить сторонние приложения. </p>
  <p id="buQQ"></p>
  <figure id="Ef3G" class="m_column">
    <img src="https://lh6.googleusercontent.com/V861VPou9Vy7jl3eN-WJHB5PufNTeoKmItzw2iMMnwbW2SyVrTVbzE1jA4PJN9smAY5bgvgq9LRDVJNylbDRaqiMe8HKvexoS0Gs4QEvTFDBnnVVi_SLenyBMKh-uj_CkQ6_KYUEOI6ACB0ixck3kzs" width="768" />
    <figcaption>Источник: https://www.digitaltrends.com</figcaption>
  </figure>
  <p id="plqS"></p>
  <p id="zEWX">Но в macOS есть свои фишки. Например, можно сделать углы экрана активными и при наведении мышью в один из углов, будет выполняться определённые действия. По умолчанию, правый нижний угол используется для создания короткой заметки. Удобно, можно быстро что-то записать пока не забыл.</p>
  <p id="Kuyi">Есть в macOS и Launchpad. Он показывает все приложения в виде сетки. Привычный режим для пользователей iPhone. Программы могут отображаться на нескольких страницах, если их слишком много и они не помещаются на одном экране.</p>
  <p id="YOTi"></p>
  <figure id="ElSZ" class="m_column">
    <img src="https://lh6.googleusercontent.com/-s80apGW2kK2iC3snSHakfPZuG1G4rLGE8g8kPK7_aAw-HoScLlIsHCGdG60xhBpxQwn9d7WiLgc9NA60SK5Ug_ANA1UEAs9bjcsV5Zes6X_iVfPXSGCOBJ3zzasqigu_4k-gZBZbBAPO2JdbAn1QiM" width="931" />
    <figcaption>Источник: https://support.apple.com</figcaption>
  </figure>
  <p id="IjlX"></p>
  <blockquote id="tZ6S">Внешне операционные системы становятся всё более похожи. У каждой из них есть свои фишки и слабые места в удобстве использования. Если не нравится функционал одной из этих систем или хочется что-то добавить — помогут сторонние утилиты.</blockquote>
  <p id="aANi"></p>
  <h3 id="15G6">Приложения</h3>
  <p id="owoC">macOS и Windows поставляются с набором базовых приложений. Но есть различие в подходе поставок офисных приложений, нужных для работы с текстом, таблицами и презентациями. Например, покупая ноутбук на Windows, можно получить пробную лицензию на пакет офисных программ Microsoft Office или докупать его отдельно. В macOS набор офисных программ идёт в комплекте с операционной системой и отдельно покупать их не надо. </p>
  <p id="Jpv3">Что касается магазинов приложений в macOS и Windows, то в них можно найти огромное количество утилит для решения разных задач. Есть приложения бесплатные, по подписке или бесплатные. </p>
  <p id="r80R"></p>
  <h3 id="KPMR">Экосистема</h3>
  <p id="CODg">В macOS экосистема — одно из главных преимуществ Apple. Если у вас есть часы, смартфон, планшет и компьютер от Apple, то вы получите отличную синхронизацию в работе этих устройств и удовольствие от их работы в одной экосистеме. </p>
  <p id="brOg">Устройства Apple синхронизируют между собой почти всё: закладки в браузере, медиатеку, заметки. Начав работать с документом на iPhone, можно продолжить его редактировать на макбуке. Наушники подключаются к тому устройству, которое вы используете сейчас, можно начав говорить на смартфоне, продолжить разговор на ноутбуке. Планшет можно подключать, как второй монитор и это будет работать без проводов.</p>
  <p id="oldC">Камеру iPhone можно использовать вместо веб-камеры макбука, если общаетесь в формате видеоконференции и качество встроенной камеры ноутбука вас не устраивает. </p>
  <p id="klku"></p>
  <figure id="ydXo" class="m_column">
    <img src="https://lh3.googleusercontent.com/3Yd_VtnOHxa-8HaOSF02R6Ccwj5cMxK1q76wtoQ7Pf9-9L66CfAZuZ6Hp4JIpVp1MKJe0AT2z3jBjaKwbkLPKpmv07M-wvuBWzMU_T-ua-jpaXY_-x4DC3jVajzHxSh2fkeEPKCH1-dpz8Ewhf0vVm0" width="1600" />
    <figcaption>Источник: https://wylsa.com</figcaption>
  </figure>
  <p id="wDjq"></p>
  <p id="ghLg">Windows тоже развивает синхронизацию между разными устройствами. Например, если у вас компьютер на Windows и смартфон на Android, то с помощью приложения «Мой телефон», вы будете получать на компьютер уведомления с телефона и управлять смартфоном с ПК.</p>
  <p id="npaT"></p>
  <figure id="SNBQ" class="m_column">
    <img src="https://lh3.googleusercontent.com/fhEdV1DBZXSgKT9OoUjzyrTjeS60Y2Heb_AEjJnMuG_4JHbIlLiU7FPnG21AhWtZobrwKAr6cTz9kNA0tk-Bb9DljydVexr3rEN3sGxc4JbrmFNZzOpylKHVKH7sBVs55MaC-X8RmvjNSLZuBFA_t7U" width="680" />
    <figcaption>Источник: https://justsurvivalcraft.ru</figcaption>
  </figure>
  <p id="8D1h"></p>
  <blockquote id="rSzL">Экосистема macOS — одна из главных фишек Apple. Windows пока не может похвастаться таким преимуществом. Возможно, если бы не исчезла мобильная операционная система «Windows Mobile», всё могло бы получится по другому.</blockquote>
  <p id="wCk5"></p>
  <h3 id="QaRF">Установка сторонних приложений </h3>
  <p id="25K5">Магазины приложений App Store для маков и Microsoft Store для Windows предлагают огромное количество утилит. Если надо установить приложения от сторонних разработчиков, то Windows и macOS не ограничивают в этом своих пользователей. В отличии от своей мобильной операционной системы, Apple тут даёт больше свободы.</p>
  <p id="B3TX">В Windows и macOS можно запускать мобильные приложения. Для Windows нужно будет установить подсистему Android. На маках запускаются программы для IOS, если на компьютере стоят чипы M-серии. <br /></p>
  <blockquote id="WAPF">Обе операционные системы не ограничивают своих пользователей в источнике скачивания утилит. Можно скачивать в официальных магазинах приложений, устанавливать программы от сторонних разработчиков или устанавливать «пиратский» софт. </blockquote>
  <p id="iLDL"></p>
  <h3 id="3tQS">Игры</h3>
  <p id="ZhJV">Когда дело касалось игр, то Windows всегда побеждал macOS. Почему так: до перехода на собственные чипы, Apple устанавливала на свои компьютеры далеко не топовые видеокарты. С переходом на чипы M-серии, маки получили достаточно видео ядер и это изменило ситуацию с играми на маках. Например, игра «Resident Evil Village» отлично оптимизирована для игры даже на базовых компьютерах Apple с чипами M-серии. </p>
  <p id="BGnj"></p>
  <figure id="wuRV" class="m_column">
    <img src="https://lh4.googleusercontent.com/RFXxjT7-iA3xxqWGFlUfZvGucp7mjIeqkWepreZ84aw2axaCC94e1qkjIPjr025f-kFJCpxbmF4c_u7W5p4ZaDTJfOhybjbDo9EMbHTOgkHFp8ECBzDP1n7bcnZX9x7D5uLjtgR0e-ZaMIqjH6qeISk" width="626" />
    <figcaption>Источник: https://apps.apple.com</figcaption>
  </figure>
  <p id="0yai"></p>
  <p id="dZaz">Пока производители игр неохотно оптимизируют свои игры под macOS. Главная причина — пользователей маков гораздо меньше пользователей PC. Да и Apple всегда позиционировала свои компьютеры, как инструмент для профессионалов, готовый к работе из «коробки», но точно не для гейминга. </p>
  <p id="hfXY"></p>
  <blockquote id="mN0w">Хочеться играть — берите компьютер на Windows или купите себе игровую консоль. Маки уже сделали огромный шаг в сторону геймеров, но этого пока мало.</blockquote>
  <p id="jRGq"></p>
  <h3 id="ifkB">Что в итоге</h3>
  <p id="q8SN">Выбирайте компьютер на macOS, если:</p>
  <ul id="AoW0">
    <li id="W7Jy">готовы переплачивать за компоненты</li>
    <li id="hqC3">не хотите заниматься самостоятельной кастомизацией</li>
    <li id="xeTV">не играете в современные игры</li>
    <li id="Sa58">вам нужна отличная автономность ноутбука без потери мощности</li>
    <li id="a6I3">используете специфический софт для работы и ему нет аналогов на Windows или они хуже</li>
    <li id="Nu5A">у вас есть другие продукты от Apple (смартфон, планшет) и вы хотите получать удовольствие от работы этих гаджетов в одной экосистеме</li>
    <li id="dS4I">если вы iOS-разработчик</li>
  </ul>
  <p id="8fzO"></p>
  <p id="KetN">Вам подойдет компьютер на Windows, если:</p>
  <ul id="lfki">
    <li id="KKRH">вам нужна свобода выбора комплектующих для сборки компьютера и последующего апгрейда</li>
    <li id="NzJN">играете на своём компьютере в современные игры</li>
    <li id="Tsgr">софт для вашей деятельности есть на Windows и он работает хорошо</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@scbt/XGl_mJ_-tzY</guid><link>https://teletype.in/@scbt/XGl_mJ_-tzY?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt</link><comments>https://teletype.in/@scbt/XGl_mJ_-tzY?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt#comments</comments><dc:creator>scbt</dc:creator><title>Играем в «Угадай число». Как поможет бинарный поиск</title><pubDate>Tue, 24 Jan 2023 07:10:07 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/52/36/5236f84b-aba7-4030-a942-5073742d6f63.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/95/40/95404f5b-994b-4d44-8097-2d5924e430eb.png"></img>Хотите сыграть в простую игру? Предположим, я загадал число от 0 до 100.  Отгадайте какое число я загадал, использовав как можно меньше попыток. При каждой попытке вы будете получать один из ответов: «мало», «много», «угадал».]]></description><content:encoded><![CDATA[
  <figure id="h7Xt" class="m_column">
    <img src="https://img2.teletype.in/files/95/40/95404f5b-994b-4d44-8097-2d5924e430eb.png" width="1200" />
  </figure>
  <p id="jq7O">Хотите сыграть в простую игру? Предположим, я загадал число от 0 до 100.  Отгадайте какое число я загадал, использовав как можно меньше попыток. При каждой попытке вы будете получать один из ответов: «мало», «много», «угадал».</p>
  <h3 id="kRmw">Угадываем число через простой поиск</h3>
  <p id="haqI">Возможно, вы начнёте перебирать все варианты подряд: 1, 2, 3, 4 ... и т.д</p>
  <figure id="kPEB" class="m_column">
    <img src="https://img1.teletype.in/files/48/69/48696fe0-5398-4d6b-9859-edec7b35c66c.png" width="1200" />
    <figcaption>Так работает простой поиск</figcaption>
  </figure>
  <p id="HFOh">При каждым ответе будет исключаться только одно число. Это пример работы простого поиска. Рано или поздно мы дойдём до правильного ответа. Но представьте, если бы я загадал число 99. Чтобы до него добраться, потребуется 99 попыток. Долго.</p>
  <figure id="Aq4j" class="m_column">
    <img src="https://img3.teletype.in/files/26/72/26727e49-aaa2-4da4-b5cf-d82a05365aa5.png" width="1200" />
    <figcaption>Да что же это за число?!!</figcaption>
  </figure>
  <p id="0puI"></p>
  <h3 id="Bnmv">Более эффективный способ</h3>
  <p id="yMSb">Начнём с числа 50. </p>
  <figure id="7pAp" class="m_column">
    <img src="https://img2.teletype.in/files/d8/d8/d8d8f6b5-a649-4e98-8b5c-44fe6cc83d89.png" width="1200" />
    <figcaption>Пора не угадали</figcaption>
  </figure>
  <p id="pgxS">Мало. Но мы только что исключили половину чисел! Теперь мы знаем, что все числа 1 — 50 меньше загаданного. Делаем следующую попытку.</p>
  <figure id="IjAn" class="m_column">
    <img src="https://img2.teletype.in/files/9e/3b/9e3b70af-79d1-4b03-a307-61c5ad41e8bc.png" width="1200" />
    <figcaption>Перелёт</figcaption>
  </figure>
  <p id="8vOr">Много, но мы снова исключили половину чисел! Начинаем использовать бинарный поиск.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <blockquote id="bIHq">С бинарным поиском мы каждый раз загадываем число в середине диапазона и исключаем половину оставшихся чисел.</blockquote>
  </section>
  <p id="NmhQ"></p>
  <p id="RJD4">Называем следующее число. Это будет 63 (середина между 50 и 75).</p>
  <figure id="lEME" class="m_column">
    <img src="https://img1.teletype.in/files/88/da/88daee0a-9d03-4a7f-85e6-ce5768080e19.png" width="1200" />
    <figcaption>Победа :)</figcaption>
  </figure>
  <hr />
  <p id="JCdW"><strong>Бинарный поиск работает только в том случае, если список отсортирован. </strong>Например, бумажный телефонный справочник. Имена абонентов в нём хранятся в алфавитном порядке и при поиске нужного номера телефона можно воспользоваться бинарным поиском.<br /><br /><em>Что почитать по теме: «Грокаем алгоритмы» Адитья Бхаргава</em></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@scbt/yr5bwqO4XYM</guid><link>https://teletype.in/@scbt/yr5bwqO4XYM?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt</link><comments>https://teletype.in/@scbt/yr5bwqO4XYM?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scbt#comments</comments><dc:creator>scbt</dc:creator><title>Краткое введение в разработку собственных правил для ESLint</title><pubDate>Thu, 12 Jan 2023 06:46:22 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/ca/af/caaf3080-db29-44a6-835d-ec5f68e6f316.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/a4/b2/a4b2c8ce-c527-4dea-8110-19ed0afd9ee4.jpeg"></img>Недавно мы в команде столкнулись с тем, что нам понадобилось кастомное правило для линтера. Немного поиска в гугле, и через час-полтора правило было готово. Делимся базовыми примерами, которые помогут вам погрузиться в процесс разработки правил.]]></description><content:encoded><![CDATA[
  <p id="VOQU">Недавно мы в команде столкнулись с тем, что нам понадобилось кастомное правило для линтера. Немного поиска в гугле, и через час-полтора правило было готово. Делимся базовыми примерами, которые помогут вам погрузиться в процесс разработки правил.</p>
  <figure id="LvZT" class="m_column">
    <img src="https://img3.teletype.in/files/a4/b2/a4b2c8ce-c527-4dea-8110-19ed0afd9ee4.jpeg" width="780" />
  </figure>
  <h3 id="WVla">Приступаем</h3>
  <p id="SQqL">Для написания правила, а точнее для исследования кода, нам понадобится абстрактное синтаксическое дерево. Быстрый способ получить его — воспользоваться <a href="https://astexplorer.net/" target="_blank">AST Explorer</a>.</p>
  <p id="tw32"><strong>Выбираем язык</strong> — JavaScript.<br /><strong>Парсер</strong> — babel-eslint9<br /><strong>Трансформер</strong> — ESLint v4 (можно и свежее, но для этой статьи достаточно и версии 4)</p>
  <p id="HkXM"></p>
  <figure id="xkE6" class="m_column">
    <img src="https://img2.teletype.in/files/5e/24/5e24daa2-89eb-4aad-ac32-936ec55ea17b.png" width="960" />
  </figure>
  <ul id="NrYb">
    <li id="ZxCX">В левой верхней части вводим пример кода, который будем исследовать.</li>
    <li id="sJq0">В правой верхней части вы увидите дерево вашего кода.</li>
    <li id="Ouvg">В нижней левой части будем писать код правила.</li>
    <li id="JXn8">В правой нижней части отображается результат обработки вашего кода.</li>
  </ul>
  <p id="JFf1"></p>
  <figure id="yr5g" class="m_column">
    <img src="https://img2.teletype.in/files/59/86/598614f4-7d93-4a29-b4c4-a7411628ae65.png" width="1560" />
  </figure>
  <h3 id="8oEs">Задача</h3>
  <p id="D6Fp">Придумаем какую-нибудь задачу для нас. Наше правило должно обрабатывать написанные нами функции следующим образом:</p>
  <ul id="Ei1o">
    <li id="b5VG">Если функция асинхронная, то ее название должно содержать Async в самом конце.</li>
    <li id="DZlX">return должен быть отделен от основного кода блока одной пустой строкой.</li>
  </ul>
  <p id="Da05"></p>
  <h3 id="NNah">Подопытный код</h3>
  <p id="gBzG">В левую верхнею секцию AST Explorer вставьте код функции:</p>
  <pre id="DuNp">async function helloFunction(names = []) {
    const namesEdited = names
        .map((name) =&gt; {
            const formattedName = &#x60;hello ${name}&#x60;;
            return formattedName;
        });
    return namesEdited;
}</pre>
  <p id="znVd"></p>
  <p id="8dY9">Вот такой результат мы хотим получить в итоге работы наших правил линтера:</p>
  <pre id="UEb0">async function helloFunctionAsync(names = []) {
    const namesEdited = names
        .map((name) =&gt; {
            const formattedName = &#x60;hello ${name}&#x60;;

            return formattedName;
        });

    return namesEdited;
}</pre>
  <p id="mOpA"></p>
  <h3 id="nDUN">Первое правило</h3>
  <p id="IBh3">В верхней правой части отображается дерево c нодами нашего кода.</p>
  <figure id="Alqx" class="m_column">
    <img src="https://img1.teletype.in/files/81/02/810232d0-5d8e-4e76-a47d-a83c3ef78d6c.png" width="928" />
  </figure>
  <p id="9311">По дереву Program -&gt; body видим ноду FunctionDeclaration — это и есть наша функция. В редакторе кода в нижней левой части напишем основную функцию нашего правила:</p>
  <pre id="UJ6Y">export default function(context) {
    return {
        FunctionDeclaration(node) {
    		
        },
    };
};</pre>
  <p id="y6et"></p>
  <p id="nmNv">Как видно из кода, функция принимает контекст и возвращает обработчик для блоков FunctionDeclaration, который в свою очередь принимает ноду в качестве аргумента.</p>
  <p id="RE64">Допишем первое условие для проверки функции на асинхронность и наличие Async в конце названия функции.</p>
  <pre id="Q9dO">export default function(context) {
    return {
        FunctionDeclaration(node) {
        	const isAsyncFunction = node.async;
          	const hasAsyncAtEndOfName = /Async$/.test(node.id.name);

      	    if (isAsyncFunction &amp;&amp; !hasAsyncAtEndOfName) {
            	//
            }
        },
    };
};</pre>
  <figure id="6cni" class="m_column">
    <img src="https://img2.teletype.in/files/10/31/103169d1-c03a-4dc3-82a4-35a4167c2e14.png" width="650" />
    <figcaption>На рисунке видно, что отображается в дереве нашего кода.</figcaption>
  </figure>
  <p id="oY6G"></p>
  <p id="qwBF">Теперь сообщим разработчику, что функция не соответствует правилу для асинхронных функций. Для этого воспользуемся методом &#x60;context.report&#x60;, который присутствует в объекте context.</p>
  <pre id="emMY">export default function(context) {
    return {
        FunctionDeclaration(node) {
        	const isAsyncFunction = node.async;
          	const hasAsyncAtEndOfName = /Async$/.test(node.id.name);
      
          	if (isAsyncFunction &amp;&amp; !hasAsyncAtEndOfName) {
            	context.report({
                	node,
                  	message: &#x27;Названия асинхронных функций должны заканчиваться на Async&#x27;,
                });
            }
        },
    };
};</pre>
  <p id="BtSh"></p>
  <figure id="YXfz" class="m_column">
    <img src="https://img4.teletype.in/files/72/8d/728db70e-f4af-4b70-9cdd-a3a33c4f6ea1.png" width="683" />
  </figure>
  <p id="ovaT">В правой нижней части AST Explorer мы увидим результат обработки кода нашим правилом. Также заметьте, что в блоке Fixed output follows нет варианта исправленного кода.</p>
  <p id="kp8q">Нужно дописать еще одно свойство в объект передаваемый в метод report:</p>
  <pre id="99Ry">export default function(context) {
    return {
        FunctionDeclaration(node) {
        	const isAsyncFunction = node.async;
          	const hasAsyncAtEndOfName = /Async$/.test(node.id.name);

      	    if (isAsyncFunction &amp;&amp; !hasAsyncAtEndOfName) {
            	context.report({
                    node,
                    message: &#x27;Названия асинхронных функций должны заканчиваться на Async&#x27;,
                    fix: function(fixer) {

                        // Получаем токен названия функции
                        const nameToken = context
                                .getTokens(node)
                                .find(token =&gt; token.value === node.id.name);

                        // Возвращаем исправленное название
                        return fixer.replaceText(nameToken, node.id.name + &#x27;Async&#x27;);
                    }
                });
            }
        },
    };
};</pre>
  <p id="CM2c"></p>
  <p id="QvEm">Результат обработки кода изменился, fixer смог изменить название функции на подходящее под правило.</p>
  <figure id="XTjF" class="m_original">
    <img src="https://img2.teletype.in/files/9f/58/9f588f32-f48f-44c8-ad48-5a770bc30418.png" width="667" />
  </figure>
  <p id="s1A0">Давайте допишем второе условие для нашего правила. Выделив слово &quot;return&quot; в исходном коде функции в левой верхней части astexplorer, мы увидим в дереве тип ноды ReturnStatement. Допишем перехватчик в нашу функцию:</p>
  <pre id="OiKa">export default function(context) {
    return {
        FunctionDeclaration(node) {
            // ... тут код не меняем
        },
        ReturnStatement(node) {
            // здесь опишем новый обработчик
        },
    };
};</pre>
  <p id="vDh9"></p>
  <p id="rVjj">Для обработки ReturnStatement нам надо:</p>
  <ol id="ekw0">
    <li id="RyuW">Убедиться, что return не является первым элементом в родительском блоке.</li>
    <li id="mT3V">Проверить, что перед строкой с return уже нет пустой строки.</li>
    <li id="ocgO">Учесть, что перед return могут быть комментарии.</li>
  </ol>
  <p id="tn7l"></p>
  <p id="mdOV">Для этой функции нам понадобятся функции-помощники. Код снабдили комментариями. Код функций ниже взят из репозитория ESLint.</p>
  <pre id="zsH3">export default function(context) {
    // Получение исходного кода
    const sourceCode = context.getSourceCode();

    // Проверка на возможность исправить найденное нарушение
    function canFix(node) {
        const leadingComments = sourceCode.getCommentsBefore(node);
        const lastLeadingComment = leadingComments[leadingComments.length - 1];
        const tokenBefore = sourceCode.getTokenBefore(node);

        if (leadingComments.length === 0) {
            return true;
        }

        if (lastLeadingComment.loc.end.line === tokenBefore.loc.end.line &amp;&amp;
            lastLeadingComment.loc.end.line !== node.loc.start.line) {

            return true;
        }

        return false;
    }
        
    // Получить номер строки токена предшествующего ноде      
    function getLineNumberOfTokenBefore(node) {
  	    const tokenBefore = sourceCode.getTokenBefore(node);

        if (tokenBefore) {
        	return tokenBefore.loc.end.line;
        }

        return 0;
    }

    // Подсчет строк с комментариемя перед нодой
    function calcCommentLines(node, lineNumTokenBefore) {
  	    const comments = sourceCode.getCommentsBefore(node);

        let numLinesComments = 0;

        if (!comments.length) {
        	return numLinesComments;
        }

        comments.forEach(comment =&gt; {
    	    numLinesComments++;

            if (comment.type === &quot;Block&quot;) {
		        numLinesComments += comment.loc.end.line - comment.loc.start.line;
            }

            if (comment.loc.start.line === lineNumTokenBefore) {
		        numLinesComments--;
            }

            if (comment.loc.end.line === node.loc.start.line) {
      	        numLinesComments--;
            }
        });

        return numLinesComments;
    }

    // Проверка на наличие пустой строки перед нодой
    function hasNewlineBefore(node) {
      	const lineNumNode = node.loc.start.line;
        const lineNumTokenBefore = getLineNumberOfTokenBefore(node);
        const commentLines = calcCommentLines(node, lineNumTokenBefore);

        return (lineNumNode - lineNumTokenBefore - commentLines) &gt; 1;
    }

    // Проверка токена перед нодой на совпадение с элементом массива
    function isPrecededByTokens(node, testTokens) {
  	    const tokenBefore = sourceCode.getTokenBefore(node);

        return testTokens.includes(tokenBefore.value);
    }

    // Является ли нода первой в родительском блоке
    function isFirstNode(node) {
        // Тип родительской ноды
  	    const parentType = node.parent.type;

        /**
        * Если родительская нода содержит body, то проверяем
        * является ли переданная нода телом родительской или первым элементом в ней
        */
        if(node.parent.body) {
    	    return Array.isArray(node.parent.body)
          		? node.parent.body[0] === node
          		: node.parent.body === node;
        }

        /**
        * Если родительская нода является Условием If,
        * то надо проверить, что перед нашей нодой есть &quot;else&quot; или &quot;)&quot;
        */
        if (parentType === &quot;IfStatement&quot;) {
    	    return isPrecededByTokens(node, [&#x27;else&#x27;, &#x27;)&#x27;]);
        }

        /**
        * Если родительская нода является блоком do-while,
        * то надо проверить, что перед нашей нодой есть &quot;do&quot;
        */
        if (parentType === &quot;DoWhileStatement&quot;) {
            return isPrecededByTokens(node, [&quot;do&quot;]);
        }

       /**
       * Если родительская нода является блоком switch case,
       * то надо проверить, что перед нашей нодой есть &quot;:&quot;
       */
        if (parentType === &quot;SwitchCase&quot;) {
           return isPrecededByTokens(node, [&quot;:&quot;]);
        }

        /**
        * Во всех остальных случаях проверяем на &quot;)&quot; перед нашей нодой
        */
        return isPrecededByTokens(node, [&quot;)&quot;]);
    }

    return {
        FunctionDeclaration(node) {
            // тут ничего не меняется
        },
    
        ReturnStatement(node) {
            if (!isFirstNode(node) &amp;&amp; !hasNewlineBefore(node)) {
                context.report({
                    node,
                    message: &#x27;Поставьте пустую строку до return&#x27;,
                    fix: function(fixer) {
    
                        if (canFix(node)) {
                            const tokenBefore = sourceCode.getTokenBefore(node);
                            const whitespaces = sourceCode.lines[node.loc.start.line - 1].replace(/return(.+)/, &#x27;&#x27;);
                            const newlines = node.loc.start.line === tokenBefore.loc.end.line ? &#x60;\n\n${whitespaces}&#x60; : &#x60;\n${whitespaces}&#x60;;
    
                            return fixer.insertTextBefore(node, newlines);
                        }
    
                        return null;
                    }
                });
            }
        },
    };
};</pre>
  <p id="qQ9t"></p>
  <p id="FU1M">Результат выполнения наших правил виден в правой нижней части AST Explorer.</p>
  <figure id="r5vk" class="m_original">
    <img src="https://img4.teletype.in/files/b1/83/b183cf1c-dc23-461e-b8ad-f24492991318.png" width="689" />
  </figure>
  <p id="qMiV">Теперь написанные правила нужно оформить в npm-пакет.</p>
  <ol id="XiNK">
    <li id="XcAg"><strong>Создаем директорию для пакета:</strong> &#x60;mkdir my-eslint-rules&#x60;</li>
    <li id="vLED"><strong>Переходим в директорию проекта и инициализируем пакет:</strong> &#x60;cd my-eslint-rules &amp;&amp; npm init --yes&#x60;</li>
    <li id="5krT"><strong>Создаем файл index.js:</strong> &#x60;touch index.js&#x60;</li>
  </ol>
  <p id="cDjp">Внутри index.js размещаем наши правила:</p>
  <pre id="4UTA">module.exports = {
  rules: {
    &#x27;async-func-name&#x27;: {
      create: function (context) {
        return { /* тут код правила добавляющего Async для асинхронных функций */ }
      },
    },
    &#x27;new-line-before-return&#x27;: {
        create: function (context) {
            return { /* тут код правила для добавления пустых строк перед return */ }  
        },
    },
  }
};</pre>
  <p id="azr4"></p>
  <p id="68tH">Можно разместить пакет в гит-репозитории или загрузить на npmjs.com. Для статьи мы будем проводить установку правила локально.</p>
  <ol id="6DsF">
    <li id="oapT">Перейдите в директорию вашего проекта в котором вы хотите применить новые правила линтера: &#x60;cd my-project&#x60;.</li>
    <li id="pFg6">Установите новый пакет с кастомными правилами: &#x60;npm i ../my-eslint-rules --save-dev&#x60;.</li>
    <li id="dsJh">В файл конфигурации линтера &#x60;.eslintrc&#x60; добавьте наш плагин и определение правил:</li>
  </ol>
  <pre id="udiY">{
    &quot;rules&quot;: {
        &quot;my-eslint-rules/async-func-name&quot;: &quot;warn&quot;,
        &quot;my-eslint-rules/new-line-before-return&quot;: &quot;warn&quot;
    },
    &quot;plugins&quot;: [&quot;my-eslint-rules&quot;]
}</pre>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="AyB3">Предварительно в вашем проекте должен быть установлен ESLint.</p>
  </section>
  <p id="zBEp"></p>
  <h3 id="5AAF">Материалы по теме</h3>
  <p id="Oryb"><a href="https://eslint.org/docs/latest/developer-guide/working-with-rules" target="_blank">Как работать с правилами. Материал от команды ESLint</a><br /><a href="https://eslint-utils.mysticatea.dev/" target="_blank">Пакет вспомогательных утилит для написания правил</a><br /><a href="https://docs.npmjs.com/creating-and-publishing-scoped-public-packages" target="_blank">Как размещать npm-пакеты</a><br /><a href="https://habr.com/ru/company/ruvds/blog/415269/" target="_blank">Подробнее об абстрактных синтаксических деревьях</a></p>

]]></content:encoded></item></channel></rss>