<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Шпаргалки</title>
    <description>Ценные подборки статей, описания «хаков» и лаконичные описания программных API для тех, кому лень каждый раз искать документацию.</description>
    <link>https://tproger.ru/tag/cheatsheets</link>
    <atom:link href="https://tproger.ru/tag/cheatsheets/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sun, 04 Oct 2026 20:08:46 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Шпаргалки</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Чек-лист компьютерной грамотности для детей</title>
      <link>https://tproger.ru/articles/chek-list-kompyuternoj-gramotnosti-dlya-detej</link>
      <comments>https://tproger.ru/articles/chek-list-kompyuternoj-gramotnosti-dlya-detej?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Блог Школа программирования Пиксель]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chek-list-kompyuternoj-gramotnosti-dlya-detej</guid>
      <description><![CDATA[<p>Компьютерная грамотность для детей — это не только работа с папками и файлами, это также про безопасность, критическое мышление и цифровое творчество. Собрали в один чек-лист все главные компьютерные навыки для школьников.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chek-list-kompyuternoj-gramotnosti-dlya-detej">Чек-лист компьютерной грамотности для детей</a>»</p>]]></description>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 15 Dec 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Умение пользоваться компьютером сегодня — это базовый навык, такой же, как чтение или письмо. Если ребенок уверенно обращается с техникой, он эффективнее учится, безопасно общается в Интернете и сможет открыть для себя целый мир цифрового творчества.</p><p>Но что входит в этот навык? Как родителю оценить уровень ребенка? Вместе с экспертами детской компьютерной школы «Пиксель» мы составили чек-лист основных компетенций.</p><h2>Как изменилось понимание компьютерной грамотности</h2><p>Всего 15-20 лет назад фраза «мой ребенок умеет работать за компьютером» чаще всего означала: он умеет включать ПК, печатать в Word и искать что-то в Интернете. Компьютер воспринимался как сложный инструмент, который упрощает работу, но без которого можно обойтись.</p><p>Сегодня все изменилось. Для современных детей компьютер и гаджеты — это важная часть их социальной среды. Поэтому и набор обязательных умений сместился с простого технического владения программами на комплексную цифровую гигиену и осознанное использование.</p><ul><li>Безопасность вышла на первый план.</li></ul><p>Раньше главной угрозой казался вирус, который мог «сломать компьютер». Сегодня реальные риски тоньше и опаснее: фишинг (кража аккаунтов), мошенничество в чатах, кибербуллинг, утечка личных фото и данных. Поэтому умение создавать и хранить надежные пароли, проверять ссылки и настраивать приватность в соцсетях стали критически важными — даже важнее, чем знание Word или Excel.</p><ul><li>Информации стало намного больше.</li></ul><p>Раньше источником знаний были книги или пара проверенных сайтов. Сейчас детей окружает бесконечный поток данных из соцсетей, видеоблогов, мессенджеров и игр. Ключевой навык теперь — не просто найти, а быстро отфильтровать: отделить факты от вымысла, рекламу от полезного совета, авторитетный источник от сомнительного. Современная компьютерная грамотность, и не только у детей, — это критическое мышление плюс умение структурировать найденное.</p><ul><li>Акцент сместился с потребления на создание.</li></ul><p>Поколение назад дети в основном потребляли готовый цифровой контент: играли в игры, смотрели фильмы. Сегодня они с самого раннего возраста видят, как их сверстники ведут влоги, собирают свои миры в Minecraft, рисуют в цифре и монтируют клипы в TikTok. Поэтому базовая грамотность теперь закономерно включает основы цифрового творчества: умение сделать простую графику, смонтировать видео, оформить презентацию или записать подкаст.</p><p>То есть компьютерная грамотность для детей — это уже не про то, как запустить программу. Это про то, как безопасно, эффективно и творчески жить в цифровой среде. А теперь перейдем к самому интересному — конкретным навыкам и чек-листу компьютерной грамотности для детей. И начнем с умений, которые напрямую влияют на успеваемость в школе.</p><h2>Учимся учиться: работа с информацией и данными</h2><p>Эти навыки — основа цифровой самостоятельности. Речь пойдет не о развлечениях, а о рабочих инструментах, которые превращают компьютер из игрушки в помощника для учебы.</p><h3>Эффективный поиск: не просто искать, а найти ответ</h3><p>Для современных детей поисковики — это вторая память. Но часто они вписывают в строку вопрос целиком, как будто разговаривают с другом, и получают в ответ миллион нерелевантных ссылок. Наша задача — научить их «разговаривать» с поисковой системой на ее языке:</p><ul><li>Нужно научить ребенка выделять значимые слова в запросе, а еще лучше — использовать операторы. Например, поставить минус перед словом, чтобы исключить ненужное: по запросу «python -змея» найдется информацию только о языке программирования.</li><li>Один из главных навыков — проверка источника. Нашли интересный факт для доклада? Отлично. Но спросите: «А кто это написал?». Научите ребенка смотреть, стоит ли за статьей научная организация, известный университет или, наоборот, это просто пост в блоге с громким заголовком. Это и есть прививка от фейков.</li><li>Еще один суперважный навык — не верить искусственному интеллекту на 100%. Нейросети могут насчитать больше 24 часов в сутках, назвать водород металлом или придумать несуществующие химические элементы — они могут ошибаться и делают это регулярно. Важно показать это ребенку.</li></ul><h3>Структурирование данных: порядок на компьютере — порядок в голове</h3><p>Вы когда-нибудь видели рабочий стол, заваленный сотней файлов с названиями «Документ1» или «Изображение123»? Это признак цифрового хаоса, который крадет время и нервы. Умение наводить порядок в файлах — это навык системного мышления, и он пригодится везде, а не только в работе за компьютером.</p><p>Что должен уметь ребенок:</p><ul><li>Создавать папки («4 класс», «Математика», «Проект „Рыцари“») и называть файлы понятно («Рыцари_черновик», «Рыцари_презентация_финал»). Это кажется мелочью, но так он учится организовывать не только файлы, но и свои мысли.</li><li>Понимание форматов — это суперсила. Ребенок должен знать, что doc, docx, txt, rtf или pages — это для текста, jpg, png — для фотографий, mobi, fb2, epub — файлы электронных книг, а pdf и djvu — чтобы документ везде выглядел одинаково. Это избавит от ситуаций «мама, у меня не открывается» и научит выбирать правильную программу для просмотра.</li></ul><h3>Облачные технологии: работа там, где удобно и не в одиночку</h3><p>Пожалуй, самый новый из всех навыков компьютерной грамотности для детей. Облако — это доступ к своей работе с любого устройства: с домашнего ПК, школьного ноутбука или планшета в дороге. Ребенок может начать писать доклад в школе, сохранить его черновик в Google Документах, а вечером продолжить работу дома.</p><p>Кроме того, облачные технологии открывают детям путь к командной работе. Современные проекты редко делаются в одиночку. Умение поделиться ссылкой на файл с одноклассником для совместной работы, оставить комментарий или откатиться к предыдущей версии — это база для любой коллективной задачи, от школьного реферата до планирования похода.</p><p>На курсах компьютерной грамотности для детей в школе «Пиксель» мы начинаем именно с этих, базовых навыков. Потому что без них любое дальнейшее обучение — не только программирование или дизайн, но и учеба в обычной школе — дается тяжело. Ребенок, который умеет искать информацию, организовывать файлы и пользоваться облаком — эффективный ученик. Он экономит свое время, меньше зависит от помощи взрослых и может сосредоточиться на сути задач, а не на технических проблемах.</p><h2>Не правила, а привычки: цифровая безопасность и гигиена</h2><p>Представьте, что вы учите ребенка переходить дорогу: смотри на светофор, иди на зеленый, убедись, что машины остановились. Цифровой мир — такая же оживленная улица, и здесь нужны свои понятные правила. Это не запреты ради запретов — правила нужны для уверенности.</p><h3>Надежные пароли: ваш первый и главный цифровой замок</h3><p>Пароли «12345» или «qwerty» — это как оставить ключ от квартиры под ковриком. Дети часто выбирают простые пароли, чтобы не забыть, или, что еще рискованнее, везде используют один и тот же пароль.</p><p>Что делать? Объясните просто: надежный пароль — это как секретная формула. Он должен быть длинным (от 10 символов) и состоять из «всего понемногу»: букв (больших и маленьких), цифр и символов (например, ! или &amp;). Можно придумать вместе правило: взять фразу из любимой песни или книжки и превратить ее в аббревиатуру с цифрами. Например, «Я учусь в 4Б классе!» → «Yuv4Bk!».</p><p>Следующий уровень — менеджер паролей. Если ребенок готов, можно показать ему, как такие программы (например, встроенные в браузер) хранят сложные пароли. Ребенку не придется запоминать сложные комбинации, а привычка использовать разные пароли для разных сайтов станет по-настоящему удобной.</p><h3>Конфиденциальность: что такое «личное» и почему им нельзя делиться</h3><p>Для детей граница между «своим» и «общим» в сети часто размыта. Выложить фото новой комнаты, отметить геолокацию школы в сторис, написать в игровом чате: «Мне 10, учусь в школе №...» — все это кажется безобидным общением.</p><p>Важно поговорить об это с ребенком не запугивая, а объясняя последствия. Спросите: «Ты бы дал свой домашний адрес незнакомому человеку на улице? Вот и в сети адрес, телефон, номер школы, кружки, на которые ты ходишь, — это твоя личная информация. Ее не выставляют на всеобщее обозрение».</p><p>Прямо вместе с ребенком зайдите в настройки его соцсети или игровой платформы (например, Minecraft). Покажите, где включается «закрытый аккаунт», кто может писать в личные сообщения, оставлять комментарии или видеть друзей.</p><h3>Критическое мышление: как не попасться на крючок мошенников</h3><p>Мошенники в сети — как карманники в толпе. Они рассчитывают на невнимательность, спешку и доверчивость. Нужно научить ребенка видеть самые распространенные уловки.</p><p>Типичные признаки опасности: «Срочно!», «Твой аккаунт взломали, перейди по ссылке!», «Поздравляем, ты выиграл iPhone, введи данные родителей!», «Привет, это твой одноклассник, скинь код из SMS». Объясните ребенку: любое сообщение, которое вызывает чувство паники, жадности или необъяснимого везения, — повод остановиться, не кликать, а подумать и позвать родителей.</p><p>Договоритесь, что если что-то вызывает малейшие сомнения (странное письмо, предложение «скачать программу, чтобы получить монетки», запрос личных данных), первым действием будет не клик, а вопрос вам.</p><h2>Основы цифрового творчества: даем идее форму</h2><p>Эта группа навыков — не про сложные профессиональные программы, а про простые инструменты, с которыми ребенок сможет воплотить свои идеи: оформить доклад так, чтобы его было интересно читать, сделать открытку или смонтировать короткий ролик, чтобы впечатлить одноклассников.</p><h3>Уверенная печать: не скорость, а техника</h3><p>Кажется: причём здесь творчество? Но представьте, как сложно думать о содержании сочинения или сценария, когда ищешь каждую букву на клавиатуре и печатаешь одним пальцем. Это сбивает с мысли и утомляет.</p><p>Здесь важно не перегнуть палку. Наша цель — не чемпионские 300 знаков в минуту, а познакомить ребенка с правильной постановкой рук и расположением букв на клавиатуре. Когда он понимает принцип и начинает печатать, не ища каждую клавишу, исчезает главный барьер между идеей в голове и текстом на экране. Он меньше устает, меньше отвлекается и может сосредоточиться на том, что сказать, а не на том, как это напечатать.</p><h3>Создание презентаций и документов: как говорить с миром на визуальном языке</h3><p>Умение сделать не просто набор слайдов, а понятную, «говорящую» историю — еще одна современная суперсила. Важно научить не только кнопкам в PowerPoint, но и принципам:</p><ul><li>Структура — это основа. Любой доклад должен иметь введение, основную часть и вывод. Это правило помогает организовать мысли.</li><li>Визуальная аккуратность — это уважение к зрителю. Один-два читаемых шрифта на всем слайде, выравнивание текста, контрастный фон, изображения, которые дополняют мысль, а не просто «для красоты». Когда ребенок собирает презентацию по этим правилам, он невольно учится логике, иерархии и дизайнерскому мышлению.</li></ul><h3>Базовая обработка медиа: первые шаги к цифровому творчеству</h3><p>Цифровые фото, видео, звук — это язык, на котором современные дети общаются и рассказывают истории. Но дать им в руки телефон с хорошей камерой — мало. Нужно показать, как довести материал до ума:</p><ul><li>Как обрезать фото, убрав лишнее (кадрирование). Изменить размер картинки для аватарки или блога. Склеить несколько фото в коллаж.</li></ul><ul><li>Как обрабатывать звук и видео. Записать четкое аудиосообщение. Вырезать из длинного видео важный момент, добавить титры.</li></ul><p>Для этого не нужен профессиональный софт — достаточно встроенных в телефон или компьютер редакторов или простых онлайн-инструментов.</p><p>Суть навыка: ребенок перестает быть пассивным потребителем роликов. Он начинает анализировать, как сделаны другие работы, и учится создавать что-то свое, пусть и простое. Это мощный импульс для самооценки и развития вкуса.</p><h2>Типичные ошибки родителей: как помочь, а не помешать</h2><p><b>Ошибка 1: Безопасность = полный запрет</b></p><p>Полный запрет видеохостингов (YouTube, RuTube), игр и соцсетей работает как таблетка от головной боли, которая не лечит причину. Ребенок, лишенный доступа дома, будет искать его в других местах: у друзей, в школе, в публичных сетях. И он пойдет туда без вашего руководства, без базовых знаний о безопасности, что сделает его намного более уязвимым. Запрет не учит осторожности, он лишь создает дефицит и вызывает азарт.</p><p>Вместо этого постепенно познакомьте ребенка с играми и Интернетом. Обсудите риски, установите понятные правила (например, «играем только час после уроков»), научите настройкам приватности.</p><p><b>Ошибка 2: Я сам сделаю быстрее и правильнее</b></p><p>Ребенок копается с презентацией, путается в папках, и рука так и тянется отодвинуть его, чтобы за пять минут сделать все идеально? Так мы сэкономим время сейчас, но заплатим за это в будущем. У ребенка закрепится чувство, что у него «не получается», и он будет ждать, когда мама или папа придут и решат проблему.</p><p>Вместо этого перейдите в режим «тренера». Спросите: «Как думаешь, с чего начать?», «Давай посмотрим, где тут кнопка выравнивания», «Попробуй сам, а если не выйдет — я подскажу». Это требует терпения, но результат — уверенность и самостоятельность — того стоит.</p><p><b>Ошибка 3: Зачем это учить, если он не будет программистом?</b></p><p>Компьютерную грамотность часто путают с узкой профориентацией. Кажется, что умение работать с облачными документами или проверять информацию нужно только будущим IT-специалистам. Но компьютерная грамотность — это универсальные навыки XXI века. Юристу, врачу, дизайнеру, предпринимателю — абсолютно любому специалисту — нужно безопасно общаться онлайн, искать и проверять данные, создавать понятные цифровые материалы.</p><p>Смотрите на компьютерную грамотность у детей как на современный аналог умения писать, считать и критически мыслить. Это фундамент для успеха в любой будущей деятельности.</p><h2>Уроки компьютерной грамотности в школе «Пиксель»</h2><p>Все, что мы обсудили — это важные, но такие разные навыки. Объединить их в систему, сохранив у ребенка интерес и понимание «а зачем это мне?», — задача непростая даже для продвинутых родителей. Именно для её решения мы и создали базовые компьютерные курсы для младших школьников в онлайн-формате.</p><p>Здесь ребенок не просто узнает, что такое облачное хранилище — он сразу создаст в нем папку для своего проекта. Он не будет зазубривать правила безопасности, а разберет их на примере настройки своего игрового аватара. Мы учим через действие, потому что только так знания превращаются в реальные умения.</p><p>Программа курса компьютерной грамотности для детей в нашей школе включает навыки, которые мы перечислили выше, но не ограничивается ими:</p><ul><li>Понимание базовых функций компьютера — включение и выключение устройства, использование клавиатуры и мыши или тачпада.</li><li>Работа с операционной системой — знание, как открывать и закрывать программы, понимание файловой структуры: создание, копирование, переименование, удаление файлов и папок.</li><li>Использование офисных программ — работа с текстовыми редакторами (например, Google Docs), создание и использование таблиц (Google Sheets).</li><li>Интернет-грамотность — основы поиска информации в интернете, безопасное поведение в сети: защита своих данных, понимание опасностей (вирусы, мошенничество и т.д.).</li><li>Программы для создания и редактирования контента — основы работы с графическими редакторами и видеоредакторами.</li><li>Основы программирования — знакомство с базовыми концепциями программирования на примере таких языков, как Scratch или Python.</li><li>Цифровая этика и безопасность — ответственное использование технологий, понимание конфиденциальности и цифрового следа.</li></ul><p>Лучший способ понять, подойдет ли курс вашему ребенку — попробовать. Наша компьютерная школа приглашает на бесплатный пробный урок — это полноценное занятие, где можно вживую увидеть, как проходит обучение, пообщаться с преподавателем и получить ответы на все вопросы.</p><p>Узнать подробнее о курсе «Компьютерная грамотность для детей» можно <a href="https://pixel.study/kompyuternaya-gramotnost-dlya-detej?utm_source=tproger.ru&amp;utm_medium=article&amp;utm_campaign=chek-list-kompyuternoy-gramotnosti-dlya-detey">на сайте школы программирования «Пиксель»</a>.</p><p>А здесь <a href="https://pixel.study/demo?utm_source=tproger.ru&amp;utm_medium=article&amp;utm_campaign=chek-list-kompyuternoy-gramotnosti-dlya-detey">запись на бесплатный пробный урок</a>.</p><p>До встречи на курсе!</p><p><i>Реклама. Рекламодатель ООО «Пиксель.Стади», ИНН 5074078988, erid: 2W5zFGm12HW</i></p>]]></content:encoded>
    </item>
    <item>
      <title>​10 телеграм-каналов, которые реально читают сеньоры</title>
      <link>https://tproger.ru/articles/-10-telegram-kanalov--kotorye-realno-chitayut-senory</link>
      <comments>https://tproger.ru/articles/-10-telegram-kanalov--kotorye-realno-chitayut-senory?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/-10-telegram-kanalov--kotorye-realno-chitayut-senory</guid>
      <description><![CDATA[<p>Собрали топ-10 каналов для опытных разработчиков, с которыми у вас точно будет что обсудить на дейлике.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/-10-telegram-kanalov--kotorye-realno-chitayut-senory">​10 телеграм-каналов, которые реально читают сеньоры</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Новости]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Веб-дизайн]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Юмор]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Мемы]]></category>
      <category><![CDATA[Промпты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 17 Jun 2025 14:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сеньорам в этой жизни всё абсолютно понятно, поэтому каналы для начинающих вы здесь не найдёте. Редакция Tproger собрала  паблики, где можно не только оставаться в курсе событий, но и качать  профессиональный скилл, знать о новых инструментах и технологиях, а иногда — просто отвлечься на качественные мемы про айтишную жизнь.</p><p>Подборка создана на основе мнений опытных программистов и разработчиков, которые не успели выгореть на работе. В основном потому, что периодически отвлекаются на телеграм-каналы.</p><h2>1. CodeCamp</h2><p>В канале тонна новостей о программировании, полезные инструменты, например, онлайн-конструктор ПК, и топовые нейросети. Часто появляются разборы моделей и фич, которые еще не стали мейнстримом, как в посте про сискарту Claude-4 или редкие нейросервисы. Из фишек CodeCamp — рубрика «ночное-полезное» с краткими заметками о прикольных фичах.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-11/90287be5-4fab-49e5-9de2-2d28c75a413f.png" alt="" /></figure><p>Перейти: <a href="https://t.me/codecamp">@codecamp</a></p><h2>2. Эксплойт</h2><p>Внутри канала — актуальные новости из мира технологий, айти и диджитал и не только, а еще — подборки инструментов и нейронок. Также вы найдете советы, например, как усилить резюме или правильно сидеть за компом, и шпаргалки по разным технологиям. Сами новости подаются с сарказмом и юмором: «Сначала собери, потом приручи», — так рассказали о новом Лего.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-11/3417d9c0-c690-46cf-ac77-3bfd602c2132.png" alt="" /></figure><p>Перейти: <a href="http://t.me/exploitex">@exploitex</a></p><h2>3. Веб-страница</h2><p>В канале собрано все по фронтенду, бэкенду и девопсу. Авторы разбирают кейсы других разрабов, делятся подборками инструментов и рассказывают, как проходить собесы и решать сложные задачки. Новостей по минимуму, фокус — на практику</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-11/5c73ba7a-812d-4770-90cd-2b7b4003958a.png" alt="" /></figure><p>Перейти: <a href="https://t.me/tproger_web">@tproger_web</a></p><h2>4. Этичный хакер</h2><p>Вас взломали! Хотя нет, не сегодня. Кстати, канал «Этичный хакер» как раз пишет о том, как обезопасить себя от разных атак, а также рассказывает о популярных и не очень хакерских группировках. Внутри — новости, подборки инструментов и разборы, включая гайды по Tor, Sherlock или атакам на шифрование.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-11/fe16691f-33d5-4118-9924-ba37b40f205a.png" alt="" /></figure><p>Перейти: <a href="https://t.me/+OGHQZkOmVmdiMzQy">@hack_less</a></p><h2>5. Цифровой журнал</h2><p>В канале пишут о трендах в айти и нейросетях с мемами и шутками. Здесь можно найти как полезные промпты, так и подборки фреймворков и короткие обзоры на сервисы, которые упрощают работу с ИИ и технологиями в целом. Из последнего — пост про ИИ-агента Manus, с помощью которого можно вести 50 аккаунтов одновременно.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-11/f427325b-9b6d-44ab-9b3d-018c4e686761.png" alt="" /></figure><p>Перейти: <a href="https://t.me/+NkyECC225AA3OWRi">@chatgptv</a></p><h2>6. IT Юмор</h2><p>В целом из названия понятно, о чем этот канал и что будет внутри. Но в любом случае — смеяться нужно всем, а сеньорам особенно. Здесь вы найдете интересные мемы про программистов и айти и поймете, что далеко не одиноки в этом нелегком деле.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-11/68bf7ba8-cfd1-4d9b-89b7-3f75e7417800.png" alt="" /></figure><p>Перейти: <a href="https://t.me/ithumor">@ithumor</a></p><h2>7. IT мероприятия России / ITMeeting / IT Events</h2><p>Канал-агрегатор с актуальными IT-событиями России с фокусом на deep dive, сложных кейсах и архитектурных решениях. Авторы каждый день отбирают мероприятия для сеньоров в разных направлениях: Backend, Frontend, DevOps, Data Science/AI, Security, Cloud, Mobile и Management. Среди анонсов — конференции, митапы, воркшопы, интенсивы и хакатоны.  В общем, все то, что нужно опытным айтишникам, чтобы найти нетворкинг, прокачать экспертизу и оставаться в курсе новостей комьюнити.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-11/6d699cda-aae0-4c11-824f-4b50a20f6a6f.png" alt="" /></figure><p>Перейти: <a href="https://t.me/iteventsrus">@iteventsrus</a></p><h2>8. ITeach</h2><p>Здесь опытные прогеры рассказывают про скрытые IT-фишки, делятся инсайтами по кибербезопасности, лайфхаками для гаджетов и анонсируют бесплатные IT-мероприятия по всей России. В ITeach сеньоры могут узнать о последних угрозах и разных IT-фишках, которые можно применять в работе. Например, как скрыть конфиденциальную информацию на экране с помощью расширения Blur It или как не попасться на мошенников в сервисах такси.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-11/f69b9918-dc59-462c-9463-229ce86bfbbc.png" alt="" /></figure><p>Перейти: <a href="https://t.me/+5fIa6IMVW6dmYzMy">@iteach_ru</a></p><h2>9. Отзывы об IT Компаниях</h2><p>Один из каналов Антона Назарова, куда айтишники и не только присылают обратную связь по вакансиям, интервью и работе в IT-компаниях. Внутри — как кринжовые истории от опытных разработчиков, так и полезные советы для потенциальных сотрудников крупного и среднего бизнеса. В общем, можно узнать заранее, произойдет ли мэтч с компанией.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-11/414194cd-4fd0-4321-835f-c941fe69dbf6.png" alt="" /></figure><p>Перейти: <a href="https://t.me/nazarov_interviews">@nazarov_interviews</a></p><h2>10. Библиотека программиста</h2><p>В канале есть практически все — от обзоров книг и видеолекций до образовательных статей и практических руководств по программированию.  И, конечно, актуальные новости и топовые апдейты. Темы самые разные: алгоритмы, машинное обучение, веб-дизайн и многое другое.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-11/0eaaa4ee-115c-4d89-bcdd-0a5e15adfecc.png" alt="" /></figure><p>Перейти: <a href="http://t.me/proglibrary">@proglib</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Как работает обучение без учителя</title>
      <link>https://tproger.ru/articles/kak-rabotaet-obuchenie-bez-uchitelya</link>
      <comments>https://tproger.ru/articles/kak-rabotaet-obuchenie-bez-uchitelya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вика Овсянникова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-rabotaet-obuchenie-bez-uchitelya</guid>
      <description><![CDATA[<p>Метод обучения без учителя помогает работать с неразмеченными данными. Разбираемся, какие алгоритмы использовать для решения таких задач.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-rabotaet-obuchenie-bez-uchitelya">Как работает обучение без учителя</a>»</p>]]></description>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 26 Oct 2023 12:46:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Что такое обучение без учителя и почему оно так называется? Какие задачи можно решить с помощью этих методов? А какими алгоритмами? Есть ли у него недостатки? Разбираемся как на банковских примерах, так и на более приземленных вещах — столах, стульях и шкафах.</p><h2>Какие типы машинного обучения бывают и чем они друг от друга отличаются</h2><p>Есть четыре типа машинного обучения:</p><ul><li>с учителем;</li><li>без учителя;</li><li>с подкреплением;</li><li>с частичным привлечением учителя.</li></ul><p>Они отличаются наборами данных, на которых модель обучается. Понять разницу между типами машинного обучения можно через аналогию. В комнате стоят стулья, столы, шкафы, мы ставим задачу определить, где что. При обучении с учителем мы показываем модели: это стул, а это — стол или шкаф. То есть датасет размеченный, информация о данных известна, мы точно знаем, какой результат хотим от них получить. За счет разметки модель понимает, как выглядят предметы, запоминает разные типы.</p><p>При обучении без учителя мы просто запускаем модель в большую комнату, и она самостоятельно изучает, какие объекты в ней есть. Спустя время она без наших подсказок понимает, какой объект перед ней находится. Данные не структурированы, о них практически ничего не известно, нет задачи получить конкретный результат. Мы хотим извлечь из данных новую информацию и увидеть в них закономерности.</p><p>При обучении с частичным привлечением учителя мы запускаем модель в комнату и выборочно называем ей некоторые предметы. Ей предстоит самостоятельно изучить большую часть объектов и понять, как они называются.</p><p>При обучении с подкреплением мы запускаем модель в темное помещение. Она взаимодействует со средой (environment), собирает сведения о ней. В роли «разметки» здесь выступает награда (reward). Это сигнал, насколько хорошо алгоритм справляется с поставленной ему задачей. Например, за каждый найденный стул вы получаете +1, а за каждый удар в стену вам прилетает -1. Она выдаётся после каждого шага взаимодействия со средой.</p><h2>Для каких задач используют обучение без учителя</h2><p>Выделяют четыре большие группы: кластеризацию, поиск аномалий, поиск ассоциаций и уменьшение размерности. Рассмотрим каждую подробнее и разберем, какие для них нужны алгоритмы.</p><h3>Кластеризация</h3><p>Это задача разделения данных на кластеры по общим признакам.</p><p>Классический пример — сегментация пользователей приложения банка. Например, пользователи часто покупают товары в спортивных магазинах. Можно выделить их в отдельную группу, используя транзакции как признак. А можно посмотреть, как часто пользователи заходят в приложение, сформировав из них «временные кластеры».</p><p>Другой пример — классификация клиентских обращений. По признакам, которые выделит модель, можно кластеризовать обращения клиентов на разные группы: жалобы, благодарности и просьбы о помощи.</p><p>Алгоритмов для этого класса задач много, рассмотрим четыре самых популярных.</p><h4>Алгоритм k-средних (k-means)</h4><p>Буква k в названии отвечает за количество выделенных центроидов — точек, которые формируют вокруг себя кластер. Удобнее, если они совпадают с точками выборки данных, но необязательно.</p><p>К примеру, возьмем значение k, равное 5. Дальше для каждой точки датасета посчитаем расстояние до каждого из пяти кластеров. Наименьшее расстояние от точки до центроида позволит модели предположить, что объект принадлежит к этому кластеру.</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-26/319249d2-e81e-4931-980f-b3dbc9b322e2.jpeg" alt="" /></figure><p>Это итеративный метод, так как после формирования кластеров координаты центроида должны быть пересчитаны, так как центральный элемент кластера может измениться после добавления элементов. Центроид может сместиться, поэтому в следующих итерациях алгоритма мы будем пересчитывать центры кластеров до тех пор, пока координаты центроида не перестанут меняться. Так, он будет представлять усредненное описание всех параметров кластера.</p><p>Чтобы оценить качество работы алгоритма, мы используем метрику WCSS (within-cluster sum of squares) — cумму квадратов внутрикластерных расстояний до центра кластера. Основная идея, лежащая в основе k-means, заключается как раз в определении таких кластеров, чтобы отклонения внутри минимальны.</p><p>У алгоритма есть ограничение: чаще всего мы не знаем, сколько кластеров предполагается. Можно последовательно брать разные k: 3, 5, 7, 9 и так далее — и строить график в координатах WCSS(k). По нему мы можем понять, какое k оптимальнее взять для задачи. До точки k = 3 наблюдается быстрое уменьшение отклонения, но потом скорость падения снижается, откуда мы делаем вывод, что k = 3 было точкой оптимума.</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-26/4d79114d-940e-437d-b90a-9bf847fdd6cb.jpeg" alt="" /></figure><h4>Иерархическая кластеризация</h4><p>Изначально количество кластеров совпадает с количеством объектов, то есть каждый объект данных представляет собой кластер. Похожие кластеры объединяются по повторяющимся признакам.</p><p>Алгоритм последовательно объединяет меньшие кластеры в большие — это агломеративная иерархия. Либо наоборот — дробит один большой кластер на меньшие — это разделяющая иерархия.</p><p>Определить похожесть можно с помощью метрик евклидова расстояния. Они бывают разные: манхэттенское расстояние; расстояние Чебышева; степенное расстояние.</p><h4>dbscan</h4><p>В алгоритме есть два гиперпараметра: максимальное расстояние между точками и минимальное количество точек в окрестности. Мы задаем количество соседей внутри определенного радиуса, чтобы выделить их в кластер.</p><p>dbscan также справляется с задачей детекции аномалий (о которой поговорим ниже). Так как у нас сохраняется количество соседей в радиусе, то могут оставаться «одинокие» точки, которые туда не попадают. Они являются либо выбросом, либо аномалией.</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-26/16b44b4f-a9f2-4121-a3ab-02302be3506b.png" alt="" /></figure><h4>Алгоритм гауссовой смеси</h4><p>В наборе данных выделяются гауссовы распределения, каждое из которых представляет собой единый кластер. Алгоритм используется в случае, когда наши данные имеют мультимодальное распределение, то есть имеют несколько «горбов».</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-26/9c256a62-e5c6-495e-bdcd-aa6185278351.jpeg" alt="" /></figure><h3>Поиск ассоциаций</h3><p>В этой задаче модель ищет взаимосвязи между существующими объектами.</p><p>Классический пример — взаимосвязь продуктов в корзине покупателя. Например, к молоку и яйцам рекомендательная система магазина может посоветовать взять муку. Чтобы получить такой «совет», нужно проанализировать, какие комбинации продуктов встречаются чаще всего.</p><h4>Алгоритм Apriori</h4><p>Он находит самые частые комбинации, и модель создает правила ассоциативности: когда встречаются два продукта, к ним присоединяется третий.</p><p>Для работы с алгоритмом нужно знать такие понятия.</p><ul><li>Support. Показывает минимальный порог встречаемости элемента, чтобы считаться частым.</li><li>Confidence. Как часто выделенные взаимосвязи встречаются во всех объектах во всем датасете.</li><li>Lift. Зависимость между объектами.</li><li>Conviction. Как часто утверждается, что товары связаны, хотя на самом деле взаимосвязи нет.</li></ul><h3>Уменьшение размерности</h3><p>Данные могут быть слишком взаимосвязаны между собой. В таком случае можно снизить размерность, заменив два признака на один. Особенно это актуально в больших данных, когда нужно сократить датасет и обработать меньшее количество данных.</p><p>Для этой задачи используется алгоритм PCA. Собственно, он как раз и «жертвует» каким-то некритичным количеством информации, подбирая новый признак, который будет включать в себя свойства обоих изначальных признаков.</p><h3>Поиск аномалий и выбросов данных</h3><p>Пример задачи — антифрод в банке. Модель должна определять мошеннические транзакции среди обычных и правильно на них реагировать.</p><p>При обучении с учителем не получится показать модели такую транзакцию сразу, потому что мы не знаем, как она выглядит. И, соответственно, у алгоритма этого знания тоже не будет. Поэтому когда модель встретится с фродом, то, скорее всего, либо не сможет его задетектировать, либо правильно интерпретировать.</p><p>При обучении без учителя модель может определять выбросы и аномалии. Аномалия — это принципиально новые данные, которых ещё не было в выборке, они возникают в реальном времени. Выброс — значение, редко встречающееся в наших данных.</p><h4>Изолированный лес</h4><p>В его основе лежит модель классического алгоритма ML — дерева. Случайным образом задаем предикат, если объект датасета под него подходит, он уходит по этой ветви дерева. Объекты, которые не прошли глубже по веткам, а остались на глубине первого или второго уровня можно считать выбросами. Они «изолировались».</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-26/f305f679-09d3-4507-a9fb-f45e6e4f4aa4.jpeg" alt="" /></figure><h2>Какие есть ограничения у обучения без учителя</h2><p>Во-первых, результаты не всегда интерпретируемы. Не каждому квалифицированному специалисту под силу объяснить выделившиеся закономерности.</p><p>Во-вторых, модель может ошибаться и выдавать не те корреляции, которые мы ожидали. В примере из начала статьи про комнату со стульями и столами модель может, например, выделить кластеры не по принадлежности к сущности (столы, стулья и т.д.), а по цвету: красные столы, стулья, шкафы. Да, это тоже может быть верно, у них действительно есть схожее свойство, но нам это было не нужно.</p><p>В таком случае, кстати, придется прибегнуть либо к обучению с подкреплением, либо к частичной разметке данных, чтобы хотя бы в какой-то степени показать модели, на что ей ориентироваться.</p><h2>Когда же лучше использовать обучение без учителя</h2><p>Метод обучения без учителя хорошо справляется с неразмеченными данными.</p><p>Разметка данных — это достаточно дорогой процесс. При большом количестве данных нужно нанимать асессоров, которые подготовят данные для обучения с учителем. Есть сервисы, где можно отдать данные специалистам на разметку, но за это нужно будет заплатить, подготовить тесты, по которым люди будут работать. И в конце оценить качество разметки. Если мы не хотим тратить на это ресурсы и время, то лучше использовать обучение без учителя.</p>]]></content:encoded>
    </item>
    <item>
      <title>Гайд по обработке данных с помощью Pandas: часть вторая</title>
      <link>https://tproger.ru/articles/gajd-po-obrabotke-dannyh-s-pomoshhyu-pandas-chast-vtoraya</link>
      <comments>https://tproger.ru/articles/gajd-po-obrabotke-dannyh-s-pomoshhyu-pandas-chast-vtoraya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вика Овсянникова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/gajd-po-obrabotke-dannyh-s-pomoshhyu-pandas-chast-vtoraya</guid>
      <description><![CDATA[<p>Второй выпуск гайда по работе с библиотекой Pandas. Разбираемся, как эффективнее анализировать данные, и даём список альтернатив.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/gajd-po-obrabotke-dannyh-s-pomoshhyu-pandas-chast-vtoraya">Гайд по обработке данных с помощью Pandas: часть вторая</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 17 Oct 2023 08:40:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В <a href="https://tproger.ru/articles/gajd-po-obrabotke-dannyh-s-pomoshhyu-pandas-chast-pervaya">первой части гайда</a> мы сконцентрировались на азах: разобрались, что такое Series и DataFrame, узнали, какими функциями можно выполнять чтение, запись, объединение данных. Также прошлись по индексам, групповым операциям, разобрались, как визуализировать графики и поработали с временными рядами. В этой части гайда по работе с Pandas мы разберём, как ещё эффективнее использовать библиотеку, а также какие у неё есть альтернативы.</p><h2>Как сделать работу с Pandas эффективнее</h2><h3>Модификация данных на месте</h3><p>Многие методы Pandas могут принимать флаг inplace, который в случае выставления значения True модифицирует данные на месте, а не создаёт новый объект. Если модифицировать исходные данные некритично, имеет смысл его использовать. Так не произойдёт аллокации дополнительной памяти:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-09/4eed2276-5782-433f-86b1-e9343b21d6a8.png" alt="" /></figure><h3>View vs copy</h3><p>В Pandas, как и в библиотеке Numpy, особое внимание уделяется оптимизации хранения данных в памяти и минимизации лишних аллокаций. Для этого используются «представление» (view) и «копирование» (copy) данных.</p><p>Представление — это ссылка или «окно» на исходные данные, через которое можно производить чтение и изменение. Так новые массивы данных в памяти не создаются. Следовательно, модификация данных через представление приведёт к изменению исходных данных.</p><p>На контрасте с этим, копирование данных означает аллокацию нового блока памяти и создание дублирующего объекта. Изменения в такой копии не затрагивают исходные данные. Однако чем больше копий, тем ниже производительность кода. В Pandas они часто создаются при выполнении операций срезов данных.</p><p>Чтобы определить является ли объект представлением или копией, можно использовать внутреннее свойство ._is_view:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/db5c3d6b-42b8-4506-82ec-c258d1f0fdc5.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/cd10ea97-38bd-4c9c-b3d4-8287efca9ad9.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/956a1b57-ca91-4d6c-b042-64696f17ce28.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/ce9c35a0-73e5-46fb-ae5e-f816efebd78a.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/8eade752-6e04-41a0-ae72-251b8713882f.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/c80ddc09-dba6-40a0-b1a9-ee1ae4ef6e4a.png" alt="" /></figure><p>Так как сейчас в датафрейме df все колонки одного типа, Pandas оптимизирует их «под капотом», на уровне массивов Numpy. Но что будет, если изменить тип одной из колонок?</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/7ddbc4e2-e003-40df-9ae3-95774af1156b.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/62c83e12-ab68-4fe0-8e8b-ae0d3e4bdeb8.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/1b2e3779-3c2e-4648-a928-a4552aaafd05.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/d3179d16-ea9c-4a37-aa1a-5c2faab2fa5c.png" alt="" /></figure><p>Можно сделать и явную копию:</p><p>Тема views и copies в Pandas довольно сложная и понимание приходит с опытом. Если попытаться присвоить значения копии датафрейма там, где по мнению Pandas этого быть не должно, то появится предупреждение SettingWithCopyWarning:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/edd5e10f-dd10-426f-b6b1-6934f32627ce.png" alt="" /></figure><h3>Чтение и обработка данных частями</h3><p>Если объём данных, читаемых из файла, больше объёма памяти на компьютере, а оптимизация типов данных при чтении не помогла, то бывает эффективно читать и обрабатывать данные по частям, используя параметр chunksize.</p><p>Прочитаем CSV-файл частями по несколько строк:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/716ebe0f-8318-4a17-a4b6-9c024d6fb9e5.png" alt="" /></figure><p>Также можно использовать параметр usecols, чтобы загрузить только необходимые столбцы:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/854fe9c9-85c8-4386-b941-90d7e737327e.png" alt="" /></figure><h3>Чейнинг методов</h3><p>Методы Pandas по умолчанию (если inplace=False) возвращают новый объект (DataFrame или Series). Так, несколько подряд идущих методов можно объединить в цепочку вызовов. Это позволяет избежать использования промежуточных переменных и может улучшить читаемость кода, но влечёт за собой копирование данных и лишние аллокации памяти на каждом шаге. Так что чейнинг эффективен, только если скорость или память не критичны:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/7bd350bb-4fa3-45fd-b610-36d7ee20221e.png" alt="" /></figure><h3>Использование query</h3><p>Метод .query() позволяет писать выражения в упрощённом виде, ссылаться на внешние переменные, использовать альтернативные бэкенды. Так запросы выполняются быстрее и эффективнее:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-10/b59c228e-67b6-45ed-9a11-c21fc488ed57.png" alt="" /></figure><h2>Что почитать о работе с Pandas</h2><p>Даже если вы освоили азы работы с библиотекой, всегда найдётся, чему ещё поучиться. В этом вам помогут такие источники:</p><ul><li><a href="https://pandas.pydata.org/docs/">Документация</a> Pandas;</li><li>Книга <a href="https://www.ozon.ru/product/python-dlya-slozhnyh-zadach-nauka-o-dannyh-i-mashinnoe-obuchenie-vander-plas-dzh-211433316/">«Python для сложных задач»</a>;</li><li>Статьи на <a href="https://towardsdatascience.com/search?q=pandas">Towards Data Science</a>;</li><li>Статьи на <a href="https://habr.com/ru/search/?q=pandas">Хабре</a>;</li><li>Разборы и блокноты Jupyter на <a href="https://www.kaggle.com">Kaggle</a>.</li></ul><h2>Какие есть альтернативы</h2><p>Мы уже упоминали, что Pandas не всегда может похвастаться своей эффективностью, например, в промышленных проектах. Поэтому следует присмотреться и к другим альтернативам. Вот инструменты, которые также помогают обрабатывать большие данные:</p><ul><li><b>Pandas 2.0 — </b>новая версия, построенная на эффективном бэкенде Apache Arrow.</li><li><b>Polars — </b>альтернативная библиотека для более быстрой обработки данных. Написана на языке Rust и использует бэкенд Apache Arrow.</li><li><b>Dask — </b>похож на Pandas, но разработан для параллельных вычислений и больших наборов данных.</li><li><b>Modin — </b>использует тот же API, что и Pandas, но производительность у неё лучше за счёт параллелизма.</li><li><b>Vaex — </b>предназначен для работы с очень большими наборами данных, которые не умещаются в оперативную память. Особенно полезен для визуализации и исследования данных.</li><li><b>PySpark DataFrame — </b>библиотека для распределенных вычислений, часть экосистемы Apache Spark. Подходит для работы с очень большими наборами данных.</li><li><b>SQL databases —</b> базы данных, такие как SQLite, MySQL, PostgreSQL, предоставляют мощные средства для работы с табличными данными, хотя и требуют отдельного языка запросов (SQL).</li></ul><p>Расскажите в комментариях, какие ещё фишки и лайфхаки по работе с Pandas вы знаете и используете!</p>]]></content:encoded>
    </item>
    <item>
      <title>Массивы в PHP: типы и операции</title>
      <link>https://tproger.ru/articles/massivy-v-php</link>
      <comments>https://tproger.ru/articles/massivy-v-php?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/massivy-v-php</guid>
      <description><![CDATA[<p>Составили шпаргалку по массивам в PHP для начинающих. Рассказали о типах массивов в PHP и об операциях, которые можно совершить над ними.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/massivy-v-php">Массивы в PHP: типы и операции</a>»</p>]]></description>
      <category><![CDATA[Массивы и строки]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 10 Oct 2023 11:39:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>В PHP массивы представляют собой мощный инструмент для хранения, обработки и управления данными. Они позволяют программистам организовывать информацию в упорядоченные коллекции и обращаться к ней по ключу или индексу.</p><p>В PHP есть несколько типов массивов, включая индексированные и ассоциативные массивы, а также многомерные и вложенные массивы, которые обеспечивают гибкость при работе с данными различной структуры.</p><p>В этой статье мы рассказываем о типах массивов в PHP и об операциях, которые можно совершить над ними.</p><ol><li><a href="https://tproger.ru/#one">Типы массивов в PHP</a></li><li><a href="https://tproger.ru/#two">Как создавать массивы в PHP</a></li><li><a href="https://tproger.ru/#three">Как получить элемент массива в PHP по индексу</a></li><li><a href="https://tproger.ru/#four">Как добавить элемент в конец массива PHP</a></li><li><a href="https://tproger.ru/#five">Как удалить последний элемент массива PHP</a></li><li><a href="https://tproger.ru/#six">Получение длины массива в PHP</a></li><li><a href="https://tproger.ru/#seven">Как проверить наличие элемента массива в PHP</a></li><li><a href="https://tproger.ru/#eight">Как выполнить обход массива в PHP и вывести его элементы</a></li><li><a href="https://tproger.ru/#nine">Как выполнить слияние массивов в PHP</a></li><li><a href="https://tproger.ru/#ten">Как сортировать массив в PHP</a></li></ol><h2>Типы массивов в PHP</h2><h3>1. Индексированные массивы</h3><p>Это самый обычный тип массива в PHP, где элементы нумеруются целыми числами, начиная с 0, и последовательно увеличиваются.</p><h3>2. Ассоциативные массивы</h3><p>В данном типе массивов элементы хранятся в парах ключ-значение, где ключи могут быть строками или целыми числами.</p><h3>3. Многомерные массивы</h3><p>Это тип массива, в котором элементы сами могут быть другими массивами. Такие массивы позволяют хранить иерархически связанные данные.</p><h3>4. Вложенные массивы</h3><p>Это тип массива, в котором элементы могут содержать другие массивы, создавая более сложную структуру данных.</p><h2>Как создавать массивы в PHP</h2><h3>1. Создание пустого массива</h3><p>Создание пустого массива в PHP может быть полезным для программистов, когда они хотят создать массив, к которому будут добавлять элементы в ходе выполнения программы.</p><p>Пустой массив предоставляет исходную точку, с которой можно начать добавлять элементы и формировать коллекцию данных.</p><p>или</p><h3>2. Создание индексированного массива</h3><p>Индексированные массивы в PHP полезны, когда нужно хранить упорядоченную коллекцию значений и обращаться к ним по числовым индексам. Можно использовать индексированный массив, например, для хранения списка элементов, результатов операций или последовательности данных.</p><p>Использование числовых индексов позволяет эффективно обращаться к элементам массива по их позиции.</p><p>или</p><h3>3. Создание ассоциативного массива</h3><p>Ассоциативные массивы в PHP полезны, когда нужно хранить данные в виде пар “ключ” =&gt; “значение”.</p><p>Ассоциативные массивы позволяют, например, хранить информацию о пользователях, настройках приложения, пунктах меню или любых других связанных данных.</p><p>Использование ключей позволяет быстро извлекать и обновлять значения в массиве по имени.</p><p>или</p><h3>4. Создание многомерного массива</h3><p>Многомерные массивы в PHP позволяют хранить данные в виде таблицы с несколькими рядами и столбцами, где каждая ячейка может содержать значение.</p><p>Также многомерные массивы представляют собой массивы, в которых элементами являются другие массивы.</p><p>Это особенно полезно при работе с матрицами, реляционными базами данных или любыми случаями, когда данные нужно организовать в иерархическую структуру.</p><p>или</p><h2>Как получить элемент массива в PHP по индексу</h2><h3>1. Оператор квадратных скобок []</h3><p>Этот способ наиболее распространен и прост в использовании. Можно использовать оператор квадратных скобок [] и указать индекс элемента внутри них.</p><h3>2. Функция array_values()</h3><p>Данная функция возвращает все значения массива в виде нового массива, с индексами, начиная с 0. Затем можно получить элемент массива по новому индексу.</p><h3>3. Функции current() и next()</h3><p>Эти функции позволяют перемещаться по массиву и получать текущий элемент. Функция current() возвращает текущий элемент массива, а функция next() сдвигает указатель на следующий элемент.</p><h2>Как добавить элемент в конец массива PHP</h2><h3>1. Использование оператора []</h3><p>Самым простым способом является использование оператора квадратных скобок [] с пустым индексом, чтобы добавить элемент в конец массива.</p><h3>2. Использование функции array_push()</h3><p>Функция array_push() позволяет добавить один или более элементов в конец массива. Синтаксис функции следующий: array_push($array, $element1, $element2, ...).</p><h3>3. Использование оператора +=</h3><p>Еще одним способом является использование оператора +=, который объединяет два массива. Если левым операндом является пустой массив, то элементы будут добавлены в конец массива</p><h2>Как удалить последний элемент массива PHP</h2><h3>1. Функция array_pop()</h3><p>В результате выполнения этого кода последний элемент (“5”) будет удален из массива, а значение этого элемента будет сохранено в переменной `$lastElement`</p><h3>2. Функция unset()</h3><p>При использовании функции unset() вы указываете индекс последнего элемента массива, который нужно удалить, используя count($myArray) - 1. Это вычисляет индекс последнего элемента массива.</p><h3>3. Оператор array_slice()</h3><p>Оператор array_slice() возвращает часть массива, начиная с индекса 0 и заканчивая индексом -1 (или индексом последнего элемента минус единица). В результате получается массив без последнего элемента.</p><h3>4. Функция array_splice()</h3><p>Функция array_splice() изменяет исходный массив, удаляя элементы, начиная с указанного индекса. В данном случае мы указываем индекс -1, чтобы удалить последний элемент массива.</p><h2>Получение длины массива в PHP</h2><h3>1. Функция count()</h3><p>Функция count() возвращает количество элементов в массиве. В результате выполнения этого кода переменная $length будет содержать длину массива, то есть значение “5”.</p><h3>2. Оператор sizeof()</h3><p>Оператор sizeof() работает аналогично функции count() и также возвращает количество элементов в массиве.</p><h3>3. Функция arraycountvalues()</h3><p>Функция array_count_values() возвращает ассоциативный массив, где ключами являются уникальные значения из исходного массива, а значениями – количество вхождений каждого значения.</p><p>В данном случае мы используем count() для получения длины ассоциативного массива, чтобы узнать количество уникальных значений в исходном массиве.</p><h3>4. Цикл foreach</h3><p>Мы итерируемся по каждому элементу массива с помощью цикла foreach и увеличиваем переменную $length на 1 для каждого элемента. В результате выполнения этого кода длина массива будет сохранена в переменной $length.</p><h2>Как проверить наличие элемента массива в PHP</h2><h3>1. Оператор in_array()</h3><p>Оператор in_array() проверяет, содержится ли указанный элемент в массиве. В этом примере переменная $exists будет содержать значение true, так как элемент `3` содержится в массиве $myArray.</p><h3>2. Функция array_search()</h3><p>Функция array_search() возвращает индекс элемента в массиве, если он найден. Если элемент не найден, функция возвращает false.</p><p>В данном случае мы проверяем, не равен ли индекс false, чтобы определить, содержится ли элемент в массиве.</p><h3>3. Функция array_key_exists()</h3><p>Функция array_key_exists() проверяет, содержится ли указанный ключ в массиве. В этом примере переменная $exists будет содержать значение true, так как ключ 'key2' существует в массиве $myArray.</p><h3>4. Оператор isset()</h3><p>Оператор isset() проверяет, определен ли указанный элемент или ключ в массиве. В данном случае переменная $exists будет содержать значение true, так как элемент с ключом 'key2' определен в массиве $myArray.</p><h2>Как выполнить обход массива в PHP и вывести его элементы</h2><h3>1. Цикл for</h3><p>В этом примере мы используем цикл for, чтобы пройти через каждый индекс массива и вывести его элементы. Код echo $myArray[$i] . ", "; выводит каждый элемент массива, за исключением последнего, и добавляет запятую после каждого элемента.</p><h3>2. Цикл foreach</h3><p>Цикл foreach автоматически итерирует по каждому элементу массива и выполняет указанные действия для каждого элемента. В этом примере мы выводим каждый элемент массива, добавляя запятую после каждого элемента.</p><h3>3. Цикл while с использованием функций current() и next()</h3><p>С помощью функции reset() мы устанавливаем указатель текущего элемента массива в начало. Затем, с помощью цикла while, мы получаем текущий элемент с помощью функции current(), выводим его и перемещаем указатель на следующий элемент с помощью функции next(). Цикл продолжается до тех пор, пока есть элементы в массиве.</p><h2>Как выполнить слияние массивов в PHP</h2><h3>1. Оператор "+"</h3><p>Оператор + объединяет элементы обоих массивов, и дубликаты удаляются, чтобы сохранить только уникальные значения.</p><p>Вывод:</p><h3>2. Функция arraymerge()</h3><p>Функция arraymerge() объединяет элементы обоих массивов в новый массив, сохраняя исходные ключи. Если есть одинаковые ключи, то значение из второго массива заменит значение из первого массива.</p><p>Вывод:</p><h3>3. Оператор "…" в PHP 7.4 и более поздних версиях</h3><p>С помощью оператора ... (spread operator) мы можем распаковать элементы массивов и объединить их в новый массив.</p><p>Вывод:</p><h3>4. Функция arraymergerecursive()</h3><p>Функция arraymergerecursive() объединяет элементы обоих массивов в новый массив, сохраняя все значения в виде массивов, если ключи совпадают.</p><p>Вывод:</p><h2>Как сортировать массив в PHP</h2><h3>1. Функция sort()</h3><p>Функция sort() сортирует массив в порядке возрастания, переиндексируя элементы массива.</p><p>Вывод:</p><h3>2. Функция rsort()</h3><p>Функция rsort() сортирует массив в порядке убывания, переиндексируя элементы массива.</p><p>Вывод:</p><h3>3. Функция asort()</h3><p>Функция asort() сортирует массив в порядке возрастания, сохраняя связь ключей и значений.</p><p>Вывод:</p><h3>4. Функция arsort()</h3><p>Функция arsort() сортирует массив в порядке убывания, сохраняя связь ключей и значений.</p><p>Вывод:</p><h3>5. Функция ksort()</h3><p>Функция ksort() сортирует массив по ключам в порядке возрастания, сохраняя связь ключей и значений.</p><p>Вывод:</p><h3>6. Функция krsort()</h3><p>Функция krsort() сортирует массив по ключам в порядке убывания, сохраняя связь ключей и значений.</p><p>Вывод:</p><h2>Заключение</h2><p>Массивы в PHP играют ключевую роль в хранении и управлении данными.</p><p>Благодаря разнообразию типов массивов разработчики могут эффективно структурировать данные. Операции над массивами позволяют динамически работать с данными и преобразовывать их согласно требованиям проекта.</p><p>Надеемся, шпаргалка оказалась полезной вам, и вы узнали много нового.</p><p>Напишите в комментариях, если эта статья помогла вам. Также укажите, чего в ней может не хватать, чем можно дополнить материал или какие новые статьи по PHP нам стоит опубликовать. Мы будем рады обратной связи. 🙂</p>]]></content:encoded>
    </item>
    <item>
      <title>Гайд по обработке данных с помощью Pandas: часть первая</title>
      <link>https://tproger.ru/articles/gajd-po-obrabotke-dannyh-s-pomoshhyu-pandas-chast-pervaya</link>
      <comments>https://tproger.ru/articles/gajd-po-obrabotke-dannyh-s-pomoshhyu-pandas-chast-pervaya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вика Овсянникова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/gajd-po-obrabotke-dannyh-s-pomoshhyu-pandas-chast-pervaya</guid>
      <description><![CDATA[<p>Разбираем, как начать работу с Pandas. В этой части самые базовые приёмы: чтение и запись данных, индексирование, агрегация и другие основы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/gajd-po-obrabotke-dannyh-s-pomoshhyu-pandas-chast-pervaya">Гайд по обработке данных с помощью Pandas: часть первая</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 06 Oct 2023 09:06:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Pandas — это библиотека на Python, предназначенная для обработки и анализа структурированных табличных данных. С её помощью можно фильтровать, сортировать, агрегировать и преобразовывать данные, а также интегрироваться с различными источниками для чтения и записи. Благодаря такому богатому функционалу, эффективности и удобству использования, Pandas — один из наиболее популярных инструментов в области анализа данных.</p><p>Руководитель группы видеоаналитики MTS AI Андрей Дугин рассказывает, как начать работу с Pandas и избежать распространённых ошибок.</p><h2>Где и для чего применяется Pandas</h2><p>Pandas скорее академический исследовательский инструмент: для промышленных масштабов производительность у библиотеки относительно низкая, управление памятью не самое эффективное и нет параллелизма. Тем не менее, библиотека отлично подходит дата-сайентистам и аналитикам для прототипирования и исследования гипотез в нересурснозатратных проектах. Её можно применить практически в любой области, где требуется обработка и анализ табличных данных или временных рядов:</p><ul><li><b>Предиктивная аналитика для агрегаторов.</b> Например, на сайтах недвижимости. Pandas поможет структурировать массив данных по квартирам: этаж, площадь, количество комнат, год постройки дома и так далее. На этих данных можно строить модели машинного обучения и предсказывать, сколько будет стоить недвижимость.</li><li><b>Финансовый анализ.</b> Pandas пригодится для анализа динамики цен акций, котировок валют, индексов и так далее. Это помогает при прогнозировании рыночных трендов, определении рисков и оценке инвестиционных стратегий.</li><li><b>Маркетинговый анализ.</b> Проанализировав с помощью Pandas данные о продажах, потребительском поведении, рекламных кампаниях можно определять оптимальные стратегии маркетинга.</li><li><b>Исследования в области биоинформатики.</b> Pandas помогает анализировать и обрабатывать биологические данные для выявления закономерностей, например, в болезнях.</li><li><b>Обработка данных сенсоров и IoT.</b> С помощью Pandas можно обрабатывать и анализировать данные сенсоров, полученных от устройств IoT, чтобы управлять системами, мониторить и диагностировать их.</li></ul><p>Рассмотрим некоторые базовые приёмы работы с Pandas на основе классического <a href="https://github.com/datasciencedojo/datasets/blob/master/titanic.csv">датасета Titanic</a>. Его используют студенты, изучающие машинное обучение, для предсказания шансов пассажиров на выживание в зависимости от их пола, возраста, класса каюты и других факторов. Подробнее почитать о значении полей можно <a href="https://colab.research.google.com/corgiredirector?site=https%3A%2F%2Fwww.kaggle.com%2Fcompetitions%2Ftitanic%2Fdata">в описании датасета</a> на Kaggle.</p><h2>Начало работы с Pandas</h2><p>DISCLAIMER</p><ul><li>Поскольку примеры кода и вывод выполняются в Jupyter Notebook, то для отображения результата нам не обязательно оборачивать выражения в функцию print(), однако это может понадобиться в других IDE.</li><li>По этой же причине при демонстрации мы иногда не модифицируем исходные данные (не делаем присваивание A = B, а показываем только правую часть выражения; используем inplace=False), а просто выводим результат.</li></ul><h3>Установка и импорт</h3><p>Pandas легко установить через стандартный пакетный менеджер Python, используя команду pip install pandas.</p><p>После установки следует импортировать саму библиотеку. Поскольку Pandas строится на базе библиотеки NumPy — инструментария для работы с многомерными массивами — для удобства рекомендуется импортировать и её. Она также будет установлена автоматически в процессе установки Pandas.</p><h3>Структуры хранения данных</h3><p>Данные организованы в структурированные таблицы с индексами, что облегчает манипуляции с ними. Операции в Pandas оптимизированы для работы по столбцам — так во многих случаях производительность выше, чем в операциях по строкам.</p><p>Структур хранения данных в Pandas две — Series и DataFrame.</p><ul><li><b>Series</b> — это одномерный массив данных с метками. Он может хранить различные типы данных, включая числа, строки и произвольные объекты Python. Каждому элементу в Series соответствует метка, доступ к которой можно получить через атрибут index.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/1f5ef405-5abb-44e6-98ad-6a67046e4416.png" alt="" /><figcaption>Здесь и далее будет приводиться вывод в Jupyter Notebook</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/53d55769-eaee-4d0d-ad32-40b02d967fef.png" alt="" /><figcaption><br /></figcaption></figure><p>Есть проводить аналогию со словарём dict, то индекс — это ключи словаря, а сам массив данных — значения, к которым можно получить доступ по ключу:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/f7917a52-b08a-44fa-8e98-2e1d592c241e.png" alt="" /></figure><ul><li><b>DataFrame</b> — это двумерная структура данных, представляющая собой таблицу с метками для строк и столбцов. Каждый столбец в DataFrame является объектом типа Series. Вместе они формируют двумерную таблицу с общим индексом. В DataFrame присутствуют две оси индексации: index для строк и columns для столбцов. Метки столбцов — это их названия.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/33f75a6e-9243-43a1-8964-8e3f80d39fd0.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/f8a22fa6-f280-457c-a344-046be9f2dec5.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/3497e7c4-e212-4bfd-acbf-44970f0605f2.png" alt="" /></figure><h3>Операции чтения и записи данных</h3><p>С помощью Pandas можно читать и записывать данные из различных источников: баз данных, файлов в форматах CSV, Excel, JSON и тому подобных. Для каждого типа данных существуют специализированные функции: read_csv(), read_excel() и другие вида read_*().</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/8864e30e-9305-43d0-8834-c0c715020328.png" alt="" /></figure><p>Можно даже автоматически спарсить таблицу из веб-страницы, указав URL и порядковый номер таблицы:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/b1196ed8-168a-45a9-bd6f-916ada1f7e1a.png" alt="" /></figure><p>Функции чтения принимают много параметров, так можно настраивать все необходимые опции, включая явное задание типов данных или соответствующих функций-конвертеров. Это позволяет предобработать данные или преобразовать их типы к более эффективным ещё на этапе чтения из источника.</p><p>Записать данные в файл так же просто, как и прочитать — используйте семейство методов .to_*(), например, .to_excel():</p><h3>Первичное исследование данных</h3><p>После того как данные загружены из источника, следует получить общее представление о них.</p><p>Первые несколько строк датафрейма можно получить с помощью метода .head(), а последние — .tail():</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/f95045e9-b8dd-4cb6-acdb-bc3ab58cb16e.png" alt="" /></figure><p>Тип данных object чаще всего соответствует строковым значениям:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/938f4063-5a01-44d4-90b5-80819d5e2494.png" alt="" /></figure><p>Pandas позволяет автоматически подобрать наиболее эффективные представления с помощью метода .convert_dtypes():</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/fe615267-8f08-4da3-95c9-a498cab68aa9.png" alt="" /></figure><p>Другой способ взглянуть на датафрейм — метод .info(). Он показывает количество строк, столбцов, их названия и типы, а также позволяет обнаружить столбцы с отсутствующими значениями.</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/c63e1088-d94b-46e0-a19d-4e5c8179c06d.png" alt="" /><figcaption>Например, в датасете 891 строка, однако количество ненулевых (non-null) значений в колонках Age, Cabin и Embarked меньше, значит, некоторые данные отсутствуют</figcaption></figure><p>Некоторую статистику по числовым столбцам можно собрать с помощью метода .describe():</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/189eb3c1-a567-40e2-93d6-c55c13fd7e3e.png" alt="" /></figure><p>Количество различных значений можно посчитать с помощью .value_counts() — как для категориальных, так и для непрерывных данных:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/405ded22-841c-438f-95d9-1a12f63f8e23.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/51fca715-95b4-47c5-a8eb-4a0948a23351.png" alt="" /></figure><h3>Индексирование</h3><p>Операции обращения к элементам данных называются индексированием.</p><p>В нашем датасете индексная колонка по умолчанию представлена целыми числами. Для наглядности в дальнейших примерах заменим индекс на колонку с именем пассажира:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/73a1ea10-fc13-4e68-8e4c-cedf1553cdaf.png" alt="" /></figure><p>Элементы индекса называются метками (лейблами):</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/729b0ada-67a2-4be7-9670-1ef36679734e.png" alt="" /></figure><p>Названия колонок — тоже метки:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/e853da2b-8a67-44a2-b64f-de98ad850142.png" alt="" /></figure><p>К колонкам можно обращаться по их названиям:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/ba41fd7d-7c26-4b00-bc89-21615012a164.png" alt="" /></figure><p>Если имя колонки удовлетворяет правилам именования переменных в Python и не совпадает с одним из уже существующих методов или атрибутов DataFrame, то к колонке можно обратиться как к атрибуту DataFrame:</p><p>Метод .loc[] есть и у Series, и у DataFrame. Он позволяет обращаться к данным по меткам:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/464fb431-65dd-4099-805e-b82c3d31d394.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/4f009356-f5b9-4468-9548-f38fa97e5799.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/fd955c8b-8002-4e61-910c-aaa802c940ea.png" alt="" /></figure><p>Метод .iloc[] работает аналогично, но вместо меток используются номера строк или столбцов:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/78eef922-9ee1-454f-ab74-15f747667d64.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/d095bf75-bfc0-4496-844d-dfc566ac653f.png" alt="" /></figure><p>С помощью .at[] можно обратиться к конкретной ячейке данных — как в Excel:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/8a0765ea-9e12-446a-9fcb-053d6e327768.png" alt="" /></figure><p>При совершении операций над объектами DataFrame и Series Pandas пытается сопоставить элементы с одинаковыми индексами. Рассмотрим для примера последовательность Series с геометрической прогрессией, где каждый следующий элемент больше предыдущего в два раза:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/45c93d40-d9ad-4002-b5de-52643565bb7b.png" alt="" /></figure><p>Попытка попарно посчитать отношение следующего элемента к предыдущему приведёт к «странному» результату:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/b1fd62c6-412f-483f-a65e-49a80677a6d1.png" alt="" /></figure><p>На самом деле мы хотели получить следующее:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/9910ea69-a941-49a2-93db-5504ea086e8b.png" alt="" /></figure><h3>Объединение данных</h3><p>Для объединения нескольких датафреймов можно использовать близкие по смыслу функции: merge(), concat() и join(). Вот несколько базовых примеров:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/ac9e3aee-80c7-4687-9ba4-cfe828ed092e.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/cfefd91d-ae8a-43d8-a5af-9f66e3db87d9.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/a9cf6af0-88bc-4cef-97c8-08213a29c354.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/115b83ac-9624-4d1e-9de4-b5cbaa3471b1.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/fe6f7fba-8f29-4c37-adc6-b771720a4a45.png" alt="" /></figure><h3>Агрегация данных</h3><p>С помощью этих функций и методов можно взглянуть на данные в различных разрезах:</p><ul><li>groupby() — для группировки и агрегации данных с большой гибкостью;</li><li>pivot_table() — для создания сводных таблиц с возможностью применения множественных агрегаций;</li><li>crosstab() — для подсчёта частоты встречаемости категорий.</li></ul><p>Рассчитаем средний возраст пассажиров с разбиением по полу:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/770d1a18-9b39-4f26-9b1f-1df24a858583.png" alt="" /></figure><p>Построим сводную таблицу, рассчитав вероятность выживания в зависимости от пола и класса:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/6817cd49-09c5-490c-ae1b-2a9b2c85ccae.png" alt="" /></figure><p>Посчитаем, сколько человек каждого пола было в трёх классах кают:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/17f13432-6dfe-4f32-a8ae-adb7caae565c.png" alt="" /></figure><h3>Групповые операции</h3><p>При обработке данных новички часто используют циклы для итераций по строкам или ячейкам. Такой код выполняется медленно. Лучше использовать методы .apply(), .map(), .transform(), которые работают быстрее за счёт векторизации.</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/632480b8-9d93-4aa3-846a-3b684d99bc44.png" alt="" /></figure><p>Кстати, такое же разбиение на возрастные группы можно выполнить с помощью функции pd.cut():</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/94d497dc-24e6-4aaa-ad98-dc31cc3dc572.png" alt="" /></figure><h3>Работа с пропущенными данными</h3><p>В реальных датасетах часть данных может отсутствовать. В библиотеке Pandas эти пропуски обычно представлены как NaN (Not a Number) в ячейках DataFrame или Series. Чтобы с ними работать можно использовать ключевые методы:</p><ul><li>.isna() — идентифицирует отсутствующие значения и возвращает булевую маску, где True указывает на пропущенные данные;</li><li>.fillna() — позволяет заполнить отсутствующие значения с помощью указанных значений или методов интерполяции;</li><li>.dropna() — удаляет строки или столбцы, содержащие отсутствующие значения.</li></ul><p>Метод .isna() есть как у DataFrame, так и у Series, а результатом его вызова будет булевая маска того же класса:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/58cbb99a-ead0-44c7-aeca-ae6b1da07e24.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/bc169e6e-1c6f-4c5d-b3e7-0ed9d09349b6.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/3bc0e608-ff4e-40c7-9fe4-027dc8f83a39.png" alt="" /></figure><p>Если датасет небольшой, то удалять отсутствующие данные слишком расточительно. Лучше придумать, как заполнить недостающие значения.</p><p>Например, можно заменить их средними значениями в столбце:</p><p>Или заполнить предыдущим, либо последующим значением:</p><p>Методы генерации и заполнения отсутствующих значений называются импутингом. В библиотекеscikit-learnесть модульsklearn.impute, в котором представлены несколько классов импутеров, основанных на различных алгоритмах.</p><h3>Визуализация данных</h3><p>Pandas интегрирована с библиотекой Matplotlib — инструментом для создания двумерных и трёхмерных графических представлений данных. В Pandas можно либо явно использовать её функции для визуализации данных, либо применять встроенные методы, такие как .plot() и .hist(). Второй вариант облегчает построение графиков, автоматически определяя наилучший способ визуализации данных.</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/227b7a27-7bfb-483e-be4b-0ff976898e78.png" alt="" /></figure><p>То же самое можно сделать через прямой вызов функций matplotlib:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/0786f394-5ca6-49f1-a6f2-570d6a417236.png" alt="" /></figure><h3>Работа с временными рядами</h3><p>Индексная колонка датафрейма представлена датой и временем, что позволяет индексировать данные по дате и времени, ресемплировать (осуществлять выборку с большей или с меньшей частотой), интерполировать отсутствующие данные, применять оконные функции.</p><p>Допустим, у нас есть статистика перевозки пассажиров некой авиакомпании. Сгенерируем эти данные по месяцам:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-10-05/8c19db75-7e45-4750-b710-6a80b0aea421.png" alt="" /></figure><p>А теперь рассчитаем среднемесячное количество пассажиров по каждому году:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/a15b759f-2d16-4762-978e-4b0bcfde8f29.png" alt="" /></figure><p>Применим скользящее окно и рассчитаем среднее количество пассажиров за последние 12 месяцев:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/8967921f-bf00-4f24-b2ee-a6c619064edc.png" alt="" /></figure><p>В первых 11 строках по умолчанию появились значения NaN, так как количество проанализированных строк меньше размера окна. Это поведение можно изменить, задав параметр min_periods — минимальное количество строк, для которых определён результат:</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2023-09-29/75c63b26-a5b6-42ba-bb7a-db8f564c3544.png" alt="" /></figure><h2>В заключение</h2><p>В этой части статьи мы рассмотрели, как использовать Pandas для разных базовых задач. Во второй части разберём, как сделать работу с Pandas эффективнее, узнаем, какие есть альтернативы для этой библиотеки и какие источники можно почитать, чтобы ещё лучше в ней ориентироваться. Следите за обновлениями!</p>]]></content:encoded>
    </item>
    <item>
      <title>​Как центрировать в CSS через Flexbox, Grid, Position и Margin</title>
      <link>https://tproger.ru/articles/kak-centrirovat-chto-ugodno-v-css</link>
      <comments>https://tproger.ru/articles/kak-centrirovat-chto-ugodno-v-css?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-centrirovat-chto-ugodno-v-css</guid>
      <description><![CDATA[<p>Рассказываем, как выровнять по центру в CSS блоки и их содержимое при помощи свойство Flexbox, Grid, Position и Margin.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-centrirovat-chto-ugodno-v-css">​Как центрировать в CSS через Flexbox, Grid, Position и Margin</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 May 2023 07:28:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сегодня мы покажем, как можно центрировать и выравнивать содержимое с помощью CSS. Ещё мы рассмотрим разные техники выравнивания.</p><p>Это — перевод <a href="https://www.freecodecamp.org/news/how-to-center-objects-using-css/">оригинальной статьи на freeCodeCamp</a> от автора Joy Shaheb.</p><p>Ещё у нас есть видеоверсия урока от автора (осторожно, английский язык):</p><h2>Что такое главная и поперечная оси в CSS</h2><p>Прежде всего, давайте разберемся, что такое:</p><ol><li>Главная ось.</li><li>Поперечная ось.</li></ol><p>Линия, проходящая по экрану слева направо — это и есть главная ось. Вы также можете называть её осью Х или горизонтальной линией.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/2f28bd6c-7cc1-4415-9d0f-1276031cc762.png" alt="" /></figure><p>Линия, которая проходит сверху вниз — это поперечная ось. Также её можно назвать осью Y или вертикальной линией.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/f195d978-04ad-4a1b-9207-4667a0f88c63.png" alt="" /></figure><h2>Настройка проекта</h2><p>Чтобы поэкспериментировать со всеми свойствами и значениями, напишем следующий код в редакторе.</p><h3>HTML</h3><p>Запишите этот код внутри тега body:</p><h3>CSS</h3><p>Очистите стили браузера по умолчанию, чтобы мы получали точные результаты.</p><p>Выберите класс .container и установите его значение 100vh. В противном случае мы не сможем увидеть наш результат на вертикальной оси:</p><p>Стилизуйте класс .box-1 следующим образом:</p><p>Все готово, теперь начнем кодить!</p><h2>Как использовать Flexbox для центрирования чего-либо</h2><p>Мы можем использовать Flexbox для выравнивания div по осям X и Y.</p><p>Для этого нам нужно записать свойство display: flex; внутри класса .container:</p><p>Мы поэкспериментируем с этими двумя свойствами:</p><ul><li>justify-content;</li><li>align-items.</li></ul><h3>Как отцентрировать что-либо по горизонтали с помощью Flexbox</h3><p>Мы используем свойство justify-content, используя следующие значения.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/9db4aaf4-29e5-49db-b7c6-b573901a3765.png" alt="" /></figure><p>Напишите следующий код.</p><p>Результат будет выглядеть следующим образом.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/27e0c7ca-ac49-4dcd-87ba-6e01c15e7c59.png" alt="" /></figure><h3>Как выровнять что-либо по вертикали с помощью Flexbox</h3><p>Мы используем свойство align-items, используя следующие значения.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/ec9f4bd6-b164-4ff5-8614-e5292d001b2c.png" alt="" /></figure><p>Чтобы поэкспериментировать со значениями, напишите следующий код.</p><p>Результат выглядит так:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/264a0f7f-7a73-452e-be8f-9b8407b9fb3c.png" alt="" /></figure><h3>Как центрировать div по горизонтали и вертикали с помощью Flexbox</h3><p>Мы объединим свойства justify-content и align-items, чтобы выровнять div как по горизонтали, так и по вертикали.</p><p>Напишите следующий код.</p><p>Результат выглядит следующим образом.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/56864a35-701f-4d07-a296-708804de596b.png" alt="" /></figure><p>Вы можете ознакомиться с этой <a href="https://tproger.ru/articles/css-flexbox-tutorial-with-flexbox-properties-cheat-sheet/">шпаргалкой</a>, чтобы узнать больше о различных свойствах Flexbox.</p><h2>Как использовать CSS Grid для центрирования чего-либо</h2><p>Используем grid для выравнивания содержимого div по осям X и Y.</p><p>Для этого нужно записать свойство display: grid; внутри класса .container:</p><p>Поэкспериментируем с этими двумя свойствами:</p><ol><li>justify-content;</li><li>align-content.</li></ol><p>В качестве альтернативы можно использовать эти свойства:</p><ol><li>justify-items;</li><li>align-items.</li></ol><h3>Как выровнять что-либо по горизонтали с помощью CSS Grid</h3><p>Используем свойство justify-content.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/2ea5a35c-c85b-4435-b4b8-6c71e37de817.png" alt="" /></figure><p>Напишите такой код:</p><p>Вот результат:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/fb4a8055-a0ae-41c2-8edc-d3ced3b1a628.png" alt="" /></figure><h3>Как выровнять что-либо по вертикали с помощью CSS Grid</h3><p>Мы используем свойство align-content, используя следующие значения.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/e84d6b49-8acb-4131-98ab-a68342ecbff5.png" alt="" /></figure><p>Напишите этот код:</p><p>Вот, каким будет результат:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/aae411a7-0776-425c-b6aa-f387dde72a85.png" alt="" /></figure><h3>Как выровнять div по горизонтали и вертикали с помощью CSS Grid</h3><p>Объединим свойства justify-content и align-content, чтобы выровнять div как по горизонтали, так и по вертикали.</p><p>Напишите следующий код:</p><p>Результат, который должен получиться:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/75581db1-fd71-49f8-8a28-d38703a5a356.png" alt="" /></figure><h3>Альтернативный способ</h3><p>Вы можете использовать свойства justify-items и align-items и получить те же результаты:</p><h3>Свойство place-content в CSS Grid</h3><p>Это сокращение двух свойств CSS Grid:</p><ol><li>justify-content;</li><li>align-content.</li></ol><p>Получаем тот же результат:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/936c4c09-35a7-4810-b205-9642d4e3989c.png" alt="" /></figure><h2>Как использовать свойство CSS Position для центрирования чего-либо</h2><p>Это комбинация этих свойств:</p><ol><li>position;</li><li>top, left;</li><li>transform, translate.</li></ol><p>Напишите следующий код:</p><p>Вместе с этим кодом в CSS:</p><h3>Что такое центральная точка div</h3><p>По умолчанию это — центральная точка div.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/016e2d4c-c233-45f3-9e4a-c4d8eb4948de.png" alt="" /></figure><p>Вот почему мы видим такое странное поведение блока при попытке выровнять его.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/903879db-3502-4e80-a167-b4faa8635c88.png" alt="" /></figure><p>Обратите внимание, что на изображении выше блок находится не по центру.</p><p>Написав эту строку:</p><p>Мы решим проблему и получим следующий результат.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/fd569112-e383-44eb-9398-97c6b6cbc4ff.png" alt="" /></figure><h3>Что такое свойство Translate в CSS</h3><p>Translate – это сокращение 3 свойств:</p><ol><li>translateX;</li><li>translateY;</li><li>translateZ.</li></ol><h3>Как выровнять div по горизонтали с помощью свойства CSS Position</h3><p>Используем свойство left внутри класса .box-1.</p><p>Вот результат:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/34b3e19e-18a8-4397-907d-8c624a7ceda5.png" alt="" /></figure><h3>Как выровнять div по вертикали с помощью свойства CSS Position</h3><p>Используем свойство top внутри класса .box-1.</p><p>Результат:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/179cf264-2291-4977-99c1-3891e0cfc9fa.png" alt="" /></figure><h3>Как центрировать div по горизонтали и вертикали с помощью свойства CSS position</h3><p>Чтобы достичь этого результата, мы объединим вместе свойства:</p><ol><li>top, left;</li><li>transform, translate.</li></ol><p>Результат:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/144c04c9-5df6-4d37-a12d-e795db032a82.png" alt="" /></figure><h2>Как использовать свойство margin для центрирования чего-либо</h2><p>Свойство margin является сокращением 4 свойств:</p><ol><li>margin-top, margin-bottom;</li><li>margin-left, margin-right.</li></ol><p>Напишите этот код:</p><h3>Как выровнять div по горизонтали с помощью свойства CSS margin</h3><p>Используем свойство margin внутри класса .box-1. Напишите этот код:</p><p>Вот, как будет выглядеть результат:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/ab9de7e9-f7b0-4070-9ca2-b55fee823198.png" alt="" /></figure><h3>Как выровнять div по вертикали с помощью свойства CSS margin</h3><p>Снова используем margin внутри класса .box-1. Напишите следующий код:</p><p>Результат:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/0f9c3785-e3d2-4b70-99d5-4b54b23db73c.png" alt="" /></figure><h3>Как выровнять div по горизонтали и вертикали с помощью свойства CSS margin</h3><p>И ещё разок используем margin внутри класса .box-1. Напишите такой код:</p><p>Результат будет выглядеть так:</p><figure><img src="https://media.tproger.ru/uploads/2023/05/e0aaa68f-a95b-4acc-9ee6-a55c11bf74b4.png" alt="" /></figure><h2>Заключение</h2><p>Теперь вы можете уверенно выравнивать или центрировать содержимое, используя любой из этих четырех методов в CSS.</p><p>Возьмите вашу медаль за то, что дочитали статью до конца!</p>]]></content:encoded>
    </item>
    <item>
      <title>Шпаргалка по всем свойствам CSS Flexbox</title>
      <link>https://tproger.ru/articles/css-flexbox-tutorial-with-flexbox-properties-cheat-sheet</link>
      <comments>https://tproger.ru/articles/css-flexbox-tutorial-with-flexbox-properties-cheat-sheet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/css-flexbox-tutorial-with-flexbox-properties-cheat-sheet</guid>
      <description><![CDATA[<p>Рассмотрели основы CSS Flexbox и объяснили, как работает каждое из свойств Flexbox. Внутри статьи — шпаргалки с котиками.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/css-flexbox-tutorial-with-flexbox-properties-cheat-sheet">Шпаргалка по всем свойствам CSS Flexbox</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 27 Apr 2023 05:09:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой статье мы рассмотрим основы CSS Flexbox, чтобы вы могли создавать адаптивные сайты.</p><p>Объясним, как работает каждое из свойств Flexbox, и дадим вам шпаргалку к каждому свойству. В шпаргалках описано всё, что можно сделать с помощью Flexbox.</p><p>Это — перевод <a href="https://www.freecodecamp.org/news/css-flexbox-tutorial-with-cheatsheet/">оригинальной статьи на freeCodeCamp</a> от автора Joy Shaheb.</p><p>Ещё у нас есть видеоверсия урока от автора (осторожно, английский язык):</p><h2>Что такое Flexbox</h2><p>Когда вы строите дом, вам нужен чертеж. Точно такой же чертеж нам понадобится для создания веб-сайтов. И Flexbox – это тот самый чертеж.</p><p>Flexbox позволяет нам компоновать между собой содержимое нашего сайта. Ещё она помогает создавать адаптивные структуры для веб-сайтов под различные устройства.</p><p>Вот демо-визитка, написанная на Flexbox в качестве чертежа.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/a9068998-714e-4253-9cd9-f17c3855c31f-autoconverted.jpeg" alt="" /></figure><h2>Архитектура Flexbox</h2><p>Как же работает архитектура Flexbox? Контентные flex-элементы распределяются вдоль главной оси и поперечной оси, как в системе координат.</p><p>И, в зависимости от значений flex-direction, положение блоков меняется между строками и колонками.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/ac9daa4c-130d-49cd-90ec-aaff9542da3f.png" alt="" /></figure><h2>Список свойств Flexbox</h2><p>Этот список содержит все возможные свойства и значения, которые вы можете использовать при работе с Flexbox.</p><p>Вы можете использовать список при выполнении проектов и экспериментировать с различными значениями.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/da8af70c-d5e3-4c12-933d-36b0dafa29c9.png" alt="" /></figure><h2>Создаём проект</h2><p>Чтобы создать проект с Flexbox, нужно немного знать HTML, CSS и работу с VS-кодом. Вот, что вам нужно сделать:</p><ol><li>Создайте папку с именем “Project-1” и откройте VS Code.</li><li>Создайте файлы index.html и style.css.</li><li>Установите Live Server и запустите его.</li></ol><p>Или вы можете просто открыть <a href="https://codepen.io/">Codepen</a> и начать кодить.</p><h3>HTML</h3><p>В HTML напишите эти строки кода внутри тега body</p><h3>CSS</h3><p>Создайте класс .container и укажите в нём поля. Затем оформите блоки так, чтобы все они выглядели одинаково, как в примере ниже. ????</p><p>Примечание: не забудьте указать высоту контейнера.</p><p>Также, прежде чем начать, необходимо понять отношения между родительскими и дочерними классами.</p><p>Flexbox работает только с родительским классом, но не с дочерними классами.</p><p>Здесь класс .container является родительским, а классы .box-* – дочерними.</p><p>Поэтому примените display: flex внутри класса .container. Расположите текст по центру блока.</p><p>И… все готово! Теперь мы готовы кодить. ????</p><h2>Свойство flex-direction</h2><p>Это свойство позволяет нам задавать направление и ориентацию, согласно которым flex-элементы должны располагаться внутри flex-контейнера.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/d2347cd5-7b8e-41f7-9a2c-52e7eb10239b.png" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2023/04/53ed9817-52fa-42f7-8f10-4d984bbe490e.png" alt="" /></figure><p>Чтобы у нас получилось то же самое, что и на картинке с котиками, нужно написать такой CSS-код.</p><p>Обратите внимание, что мы пишем код внутри класса .container.</p><h2>Свойство justify-content</h2><p>Это свойство выстраивает flex-элементы вдоль <b>главной оси</b> внутри flex-контейнера.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/277964d7-84e1-4a00-85ad-78906e5775d3.png" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2023/04/4a2cd2f0-a553-4ed7-974b-0cd77a0e266a.png" alt="" /></figure><p>Попробуйте воссоздать это с помощью этого кода CSS:</p><h2>Свойство align-content</h2><p>Это свойство выравнивает flex-элементы по <b>поперечной оси</b> внутри flex-контейнера. Оно аналогично свойству justify-content, которое мы рассматривали только что. Разница только в осях выравнивания.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/ccaceb9a-2972-4341-976f-2e1506f4a924.png" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2023/04/d825543f-5273-4fab-b68e-95d1d177eb6e.png" alt="" /></figure><p>Обратите внимание, что без flex-wrap это свойство не работает. Вот, что должно быть в вашем коде:</p><h2>Свойство align-items</h2><p>Это свойство распределяет Flex-элементы вдоль поперечной оси.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/3ec42474-d697-4603-a1e6-1c16751f6919.png" alt="" /></figure><p>Чтобы протестировать свойство, напишем следующий код в CSS:</p><h2>Свойство align-self</h2><p>Это свойство работает <b>с дочерними классами</b>. Оно позиционирует выбранный элемент <b>вдоль поперечной оси</b>.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/5ed27c09-637b-4186-b7ee-284bb5ac8500.png" alt="" /></figure><p>Всего есть 6 значений align-self:</p><ul><li>flex-start;</li><li>flex-end;</li><li>center;</li><li>baseline;</li><li>stretch;</li><li>auto.</li></ul><p>Чтобы воссоздать результат, выберите любой .box-* и напишите следующий код:</p><h2>Свойства flex-grow, shrink, wrap и basis</h2><p>Свойства, которые мы сейчас обсудим, будут работать при изменении размера окна. Давайте приступим.</p><h3>Flex-grow</h3><p>Это свойство <b>увеличивает</b> размер flex-элемента на основе ширины flex-контейнера.</p><h3>Flex-shrink</h3><p>Это свойство <b>уменьшает</b> flex-элемент в зависимости от ширины flex-контейнера. Оно противоположно flex-grow.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/64582c7e-98e3-492d-aa65-46de85171ef3.png" alt="" /></figure><p>Обратите внимание, что flex-grow и flex-shrink работают на дочерних классах. Поэтому мы изменим все наши блоки следующим образом:</p><p>Поиграйтесь с размером окна браузера, и вы увидите результат.</p><p>Теперь используем flex-shrink.</p><p>Обратите внимание, что сначала нужно удалить свойство flex-wrap, иначе flex-shrink не будет работать.</p><p>Измените размер окна, и вы увидите результат.</p><h3>Flex-wrap</h3><p>Это свойство помогает установить количество flex-элементов в строке или в колонке.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/59b352a5-d05f-409d-89c3-f4c138b3eaf1.png" alt="" /></figure><p>Свойство работает в родительском классе .container. Итак, напишите код:</p><h3>Flex-basis</h3><p>Свойство похоже на добавление ширины к flex-элементу, но работает более гибко.</p><p>К примеру, flex-basis: 10em установит начальный размер flex-элемента равным 10em. Его конечный размер будет основан на доступном пространстве, на данных flex-grow и flex-shrink.</p><h2>Как читать сокращения свойств Flexbox</h2><h3>Сокращение flex</h3><p>Вот, как могут быть одновременно указаны свойства flex-grow, flex-shrink и flex-basis вместе взятые.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/85caf0c3-6d89-443d-ac29-91db51ab8aa0.png" alt="" /></figure><p>Попробуйте понять сокращение, написав следующий код.</p><p>Обратите внимание, что он работает только для дочерних классов.</p><h3>Сокращение flex-flow</h3><p>Это сокращение для свойств flex-direction и flex-wrap.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/5551b314-5a1d-4cc6-a236-b74f371a57cb.png" alt="" /></figure><p>Напишите следующий код, который работает в родительском классе:</p><h3>Сокращение place-content</h3><p>Это сокращение для свойств justify-content и align-content.</p><p>Обратите внимание, что оно работает в родительском классе.</p><p>Если вы дочитали до конца, вам полагается большущая медаль. &lt;3</p><p>Пишите в комментариях, интересны ли вам статьи по CSS и на какие темы. Нам будет приятно знать, что тема востребована.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 шпаргалок для веб-разработчика</title>
      <link>https://tproger.ru/articles/10-shpargalok-dlja-veb-razrabotchika</link>
      <comments>https://tproger.ru/articles/10-shpargalok-dlja-veb-razrabotchika?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-shpargalok-dlja-veb-razrabotchika</guid>
      <description><![CDATA[<p>В этих шпаргалках собраны подсказки по HTML, CSS, JavaScript, PHP, Django, Spring Boot и всему, что нужно знать веб-разработчику.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-shpargalok-dlja-veb-razrabotchika">10 шпаргалок для веб-разработчика</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 05 Feb 2023 07:46:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Веб включает в себя и фронтенд, и бэкенд, потому мы постарались собрать шпаргалки для веб-разработчиков по самым разным языкам и технологиям.</p><h2>Шпаргалки по HTML</h2><p>Язык гипертекстовой разметки — основа фронтенда и не даром стоит на первом месте в перечне HTML/CSS/JS. Не стоит забывать и об HTML5 — пятой и последней версии.</p><p>Следующая шпаргалка содержит основные теги HTML5:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/HTML5_Cheatsheet.jpg" alt="" /></figure><p>Если же вас интересуют коды спецсимволов, то они собраны здесь:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/HTML_Characters_Cheatsheet.jpg" alt="" /></figure><h2>Шпаргалки по CSS</h2><p>Дальше ожидаемо идёт стилизация элементов с помощью CSS. И несмотря на то, что CSS4 разрабатывается W3C с 2011 года, CSS3 всё ещё актуальная версия. Держите шпаргалку, которая упростит работу с каскадными таблицами стилей:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/css3-help-sheet-large1.jpg" alt="" /></figure><p>А за хинтами по CSS Grid и Flexbox можно обратиться к нашим статьям:</p><ul><li><a href="https://tproger.ru/translations/how-css-flexbox-works/">CSS Flexbox в гифках</a></li><li><a href="https://tproger.ru/articles/7-osnovnyh-ponjatij-css-grid-layout-s-primerami-kotorye-pomogut-nachat-rabotu-s-gridami/">CSS Grid в примерах</a></li></ul><h2>Шпаргалки по JavaScript</h2><p>Этот язык не нуждается в представлении — его знает каждый веб-разработчик. Для тех, кто интересуется функциональным программированием на JS, есть такие подсказки:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/Functional_programming_JS_Cheatsheet-1.jpg" alt="" /></figure><p>Отдельного внимания заслуживает шпаргалка для веб-разработчика по массивам, строкам и регулярным выражениям в JavaScript:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/Javascript_cheatsheet.jpg" alt="" /></figure><p>Ещё один небезызвестный представитель в веб-разработке — Node.js. По нему тоже есть полезный список подсказок:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/Nodejs_Cheatsheet.jpg" alt="" /></figure><h2>Шпаргалки по PHP</h2><p>Как бы ни ругали PHP, это всё ещё основной язык бэкенда, на котором написано подавляющее большинство сайтов.</p><p>В следующей шпаргалке для веб-разработчиков собрана информация о синтаксисе PHP — отлично подойдёт для начинающих:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/PHP_Cheatsheet.jpg" alt="" /></figure><p>А это краткое руководство по PHP с массивами, строками, регулярными выражениями, форматами дат, паттернами и многим другим:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/PHP_basics_Cheatsheet.jpg" alt="" /></figure><h2>Шпаргалки по Django</h2><p>Одну из них вы можете найти в <a href="https://tproger.ru/articles/python-cheatsheets/">шпаргалках по Python</a>. Вторая же вышла в 2021 году и содержит более полную информацию, включая атрибуты модели, работу с базами данных и деплой на PythonAnywhere:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/Python_Django_CheatSheet.jpg" alt="" /></figure><h2>Видеокурс по Spring Boot</h2><p>Java является одним из наиболее популярных кроссплатформенных языков программирования. Большое распространение в веб-разработке он получил благодаря Spring Boot.</p><p>Это не совсем шпаргалка, а комплексный видеокурс, который тем не менее поможет освоить инструмент и создать своё первое веб-приложение на Java:</p><p>Что-то упустили? Напишите в комментариях — мы всегда рады дельным советам.</p>]]></content:encoded>
    </item>
    <item>
      <title>Прохождение Learn Git Branching</title>
      <link>https://tproger.ru/articles/prohozhdenie-learn-git-branching</link>
      <comments>https://tproger.ru/articles/prohozhdenie-learn-git-branching?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/prohozhdenie-learn-git-branching</guid>
      <description><![CDATA[<p>Если у вас возникли сложности с прохождением интерактивного курса Learn Git Branching, подсмотрите решение в этой шпаргалке.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/prohozhdenie-learn-git-branching">Прохождение Learn Git Branching</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 12 Oct 2022 11:18:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Learn Git Branching — это <a href="https://learngitbranching.js.org/?locale=ru_RU">интерактивный учебник по Git</a>, направленный на закрепление теории прохождением наглядной практики. Если вы столкнулись с трудностью в процессе прохождения, выберите необходимый раздел, уровень и подсмотрите решение.</p><ol><li><a href="https://tproger.ru/#part1">Введение</a></li><li><a href="https://tproger.ru/#part2">Едем дальше</a></li><li><a href="https://tproger.ru/#part3">Перемещаем труды туда-сюда</a></li><li><a href="https://tproger.ru/#part4">Сборная солянка</a></li><li><a href="https://tproger.ru/#part5">Продвинутый уровень</a></li><li><a href="https://tproger.ru/#part6">Push &amp; Pull</a></li><li><a href="https://tproger.ru/#part7">Origin и Git remotes</a></li></ol><h2>Введение</h2><p>Прохождение Learn Git Branching начинается с азов.</p><h3>1. Знакомство с Git commit</h3><p>В этом уровне объясняется, что такое коммиты и как их следует делать. Для прохождения уровня достаточно ввести две команды для коммита, а именно:</p><p>Примечание Чтобы перейти в консоль LearnGitBranching, нажмите Tab.</p><p>Вообще, достаточно и просто двух команд git commit. Однако правилом хорошего тона является указание ветки (у нас это main) и именование коммитов в соответствии с тем, какие изменения были в них внесены.</p><h3>2. Ветвление в Git</h3><p>В этом уровне следует создать и переключиться на новую ветку bugFix:</p><h3>3. Git merge</h3><p>Теперь надо понять, как объединять изменения из двух разных веток. Для этого будем использовать команду git merge. Такой тип слияния создаёт коммит, который имеет сразу двух родителей. Для прохождения уровня введите следующие команды:</p><h3>4. Git rebase</h3><p>Это второй способ объединения изменений в двух ветках. При ребейзе Git по сути копирует набор коммитов и переносит их в другое место. В учебнике сказано, что с rebase история коммитов будет чище, но в основном используется именно merge.</p><p>Давайте посмотрим на решение:</p><h2>Едем дальше</h2><p>Далее в прохождении Learn Git Branching вы столкнётесь с демонстрацией способов перемещения по дереву коммитов.</p><h3>1. HEAD</h3><p>Суть в том, чтобы отделить HEAD от ветки bugFix и присвоить его последнему коммиту в этой же ветке:</p><h3>2. Относительные ссылки: ^</h3><p>Перемещаемся на первого родителя ветки bugFix:</p><h3>3. Оператор «~» и branch forcing</h3><p>Именно на этой задаче у многих возникают проблемы, потому что схема выглядит весьма запутанной. Но чтобы осуществить перемещение, достаточно ввести в консоль Learn Git Branching такие команды:</p><h3>4. Отмена изменений в Git</h3><p>Здесь просто отменяем изменения локально и удалённо. Поскольку изначально мы находимся на локальной ветке (она отмечена звёздочкой), то и начинаем с неё:</p><h2>Перемещаем труды туда-сюда</h2><p>Теперь речь пойдёт о перемещении изменений — возможности, позволяющей разработчику сказать «Хочу, чтобы эти изменения были вот тут, а вот эти — вон там» и получить точные, правильные результаты, не теряя при этом гибкости разработки.</p><h3>1. Git cherry-pick</h3><p>Здесь нужно перенести копии выбранных комитов в main, что делается всего одной строкой:</p><h3>2. Git interactive rebase</h3><p>Это задача с использованием интерактивного окна для перемещения элементов. Для начала впишите код:</p><p>Затем выделите и переставьте элементы в интерактивном окне Learn Git Branching следующим образом:</p><figure><img src="https://media.tproger.ru/uploads/2022/10/Interactive-rebase.jpg" alt="" /></figure><h2>Сборная солянка</h2><p>На этом прохождение основ в Learn Git Branching заканчивается, и дальше именно вы решаете, какую команду выбрать. Я просто приведу свои варианты решения задач из сборной солянки, но вы всегда можете воспользоваться другими.</p><h3>1. Выберем один коммит</h3><h3>2. Жонглируем коммитами</h3><h3>3. Жонглируем коммитами №2</h3><h3>4. Теги</h3><h3>5. Git describe</h3><h2>Продвинутый уровень</h2><p>Вот мы и подошли к продвинутому уровню в прохождении Learn Git Branching.</p><h3>1. Rebase на нескольких ветках</h3><p>Перемещения здесь выглядят сложными, но на деле всё просто:</p><h3>2. Определение родителей</h3><p>Решить можно в три, две и в одну команду. Сделаем в одну:</p><h3>3. Спутанные ветки</h3><p>Задание считается сложным, но достаточно просто абстрагироваться и вспомнить полезную команду git cherry-pick:</p><h2>Push &amp; Pull</h2><p>Теперь переходим к удалённым репозиториям. В этих ответах только код.</p><h3>1. Введение в клонирование</h3><h3>2. Удалённые ветки в Git</h3><h3>3. Git fetch</h3><h3>4. Git pull</h3><h3>5. Коллективная работа</h3><h3>6. Git push</h3><h3>7. Когда наработки расходятся</h3><h3>8. Remote rejected</h3><h2>Origin и Git remotes</h2><p>Это завершающий этап прохождения интерактива Learn Git Branching, в котором, как и в предыдущем, содержится восемь заданий. Здесь я приведу только их решения.</p><h3>1. Слияние фича-бранчей (веток)</h3><h3>2. Merge? Нет, нет, спасибо.</h3><h3>3. Удалённые-отслеживаемые ветки</h3><h3>4. Аргументы команды push</h3><h3>5. Подробности аргумента &lt;пункт назначения&gt;</h3><h3>6. Аргументы git fetch</h3><h3>7. Странный &lt;источник&gt;</h3><h3>8. Аргументы для pull</h3><p>Надеюсь, моё прохождение Learn Git Branching окажется полезным. Старайтесь проходить уровни самостоятельно, чтобы закреплять полученные знания, но если где-то застрянете — обращайтесь за помощью к этой шпаргалке.</p><p>Держите больше <a href="https://tproger.ru/articles/5-shpargalok-po-git-ot-osnov-do-raboty-s-github/">шпаргалок по Git</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 шпаргалок по HTML и CSS</title>
      <link>https://tproger.ru/articles/10-shpargalok-po-html-i-css</link>
      <comments>https://tproger.ru/articles/10-shpargalok-po-html-i-css?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-shpargalok-po-html-i-css</guid>
      <description><![CDATA[<p>Собрали небольшой перечень чит-листов по HTML и CSS, которые помогут и в учёбе, и в работе. Сохраните, чтобы не потерять.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-shpargalok-po-html-i-css">10 шпаргалок по HTML и CSS</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 08 Jul 2022 08:15:43 GMT</pubDate>
      <content:encoded><![CDATA[<p>Чтобы не теряться в океане тегов и атрибутов, забирайте наиболее полные шпаргалки по HTML и CSS. Никакой воды — максимум пользы.</p><ol><li><a href="https://tproger.ru/#part1">Шпаргалки по HTML</a></li><li><a href="https://tproger.ru/#part2">Шпаргалки по CSS</a></li></ol><h2>Шпаргалки по HTML</h2><p>Язык гипертекстовой разметки — основа фронтенда, её скелет, на который вешаются стили и функционал. Самая последняя версия — HTML5: поддерживает все теги и элементы. Так, с появлением HTML 5 были добавлены новые типы ввода:</p><ul><li>email для ввода электронной почты:&lt;input type="email" name="user_email" /&gt;</li><li>url для соответствующих input-полей: &lt;input type="url" name="user_url" /&gt;</li><li>number для числовых значений: &lt;input type="number" name="points" min="1" max="10" /&gt;</li><li>range для диапазона чисел: &lt;input type="range" name="points" min="1" max="10" /&gt;</li><li>Выбор даты: &lt;input type="date" name="user_date" /&gt;</li><li>Выбор цвета: &lt;input type="color" name="user_color" /&gt;. Opera позволит выбрать цвет из палитры, а Chrome разрешит отправлять форму только с шестнадцатеричным значением.</li></ul><p><b>Держите шпаргалку по HTML4 и HTML5</b>. Там же вы сможете найти различные спецификации поддержки и совместимости для десктопа и мобильных устройств для HTML 5 в разных браузерах.</p><p>А в следующих двух шпаргалках представлены <b>символьные объекты HTML</b>. Что это такое? Некоторые символы зарезервированы за HTML-разметкой, а потому не могут использоваться напрямую, поскольку есть шанс поломать вёрстку. Например, чтобы прописать левую или правую угловую скобку (&lt;&gt;) в статье, мы записываем их в HTML как &lt; и &gt; соответственно. В противном случае затронем теги вёрстки.</p><p>Вот сами чит-листы по HTML-символам:</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/cd366938-57d7-4dd1-81f2-b73218787fde.jpg" alt="" /><figcaption>Полная версия: https://cheatography.com/davechild/cheat-sheets/html-character-entities/</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/dbeac0ac-2631-4d38-8dd4-9831d5e1c2e5.jpg" alt="" /><figcaption>Полная версия: https://cheatography.com/reverseemf/cheat-sheets/html-character-entities/</figcaption></figure><p>То же самое, но на русском вы найдёте на <a href="http://htmlbook.ru/samhtml/tekst/spetssimvoly">htmlbook.ru</a>.</p><p>Следующая шпаргалка содержит <b>основные теги HTML5</b>:</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/fd093f80-4874-487b-b811-b03552ea33b4.jpg" alt="" /><figcaption>Полная версия: https://cheatography.com/kenlandtan/cheat-sheets/html-5/<br /></figcaption></figure><p>Также держите расширенную шпаргалку с тегами HTML5: четыре страницы с подсказками отлично подойдут, чтобы подготовиться к собеседованию.</p><p>Но перед тем, как перейти к CSS, нельзя не отметить едва ли не самую <a href="https://drive.google.com/file/d/17iv0459FcBZAAmGzeL-T55JQxR_E5pjo/view">удобную шпаргалку по HTML</a>, которая выручит в любой ситуации, будь то подготовка к интервью или рабочий процесс.</p><h2>Шпаргалки по CSS</h2><p>Каскадные таблицы стилей, они же CSS, описывают, как именно HTML-элементы будут отображаться. При этом один и тот же стиль может применяться сразу к нескольким элементам или даже страницам.</p><p>При первом знакомстве с CSS могут возникнуть проблемы с обозначением единиц измерения. Некоторые из них пришли из типографской традиции, как пункт (pt) и пика (pc), другие, например сантиметр (cm) и дюйм (in), знакомы нам из обихода. Есть и специальная единица измерения, придуманная специально для CSS: px.</p><p>Держите шпаргалку по единицам измерения в CSS, чтобы не запутаться:</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/d60fe74c-7a92-4170-929b-6edfc7bd17fa.jpg" alt="" /><figcaption>Источник: https://cheatography.com/rahilkasimi/cheat-sheets/css-units-cheatsheet/</figcaption></figure><p>А ещё есть селекторы, которые определяют, к какому элементу применять то или иное CSS-правило. Если вас интересуют CSS-селекторы, то вам сюда:</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-05/a008510b-c6f2-43cb-87e1-83143a181900.jpg" alt="" /></figure><p>А вот ещё одна <a href="https://drive.google.com/file/d/1EmcZoYh0fYSJNL4Yr8eHuxpgVvVpPvx3/view">удобная шпаргалка по CSS</a>, которая собрала в себе максимум полезной информации. Также посмотрите, <a href="https://tproger.ru/articles/css-selektor-has/">как правильно использовать CSS-селектор :has()</a>.</p><p>Надеемся, что шпаргалки по HTML и CSS оказались полезными. Чит-листы по каким языкам и технологиям вы хотели бы увидеть? Напишите в комментариях.</p>]]></content:encoded>
    </item>
    <item>
      <title>Шпаргалки по SQL: сохранить и не забыть</title>
      <link>https://tproger.ru/articles/shpargalki-po-sql</link>
      <comments>https://tproger.ru/articles/shpargalki-po-sql?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/shpargalki-po-sql</guid>
      <description><![CDATA[<p>Держите полезные шпаргалки по SQL, с которыми вы никогда не забудете основное из работы с реляционными базами данных.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/shpargalki-po-sql">Шпаргалки по SQL: сохранить и не забыть</a>»</p>]]></description>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 03 Jun 2022 09:07:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>С этими шпаргалками по SQL можно не бояться, что в ответственный момент вы что-то забудете. Сохраняйте в закладки и используйте в работе с реляционными базами данных.</p><ol><li><a href="https://tproger.ru/#part1">Ключевые слова</a></li><li><a href="https://tproger.ru/#part2">Комментарии</a></li><li><a href="https://tproger.ru/#part3">Операторы</a></li><li><a href="https://tproger.ru/#part4">Джойны</a></li><li><a href="https://tproger.ru/#part5">Другие шпаргалки по SQL</a></li></ol><h2>Ключевые слова</h2><p>Это перечень ключевых слов в SQL с описаниями и примерами использования. Зарезервированные ключевые слова используются для определения и манипулирования данными.</p><p>Шпаргалка с ключевыми словами SQL позволит вспомнить необходимую информацию в нужный момент, особенно это актуально перед собеседованиями.</p><figure><img src="https://media.tproger.ru/uploads/2022/06/Kljuchevye-slova-SQL-2-scaled.jpg" alt="" /></figure><h2>Комментарии</h2><p>Однострочные комментарии в SQL начинаются с двух тире -- и продолжаются до конца строки:</p><p>Многострочные комментарии в SQL напоминают комментирование в Java. Они начинаются со слеша и звёздочки /* и заканчиваются звёздочкой со слешем */:</p><p>Примечание Синтаксис комментариев зависит от системы, к которой выполняется запрос.</p><h2>Операторы</h2><p>Чтобы не путаться, разобьём в этой шпаргалке операторы SQL по разным столбцам в соответствии с их типом:</p><figure><img src="https://media.tproger.ru/uploads/2022/06/Operatory-SQL.jpg" alt="" /></figure><h2>Джойны</h2><p>JOIN используется для связи двух или более таблиц с помощью общих атрибутов внутри них. Соединение таблиц может быть внутренним (INNER) или внешним (OUTER), причём внешнее соединение может быть левым (LEFT), правым (RIGHT) или полным (FULL).</p><ul><li>INNER JOIN — получение записей с одинаковыми значениями в обеих таблицах, т.е. получение пересечения таблиц.</li><li>FULL OUTER JOIN — объединяет записи из обеих таблиц (если условие объединения равно true) и дополняет их всеми записями из обеих таблиц, которые не имеют совпадений. Для записей, которые не имеют совпадений из другой таблицы, недостающее поле будет иметь значение NULL.</li><li>LEFT JOIN — возвращает все записи, удовлетворяющие условию объединения, плюс все оставшиеся записи из внешней (левой) таблицы, которые не удовлетворяют условию объединения.</li><li>RIGHT JOIN — работает точно так же, как и левое объединение, только в качестве внешней таблицы будет использоваться правая.</li></ul><p>Держите понятную иллюстрацию вышеизложенного:</p><figure><img src="https://media.tproger.ru/uploads/2022/06/image-autoconverted.jpeg" alt="" /></figure><p><b>Пример:</b> следующий запрос выберет все заказы из  таблицы orders с информацией о клиенте из таблицы customers:</p><h2>Другие шпаргалки по SQL</h2><p>Следующая шпаргалка очень пригодится, потому как включает также агрегатные и строковые функции. Всё это с доступными примерами:</p><p>Ещё одна удобная шпаргалка по SQL с типами данных и командами, объединёнными по общим признакам. Есть примеры использования:</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-15/0be0a660-6505-43e6-8b80-3098eebe24f7.png" alt="" /></figure><p>Также рекомендуем ознакомиться с <a href="https://tproger.ru/translations/sql-recap/">основными командами SQL</a>, которые должен знать каждый программист.</p>]]></content:encoded>
    </item>
    <item>
      <title>Шпаргалка по логированию на Python</title>
      <link>https://tproger.ru/articles/shpargalka-po-logirovaniju-na-python</link>
      <comments>https://tproger.ru/articles/shpargalka-po-logirovaniju-na-python?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Andron Alexanyan]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/shpargalka-po-logirovaniju-na-python</guid>
      <description><![CDATA[<p>В языке Python основным инструментом для логирования является библиотека logging. Так давайте вместе с IT Resume рассмотрим её подробней. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/shpargalka-po-logirovaniju-na-python">Шпаргалка по логированию на Python</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Гостевая публикация]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 07 Jun 2021 10:21:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если Вы хотя бы немного знакомы с программированием и пробовали запускать что-то «в продакшен», то вам наверняка станет больно от такого диалога:</p><p>— Вась, у нас там приложение слегло. Посмотри, что случилось?— Эмм... А как я это сделаю?..</p><p>Да, у Василия, судя по всему, не настроено логирование. И это ужасно, хотя бы по нескольким причинам:</p><ol><li>Он никогда не узнает, из-за чего его приложение упало.</li><li>Он не сможет отследить, что привело к ошибке (даже если приложение не упало).</li><li>Он не сможет посмотреть состояние своей системы в момент времени N.</li><li>Он не сможет профилактически поглядывать в логи, чтобы следить за работоспособностью приложения.</li><li>Он не сможет хвастаться своим… (кхе-кхе).</li></ol><p>Впрочем, последний пункт, наверно, лишний. Однако, одну вещь мы поняли наверняка:</p><p>Логирование — крайне важная штука в программировании.</p><p>В языке Python основным инструментом для логирования является библиотека logging. Так давайте вместе с <a href="https://t.me/it_resume">IT Resume</a> рассмотрим её подробней.</p><h2>Что такое logging?</h2><p>Модуль logging в Python — это набор функций и классов, которые позволяют регистрировать события, происходящие во время работы кода. Этот модуль входит в стандартную библиотеку, поэтому для его использования достаточно написать лишь одну строку:</p><p>Основная функция, которая пригодится Вам для работы с этим модулем — basicConfig(). В ней Вы будете указывать все основные настройки (по крайней мере, на базовом уровне).</p><p>У функции basicConfig() 3 основных параметра:</p><ol><li>level — уровень логирования на Python;</li><li>filename — место, куда мы направляем логи;</li><li>format — вид, в котором мы сохраняем результат.</li></ol><p>Давайте рассмотрим каждый из параметров более подробно.</p><h2>Уровни логирования на Python</h2><p>Наверно, всем очевидно, что события, которые генерирует наш код кардинально могут отличаться между собой по степени важности. Одно дело отлавливать критические ошибки (FatalError), а другое — информационные сообщения (например, момент логина пользователя на сайте).</p><p>Соответственно, чтобы не засорять логи лишней информацией, в basicConfig() Вы можете указать минимальный уровень фиксируемых событий.</p><p>По умолчанию фиксируются только предупреждения (WARNINGS) и события с более высоким приоритетом: ошибки (ERRORS) и критические ошибки (CRITICALS).</p><p>А далее, чтобы записать информационное сообщение (или вывести его в консоль, об этом поговорим чуть позже), достаточно написать такой код:</p><p>И так далее. Теперь давайте обсудим, куда наши сообщения попадают.</p><h2>Отображение лога и запись в файл</h2><p>За место, в которое попадают логи, отвечает параметр filename в basicConfig. По умолчанию все Ваши логи будут улетать в консоль.</p><p>Другими словами, если Вы просто выполните такой код:</p><p>То сообщение WOW придёт Вам в консоль. Понятно, что в консоли никому эти сообщения не нужны. Как же тогда направить запись лога в файл? Очень просто:</p><p>Ок, с записью в файл и выбором уровня логирования все более-менее понятно. А как настроить свой шаблон? Разберёмся.</p><p>Кстати, мы собрали для Вас <a href="https://vk.com/itresume?w=wall-197837145_1259">сублимированную шпаргалку</a> по логированию на Python в виде карточек. У нас ещё много полезностей, не пожалеете 🙂</p><h2>Форматирование лога</h2><p>Итак, последнее, с чем нам нужно разобраться — форматирование лога. Эта опция позволяет Вам дополнять лог полезной информацией — датой, названием файла с ошибкой, номером строки, названием метода и так далее.</p><p>Сделать это можно, как все уже догадались, с помощью параметра format.</p><p>Например, если внутри basicConfig указать:</p><p>То вывод ошибки будет выглядеть так:</p><p>Вы можете сами выбирать, какую информацию включить в лог, а какую оставить. По умолчанию формат такой:</p><p>&lt;УРОВЕНЬ&gt;: &lt;ИМЯ_ЛОГГЕРА&gt;: &lt;СООБЩЕНИЕ&gt;.</p><p>Важно помнить, что все параметры logging.basicConfig должны передаваться до первого вызова функций логирования.</p><h2>Эпилог</h2><p>Что же, мы разобрали все основные параметры модуля logging и функции basicConfig, которые позволят Вам настроить базовое логирование в Вашем проекте. Дальше — только практика и набивание шишек 🙂</p><p>Вместо заключения просто оставим здесь рабочий кусочек кода, который можно использовать 🙂</p><p>Если хотите разобраться с параметрами более подробно, Вам поможет <a href="https://docs.python.org/3/library/logging.html">официальная документация</a> (очень неплохая, кстати).</p>]]></content:encoded>
    </item>
    <item>
      <title>Методы строк в JavaScript: простая шпаргалка с примерами</title>
      <link>https://tproger.ru/articles/metody-strok-v-javascript-shpargalka-dlja-nachinajushhih</link>
      <comments>https://tproger.ru/articles/metody-strok-v-javascript-shpargalka-dlja-nachinajushhih?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Почекутов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/metody-strok-v-javascript-shpargalka-dlja-nachinajushhih</guid>
      <description><![CDATA[<p>Встроенные методы строк JS собраны по задачам: смена регистра, объединение и разделение строк; при вызове метода создаётся новая строка.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/metody-strok-v-javascript-shpargalka-dlja-nachinajushhih">Методы строк в JavaScript: простая шпаргалка с примерами</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 01 Feb 2021 05:45:17 GMT</pubDate>
      <content:encoded><![CDATA[<p>Любые текстовые данные в JavaScript считаются строками.  Это примитивный тип, но язык позволяет работать с ним так, будто он является объектом. В том числе — использовать  встроенные в JS методы строк, которые собраны в этой шпаргалке.</p><p><b>Важно:</b> при использовании методов создаётся новая строка, которая записывается в ту же переменную вместо старой строки.</p><h3>Как изменить регистр</h3><h3>toLowerCase</h3><p>Преобразует символы в строке в нижний регистр.</p><h3>toUpperCase</h3><p>Преобразует символы в строке в верхний регистр.</p><h3>Как объединить строки</h3><h3>concat</h3><p>Объединяет две или более строки и возвращает одну строку.</p><h3>Как разделить строку на подстроки</h3><h3>split</h3><p>Разбивает строку в массив по указанному разделителю, которым может быть подстрока или регулярное выражение. Вторым параметром можно указать ограничитель.</p><h3>Как повторить строку</h3><h3>repeat</h3><p>Принимает в качестве параметра число и повторяет строку указанное количество раз.</p><h3>Как найти подстроку</h3><h3>charAt</h3><p>Возвращает символ по указанному индексу.</p><h3>includes</h3><p>Проверяет, содержит ли строка указанную подстроку. Возвращает значение true или false. Вторым параметром можно указать позицию в строке, с которой следует начать поиск.</p><h3>indexOf</h3><p>Возвращает индекс первого найденного вхождения указанного значения. Поиск ведётся от начала до конца строки. Если совпадений нет, возвращает -1. Вторым параметром можно передать позицию, с которой следует начать поиск.</p><h3>lastIndexOf</h3><p>Возвращает индекс последнего найденного вхождения указанного значения. Поиск ведётся от конца к началу строки. Если совпадений нет, возвращает -1. Вторым параметром можно передать позицию, с которой следует начать поиск.</p><h3>endsWith</h3><p>Проверяет, заканчивается ли строка символами, заданными первым параметром. Возвращает true или false. Есть второй необязательный параметр — ограничитель по диапазону поиска. По умолчанию он равен длине строки.</p><h3>startsWith</h3><p>Проверяет, начинается ли строка с указанных символов. Возвращает true или false. Вторым параметром можно указать индекс, с которого следует начать проверку.</p><h3>search</h3><p>Проверяет, есть ли в строке указанное значение или регулярное выражение и возвращает индекс начала совпадения.</p><h3>Как извлечь подстроку</h3><h3>slice</h3><p>Извлекает часть строки и возвращает новую строку. Обязательный параметр — начало извлечения. Вторым параметром можно установить границу (по умолчанию — до конца строки).</p><h3>substring</h3><p>Извлекает символы из строки между двумя указанными индексами. Второй индекс указывать не обязательно. В таком случае будут извлечены все символы от начала до конца строки. В отличие от slice, можно задавать start больше, чем end. Отрицательные значения не поддерживаются, они интерпретируются как 0.</p><h3>substr</h3><p>Извлекает часть строки указанной длины. Первым параметром принимает стартовую позицию, вторым — длину. Значение первого параметра может быть отрицательным, тогда позиция определяется с конца строки.</p><h3>Как заменить подстроку</h3><h3>replace</h3><p>Ищет в строке указанное значение или регулярное выражение и возвращает новую строку, в которой выполнена замена на второй параметр. Можно заменить найденные значения другой строкой или передать функцию для работы над совпадениями.</p><h3>replaceAll</h3><p>Даёт такой же результат, как метод replace() с глобальным флагом g. Заменяет все найденные совпадения другой строкой или переданной функцией.</p><h3>Как добавить в строку пробелы или другие символы</h3><h3>padEnd</h3><p>Добавляет в конце отступы, пока строка не достигнет длины, заданной первым параметром. Вторым параметром можно указать другой символ вместо пробела.</p><h3>padStart</h3><p>Добавляет в начале отступы, пока строка не достигнет длины, заданной первым параметром. Вторым параметром можно указать другой символ вместо пробела.</p><h3>Как удалить пробелы в строке</h3><h3>trim</h3><p>Обрезает пробелы с обоих концов строки.</p><h3>trimEnd</h3><p>Обрезает пробелы в конце строки</p><h3>trimStart</h3><p>Обрезает пробелы в начале строки</p><h3>Как работать с Юникодом</h3><h3>charCodeAt</h3><p>Возвращает числовое значение Юникода по указанному индексу. Обратите внимание: у букв в верхнем и нижнем регистрах разные коды.</p><h3>fromCharCode</h3><p>Преобразует числовые значения Юникода в читаемые символы.</p><p>Примечание: при работе с эмодзи, редкими математическими символами, иероглифами нужно помнить о суррогатных парах. Это символы, которые записываются двумя 16-битными словами. Длина таких строк — 2.</p><p>Суррогатные пары не учитывались при создании JS и методы строк charCodeAt / fromCharCode обрабатывают их некорректно. Правильно работают с суррогатными парами редкие методы String.fromCodePoint и str.codePointAt, которые появились в языке недавно.</p><p>Для работы со строками в JS есть не только встроенные методы, но и сторонние библиотеки. Они решают задачи более сложные задачи. Но подключать их имеет смысл только в том случае, если возможностей встроенных методов действительно не хватает.</p><p>При составлении этой шпаргалки я пользовался <a href="https://learn.javascript.ru/">«Современным учебником JavaScript» Ильи Кантора</a> и <a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Useful_string_methods">документацией MDN</a>.</p><p>Больше полезных материалов по JS:</p><ul><li><a href="https://tproger.ru/translations/javascript-cheatsheet/">Шпаргалка по современному JavaScript</a></li><li><a href="https://tproger.ru/articles/primery-zadach-po-javascript-dlja-podgotovki-dzhuna-k-sobesedovaniju-po-frontendu/">Примеры задач по JavaScript для подготовки джуна к собеседованию по фронтенду</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>5 шпаргалок по Python для разных сфер применения</title>
      <link>https://tproger.ru/articles/python-cheatsheets</link>
      <comments>https://tproger.ru/articles/python-cheatsheets?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/python-cheatsheets</guid>
      <description><![CDATA[<p>Подборка шпаргалок по основам языка, регулярным выражениям и библиотеке pandas для анализа данных — базовую информацию не придётся искать.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/python-cheatsheets">5 шпаргалок по Python для разных сфер применения</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Регулярные выражения]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 05 Nov 2020 13:02:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Держите несколько шпаргалок по Python, которые сэкономят вам время в процессе обучения и работы с популярным языком программирования.</p><ol><li><a href="https://tproger.ru/#part1">Шпаргалка по основам Python</a></li><li><a href="https://tproger.ru/#part2">Регулярные выражения в Python</a></li><li><a href="https://tproger.ru/#part3">Шпаргалка по pandas</a></li><li><a href="https://tproger.ru/#part4">Шпаргалка по Django</a></li><li><a href="https://tproger.ru/#part5">Виртуальное окружение Python</a></li></ol><h2>Шпаргалка по основам Python</h2><p>Здесь собраны переменные, методы, индексы и срезы, а также форматирование дат с соответствующими подсказками в сносках. Если вы только начали изучать программирование на языке Python, смело обращайтесь к этой шпаргалке:</p><figure><img src="https://media.tproger.ru/uploads/2020/11/python_basics_cheat_sheet.jpg" alt="" /></figure><h2>Регулярные выражения в Python</h2><p>Шпаргалка собрала большое количество информации о регулярках, включая:</p><ul><li>специальные символы;</li><li>объекты Match;</li><li>методы модуля re;</li><li>escape-символы;</li><li>Raw String Notation;</li><li>расширения;</li><li>объекты;</li><li>флаги;</li><li>ссылки на документацию: <a href="https://docs.python.org/3/howto/regex.html">Regular Expression HOWTO</a> и <a href="https://docs.python.org/3/library/re.html">Regular expression operations</a>.</li></ul><figure><img src="https://media.tproger.ru/uploads/2020/11/python_regex_cheat_sheet.jpg" alt="" /></figure><h2>Шпаргалка по pandas</h2><p>Эта библиотека для анализа данных прекрасно себя зарекомендовала в Data Science. Такая шпаргалка поможет в построении различных диаграмм с использованием pandas:</p><figure><img src="https://media.tproger.ru/uploads/2020/11/pandas_plotting_cheat_sheet.jpg" alt="" /></figure><h2>Шпаргалка по Django</h2><p>Будет полезна тем, кто желает освоить веб-разработку на Python. Здесь вы найдёте базовую информацию по работе с фреймворком — от его установки и до операций с Git:</p><figure><img src="https://media.tproger.ru/uploads/2020/11/django_cheatsheet.png" alt="" /></figure><h2>Виртуальное окружение Python</h2><p>Эта шпаргалка собрала популярные инструменты для создания и работы с изолированными средами, а также команды по установке данных инструментов и активации виртуального окружения:</p><figure><img src="https://media.tproger.ru/uploads/2020/11/puthon_virtual_environments__cheat_sheet.jpg" alt="" /></figure>]]></content:encoded>
    </item>
    <item>
      <title>Шпаргалка по OpenCV — Python</title>
      <link>https://tproger.ru/translations/opencv-python-guide</link>
      <comments>https://tproger.ru/translations/opencv-python-guide?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/opencv-python-guide</guid>
      <description><![CDATA[<p>Краткая шпаргалка по OpenCV на Python с примерами кода: чтение и вывод изображений, обрезка, поворот, изменение размера, размытие, рисование, наложение текста, распознавание лиц и контуров.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/opencv-python-guide">Шпаргалка по OpenCV — Python</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Компьютерное зрение]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 03 May 2019 08:06:01 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Что такое OpenCV?</h2><p>Библиотека компьютерного зрения и машинного обучения с открытым исходным кодом. В неё входят более 2500 алгоритмов, в которых есть как классические, так и современные алгоритмы для компьютерного зрения и машинного обучения. Эта библиотека имеет интерфейсы на различных языках, среди которых есть Python (в этой статье используем его), Java, C++ и Matlab.</p><p>В этой шпаргалке собраны основные операции OpenCV на Python с готовыми примерами кода: от чтения и вывода изображений до распознавания лиц и контуров объектов. Каждый блок можно скопировать и сразу использовать в своём проекте.</p><h2>Содержание</h2><ol><li><a href="https://tproger.ru/#install">Установка</a>.</li><li><a href="https://tproger.ru/#import">Импорт и просмотр изображения</a>.</li><li><a href="https://tproger.ru/#crop">Обрезка</a>.</li><li><a href="https://tproger.ru/#size">Изменение размера</a>.</li><li><a href="https://tproger.ru/#rotate">Поворот</a>.</li><li><a href="https://tproger.ru/#grey">Градация серого и порог</a>.</li><li><a href="https://tproger.ru/#antialiasing">Размытие/сглаживание</a>.</li><li><a href="https://tproger.ru/#rectangle">Рисование прямоугольников</a>.</li><li><a href="https://tproger.ru/#lines">Рисование линий</a>.</li><li><a href="https://tproger.ru/#text">Текст на изображении</a>.</li><li><a href="https://tproger.ru/#faces">Распознавание лиц</a>.</li><li><a href="https://tproger.ru/#contours">Contours — распознавание объектов</a>.</li><li><a href="https://tproger.ru/#save">Сохранение изображения</a>.</li></ol><h2>Импорт и просмотр изображения</h2><p>Примечание При чтении способом выше изображение находится в цветовом пространстве не RGB (как все привыкли), а BGR. Возможно, в начале это не так важно, но как только вы начнёте работать с цветом — стоит знать об этой особенности. Есть 2 пути решения:</p><ol><li>Поменять местами 1-й канал (R — красный) с 3-м каналом (B — синий), и тогда красный цвет будет (0,0,255), а не (255,0,0).</li><li>Поменять цветовое пространство на RGB:rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)И тогда в коде работать уже не с image, а с rgb_image.</li></ol><p>Примечание Чтобы закрыть окно, в котором отображается изображение, нажмите любую клавишу. Если использовать кнопку закрытия окна, можно наткнуться на подвисания.</p><p>На протяжении статьи для вывода изображений будет использоваться следующий код:</p><h2>Кадрирование</h2><figure><img src="https://media.tproger.ru/uploads/2019/04/1_JOqAtM92uNHBxJ9uRAyKtg.jpeg" alt="Исходное изображение для кадрирования" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/04/1_UuTiqdGQFfvA78djIPwVYA.jpeg" alt="Результат кадрирования изображения" /></figure><p>Где image[10:500, 500:2000] — это image[y:y + высота, x:x + ширина].</p><h2>Изменение размера</h2><figure><img src="https://media.tproger.ru/uploads/2019/04/1_AJjT80DpN93YUWTUkOBOJQ.jpeg" alt="Исходное изображение до изменения размера" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/04/1_YJzoBwWOtJhkksl3Mpv61w.jpeg" alt="Результат уменьшения изображения" /></figure><p>Эта функция учитывает соотношение сторон оригинального изображения. Другие функции изменения размера изображений можно увидеть <a href="https://www.tutorialkart.com/opencv/python/opencv-python-resize-image/">здесь</a>.</p><h2>Поворот</h2><figure><img src="https://media.tproger.ru/uploads/2019/04/1_SVkI8I5XHs18gfS3jrL4Cw.jpeg" alt="Исходное изображение до поворота" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/04/1_j2pCsTfv_bF1ZAys8IQTLA.jpeg" alt="Результат поворота изображения на 180 градусов" /></figure><p>image.shape возвращает высоту, ширину и каналы. M — матрица поворота — поворачивает изображение на 180 градусов вокруг центра. -ve — это угол поворота изображения по часовой стрелке, а +ve, соответственно, против часовой.</p><h2>Перевод в градации серого и в чёрно-белое изображение по порогу</h2><figure><img src="https://media.tproger.ru/uploads/2019/04/1_TRn-JK8tlKBCUSgkooKVpg.jpeg" alt="Исходное цветное изображение" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/04/1_lVHmCqfGqT0Fx5DIJnaRzQ.jpeg" alt="Изображение в градациях серого" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/04/1_4p1SghdBZucSg5R2dZvn1Q.jpeg" alt="Чёрно-белое изображение по порогу" /></figure><p>gray_image — это одноканальная версия изображения.</p><p>Функция threshold возвращает изображение, в котором все пиксели, которые темнее (меньше) 127 заменены на 0, а все, которые ярче (больше) 127, — на 255.</p><p>Для ясности другой пример:</p><p>Здесь всё, что темнее, чем 150, заменяется на 10, а всё, что ярче, — на 200.</p><p>Остальные threshold-функции описаны <a href="https://docs.opencv.org/3.4/d7/d4d/tutorial_py_thresholding.html">здесь</a>.</p><h2>Размытие/сглаживание</h2><figure><img src="https://media.tproger.ru/uploads/2019/04/1_Rny9ak-Taj58otF4ao9uFA.jpeg" alt="Исходное изображение до размытия" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/04/1_WhEeegXBhcAllIRDN4TTvA.jpeg" alt="Результат размытия по Гауссу" /></figure><p>Функция GaussianBlur (размытие по Гауссу) принимает 3 параметра:</p><ol><li>Исходное изображение.</li><li>Кортеж из 2 положительных нечётных чисел. Чем больше числа, тем больше сила сглаживания.</li><li>sigmaX и sigmaY. Если эти параметры оставить равными 0, то их значение будет рассчитано автоматически.</li></ol><p>Больше про размытие <a href="https://docs.opencv.org/3.1.0/d4/d13/tutorial_py_filtering.html">здесь</a>.</p><h2>Рисование прямоугольников</h2><figure><img src="https://media.tproger.ru/uploads/2019/04/1_rr0RN5b8cxseYUwABRdlKw.jpeg" alt="Исходное изображение для рисования прямоугольника" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/04/1_uMd8BQyqdDhpH-gR8F3tbg.jpeg" alt="Изображение с нарисованным прямоугольником" /></figure><p>Эта функция принимает 5 параметров:</p><ol><li>Само изображение.</li><li>Координата верхнего левого угла (x1, y1).</li><li>Координата нижнего правого угла (x2, y2).</li><li>Цвет прямоугольника (GBR/RGB в зависимости от выбранной цветовой модели).</li><li>Толщина линии прямоугольника.</li></ol><h2>Рисование линий</h2><figure><img src="https://media.tproger.ru/uploads/2019/04/1_NdAq3JTqU8nLZWjbaGfjPg.jpeg" alt="Исходное изображение для рисования линии" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/04/1_H1r2tUmUN3V15ps5ynwJHQ.jpeg" alt="Изображение с нарисованной линией" /></figure><p>Функция line принимает 5 параметров:</p><ol><li>Само изображение, на котором рисуется линия.</li><li>Координата первой точки (x1, y1).</li><li>Координата второй точки (x2, y2).</li><li>Цвет линии (GBR/RGB в зависимости от выбранной цветовой модели).</li><li>Толщина линии.</li></ol><h2>Текст на изображении</h2><figure><img src="https://media.tproger.ru/uploads/2019/04/1_crsVfLMtv1SNBMlqXyFfYg.jpeg" alt="Исходное изображение для добавления текста" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/04/1_lTizoTFVbhkx2PdDVEi9WQ.jpeg" alt="Изображение с наложенным текстом" /></figure><p>Функция putText принимает 7 параметров:</p><ol><li>Непосредственно изображение.</li><li>Текст для изображения.</li><li>Координата нижнего левого угла начала текста (x, y).</li><li>Используемый шрифт.</li><li>Размер шрифта.</li><li>Цвет текста (GBR/RGB в зависимости от выбранной цветовой модели).</li><li>Толщина линий букв.</li></ol><h2>Распознавание лиц</h2><p>На этот раз без пёсиков.</p><figure><img src="https://media.tproger.ru/uploads/2019/04/1_nevvkOrzz97jJ3cB8PiQiQ.jpeg" alt="Фотография с людьми для распознавания лиц" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/04/1_IUvY3sxQ_j7qErv8Wr1xtg.jpeg" alt="Результат распознавания лиц на фотографии" /></figure><p>detectMultiScale — общая функция для распознавания как лиц, так и объектов. Чтобы функция искала именно лица, мы передаём ей соответствующий каскад.</p><p>Функция detectMultiScale принимает 4 параметра:</p><ol><li>Обрабатываемое изображение в градации серого.</li><li>Параметр scaleFactor. Некоторые лица могут быть больше других, поскольку находятся ближе, чем остальные. Этот параметр компенсирует перспективу.</li><li>Алгоритм распознавания использует скользящее окно во время распознавания объектов. Параметр minNeighbors определяет количество объектов вокруг лица. То есть чем больше значение этого параметра, тем больше аналогичных объектов необходимо алгоритму, чтобы он определил текущий объект, как лицо. Слишком маленькое значение увеличит количество ложных срабатываний, а слишком большое сделает алгоритм более требовательным.</li><li>minSize — непосредственно размер этих областей.</li></ol><h2>Contours — распознавание объектов</h2><p>Распознавание объектов производится с помощью цветовой <a href="https://www.fritz.ai/features/image-segmentation.html">сегментации изображения</a>. Для этого есть две функции: cv2.findContours и cv2.drawContours.</p><p>В <a href="https://towardsdatascience.com/object-detection-via-color-based-image-segmentation-using-python-e9b7c72f0e11">этой статье</a> детально описано обнаружение объектов с помощью цветовой сегментации. Всё, что вам нужно для неё, находится там.</p><h2>Сохранение изображения</h2><h2>Заключение</h2><p>OpenCV — отличная библиотека с лёгкими алгоритмами, которые могут использоваться в 3D-рендере, продвинутом редактировании изображений и видео, отслеживании и идентификации объектов и людей на видео, поиске идентичных изображений из набора и для много-много чего ещё.</p><p>Эта библиотека очень важна для тех, кто разрабатывает проекты, связанные с машинным обучением в области изображений.</p><h2>Часто задаваемые вопросы</h2><p><b>Что такое OpenCV и для чего она используется?</b></p><p>OpenCV (Open Source Computer Vision Library) — это библиотека компьютерного зрения с открытым исходным кодом, содержащая более 2500 алгоритмов. Она используется для обработки изображений, распознавания лиц и объектов, работы с видеопотоком, 3D-рендеринга и задач машинного обучения.</p><p><b>Как установить OpenCV для Python?</b></p><p>Установить OpenCV можно через pip командой pip install opencv-python. Для расширенной версии с дополнительными модулями используйте pip install opencv-contrib-python.</p><p><b>Почему OpenCV читает изображения в BGR, а не в RGB?</b></p><p>Это связано с историческими причинами: формат BGR был популярен на ранних этапах развития библиотеки. Для преобразования в привычный RGB используйте функцию cv2.cvtColor(image, cv2.COLOR_BGR2RGB).</p><p><b>Какие основные операции с изображениями поддерживает OpenCV?</b></p><p>OpenCV поддерживает чтение, запись, кадрирование, изменение размера, поворот, перевод в градации серого, размытие, рисование графических примитивов (прямоугольники, линии), наложение текста, распознавание лиц и контуров объектов.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 команд Docker, которые должен знать каждый разработчик</title>
      <link>https://tproger.ru/translations/top-10-docker-commands</link>
      <comments>https://tproger.ru/translations/top-10-docker-commands?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/top-10-docker-commands</guid>
      <description><![CDATA[<p>Разбираем 10 команд Docker, которые нужны каждому разработчику: docker ps, pull, build, run, logs, volume, rm, rmi, stop и комбинации для очистки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/top-10-docker-commands">10 команд Docker, которые должен знать каждый разработчик</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 15 Nov 2018 15:26:56 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Ключевые выводы:</b> 10 команд Docker, которые покрывают основные сценарии работы: просмотр контейнеров, скачивание образов, сборка и запуск, логи, тома, удаление и остановка. Плюс комбинации для полной очистки окружения.</p><h2>Что такое образы и контейнеры Docker</h2><p>Docker — отличный инструмент для создания микросервисов, который позволяет создавать облачные приложения и системы. Чтобы выжать из него максимум через терминал, вам пригодятся 10 команд, перечисленных ниже.</p><p>Контейнер запускается путём запуска образа. Образ — исполняемый пакет, который содержит всё необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные среды и конфигурационные файлы.Контейнер создаётся из образа. Это то, чем становится образ во время исполнения (иными словами, образом с состоянием или пользовательским процессом). Вы можете просмотреть список запущенных контейнеров с помощью команды docker ps, прямо как в Linux.</p><p><a href="https://docs.docker.com/get-started/#docker-concepts"><em>Docker Concepts</em></a></p><h2>10 основных команд Docker</h2><h3>1. docker ps — список контейнеров</h3><p>Показывает список запущенных контейнеров. Некоторые из полезных флагов:</p><ul><li>-a / --all — список всех контейнеров (по умолчанию показывает только запущенные)</li><li>-q / --quiet — перечислить только id контейнеров (полезно, когда вам нужны все контейнеры)</li></ul><h3>2. docker pull — скачивание образов</h3><p>Большинство образов создаётся на основе базового образа из Docker Hub. Docker Hub содержит множество готовых образов, которые можно использовать вместо того, чтобы создавать и настраивать свой собственный. Чтобы скачать определённый образ или набор образов (репозиторий), используйте команду docker pull.</p><h3>3. docker build — сборка образа</h3><p>Эта команда собирает образ Docker из Dockerfile и «контекста». Контекст сборки — это набор файлов, расположенных по определённому пути или URL. Используйте флаг -t, чтобы задать имя образу. Например, команда docker build -t my_container . соберёт образ, используя текущую директорию, на что указывает точка в конце.</p><h3>4. docker run — запуск контейнера</h3><p>Запускает контейнер на основе указанного образа. Эту команду можно дополнять другими, например, docker run my_image -it bash запустит контейнер, а затем запустит в нём bash.</p><h3>5. docker logs — просмотр логов</h3><p>Эта команда используется для просмотра логов указанного контейнера. Можно использовать флаг --follow, чтобы следить за логами работающей программы: docker logs --follow my_container.</p><h3>6. docker volume ls — тома</h3><p>Показывает список томов, которые являются предпочитаемым механизмом для сохранения данных, генерируемых и используемых контейнерами Docker.</p><h3>7. docker rm — удаление контейнеров</h3><p>Удаляет один и более контейнеров, например, docker rm my_container.</p><h3>8. docker rmi — удаление образов</h3><p>Удаляет один и более образов, например, docker rmi my_image.</p><h3>9. docker stop — остановка контейнеров</h3><p>Останавливает один и более контейнеров. Команда docker stop my_container остановит один контейнер, а docker stop $(docker ps -a -q) — все запущенные. Более грубый способ — использовать docker kill my_container, который не пытается сначала аккуратно завершить процесс.</p><h2>Комбинации команд для очистки</h2><p>Можно комбинировать эти команды. Например, для очистки всех контейнеров и образов:</p><ol><li>Останавливаем все запущенные контейнеры — docker kill $(docker ps -q)</li><li>Удаляем все остановленные контейнеры — docker rm $(docker ps -a -q)</li><li>Удаляем все образы — docker rmi $(docker images -q)</li></ol><p>Существует гораздо больше команд для Docker, о которых можно почитать в <a href="https://docs.docker.com/engine/reference/commandline/docker/">документации</a>. Пробуйте новые примеры, комбинируйте их, и скоро это войдёт в привычку.</p><p>Смотрите также: <a href="https://tproger.ru/translations/how-to-start-using-docker/">Как начать использовать Docker в своих проектах</a></p><h2>Часто задаваемые вопросы</h2><h3>Чем отличается docker stop от docker kill?</h3><p>docker stop отправляет сигнал SIGTERM и даёт процессу время на корректное завершение (graceful shutdown). docker kill отправляет SIGKILL и принудительно завершает процесс без ожидания. Используйте stop в продакшене, kill — когда контейнер завис.</p><h3>Как удалить все неиспользуемые ресурсы Docker?</h3><p>Команда docker system prune удаляет все остановленные контейнеры, неиспользуемые сети, образы без тегов и кэш сборки. Добавьте флаг -a, чтобы удалить ещё и образы, не связанные ни с одним контейнером.</p><h3>Нужно ли учить все команды Docker?</h3><p>Нет, достаточно освоить 10–15 базовых команд, перечисленных в этой статье. Остальные можно находить по мере необходимости в <a href="https://docs.docker.com/engine/reference/commandline/docker/">официальной документации</a> или через docker --help.</p>]]></content:encoded>
    </item>
    <item>
      <title>15 полезных команд PostgreSQL</title>
      <link>https://tproger.ru/translations/useful-postgresql-commands</link>
      <comments>https://tproger.ru/translations/useful-postgresql-commands?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/useful-postgresql-commands</guid>
      <description><![CDATA[<p>Подборка продвинутых PostgreSQL-команд с примерами: размер базы, удаление дубликатов, поиск пропусков, транзакции, управление запросами и конфигурацией СУБД.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/useful-postgresql-commands">15 полезных команд PostgreSQL</a>»</p>]]></description>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 01 Sep 2017 17:57:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>В сети много руководств по PostgreSQL, которые описывают основные команды. Но при погружении глубже в работу возникают такие практические вопросы, для которых требуются продвинутые команды.</p><p>Такие команды, или <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BD%D0%B8%D0%BF%D0%BF%D0%B5%D1%82">сниппеты</a>, редко описаны в документации. Рассмотрим несколько на примерах, полезных как для разработчиков, так и для администраторов баз данных. Эта статья — часть нашего <a href="https://tproger.ru/articles/sql--polnyj-putevoditel---ot-pervyh-zaprosov-do-okonnyh-funkcij">полного путеводителя по SQL</a>.</p><p><b>Кратко:</b> В этой статье — 15 практических команд PostgreSQL, сгруппированных по задачам: получение информации о базе данных (размер, таблицы, пользователи), работа с данными (удаление дубликатов, изменение типов, поиск пропусков) и управление конфигурацией СУБД (расположение кластера, типы данных, применение настроек без перезагрузки).</p><h2>Получение информации о базе данных</h2><h3>Размер базы данных</h3><p>Чтобы получить физический размер файлов (хранилища) базы данных, используем следующий запрос:</p><p>Результат будет представлен как число вида 41809016.</p><p>current_database() — функция, которая возвращает имя текущей базы данных. Вместо неё можно ввести имя текстом:</p><p>Для того, чтобы получить информацию в человекочитаемом виде, используем функцию pg_size_pretty:</p><p>В результате получим информацию вида 40 Mb.</p><h3>Перечень таблиц</h3><p>Иногда требуется получить перечень таблиц базы данных. Для этого используем следующий запрос:</p><p>information_schema — стандартная схема базы данных, которая содержит коллекции представлений (views), таких как таблицы, поля и т.д. Представления таблиц содержат информацию обо всех таблицах баз данных.</p><p>Запрос, описанный ниже, выберет все таблицы из указанной схемы текущей базы данных:</p><p>В последнем условии IN можно указать имя определенной схемы.</p><h3>Размер таблицы</h3><p>По аналогии с получением размера базы данных размер данных таблицы можно вычислить с помощью соответствующей функции:</p><p>Функция pg_relation_size возвращает объём, который занимает на диске указанный слой заданной таблицы или индекса.</p><h3>Имя самой большой таблицы</h3><p>Для того, чтобы вывести список таблиц текущей базы данных, отсортированный по размеру таблицы, выполним следующий запрос:</p><p>Для того, чтобы вывести информацию о самой большой таблице, ограничим запрос с помощью LIMIT:</p><p>relname — имя таблицы, индекса, представления и т.п.<br />relpages — размер представления этой таблицы на диске в количествах страниц (по умолчанию одна страницы равна 8 Кб).<br />pg_class — системная таблица, которая содержит информацию о связях таблиц базы данных.</p><h3>Перечень подключенных пользователей</h3><p>Чтобы узнать имя, IP и используемый порт подключенных пользователей, выполним следующий запрос:</p><h3>Активность пользователя</h3><p>Чтобы узнать активность соединения конкретного пользователя, используем следующий запрос:</p><h2>Работа с данными и полями таблиц</h2><h3>Удаление одинаковых строк</h3><p>Если так получилось, что в таблице нет первичного ключа (primary key), то наверняка среди записей найдутся дубликаты. Если для такой таблицы, особенно большого размера, необходимо поставить ограничения (constraint) для проверки целостности, то удалим следующие элементы:</p><ul><li>дублирующиеся строки,</li><li>ситуации, когда одна или более колонок дублируются (если эти колонки предполагается использовать в качестве первичного ключа).</li></ul><p>Рассмотрим таблицу с данными покупателей, где задублирована целая строка (вторая по счёту).</p><figure><img src="https://media.tproger.ru/uploads/2017/08/postgre_01.png" alt="Таблица с дублирующимися строками в PostgreSQL" /></figure><p>Удалить все дубликаты поможет следующий запрос:</p><p>Уникальное для каждой записи поле ctid по умолчанию скрыто, но оно есть в каждой таблице.</p><p>Последний запрос требователен к ресурсам, поэтому будьте аккуратны при его выполнении на рабочем проекте.</p><p>Теперь рассмотрим случай, когда повторяются значения полей.</p><figure><img src="https://media.tproger.ru/uploads/2017/08/postgre_02.png" alt="Таблица с повторяющимися значениями полей в PostgreSQL" /></figure><p>Если допустимо удаление дубликатов без сохранения всех данных, выполним такой запрос:</p><p>Если данные важны, то сначала нужно найти записи с дубликатами:</p><figure><img src="https://media.tproger.ru/uploads/2017/08/postgre_03.png" alt="Результат поиска дубликатов в PostgreSQL" /></figure><p>Перед удалением такие записи можно перенести во временную таблицу или заменить в них значение customer_id на другое.</p><p>Общая форма запроса на удаление описанных выше записей выглядит следующим образом:</p><h3>Безопасное изменение типа поля</h3><p>Может возникнуть вопрос о включении в этот список такой задачи. Ведь в PostgreSQL изменить тип поля очень просто с помощью команды ALTER. Давайте для примера снова рассмотрим таблицу с покупателями.</p><p>Для поля customer_id используется строковый тип данных varchar. Это ошибка, так как в этом поле предполагается хранить идентификаторы покупателей, которые имеют целочисленный формат integer. Использование varchar неоправданно. Попробуем исправить это недоразумение с помощью команды ALTER:</p><p>Но в результате выполнения получим ошибку: Для оптимизации запросов — <a href="https://tproger.ru/articles/indeksy-v-postgresql">разбор индексов PostgreSQL</a>.</p><p>Это значит, что нельзя просто так взять и изменить тип поля при наличии данных в таблице. Так как использовался тип varchar, СУБД не может определить принадлежность значения к integer. Хотя данные соответствуют именно этому типу. Для того, чтобы уточнить этот момент, в сообщении об ошибке предлагается использовать выражение USING, чтобы корректно преобразовать наши данные в integer:</p><p>В результате всё прошло без ошибок:</p><figure><img src="https://media.tproger.ru/uploads/2017/08/postgre_04.png" alt="Успешное изменение типа поля в PostgreSQL" /></figure><p>Обратите внимание, что при использовании USING кроме конкретного выражения возможно использование функций, других полей и операторов.</p><p>Например, преобразуем поле customer_id обратно в varchar, но с преобразованием формата данных:</p><p>В результате таблица примет следующий вид:</p><figure><img src="https://media.tproger.ru/uploads/2017/08/postgre_05.png" alt="Результат преобразования типа поля с USING в PostgreSQL" /></figure><h3>Поиск «потерянных» значений</h3><p>Будьте внимательны при использовании последовательностей (sequence) в качестве первичного ключа (primary key): при назначении некоторые элементы последовательности случайно пропускаются, в результате работы с таблицей некоторые записи удаляются. Такие значения можно использовать снова, но найти их в больших таблицах сложно.</p><figure><img src="https://media.tproger.ru/uploads/2017/08/postgre_06.png" alt="Таблица с пропущенными значениями последовательности в PostgreSQL" /></figure><p>Рассмотрим два варианта поиска.</p><p>Первый способ<br />Выполним следующий запрос, чтобы найти начало интервала с «потерянным» значением:</p><p>В результате получим значения: 5, 9 и 11.</p><p>Если нужно найти не только первое вхождение, а все пропущенные значения, используем следующий (ресурсоёмкий!) запрос:</p><p>В результате видим следующий результат: 5, 9 и 6.</p><p>Второй способ<br />Получаем имя последовательности, связанной с customer_id:</p><p>И находим все пропущенные идентификаторы:</p><h3>Подсчёт количества строк в таблице</h3><p>Количество строк вычисляется стандартной функцией count, но её можно использовать с дополнительными условиями.</p><p>Общее количество строк в таблице:</p><p>Количество строк при условии, что указанное поле не содержит NULL:</p><p>Количество уникальных строк по указанному полю:</p><h3>Использование транзакций</h3><p>Транзакция объединяет последовательность действий в одну операцию. Её особенность в том, что при ошибке в выполнении транзакции ни один из результатов действий не сохранится в базе данных.</p><p>Начнём транзакцию с помощью команды BEGIN.</p><p>Для того, чтобы откатить все операции, расположенные после BEGIN, используем команду ROLLBACK.</p><p>А чтобы применить — команду COMMIT.</p><h3>Просмотр и завершение исполняемых запросов</h3><p>Для того, чтобы получить информацию о запросах, выполним следующую команду:</p><p>Для того, чтобы остановить конкретный запрос, выполним следующую команду, с указанием id процесса (pid):</p><p>Для того, чтобы прекратить работу запроса, выполним:</p><h2>Работа с конфигурацией</h2><h3>Поиск и изменение расположения экземпляра кластера</h3><p>Возможна ситуация, когда на одной операционной системе настроено несколько экземпляров PostgreSQL, которые «сидят» на различных портах. В этом случае поиск пути к физическому размещению каждого экземпляра — достаточно нервная задача. Для того, чтобы получить эту информацию, выполним следующий запрос для любой базы данных интересующего кластера:</p><p>Изменим расположение на другое с помощью команды:</p><p>Но для того, чтобы изменения вступили в силу, требуется перезагрузка.</p><h3>Получение перечня доступных типов данных</h3><p>Получим перечень доступных типов данных с помощью команды:</p><p>typname — имя типа данных.<br />typlen — размер типа данных.</p><h3>Изменение настроек СУБД без перезагрузки</h3><p>Настройки PostgreSQL находятся в специальных файлах вроде postgresql.conf и pg_hba.conf. После изменения этих файлов нужно, чтобы СУБД снова получила настройки. Для этого производится перезагрузка сервера баз данных. Понятно, что приходится это делать, но на продакшн-версии проекта, которым пользуются тысячи пользователей, это очень нежелательно. Поэтому в PostgreSQL есть функция, с помощью которой можно применить изменения без перезагрузки сервера:</p><p>Но, к сожалению, она применима не ко всем параметрам. В некоторых случаях для применения настроек перезагрузка обязательна.</p><p>Мы рассмотрели команды, которые помогут упростить работу разработчикам и администраторам баз данных, использующим PostgreSQL. Но это далеко не все возможные приёмы. Если вы сталкивались с интересными задачами, напишите о них в комментариях. Поделимся полезным опытом!</p><h2>Часто задаваемые вопросы</h2><h3>Как быстро узнать размер всех баз данных на сервере PostgreSQL?</h3><p>Выполните запрос SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database ORDER BY pg_database_size(datname) DESC; — он выведет список всех баз с их размерами в человекочитаемом формате.</p><h3>Как безопасно удалить дубликаты в большой таблице без блокировки?</h3><p>Для больших таблиц рекомендуется удалять дубликаты пакетами с помощью DELETE ... WHERE ctid IN (SELECT ctid ... LIMIT 1000) в цикле внутри транзакции. Это позволяет избежать длительной блокировки таблицы и чрезмерного использования памяти.</p><h3>Чем отличается pg_cancel_backend от pg_terminate_backend?</h3><p>Функция pg_cancel_backend отменяет текущий запрос процесса, но сохраняет само соединение активным. Функция pg_terminate_backend полностью завершает серверный процесс и разрывает соединение. Начинайте с cancel и используйте terminate только если отмена не помогла. Чем PostgreSQL отличается от MySQL и SQLite — <a href="https://tproger.ru/translations/sqlite-mysql-postgresql-comparison">сравнение трёх СУБД</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как отправлять электронную почту в веб-приложении на Django</title>
      <link>https://tproger.ru/translations/email-functionality-django</link>
      <comments>https://tproger.ru/translations/email-functionality-django?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Богдан Федоренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/email-functionality-django</guid>
      <description><![CDATA[<p>Django-приложение принимает адрес электронной почты пользователя и отправляет приветственное письмо; для настройки рассылки в проекте используется Gmail.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/email-functionality-django">Как отправлять электронную почту в веб-приложении на Django</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 03 Jun 2017 19:25:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает yasoob008</p><p>Недавно у меня появилась необходимость создать приложение на Django, которое бы позволило пользователям оставлять адреса своей электронной почты и получать приветственное письмо в ответ. Проект получилось реализовать за несколько часов, большая часть времени ушла на тестирование пользовательского интерфейса. В этой статье я покажу, как сделать такое простое приложение на Django.</p><p>В этом руководстве мы будем использовать Gmail.</p><h3>Создание проекта</h3><p>Для начала создадим проект Django. Введем следующую команду в терминале:</p><p>Теперь переместимся в папку с новым проектом:</p><h3>Создание нового приложения</h3><p>Теперь нам необходимо создать новое приложение. Запустим следующую команду, которая создаст папку send_email с несколькими файлами внутри нашего проекта:</p><h3>Изменение настроек проекта</h3><p>Теперь немного изменим настройки проекта. Мы добавим наше приложение и всю информацию, связанную с рассылкой писем в файл settings.py. Добавим следующие данные:</p><p>В разделе файла INSTALLED_APPS необходимо добавить следующую строку в список:</p><p>Теперь наш файл настроек должен содержать следующий список:</p><p>Также добавим туда следующий код:</p><h3>Создание URL</h3><p>Изменим файл urls.py в папке gci_email:</p><p>Теперь создадим файл urls.py в папке send_email и добавим туда следующий код:</p><h3>Добавление файлов отображения</h3><p>Нам необходимо изменить файл views.py в папке send_email:</p><h3>Добавление шаблонов</h3><p>Теперь нам необходимо создать папку templates внутри send_email, а в ней 2 файла: index.html и success.html.</p><p>В файле index.html надо создать форму для ввода почты. Файл success.html не должен содержать ничего особого.</p><p>Вот и всё. Теперь мы можем создать миграции, затем применить их и запустить проект:</p><p>Исходный код можно посмотреть на <a href="https://github.com/yasoob/email_django">странице автора на GitHub</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Хитрые приёмы на Python</title>
      <link>https://tproger.ru/translations/nifty-python-tricks</link>
      <comments>https://tproger.ru/translations/nifty-python-tricks?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/nifty-python-tricks</guid>
      <description><![CDATA[<p>Приёмы с enumerate, абстракциями словарей и множеств, делением с плавающей запятой и простым сервером сокращают код на Python.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/nifty-python-tricks">Хитрые приёмы на Python</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 22 May 2017 08:22:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой статье собраны удобные приёмы, которые вполне могут упростить жизнь всем Python-программистам. Итак, не будем терять времени.</p><h2>Перечисление</h2><p>Вместо этого:</p><p>Можно сделать так:</p><p>В enumerate можно передавать и второй аргумент. Вот пример:</p><h2>Абстракция словарей/множеств</h2><p>С <a href="https://tproger.ru/translations/implementing-zip-list-comprehensions/">абстракциями списков</a> (list comprehension) вы скорее всего сталкивались, но вот с абстракциями словарей/множеств (dict/set comprehension) — вряд ли. Они просты в использовании и так же эффективны. Вот пример:</p><h2>Деление с плавающей запятой</h2><p>При делении целых чисел в Python результат будет целым, даже если на самом деле он был дробным. Чтобы получить корректный ответ, приходится делать что-то подобное:</p><p>Но у этой проблемы есть и другое решение:</p><p>Вуаля! И не нужно дописывать .0. Стоит отметить, что этот приём относится только к Python 2 — в третьей версии языка всё работает как нужно по умолчанию.</p><h2>Простой сервер</h2><p>Если нужно быстро и легко расшарить файлы из директории, то вот простой способ:</p><p>Эта команда запустит сервер.</p><h2>Вычисление выражений Python</h2><p>Вы наверняка знакомы с eval, но знаете ли вы о literal_eval? Вряд ли. Для безопасного исполнения выражений, содержащих исключительно литералы, вы можете делать так:</p><p>А не так:</p><p>Между прочим, эта фича находится в языке уже давно.</p><h2>Профилирование скрипта</h2><p>Вы можете с лёгкостью профилировать скрипт, запустив его следующей командой:</p><h2>Интроспекция объектов</h2><p>Вы можете изучать объекты Python при помощи команды dir(). Простой пример:</p><h2>Отладочные скрипты</h2><p>Вы можете задавать точки останова (breakpoint) при помощи модуля pdb:</p><p>Чтобы задать точку останова в любом месте скрипта, напишите там команду pdb.set_trace(). В pdb есть ещё несколько интересных штучек, описанных в <a href="https://docs.python.org/3/library/pdb.html">документации</a>.</p><h2>Упрощение конструкций с if</h2><p>Если вам нужно проверить несколько значений, сделайте так:</p><p>А не так:</p><h2>Разворачивание списка/строки</h2><p>Быстро развернуть список можно следующим образом:</p><p>То же самое можно сделать и со строкой:</p><h2>Красивый вывод</h2><p>Вы можете красиво выводить на экран словари и списки вот так:</p><p>Нагляднее это, конечно, при работе со словарями. Кроме того, так же можно выводить информацию из JSON-файлов:</p><h2>Тернарный оператор</h2><p>Тернарный оператор — это сокращённая форма записи условного выражения if-else. Вот пример использования:</p><p>Если вы знаете другие полезные приёмы, делитесь ими в комментариях!</p>]]></content:encoded>
    </item>
    <item>
      <title>Сохраните своё время, избегая повторного написания этих популярных JavaScript-функций</title>
      <link>https://tproger.ru/translations/js-avoid-rewriting</link>
      <comments>https://tproger.ru/translations/js-avoid-rewriting?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Богдан Федоренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/js-avoid-rewriting</guid>
      <description><![CDATA[<p>Библиотеки Underscore и Lodash содержат готовые функции для случайных элементов, объединения и пересечения массивов, сокращая собственный код.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/js-avoid-rewriting">Сохраните своё время, избегая повторного написания этих популярных JavaScript-функций</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 20 May 2017 23:19:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Флавио Фрейтас</p><p>Разработка — это интересный процесс. Но, увлёкшись, мы не всегда выбираем оптимальные решения. Например, когда реализуем функционал, который уже реализован (это называется «изобретать велосипед»). Я хочу познакомить вас с некоторыми функциями, которые многие часто пытаются реализовать самостоятельно, хотя есть путь проще.</p><p>Некоторое время назад я начал использовать библиотеки (иногда одну, иногда другую, поскольку они выполняют, в общем-то, одинаковые задачи), в которых реализованы многие функции, используемые регулярно. Эти библиотеки — <a href="http://underscorejs.org/">Underscore</a> и <a href="https://lodash.com/">Lodash</a>. Они эффективные и легковесные (~19 КБ).</p><p>Список, приведённый ниже, основан на моём опыте работы в проектах. Я описал здесь наиболее распространенные функции, которые вы наверняка использовали раньше.</p><h3>1. Получить случайный элемент из списка</h3><p>Это функция, которую я люблю больше всего. С её помощью очень просто заполнить базу данных случайными значениями, что часто бывает необходимо для тестирования.</p><h3>2. Объединение массивов</h3><p>Это хороший пример того, как вы можете сократить ваш код и сделать его более читаемым:</p><h3>3. Пересечение массивов</h3><p>Другой пример того, как избавиться от кучи кода:</p><h3>4. Избежание итерирования объектов через их свойства</h3><p>Получение ключей:</p><p>Получение значений:</p><h3>5. Расширение объектов</h3><p>Довольно часто необходимо скопировать аргументы одного объекта в другой. Решение этой задачи довольно громоздкое:</p><h3>6. Цикл в N итераций</h3><p>Мы часто итерируем по массиву или объекту N раз:</p><h3>7. Наличие элемента</h3><p>Функция уже доступна в <a href="https://medium.com/@flaviohfreitas/es7-a-simple-and-useful-guide-to-master-it-6aba54abb4df">ES7</a>, но пример пригодится тем, кто ещё не использует эту версию JavaScript:</p><h3>8. Удаление атрибутов из объекта</h3><h3>9. Псевдослучайное число из диапазона</h3><p>Прощайте, длинные функции для получения псевдослучайного числа из диапазона:</p><h3>10. Соотношения (map) для вложенных атрибутов</h3><p>Простой способ итерироваться по массиву для возвращения определённого атрибута объекта. Пример на Lodash и Underscore выглядит примерно одинаково:</p><h3>11. Примеси (mixins)</h3><p>А если после знакомства с функциями Lodash и Underscore вы понимаете, что вам их не хватает, то ваш ответ — примеси. С их помощью вы можете создать собственные функции и расширить функционал библиотеки.</p><p>Простой пример:</p><p>БОНУС: Примесь, которую я часто использую в своем коде для получения вложенных атрибутов объекта, не опасаясь, что какое-то значение будет null:</p>]]></content:encoded>
    </item>
    <item>
      <title>Как отсюда выйти: шпаргалка по Vim</title>
      <link>https://tproger.ru/translations/vim-for-beginners</link>
      <comments>https://tproger.ru/translations/vim-for-beginners?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/vim-for-beginners</guid>
      <description><![CDATA[<p>Знакомство с текстовым редактором Vim, который установлен по умолчанию в большинстве дистрибутивов Linux и в macOS, и способ корректно его закрыть.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/vim-for-beginners">Как отсюда выйти: шпаргалка по Vim</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 17 Apr 2017 15:15:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вы собираетесь создать файл crontab и внезапно оказываетесь в этом странном редакторе по умолчанию. В том, в котором всё никак не разберётесь.</p><p>ESC? Ничего не произошло. CTRL + C? Нет. ESC ESC ESC? Неа. Вы в тупике.</p><p>Ну вот, опять. Склонив голову от стыда, вы запускаете очередной терминал, чтобы исполнить команду killall vim и продолжить заниматься своими делами.</p><p>С вами бывало такое? Конечно, бывало. Что ж, потратив несколько минут на эту статью, вы познакомитесь с основами редактора Vim (и научитесь быстро выходить из него).</p><p>Vim по умолчанию установлен во многих операционных системах (включая большинство дистрибутивов Linux и macOS), поэтому хотя бы поверхностные знания о нём лишними не будут. Откройте терминал и введите vim.</p><p>В умелых руках Vim может стать мощнее многих IDE. И, разумеется, он не ест сотни мегабайт памяти лишь для отображения пустого файла (да, Eclipse, это о тебе).</p><h3>Основы</h3><p>Некоторые из нижеописанных команд начинаются с двоеточия: нажав его, появится подсказка, в которой будет указана полная команда. Команды без двоеточий — это скорее горячие клавиши, которые можно использовать в режиме по умолчанию (в нём запускается Vim). Команды, написанные ЗАГЛАВНЫМИ БУКВАМИ — это отдельные клавиши: например, ESC — это клавиша Esc на вашей клавиатуре.</p><p>Все команды чувствительны к регистру и должны выполняться вне режима insert.</p><h3>Выход из Vim</h3><p>Выход без сохранения изменений:</p><blockquote>Как запомнить: quit dammit! (закройся, чёрт возьми!)</blockquote><p>Выход с сохранением изменений:</p><blockquote>Как запомнить: write to disk and quit</blockquote><h3>Навигация</h3><p>Для перемещения по открытому файлу используйте стрелки.</p><p>Перемещение на строку 285:</p><p>Поиск слова «import»:</p><h3>Изменение текста</h3><p>Вставка текста там, где стоит курсор:</p><blockquote>Как запомнить: insert</blockquote><p>Вставка текста в конце текущей строки:</p><blockquote>Как запомнить: Append</blockquote><p>Выход из режима редактирования (возврат в стандартный режим):</p><h3>Выделение текста</h3><p>Переход в визуальный режим:</p><blockquote>Как запомнить: visual</blockquote><p>Для выделения текста используйте стрелки.</p><p>Выход из визуального режима:</p><h3>Копирование, удаление, вставка</h3><p>Копирование выделенного текста в буфер:</p><blockquote>Как запомнить: yank</blockquote><p>Удаление выделенного текста:</p><blockquote>Как запомнить: delete</blockquote><p>Копирование текущей строки в буфер:</p><blockquote>Как запомнить: yank yank</blockquote><p>Копирование трёх строк, включая текущую, в буфер:</p><p>Удаление текущей строки и помещение её в буфер:</p><blockquote>Как запомнить: delete delete</blockquote><p>Удаление 5 строк, включая текущую:</p><p>Вставка из буфера перед текущей строкой:</p><blockquote>Примечание: заглавная P</blockquote><p>Вставка из буфера после текущей строки:</p><h3>Отмена и восстановление последнего изменения</h3><p>Отмена последнего изменения:</p><blockquote>Как запомнить: uh-oh 🙂</blockquote><p>Восстановление последнего отменённого изменения:</p><p>Вывод изменений:</p><p>Отмена двух последних изменений:</p><p>Многоуровневое дерево отката изменений Vim очень мощное, подробнее о нём можно почитать <a href="http://vimdoc.sourceforge.net/htmldoc/usr_32.html">в документации</a>.</p><h3>Работа с файлом</h3><p>Открытие файла index.html вместо текущего:</p><p>Сохранение текущего файла:</p><blockquote>Как запомнить: write to disk</blockquote><p>Сохранение файла с изменённым именем, например, changes.txt:</p><h3>Поиск и замена</h3><p>Поиск и замена всех вхождений строки в файле:</p><p>Поиск и замена с запросом подтверждения замены:</p><blockquote>Как запомнить: confirm</blockquote><h3>Подсветка синтаксиса и отступы</h3><p>Включение подсветки синтаксиса:</p><p>Включение автоматических отступов:</p><p>Увеличение отступов нескольких строк при выделении их в визуальном режиме:</p><h3>Вкладки</h3><p>Открытие server.py в новой вкладке:</p><blockquote>Как запомнить: tab edit</blockquote><p>Переход на вкладку справа:</p><blockquote>Как запомнить: tab next</blockquote><p>Переход на предыдущую вкладку слева:</p><blockquote>Как запомнить: tab previous</blockquote><p>Для закрытия вкладки переключитесь на неё и используйте команду :q или :wq.</p><h3>Разделённый экран</h3><p>Открытие templates/base.html в режиме вертикального разделения экрана:</p><blockquote>Как запомнить: vertical split</blockquote><p>Открытие shared.js в режиме горизонтального разделения экрана:</p><blockquote>Как запомнить: the ’default’ horizontal split</blockquote><p>Перемещение между «частями» экрана:</p><p>Для закрытия экрана переключитесь на него и используйте команду :q или :wq.</p><h3>Настройка Vim: файл .vimrc</h3><p>Многие команды, используемые для изменения вида и поведения Vim, можно сделать включёнными по умолчанию, поместив их в .vimrc — файл конфигурации Vim, который расположен в домашнем каталоге.</p><p>Например, добавление этих строк в ~/.vimrc сделает подсветку синтаксиса и автоматическую корректировку отступов включёнными по умолчанию:</p><p>Идеи для кастомизации Vim можно почерпнуть в этом <a href="https://github.com/amix/vimrc">GitHub-репозитории</a>.</p><h3>Полезные ресурсы</h3><p>Вот ещё несколько полезных материалов для изучения Vim:</p><ul><li><a href="http://dalibornasevic.com/posts/43-12-vim-tips">12 продвинутых команд Vim</a>;</li><li><a href="http://vim.wikia.com/wiki/Best_Vim_Tips">Лучшие команды с официальной вики-страницы проекта</a>;</li><li><a href="http://zzapper.co.uk/vimtips.html">Огромная подборка команд</a>.</li></ul><p>А какая команда Vim — ваша любимая? Может, вы знаете удобные приёмчики? Делитесь ими в комментариях!</p>]]></content:encoded>
    </item>
    <item>
      <title>Краткая шпаргалка по jQuery: селекторы, атрибуты CSS, манипуляции с DOM, события и другие способы использования библиотеки</title>
      <link>https://tproger.ru/articles/jquery-cheatsheet</link>
      <comments>https://tproger.ru/articles/jquery-cheatsheet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лапа]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/jquery-cheatsheet</guid>
      <description><![CDATA[<p>Методы и атрибуты jQuery по разделам — селекторы, атрибуты CSS, работа с DOM, обход элементов, события, AJAX и эффекты — в виде картинки и PDF.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/jquery-cheatsheet">Краткая шпаргалка по jQuery: селекторы, атрибуты CSS, манипуляции с DOM, события и другие способы использования библиотеки</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Материалы от друзей Tproger]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Mar 2017 19:26:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>В нашу редакцию поступило письмо от веб-разработчика Роба Менинга — он показал нам свою шпаргалку по jQuery и предложил разместить ее на Tproger. Шпаргалка представлена в двух форматах: в виде большой картинки и PDF-файла — и разбита на разделы: в каждом из них кратко представлены все методы и атрибуты jQuery. Такая шпаргалка будет очень полезна и новичку, и уже опытному веб-разработчику для повседневного использования, поэтому мы решили поделиться ею с вами.</p><p>Мы разбили оригинальную картинку на разделы, но если вам удобнее использовать один большой файл, то его можно скачать <a href="https://media.tproger.ru/uploads/2017/03/Jquery-Cheat-Sheet-WSU.png">здесь</a>.</p><h4>Селекторы</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/1-selectors-929x1024.png" alt="" /></figure><h4>Атрибуты / CSS</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/2-attribute-1024x625.png" alt="" /></figure><h4>Манипуляции с DOM</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/3-manipulation-1024x490.png" alt="" /></figure><h4>Обход элементов</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/4-traversing-1024x474.png" alt="" /></figure><h4>События</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/5-events-1024x957.png" alt="" /></figure><h4>Эффекты</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/6-effects-1024x490.png" alt="" /></figure><h4>Ajax</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/7-ajax-1024x356.png" alt="" /></figure><h4>Возможности самого jQuery</h4><figure><img src="https://media.tproger.ru/uploads/2017/03/8-core-736x1024.png" alt="" /></figure><p>PDF-файл со всеми разделами шпаргалки, собранными вместе:</p><p><a href="https://media.tproger.ru/uploads/2017/03/wsu-jquery-cheat-sheet.pdf">Ссылка на PDF</a> для тех, у кого не работает встраивание PDF в браузере.</p><p>Благодарим Роба Менинга, автора сайта <a href="https://websitesetup.org">WebsiteSetup</a>, за предоставленный <a href="https://websitesetup.org/jquery-cheat-sheet/">материал</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Большая подборка практических и обучающих материалов по Swift</title>
      <link>https://tproger.ru/digest/swift</link>
      <comments>https://tproger.ru/digest/swift?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Антон]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/swift</guid>
      <description><![CDATA[<p>Ресурсы по Swift для любого уровня подготовки: теория алгоритмов и структур данных, репозитории с примерами кода, инструменты и практические руководства.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/swift">Большая подборка практических и обучающих материалов по Swift</a>»</p>]]></description>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 24 Feb 2017 19:21:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>Язык Swift создан компанией Apple и предназначен для iOS-разработки. У нас накопилось много полезных статей и ресурсов, которые подойдут для разных уровней владения языком, даже если у вас совсем нет опыта. Так что делимся с вами этим полезным списком, который планируем пополнять:</p><h3>Базовые знания и инструменты</h3><ul><li><a href="https://medium.com/ios-geek-community/10-tips-to-become-better-swift-developer-a7c2ab6fc0c2#.pomjsgwoi">10 советов</a> для начинающих своё знакомство со Swift.</li><li>14 понятий, с которыми должен быть знаком каждый iOS-разработчик.</li><li><a href="https://drewag.me/posts/2017/01/21/5-core-swift-competencies-before-you-get-a-job?utm_source=mybridge&amp;utm_medium=blog&amp;utm_campaign=read_more">5 компетенций</a>, которые желательно приобрести Swift-разработчику перед устройством на работу.</li><li><a href="https://tproger.ru/digest/ios-development-kit/">Набор инструментов</a> iOS-разработчика в 2017 году.</li></ul><h3>Алгоритмы и структуры данных</h3><ul><li><a href="https://github.com/raywenderlich/swift-algorithm-club">Руководство</a> в репозитории Swift Algorithm Club (пригодится не только iOS-разработчикам). Предлагаем также взглянуть на нашу <a href="https://tproger.ru/tag/algos-and-data-structs/">серию по алгоритмам и структурам данных</a>.</li><li>Если предыдущий материал показался вам слишком сложным, вот серия «A Swift Introduction to Algorithms» — она попроще и состоит всего из двух частей. Интерактивные упражнения прилагаются:часть 1;часть 2.</li></ul><h3>Практические руководства</h3><ul><li>Повышаем навык владения Swift:строки;массивы и словари;ключевое слово «_» (кстати, мы тоже писали о «_», но в Python);ключевое слово «self».</li></ul><ul><li>Создаем компилятор на Swift с помощью LLVM:часть 1, введение и лексер;часть 2, абстрактное синтаксическое дерево и парсер;часть 3, генерация кода.</li><li><a href="https://tproger.ru/articles/roll-dice-for-iphone/">Пишем игру</a> «Бросание игральных костей» для iPhone с помощью визуальных средств разработки.</li><li><a href="https://tproger.ru/articles/localizations-in-swift/">Настройка локализаций в Xcode 8 и Swift 3</a> — руководство по созданию в мобильном приложении для iOS локализации текста, даты, чисел, валюты и изображений на примере русского и английского языков.</li></ul><h3>Полезные статьи</h3><ul><li><a href="https://medium.com/the-traveled-ios-developers-guide/swift-keywords-v-3-0-1-f59783bf26c">Подробный обзор</a> ключевых слов в Swift.</li><li><a href="https://medium.com/the-react-native-log/comparing-the-performance-between-native-ios-swift-and-react-native-7b5490d363e2">Сравнение</a> производительности использования Swift и React Native.</li><li><a href="https://medium.com/exyte/replicating-apple-design-awarded-applications-70e5df4c4b94">Пошаговое описание</a> создания таких же интерфейсов, как у трех приложений-победителей <a href="https://developer.apple.com/design/awards/">Apple Design Awards</a>.</li><li><a href="https://web.archive.org/web/20171001032036/https://blog.bobthedeveloper.io/make-memory-management-great-again-f781fb29cea1">Объяснение</a> технологии автоматического подсчета ссылок (<a href="https://en.wikipedia.org/wiki/Automatic_Reference_Counting">Automatic Reference Counting</a>) в Swift 3, которая используется для управления памятью приложения.</li><li><a href="https://tproger.ru/articles/rxswift-3/">Знакомство с RxSwift</a> — примеры кода реактивного программирования от профессиональных iOS-разработчиков.</li><li><a href="https://medium.com/swift-programming/swift-syntax-cheat-codes-9ce4ab4bc82e#.sp7fayqoz">Хитрости синтаксиса языка</a> пригодятся тем, кто уже немного шарит.</li></ul><h3>Другие ресурсы</h3><ul><li><a href="https://github.com/soapyigu/Swift30Projects">Репозиторий</a> на GitHub с 30 небольшими проектами для изучения языка и <a href="https://medium.mybridge.co/21-amazing-open-source-ios-apps-written-in-swift-5e835afee98e">еще 21 приложение</a> с открытыми исходниками, которые уже добавлены в AppStore и пользуются популярностью — стоит взглянуть, чтобы знать, к чему стремиться.</li><li><a href="https://medium.mybridge.co/39-open-source-swift-ui-libraries-for-ios-app-development-da1f8dc61a0f#.8ust9nebg">39 открытых библиотек</a> для разработки пользовательских интерфейсов.</li><li>Видеолекция с текстовой расшифровкой о том, как протестировать готовое приложение, для которого ранее не было написано ни одного теста.</li></ul><h3>Инструменты</h3><ul><li><a href="https://github.com/louisdh/panelkit?utm_source=mybridge&amp;utm_medium=blog&amp;utm_campaign=read_more">PanelKit</a> — UI-фреймворк для создания панелей управления на iOS:</li></ul><figure><img src="https://media.tproger.ru/uploads/2017/04/swift-digest-ui-panel-iloveimg-compressed.gif" alt="" /></figure><ul><li><a href="https://github.com/roberthein/TinyConstraints?utm_source=mybridge&amp;utm_medium=blog&amp;utm_campaign=read_more">TinyConstraints</a> — синтаксический сахар для улучшения интерфейсов, создаваемых с помощью Auto Layout:</li></ul><figure><img src="https://media.tproger.ru/uploads/2017/04/swift-digest-tiny-constraints.gif" alt="" /></figure><ul><li><a href="https://github.com/jerkoch/SwipeCellKit?utm_source=mybridge&amp;utm_medium=blog&amp;utm_campaign=read_more">SwipeCellKit</a> — реализация на Swift ячеек со свайпом, основанная на приложении для почты:</li></ul><figure><img src="https://media.tproger.ru/uploads/2017/04/swift-digest-swipe-cell-kit.gif" alt="" /></figure><p>Делитесь понравившимися вам ресурсами по Swift в комментариях, добавим к нам ?</p>]]></content:encoded>
    </item>
    <item>
      <title>AWS на понятном русском — шпаргалка по веб-сервисам Amazon</title>
      <link>https://tproger.ru/translations/aws-in-plain-russian</link>
      <comments>https://tproger.ru/translations/aws-in-plain-russian?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/aws-in-plain-russian</guid>
      <description><![CDATA[<p>Разбор линейки Amazon Web Services простым языком: зачем нужен каждый продукт, чем EC2 похож на привычный VPS и как выбрать подходящий сервис под задачу.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/aws-in-plain-russian">AWS на понятном русском — шпаргалка по веб-сервисам Amazon</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 24 Feb 2017 14:45:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Эй, а вы уже слышали про эти новые AWS-сервисы: ContainerCache, ElastiCast and QR72?</p><p>Конечно, нет, ведь я их только что выдумал. Чтобы не попадать в такие ситуации, советуем ознакомиться со шпаргалкой по Amazon Web Services, которых уже так много, что и запутаться в них не грех. Можете глянуть такую же <a href="https://tproger.ru/translations/azure-in-plain-russian/">шпаргалку по Azure</a>, если веб-сервисы Microsoft вам кажутся ближе.</p><h3>Сервисы “Run an App”</h3><p>Неважно, что вы будете делать с AWS, вы всё равно будете использовать эти сервисы.</p><h3>EC2</h3><p>Должен называться<br />Amazon Virtual Servers<br />Сфера применения<br />Хостуйте вещи, которые вы считаете компьютерами.<br />Похож на<br />VPS, предоставляемые Linode, DigitalOcean и Rackspace</p><h3>IAM</h3><p>Должен называться<br />Users, Keys and Certs<br />Сфера применения<br />Настраивайте пользователей, добавляйте новые ключи AWS Keys и сертификаты.</p><h3>S3</h3><p>Должен называться<br />Amazon Unlimited FTP Server<br />Сфера применения<br />Храните фотографии и прочие материалы для сайтов. Храните бекапы и файлы в общем доступе. Храните статические сайты. Кстати, многие сервисы также хранят свои данные в S3.</p><h3>VPC</h3><p>Должен называться<br />Amazon Virtual Colocated Rack<br />Сфера применения<br />Добавьте дополнительный уровень защиты всему, что вы храните в Интернете. Пусть всё выглядит так, будто все ваши AWS-сервисы находятся в одной маленькой сети, а не разбросаны в огромной.<br />Похож на<br />VLAN, если вы разбираетесь в сетях</p><h3>Lambda</h3><p>Должен называться<br />AWS App Scripts<br />Сфера применения<br />Запускайте маленькие сниппеты на JS, Java или Python для выполнения отдельных задач.</p><h3>Сервисы веб-разработчика</h3><p>Если вы пишете веб-приложение, то наверняка будете использовать эти сервисы. Похожи на те, что вы найдёте в Heroku Addon Marketplace.</p><h3>API Gateway</h3><p>Должен называться<br />API Proxy<br />Сфера применения<br />Проксируйте API ваших приложений через этот сервис для обработки трафика, тестирования новых версий и т.д.<br />Похож на<br />3Scale</p><h3>RDS</h3><p>Должен называться<br />Amazon SQL<br />Сфера применения<br />Одновременно MySQL-, Postgres-, и Oracle-БД для вашего приложения.<br />Похож на<br />Heroku Postgres</p><h3>Route53</h3><p>Должен называться<br />Amazon DNS + Domains<br />Сфера применения<br />Купите новый домен и настройте DNS-записи.<br />Похож на<br />DNSimple, GoDaddy, Gandi</p><h3>SES</h3><p>Должен называться<br />Amazon Transactional Email<br />Сфера применения<br />Отправляйте одиночные письма (для смены паролей, доставки уведомлений и т.п.). Можно использовать и как газету, если реализуете, но лучше не стоит.<br />Похож на<br />SendGrid, Mandrill, Postmark</p><h3>Cloudfront</h3><p>Должен называться<br />Amazon CDN<br />Сфера применения<br />Ускорьте загрузку сайтов, оптимально распределяя доставку статических файлов пользователям.<br />Похож на<br />MaxCDN, Akamai</p><h3>CloudSearch</h3><p>Должен называться<br />Amazon Fulltext Search<br />Сфера применения<br />Достаньте все данные из S3 или RDS и ищите в них то, что нужно.<br />Похож на<br />Sphinx, Solr, ElasticSearch</p><h3>DynamoDB</h3><p>Должен называться<br />Amazon NoSQL<br />Сфера применения<br />Масштабируемое хранилище ключей для вашего приложения.<br />Похож на<br />MongoLab</p><h3>Elasticache</h3><p>Должен называться<br />Amazon Memcached<br />Сфера применения<br />Memcached или Redis вашего приложения.<br />Похож на<br />Redis to Go, Memcachier</p><h3>Elastic Transcoder</h3><p>Должен называться<br />Amazon Beginning Cut Pro<br />Сфера применения<br />Обработка различных странностей видео (форматы, сжатие и т.д.).</p><h3>SQS</h3><p>Должен называться<br />Amazon Queue<br />Сфера применения<br />Храните данные для дальнейшей обработки в очереди.<br />Похож на<br />RabbitMQ, Sidekiq</p><h3>WAF</h3><p>Должен называться<br />AWS Firewall<br />Сфера применения<br />Блокируйте опасные запросы к сайтам, защищённым Cloudfront (не давайте людям попробовать подобрать 10 000 паролей к /wp-admin).<br />Похож на<br />Sophos, Kaspersky</p><h3>Сервисы для мобильных разработчиков</h3><p>Эти сервисы нужны только мобильным разработчикам.</p><h3>Cognito</h3><p>Должен называться<br />Amazon OAuth as a Service<br />Сфера применения<br />Предоставьте пользователям возможность залогиниться через Google, Facebook и т.д.<br />Похож на<br />OAuth.io</p><h3>Device Farm</h3><p>Должен называться<br />Amazon Drawer of Old Android Devices<br />Сфера применения<br />Протестируйте ваше приложение на нескольких iOS и Android-устройствах одновременно.<br />Похож на<br />MobileTest, iOS emulator</p><h3>Mobile Analytics</h3><p>Должен называться<br />Spot on Name, Amazon Product Managers take note<br />Сфера применения<br />Следите, что пользователи делают в ваших приложениях.<br />Похож на<br />Flurry</p><h3>SNS</h3><p>Должен называться<br />Amazon Messenger<br />Сфера применения<br />Отправляйте мобильные уведомление, письма и / или SMS.<br />Похож на<br />UrbanAirship, Twilio</p><h3>Сервисы для внедрения кода</h3><p>Эти сервисы нужны для автоматизации управления и внедрения кода в других сервисах.</p><h3>CodeCommit</h3><p>Должен называться<br />Amazon GitHub<br />Сфера применения<br />Контроль версий вашего кода.<br />Похож на<br />Github, BitBucket</p><h3>Code Deploy</h3><p>Должен называться<br />И так неплохо<br />Сфера применения<br />Загрузите ваш код из репозитория CodeCommit (или Github) на несколько сущностей EC2.<br />Похож на<br />Heroku, Capistrano</p><h3>CodePipeline</h3><p>Должен называться<br />Amazon Continuous Integration<br />Сфера применения<br />Запускайте автоматизированные тесты вашего кода и вносите необходимые изменения.<br />Похож на<br />CircleCI, Travis</p><h3>EC2 Container Service</h3><p>Должен называться<br />Amazon Docker as a Service<br />Сфера применения<br />Поместите Dockerfile в сущность EC2 для запуска сайта.</p><h3>Elastic Beanstalk</h3><p>Должен называться<br />Amazon Platform as a Service<br />Сфера применения<br />Переместите ваше приложение с Heroku на AWS, когда первый вам станет не по карману.<br />Похож на<br />Heroku, BlueMix, Modulus</p><h3>Корпоративные сервисы</h3><p>Сервисы для бизнеса и сетей.</p><h3>AppStream</h3><p>Должен называться<br />Amazon Citrix<br />Сфера применения<br />Поместите копию Windows-приложения на Windows-систему, к которой вы предоставляете удалённый доступ.<br />Похож на<br />Citrix, RDP</p><h3>Direct Connect</h3><p>Должен называться<br />На самом деле, весьма точное название<br />Сфера применения<br />Заплатите за доступ к выделенной линии от вашего дата-центра или сети до AWS.<br />Похож на<br />Туннель, позволяющий объехать пробку</p><h3>Directory Service</h3><p>Должен называться<br />На самом деле, весьма точное название<br />Сфера применения<br />Объединяйте приложения, которым для управления нужна Microsoft Active Directory.</p><h3>WorkDocs</h3><p>Должен называться<br />Amazon Unstructured Files<br />Сфера применения<br />Делитесь Word-документами с коллегами.<br />Похож на<br />Dropbox, DataAnywhere</p><h3>WorkMail</h3><p>Должен называться<br />Amazon Company Email<br />Сфера применения<br />Настройте всем в компании одинаковые почтовую систему и календарь.<br />Похож на<br />Google Apps for Domains</p><h3>Workspaces</h3><p>Должен называться<br />Amazon Remote Computer<br />Сфера применения<br />Интерфейс для удалённого управления компьютером.</p><h3>Service Catalog</h3><p>Должен называться<br />Amazon Setup Already<br />Сфера применения<br />Предоставьте всем пользователям AWS в вашей группе доступ к написанным вами приложениям, чтобы им не приходилось читать гайды вроде этого.</p><h3>Storage Gateway</h3><p>Должен называться<br />S3, считающий себя частью вашей корпоративной сети<br />Сфера применения<br />Хватит покупать место для хранения документов Word. Упростите передачу файлов из сети в S3.</p><h3>Big Data-сервисы</h3><p>Сервисы для поглощения, управления и прочих махинаций с данными.</p><h3>Data Pipeline</h3><p>Должен называться<br />Amazon ETL<br />Сфера применения<br />Извлекайте, Обрабатывайте и Сохраняйте все данные из AWS, а также настраивайте расписания и получайте сообщения об ошибках.</p><h3>Elastic Map Reduce</h3><p>Должен называться<br />Amazon Hadooper<br />Сфера применения<br />Обрабатывайте большие объёмы текстовых или сырых данных, хранящихся в S3.<br />Похож на<br />Treasure Data</p><h3>Glacier</h3><p>Должен называться<br />Очень медленный Amazon S3<br />Сфера применения<br />Делайте бекапы бекапов, хранящихся в S3. Запасы на чёрный день.</p><h3>Kinesis</h3><p>Должен называться<br />Amazon High Throughput<br />Сфера применения<br />Быстро сохраняйте большие объёмы данных (например, аналитику или список людей, ретвитящих Канье Уэста), чтобы проанализировать их позже.<br />Похож на<br />Kafka</p><h3>RedShift</h3><p>Должен называться<br />Amazon Data Warehouse<br />Сфера применения<br />Храните аналитические данные, обрабатывайте их и выгружайте.</p><h3>Machine Learning</h3><p>Должен называться<br />Skynet<br />Сфера применения<br />Предсказывайте поведение, исходя из текущих данных, для решения различных задач.</p><h3>SWF</h3><p>Должен называться<br />Amazon EC2 Queue<br />Сфера применения<br />Создайте сервис из “мыслителей” и “рабочих” поверх EC2 для выполнения задачи. В отличие от SQS, обладает встроенной логикой.<br />Похож на<br />IronWorker</p><h3>Snowball</h3><p>Должен называться<br />AWS Big Old Portable Storage<br />Сфера применения<br /><a href="https://tproger.ru/news/highway-to-cloud/">AWS Snowmobile</a> в миниатюре.<br />Похож на<br />Shipping a Network Attached Storage device to AWS</p><h3>Сервисы для управления AWS</h3><p>AWS становится сложным, эти сервисы помогут разобраться.</p><h3>CloudFormation</h3><p>Должен называться<br />Amazon Services Setup<br />Сфера применения<br />Настройте несколько связанных сервисов за один подход.</p><h3>CloudTrail</h3><p>Должен называться<br />Amazon Logging<br />Сфера применения<br />Ведите логи активностей AWS-стека.</p><h3>CloudWatch</h3><p>Должен называться<br />Amazon Status Pager<br />Сфера применения<br />Получайте уведомления, когда ваши сервисы AWS ведут себя некорректно.<br />Похож на<br />PagerDuty, Statuspage</p><h3>Config</h3><p>Должен называться<br />Amazon Configuration Management<br />Сфера применения<br />Не сходите с ума, когда вам нужно следить за большой AWS-системой.</p><h3>OpsWorks</h3><p>Должен называться<br />Amazon Chef<br />Сфера применения<br />Управляйте запуском вашего приложения при помощи вещей наподобие автоматического масштабирования.</p><h3>Trusted Advisor</h3><p>Должен называться<br />Amazon Pennypincher<br />Сфера применения<br />Выясните, за что вы переплачиваете.</p><h3>Inspector</h3><p>Должен называться<br />Amazon Auditor<br />Сфера применения<br />Проверьте вашу AWS-систему на наличие проблем безопасности.<br />Похож на<br />Alert Logic</p>]]></content:encoded>
    </item>
    <item>
      <title>Azure на понятном русском — шпаргалка по веб-сервисам Microsoft</title>
      <link>https://tproger.ru/translations/azure-in-plain-russian</link>
      <comments>https://tproger.ru/translations/azure-in-plain-russian?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/azure-in-plain-russian</guid>
      <description><![CDATA[<p>Расшифровка названий и назначения сервисов Microsoft Azure для веб-разработки с примерами аналогичных сервисов Amazon Web Services.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/azure-in-plain-russian">Azure на понятном русском — шпаргалка по веб-сервисам Microsoft</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 11 Feb 2017 12:27:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Эй, а вы уже слышали про эти новые <a href="https://azure.microsoft.com/">Azure</a>-сервисы: Elasticville, StorageWart и API Gatesian?</p><p>Конечно, нет, ведь мы их только что выдумали. Чтобы не попадать в такие ситуации, советуем ознакомиться со шпаргалкой по сервисам Microsoft Azure, которых уже так много, что и запутаться в них не грех.</p><h3>Сервисы для разработки веб-приложений</h3><p>Если вы пишете веб-приложение, то скорее всего будете пользоваться именно этими сервисами. Если сравнение с AWS ясности не вносит, можете заглянуть в соответствующую <a href="https://tproger.ru/translations/aws-in-plain-russian/">шпаргалку по веб-сервисам Amazon</a>.</p><h3>Service Fabric</h3><p>Azure Microservice<br /><b>Сфера применения</b><br />В вашем коде есть класс? Сделайте его микросервисом! Задеплойте его в Service Fabric! Можете просить повышение.<br /><b>Похож на</b><br />AWS Lambda, AWS API Gateway</p><h3>App Service &gt; Web Apps</h3><p>Azure PAAS, раньше назывался “Azure Websites”<br /><b>Сфера применения</b><br />Управляйте приложением, но не волнуйтесь о системном администрировании.<br /><b>Похож на</b><br />Heroku, Modulus, AWS ElasticBeanstalk, CloudFoundry</p><h3>Cloud Services</h3><p>Azure IAAS<br /><b>Сфера применения</b><br />Управляйте приложением, которое вам придётся настраивать и патчить.<br /><b>Похож на</b><br />AWS EC2</p><h3>Virtual Machines</h3><p>Вы не можете поверить, что это — не реальный сервер<br /><b>Сфера применения</b><br />Хвастайтесь перед своими Devops-друзьями, что вы бы делали всё на реальном “железе”, но ваш технический директор предпочитает “облако”.<br /><b>Похож на</b><br />Linode, Rackspace VPS</p><h3>Visual Studio Team Services</h3><p>Source Control CI<br /><b>Сфера применения</b><br />Пишите приложения с другими людьми: общее управление исходниками и непрерывная интеграция<br /><b>Похож на</b><br />Github, Jenkins, CodeShip, BitBucket, AWS CodeCommit</p><h3>DevTest Labs</h3><p>QA Virtual Machines<br /><b>Сфера применения</b><br />Тестируйте то, что вы получили при помощи Virtual Machines.<br /><b>Похож на</b><br />Dockerish, Chef или Puppetish</p><h3>Application Insights</h3><p>Crash, Burn and Report (Круши, Ломай и Сообщай)<br /><b>Сфера применения</b><br />Следите за производительностью и ошибками в приложениях на ASP.NET или J2EE. Получайте уведомления об ошибках и логи.<br /><b>Похож на</b><br />Honeybadger, Exception.io</p><h3>Scheduler</h3><p>Cron the Barbarian (Cron-варвар)<br /><b>Сфера применения</b><br />Выполняйте небольшие задания по расписанию. Удобно, теперь не нужно держать виртуальную машину постоянно запущенной.<br /><b>Похож на</b><br />Heroku Background Jobs, Cron</p><h3>Сервисы-хранилища</h3><p>В Azure есть единый сервис под названием “Storage”, который включает в себя все ниже перечисленные и ещё несколько, от которых они зависят.</p><h3>Blob Storage</h3><p>Large File Storage (Хранилище больших файлов)<br /><b>Сфера применения</b><br />Складывайте загруженные изображения, логи, спираченные отечественные комедии и всё, что нужно вашему приложению, в бесконечный жёсткий диск.<br /><b>Похож на</b><br />AWS S3, Rackspace Cloud Files</p><h3>Table Storage</h3><p>Database Storage (Хранилище баз данных)<br /><b>Сфера применения</b><br />Что-то между SQL и NoSQL.<br /><b>Похож на</b><br />DynamoDB</p><h3>Queue Storage</h3><p>Queue (Очередь)<br /><b>Сфера применения</b><br />Соединяйте сервисы в порядке очередности сообщений.<br /><b>Похож на</b><br />AWS SQS, RabbitMQ, Sidekiq</p><h3>File Storage</h3><p>Attached File Storage (Хранилище прикреплённых файлов)<br /><b>Сфера применения</b><br />Переносите на Azure приложения, которые зависят от локальной файловой системы. И да, вы не сможете пользоваться Blob Storage.<br /><b>Похож на</b><br />AWS EBS</p><h3>StorSimple</h3><p>Более сложная версия “Storage”<br /><b>Сфера применения</b><br />Похож на “Storage”, но перемещает файлы из и в Azure по установленным вами правилам.<br /><b>Похож на</b><br />AWS Storage Gateway</p><h3>Search</h3><p>FullText Search (Поиск по тексту)<br /><b>Сфера применения</b><br />Ищите то, что нужно, в файле, сайте и любом другом текстовом объекте.<br /><b>Похож на</b><br />AWS CloudSearch, ElasticSearch</p><h3>Document DB</h3><p>JSON DB<br /><b>Сфера применения</b><br />Храните NoSQL-структурированные JSON-данные — то есть храните больше данные, чем могли бы при использовании SQL.<br /><b>Похож на</b><br />DynamoDB, MongoDB</p><h3>SQL Database</h3><p>SQL Database<br /><b>Сфера применения</b><br />Храните все данные приложения в таблицах и настраивайте между ними “отношения”.<br /><b>Похож на</b><br />Heroku Postgres</p><h3>Redis Cache</h3><p>Redis<br /><b>Сфера применения</b><br />Храните часто используемые данные в удобных структурах. Похоже на Memcached, но без старого хлама от LiveJournal.<br /><b>Похож на</b><br />Redis2Go, RedisGreen</p><h3>Сервисы для управления Azure</h3><p>Azure становится сложным, эти сервисы помогут разобраться.</p><h3>Automation</h3><p>Cloud Shell<br /><b>Сфера применения</b><br />Автоматизируйте сервисы Azure при помощи Powershell — языка Богов Windows Server.<br /><b>Похож на</b><br />AWS Cloudformation</p><h3>Operational Insights</h3><p>Log Reader<br /><b>Сфера применения</b><br />Собирайте, объединяйте и изучайте логи для решения проблем.<br /><b>Похож на</b><br />Splunk</p><h3>KeyVault</h3><p>Hardware Security Module<br /><b>Сфера применения</b><br />Храните ключи шифрования в безопасном хранилище, доступном только при использовании.<br /><b>Похож на</b><br />AWS KMS</p><h3>Security Center</h3><p>Policy Minder<br /><b>Сфера применения</b><br />Устанавливайте определённые правила для сервисов Azure и получайте уведомления, когда они нарушаются.</p><h3>Сервисы для мобильных разработчиков</h3><p>Эти сервисы нужны только мобильным разработчикам.</p><h3>App Service &gt; Mobile Apps</h3><p>Baby’s got Backend As A Service (Да, детка, у меня есть Backend As A Service)<br /><b>Сфера применения</b><br />Подтверждайте и отправляйте сообщения и храните сетевые данные для мобильных платформ.<br /><b>Похож на</b><br />Heroku, Urban Airship, Parse</p><h3>App Service &gt; API Apps</h3><p>Azure API Proxy<br /><b>Сфера применения</b><br />Создайте API для сервисов Azure и SDK для различных языков клиента (PHP, Node, Java, ASP.NET).<br /><b>Похож на</b><br />AWS API Gateway</p><h3>API Management</h3><p>API Big Boss<br /><b>Сфера применения</b><br />Управляйте трафиком и пределами того, что передаётся через API.<br /><b>Похож на</b><br />AWS API Gateway</p><h3>Notification Hubs</h3><p>Azure Push Notifications<br /><b>Сфера применения</b><br />Отправляйте пуш-уведомления на iOS, Android, Windows и Kindle. Теперь, когда поддерживается даже Kindle, шутить над Blackberry даже как-то стыдно.<br /><b>Похож на</b><br />AWS SNS, UrbanAirship</p><h3>Mobile Engagement</h3><p>Mobile Analytics (но это название уже заняли AWS)<br /><b>Сфера применения</b><br />Анализируйте то, почему люди покупают бонусы в вашем приложении про боулинг с пандами, в реальном времени.<br /><b>Похож на</b><br />AWS Mobile Analytics, Flurry</p><h3>Медиа- и CDN-сервисы</h3><p>Доставляйте контент быстрее и настраивайте видео для просмотра на разных устройствах.</p><h3>Encoding</h3><p>Название и так неплохое, но лучше бы назвали “VHS” — шарм старины<br /><b>Сфера применения</b><br />Шифруйте видео в форматы для воспроизведения на мобильных устройствах, в Сети, на домашних кинотеатрах с разрешением 4K и т.д.<br /><b>Похож на</b><br />AWS ElasticTranscoder</p><h3>Media Player</h3><p>RealPlayer(TM)<br /><b>Сфера применения</b><br />Просто встраивайте видео, не задумываясь о различных платформах.</p><h3>Media Indexer</h3><p>Closed Captioner (Почти точный переводчик)<br /><b>Сфера применения</b><br />Автоматически генерируйте текст / субтитры из аудио- и видеофайлов.</p><h3>Content Protection</h3><p>Azure DRM<br /><b>Сфера применения</b><br />Защищайте свои видео с котиками от нарушителей авторского права и пиратов.</p><h3>Live and On Demand Streaming</h3><p>McStreamey<br /><b>Сфера применения</b><br />Управляйте стримингом видео, убедившись, что его смотрят только нужные люди, которые уже заплатили вам за это.</p><h3>Content Delivery Network</h3><p>A(zure)kami<br /><b>Сфера применения</b><br />Быстрая доставка сайтов, файлов и видео людям, которым это нужно.<br /><b>Похож на</b><br />Cloudfront, MaxCDN</p><h3>Сетевые сервисы</h3><p>В зависимости от того, что вы делаете, эти сервисы могут улучшить производительность или безопасность.</p><h3>Virtual Network</h3><p>Network Expander<br /><b>Сфера применения</b><br />Пусть всё выглядит так, будто новые сервисы Azure случайно появились во внутренней сети компании. Возьмите с собой IP-адрес.<br /><b>Похож на</b><br />AWS VPC</p><h3>Express Route</h3><p>И так сойдёт<br /><b>Сфера применения</b><br />Отправляете в Azure терабайты данных, но родители ругаются, что им не хватает скорости? Получите выделенный канал.<br /><b>Похож на</b><br />AWS Direct Connect</p><h3>VPN Gateway</h3><p>Я не могу позволить себе Express Route<br /><b>Сфера применения</b><br />Настройте VPN-подключение между вашим дата-центром и Azure.<br /><b>Похож на</b><br />OpenVPN</p><h3>Traffic Manager</h3><p>Geo Load Balancer (Геопозиционный балансировщик нагрузки)<br /><b>Сфера применения</b><br />Повышайте производительность, распределяя трафик между дата-центрами в зависимости от местоположения запросов.<br /><b>Похож на</b><br />AWS ELB</p><h3>Load Balancer</h3><p>Local Load Balancer (Локальный балансировщик нагрузки)<br /><b>Сфера применения</b><br />Разделяйте трафик между несколькими серверами / сервисами.<br /><b>Похож на</b><br />AWS ELB</p><h3>Application Gateway</h3><p>Web Load Balancer (Сетевой балансировщик нагрузки)<br /><b>Сфера применения</b><br />Оптимизируйте нагрузку на веб-серверы. Все оптимизированные HTTP-штучки в комплекте.<br /><b>Похож на</b><br />AWS ELB</p><h3>Корпоративные сервисы</h3><p>Сервисы для бизнеса и сетей.</p><h3>RemoteApp</h3><p>Apps on Cloud<br /><b>Сфера применения</b><br />Загрузите приложение в и предоставьте пользователям доступ по RDP.<br /><b>Похож на</b><br />Citrix</p><h3>BizTalk</h3><p>App Communicator<br /><b>Сфера применения</b><br />Объединяйте Enteprise-приложения (вроде SAS или Peoplesoft). Звучит забавно.</p><h3>Service Bus</h3><p>Network Message Queue<br /><b>Сфера применения</b><br />Отправляйте команды и данные в очередь, которая позволит соединить множество устройств, серверов и клиентов для оптимизации обработки.<br /><b>Похож на</b><br />RabbitMQ, AWS SQS</p><h3>Backup</h3><p>Лучше, чем диск<br /><b>Сфера применения</b><br />Защитите дата-центр от стирания всех бекапов.<br /><b>Похож на</b><br />Glacier, Backblaze</p><h3>Site Recovery</h3><p>План Б<br /><b>Сфера применения</b><br />Сохраните копию всей критически важной инфраструктуры в Azure.<br /><b>Похож на</b><br />AWS CloudConfig</p><h3>Active Directory</h3><p>Hybridactive Directory<br /><b>Сфера применения</b><br />Настройте Active Directory As A Service, которая может синхронизироваться с вашей активной директорией Enterprise или заменить её.</p><h3>Big Data-сервисы</h3><p>Сервисы для поглощения, управления и прочих махинаций с данными.</p><h3>Batch</h3><p>Bunch-of-VMs.bat (куча-виртуальных-машин.bat)<br /><b>Сфера применения</b><br />Делайте много разных вещей сразу на нескольких системах, но не всегда. Используйте слово “параллельный” чаще, чем учитель геометрии в школе.<br /><b>Похож на</b><br />AWS Elastic Map Reduce</p><h3>App Service &gt; Logic Apps</h3><p>Cloud Lego Flowchart (Облачный Lego для блок-схем)<br /><b>Сфера применения</b><br />Настройте рабочий поток для ваших данных в облаке.<br /><b>Похож на</b><br />IFTTT, Zapier</p><h3>SQL Data Warehouse</h3><p>А ты неплох, SQL Data Warehouse, ты неплох.<br /><b>Сфера применения</b><br />Загрузите данные на огромный SQL Server вашей мечты и обработайте их полностью.<br /><b>Похож на</b><br />AWS Redshift</p><h3>Data Lake Analytics</h3><p>Убер-SQL Data Warehouse<br /><b>Сфера применения</b><br />Храните эксабайты данных (не волнуйтесь о том, сколько это — если бы у вас было столько данных, вы бы знали).</p><h3>Data Lake Store</h3><p>ETL Query (ИОС-запрос)<br /><b>Сфера применения</b><br />Извлекайте, Обрабатывайте и Сохраняйте все данные из Data Warehouse при помощи Hadoop.<br /><b>Похож на</b><br />AWS ElasticMap Reduce</p><h3>HDInsight</h3><p>Apache Apps<br /><b>Сфера применения</b><br />Убедите своего босса, что Свинтус, Рой, Эйчбэйс, Шторм и Искра (Pig, Hive, HBase, Storm, Spark) — это не имена супергероев из нового фильма про Мстителей.</p><h3>Machine Learning</h3><p>Cortana AI Edition<br /><b>Сфера применения</b><br />Выясните, что не-геймеры думают обо всем связанном с Кортаной. Ну и используйте сервис, чтобы ИИ принял вас на свою сторону, когда наступит Сингулярность.<br /><b>Похож на</b><br />AWS Machine Learning</p><h3>Stream Analytics</h3><p>Real Time Analytics<br /><b>Сфера применения</b><br />Собирайте тысячи потоков аналитики одновременно.<br /><b>Похож на</b><br />AWS Kinesis</p><h3>Data Factory</h3><p>Data Pipeline<br /><b>Сфера применения</b><br />Составьте план передачи данных между сервисами.<br /><b>Похож на</b><br />AWS DataPipeline</p><h3>Data Catalog</h3><p>Data Sharing<br /><b>Сфера применения</b><br />Предоставьте доступ к некоторым данным из других сервисов всем в вашей организации. Похоже на SQL View для кросс-сервисных данных.<br /><b>Похож на</b><br />Chartio</p>]]></content:encoded>
    </item>
    <item>
      <title>Оболочка Bash — шпаргалка для начинающих</title>
      <link>https://tproger.ru/translations/bash-cheatsheet</link>
      <comments>https://tproger.ru/translations/bash-cheatsheet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/bash-cheatsheet</guid>
      <description><![CDATA[<p>Шпаргалка по Bash: команды навигации, grep, sed, awk, конвейеры и права доступа. Изучите терминал Linux быстро — с примерами и таблицей горячих клавиш.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/bash-cheatsheet">Оболочка Bash — шпаргалка для начинающих</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 12 Jan 2017 15:28:59 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Ключевые моменты:</b><br />— Bash (Bourne Again Shell) — оболочка для взаимодействия с операционной системой через терминал<br />— Основные команды навигации: pwd, cd, mkdir — позволяют перемещаться по файловой системе<br />— Команды grep, sed и awk — мощные инструменты для поиска и обработки текста<br />— Конвейеры (pipe, символ |) позволяют соединять вывод одной команды со входом другой<br />— Права доступа в Linux управляются командой chmod с буквенной или восьмеричной записью</p><p>В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.</p><h3>Оболочка Bash: введение</h3><p>Оболочка, или шелл (shell) — это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как <a href="https://help.gnome.org/users/gnome-terminal/stable/">gnome-terminal</a>, eterm, nxterm и т. п.</p><h3>Навигация</h3><p>В Linux файлы и каталоги имеют иерархическую организацию, то есть существует некий начальный каталог, называемый корневым. В нём содержатся файлы и подкаталоги, которые в свою очереди содержат файлы и свои подкаталоги.</p><h4>pwd</h4><p>Команда pwd, сокращение от print working directory, отображает текущее местоположение в структуре каталогов.</p><h4>cd</h4><p>Команда cd позволяет перейти в новый каталог.</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/fe3000f0-76eb-4373-950d-354dda8c943c.png" alt="Примеры использования команды cd в Bash" /></figure><h4>mkdir</h4><p>Команда mkdir создаёт новый каталог в текущем каталоге.</p><h3>Основные команды</h3><h4>man</h4><p>Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat:</p><h4>cat</h4><p>Команда cat считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.</p><h4>echo</h4><p>Команда echo выводит свои аргументы по стандартному каналу вывода.</p><p>Если вызвать echo без аргументов, будет выведена пустая строка.</p><h4>head</h4><p>Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:</p><h4>tail</h4><p>Команда tail работает аналогично команде head, но читает строки с конца:</p><p>Также можно просматривать добавляемые к файлу строки в режиме реального времени при помощи флага -f:</p><h4>less</h4><p>Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.</p><p>Подробнее о назначении символа | будет рассказано ниже в разделе команды history.</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/8396171d-ad81-4d62-892d-f14b4f1d9cd2.png" alt="Пример вывода команды less в терминале" /></figure><h4>true</h4><p>Команда true всегда возвращает ноль в качестве выходного статуса для индикации успеха.</p><h4>false</h4><p>Команда false всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.</p><h4>$?</h4><p>$? — это переменная, которая содержит выходной статус последней запущенной команды. Под статусом обычно понимается <a href="https://ru.wikipedia.org/wiki/Код_возврата">код возврата</a> программы. 0 означает успешное выполнение программы, любое значение большее 0 отражает тот факт, что в процессе выполнения возникли некоторые ошибки. Кстати, именно поэтому в bash истинной (true) считается 0, а все, что не 0 — ложью (false):</p><h4>grep</h4><p>Команда grep занимается поиском переданной строки в указанном файле:</p><p>grep также может принимать несколько файлов и регулярных выражений для уточнения формата текста.</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/767f1010-e77e-42ce-b7c4-3101142038a5.png" alt="Примеры использования команды grep" /></figure><p>Также можно ознакомиться с <a href="https://github.com/mikeizbicki/ucr-cs100/tree/2015winter/textbook/using-bash/regex">руководством по regex</a>. У нас на сайте тоже есть <a href="https://tproger.ru/translations/regular-expression-python/">руководство</a> по «регуляркам» в Python для новичков.</p><h4>sed</h4><p>Команда sed — это потоковый редактор, преобразующий входные текстовые данные. Обычно её используют для замены выражений так: s/regexp/replacement/g. Например, следующий код заменит все слова «Hello» на «Hi»:</p><p>Также вы можете ознакомиться с <a href="https://github.com/mikeizbicki/ucr-cs100/tree/2015winter/textbook/using-bash/sed">руководством по sed</a>.</p><h4>history</h4><p>Команда history выводит историю командной строки. Обычно её используют вместе с командой grep для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++:</p><p>Здесь также используется символ | — это так называемый <a href="https://ru.wikipedia.org/wiki/Перенаправление_ввода-вывода">конвейер</a> (pipe). Благодаря ему можно перенаправлять вывод одной команды на вход другой — таким образом в примере выше вся история, которая в обычном режиме выводится командой history прямо в вывод терминала, будет перенаправлена в grep в качестве входных данных. Мы не увидим вывода команды history, но увидим вывод команды grep.</p><p>Это может быть довольно сложно для понимания без практики, поэтому поэкспериментируйте самостоятельно, например с командами ls, history, ps (описана ниже), перенаправляя их вывод в grep, sed или less, например.</p><h4>export</h4><p>Команда export устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name со значением student:</p><h4>ps</h4><p>Команда ps выводит информацию о запущенных процессах.</p><p>Выводится четыре элемента:</p><ul><li>ID процесса (PID),</li><li>тип терминала (TTY),</li><li>время работы процесса (TIME),</li><li>имя команды, запустившей процесс (CMD).</li></ul><h4>awk</h4><p>Команда awk находит и заменяет текст в файлах по заданному шаблону: awk 'pattern {action}' test.txt</p><h4>wget</h4><p>Команда wget скачивает файлы из Сети и помещает их в текущий каталог.</p><h4>nc</h4><p>Команда nc — это утилита для отладки сети. Также можно ознакомиться с <a href="https://github.com/mikeizbicki/ucr-cs100/tree/2015winter/textbook/using-bash/nctutorial">руководством по nc</a>.</p><h4>ping</h4><p>Команда ping тестирует сетевое подключение.</p><p>Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.</p><h4>git</h4><p>Git — это популярная система контроля версий. Также можно ознакомиться с <a href="https://github.com/mikeizbicki/ucr-cs100/tree/2015winter/assignments/lab/lab1-git">руководством по git</a> и <a href="https://tproger.ru/tag/git/">нашими материалами</a>.</p><h3>Переменные окружения</h3><p>Переменные окружения — это именованные переменные, содержащие значения, используемые одним или несколькими приложениями.</p><p>Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.</p><p>Переменная HOME содержит путь к домашнему каталогу текущего пользователя.</p><h3>Коннекторы</h3><p>Коннекторы позволяют запускать несколько команд одновременно.</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/313416d4-e746-498b-9f3f-46b769f29cc3.png" alt="Таблица коннекторов Bash: &amp;&amp;, ||, ;" /></figure><h3>Конвейеры</h3><p>Конвейеры, или пайпы, позволяют соединять входные и выходные каналы различных команд. В следующем примере вывод команды ls будет передан в head , и в результате будет напечатано лишь 10 первых элементов.</p><h3>Перенаправление ввода/вывода</h3><h4>Перенаправление вывода</h4><p>Для стандартного перенаправления вывода используются символы &gt; и &gt;&gt;.</p><p>Например, этот код передаст вывод ls в файл, а не на экран:</p><p>Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду &gt;&gt; — она дописывает данные в конец файла.</p><h4>Перенаправление ввода</h4><p>Для стандартного перенаправления вывода используется символ &lt;. В следующем примере sort берет входные данные из файла, а не с клавиатуры:</p><p>Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:</p><h4>Продвинутое перенаправление</h4><p>Добавление &amp; к &gt; приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp выведет строку stdout в cout и строку stderr в cerr.</p><p>Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к &gt;.</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/6ff29136-7d62-47e1-a2a4-b28fc95b6af0.png" alt="Таблица файловых дескрипторов: stdin, stdout, stderr" /></figure><p>Например, для перенаправления stderr в test.txt нужно сделать следующее:</p><h3>Права доступа</h3><p>Команда ls -l выводит много информации о правах доступа к каждому файлу:</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/794762b4-ca69-4d6e-93d0-dd6aa207c6fb.png" alt="Схема прав доступа к файлам в Linux" /></figure><h4>chmod</h4><p>Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/d19f4656-1797-48a2-828c-2c8ab0cbb7ef.png" alt="Таблица флагов команды chmod" /></figure><p>Вы можете вызвать chmod с описанием действий над конкретным файлом. Символ - обозначает удаление прав, символ + — добавление. Следующий пример сделает файл доступным для чтения и записи владельцу и группе:</p><p>Кроме того, chmod можно использовать с восьмеричными числами, где 1 — это наличие прав, а 0 — отсутствие:</p><p>Следующая команда сработает так же, как и предыдущая:</p><p>Также можно ознакомиться с <a href="https://github.com/mikeizbicki/ucr-cs100/tree/2015winter/textbook/using-bash/file-permission">руководством по правам доступа</a>.</p><h3>Сочетания клавиш</h3><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/ebfca099-3843-40d0-bee1-890e22bb9abb.png" alt="Таблица горячих клавиш Bash" /></figure><h2>FAQ</h2><h3>Чем Bash отличается от других оболочек (Zsh, Fish)?</h3><p>Bash — стандартная оболочка в большинстве дистрибутивов Linux и macOS (до Catalina). Zsh предлагает более продвинутое автодополнение и плагины (Oh My Zsh), а Fish — интуитивный синтаксис и подсветку прямо из коробки. Однако Bash остаётся самым универсальным выбором: скрипты на Bash работают практически везде без дополнительной настройки.</p><h3>Как запустить Bash-скрипт?</h3><p>Создайте файл с расширением .sh, добавьте в первую строку шебанг (#!/bin/bash), напишите команды и сделайте файл исполняемым: chmod +x script.sh. После этого запустите его командой ./script.sh или bash script.sh.</p><h3>Что означает символ | (pipe) в командной строке?</h3><p>Символ | (pipe, конвейер) перенаправляет стандартный вывод одной команды на стандартный вход другой. Например, ls | grep txt выведет только файлы, содержащие "txt" в имени. Это один из ключевых принципов Unix-философии: простые команды, соединённые в цепочку.</p><h3>Как посмотреть историю команд в Bash?</h3><p>Используйте команду history для вывода всей истории. Для поиска конкретной команды нажмите Ctrl+R и начните вводить часть команды — Bash покажет последнее совпадение. Также можно использовать history | grep ключевое_слово для фильтрации.</p><h3>Как изменить права доступа к файлу в Linux?</h3><p>Используйте команду chmod. Буквенная запись: chmod u+rwx,g+rx,o+r file — даёт владельцу все права, группе чтение и выполнение, остальным только чтение. Числовая запись: chmod 754 file — делает то же самое. Числа складываются из r=4, w=2, x=1.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 ресурсов для изучения и использования Git</title>
      <link>https://tproger.ru/translations/10-free-resources-to-learn-git</link>
      <comments>https://tproger.ru/translations/10-free-resources-to-learn-git?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/10-free-resources-to-learn-git</guid>
      <description><![CDATA[<p>Подборка бесплатных материалов по распределённой системе контроля версий Линуса Торвальдса: официальное руководство Git tutorial и Learn Git Branching.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/10-free-resources-to-learn-git">10 ресурсов для изучения и использования Git</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 23 Dec 2016 20:29:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Git — это бесплатная open source распределённая система управления версиями, созданная самим Линусом Торвальдсом, создателем Linux. Начать работать с Git может быть трудно, но в Сети можно найти большое количество бесплатных ресурсов, которые смогут вам помочь. Мы собрали их в этом материале для вас.</p><h3>Git tutorial</h3><figure><img src="https://media.tproger.ru/uploads/2016/11/git_tutorial.jpg" alt="" /></figure><p><a href="https://git-scm.com/docs/gittutorial">Git tutorial</a> — это официальное введение в git, и начать вам можно именно с него.</p><p>Руководство также доступно в виде man-страницы, доступ к которой из терминала можно получить так:</p><p>Также будет полезно прочитать <a href="https://git-scm.com/docs/gittutorial-2">второе руководство</a> и <a href="https://git-scm.com/docs/gitglossary">глоссарий</a>. Они также доступны в виде man-страниц.</p><h3>Learn Git Branching</h3><figure><img src="https://media.tproger.ru/uploads/2016/11/learn_git_branching-cover.png" alt="" /></figure><p><a href="http://learngitbranching.js.org">Learn Git Branching</a> — это интерактивное онлайн-руководство, которое научит вас использовать git в игровом стиле.</p><p>Сайт не работает на мобильных устройствах, но это не страшно, ведь вы всё равно будете использовать Git на компьютере.</p><h3>Try Git</h3><figure><img src="https://media.tproger.ru/uploads/2016/11/try_git-cover.png" alt="" /></figure><p><a href="https://try.github.io/levels/1/challenges/1">Try Git</a> — это интерактивное руководство от GitHub, основанное на онлайн-оболочке, в которой вы можете вводить различные команды и экспериментировать с виртуальным репозиторием. Оно затрагивает все базовые темы, но для изучения продвинутых вопросов вам понадобятся другие ресурсы.</p><p>Кстати, еще больше интерактивных самоучителей есть в другой <a href="https://tproger.ru/digest/trysmthorg/">нашей подборке</a>.</p><h3>Git wiki</h3><figure><img src="https://media.tproger.ru/uploads/2016/11/Git_wiki.jpg" alt="" /></figure><p><a href="https://git.wiki.kernel.org/index.php/Main_Page">Git wiki</a> — это официальная энциклопедия по Git. Здесь можно найти любую интересующую вас информацию: руководства, шпаргалки и т.д. Особое внимание стоит уделить <a href="https://git.wiki.kernel.org/index.php/GitDocumentation">разделу с документацией</a>.</p><h3>Git Reference</h3><figure><img src="https://media.tproger.ru/uploads/2016/11/git_reference.jpg" alt="" /></figure><p><a href="http://gitref.org">Git Reference</a> — это быстрый гайд по основным командам системы с примерами их использования и опциями. Сайт был создан командой GitHub, но сейчас является официальным ресурсом. Кстати, исходный код сайта открыт.</p><h3>Pro Git</h3><figure><img src="https://media.tproger.ru/uploads/2016/11/pro_git_2nd_edition_online-cover.jpg" alt="" /></figure><p><a href="https://git-scm.com/book/en/v2">Pro Git</a> — это официальная книга о Git, доступная всем и каждому. Она доступна онлайн, её можно скачать в несколькких форматах, а также купить печатную версию на Amazon.</p><p>В книге покрываются все необходимые для изучения темы, от основ до аспектов внутренней реализации.</p><h3>Ry’s Git Tutorial</h3><figure><img src="https://media.tproger.ru/uploads/2016/11/RyPress_git_tutorial.png" alt="" /></figure><p><a href="https://web.archive.org/web/20161121145226/http://rypress.com:80/tutorials/git/index">Ry’s Git Tutorial</a> — это отличное написанное обширное онлайн-руководство, затрагивающее не только все основные фичи Git, но и продвинутые темы наподобие работы с патчами и низкоуровневыми командами.</p><p>Каждая тема сопровождается реальными примерами.</p><h3>Git Immersion</h3><figure><img src="https://media.tproger.ru/uploads/2016/11/git_immersion-cover.jpg" alt="" /></figure><p><a href="http://gitimmersion.com">Git Immersion</a> — это экскурсия по основным темам с понятными практическими примерами.</p><p>Для воспроизведения примеров на своём компьютере вам понадобится интерпретатор Ruby.</p><h3>Visualizing Git Concepts with D3</h3><figure><img src="https://media.tproger.ru/uploads/2016/11/visualizing_git_concept_with_D3.jpg" alt="" /></figure><p><a href="http://onlywei.github.io/explain-git-with-d3/">Visualizing Git Concepts with D3</a> — это вебсайт, использующий D3 (JavaScript-библиотеку для визуализации данных) для того, чтобы помочь пользователям понять основные принципы Git. Сайт предоставляет интерактивную оболочку, в которой мы можете вводить команды и получать анимированные результаты.</p><p>Он покрывает все основные команды, а также предоставляет несколько реальных сценариев и режим песочницы. Продвинутые аспекты не затрагиваются, но это отличный ресурс для наглядного изучения основ.</p><h3>Getting Git Right</h3><figure><img src="https://media.tproger.ru/uploads/2016/11/Getting_Git_Right.jpg" alt="" /></figure><p><a href="https://www.atlassian.com/git/">Getting Git Right</a> — это коллекция руководств и статей и глоссарий, собранная Atlassian, создателем BitBucket (аналог GitHub).</p><p>Все руководства весьма детальны и покрывают весь спектр тем, от простых к сложным. Некоторые руководства подразумевают, что вы используете BitBucket, но эти части можно пропустить.</p><p>Кроме того, на нашем сайте также можно найти <a href="https://tproger.ru/tag/git/">много полезных материалов</a>, посвящённых Git. Например, обратите внимание на <a href="https://tproger.ru/translations/git-in-500-words/">руководство «Git за 500 слов»</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что и как в ES6: хитрости, лучшие практики и примеры. Часть вторая. Мэпы, слабые мэпы, обещания, генераторы, async / await, геттеры / сеттеры, символы</title>
      <link>https://tproger.ru/translations/es6-cheatsheet-2</link>
      <comments>https://tproger.ru/translations/es6-cheatsheet-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/es6-cheatsheet-2</guid>
      <description><![CDATA[<p>Продолжение шпаргалки по ES2015 с примерами объясняет работу мэпов: они позволяют устанавливать, получать и искать значения с ключами любого типа.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/es6-cheatsheet-2">Что и как в ES6: хитрости, лучшие практики и примеры. Часть вторая. Мэпы, слабые мэпы, обещания, генераторы, async / await, геттеры / сеттеры, символы</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 05 Dec 2016 17:21:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Продолжение шпаргалки для повседневного использования по ES2015 [ES6] с примерами. Делитесь своими советами в комментариях!</p><h3>Мэпы</h3><p>Мэпы — это очень полезная структура данных. До ES6 хеш-мэпы создавались через объекты:</p><p>Однако это не защищает от случайной перегрузки функций с конкретными именами свойств:</p><p>Настоящие мэпы позволяют устанавливать значения (set), брать их (get), искать их (search) и многое другое.</p><p>Самое замечательное — это то, что теперь мы не обязаны использовать только строки. Можно использовать любой тип как ключ, и он не будет приведён к строковому виду.</p><blockquote>Примечание: использование сложных величин (функций, объектов) невозможно при проверке на равенство при использовании методов наподобие map.get(). Поэтому используйте простые величины: строки, логические переменные и числа.</blockquote><p>Также по мэпам можно итерироваться через .entries():</p><h3>Слабые мэпы</h3><p>В версиях младше ES6 было несколько способов хранения приватных данных. Например, можно было использовать соглашения по именованию:</p><p>Но такие соглашения могут запутать, да и не всегда их придерживаются. Вместо этого можно использовать WeakMaps:</p><p>Фишкой WeakMaps является то, что ключи приватных данных не выдают имена свойств, которые можно увидеть, используя Reflect.ownKeys():</p><p>Практическим примером использования WeakMaps является хранение данных, связанных с элементом DOM, при этом сама DOM не захламляется:</p><p>Как видно выше, когда объект уничтожается сборщиком мусора, WeakMap автоматически удаляет пару ключ-значение, которая идентифицировалась этим объектом.</p><h3>Обещания</h3><p>Обещания, о которых мы подробно рассказывали в <a href="https://tproger.ru/translations/meet-the-promises/">отдельной статье</a>, позволяют превратить “горизонтальный” код:</p><p>В вертикальный:</p><p>До ES6, приходилось использовать <a href="https://github.com/petkaantonov/bluebird">bluebird</a> или <a href="https://github.com/kriskowal/q">Q</a>. Теперь Promises реализованы нативно:</p><p>У нас есть два обработчика, resolve (функция, вызываемая при выполнении обещания) и reject (функция, вызываемая при невыполнении обещания).</p><blockquote>Преимущества Promises: обработка ошибок с кучей вложенных коллбэков — это ад. Обещания же выглядят гораздо приятнее. Кроме того, значение обещания после его разрешения неизменно.</blockquote><p>Вот практический пример использования Promises:</p><p>Мы также можем <b>распараллеливать</b> обещания для обработки массива асинхронных операций, используя Promise.all():</p><h3>Генераторы</h3><p>Подобно обещаниям, позволяющим нам избежать <a href="http://callbackhell.com/">ада коллбэков</a>, генераторы позволяют сгладить код, придавая асинхронному коду синхронный облик. Генераторы — это функции, которые могут <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield">приостановить своё выполнение</a> и впоследствии вернуть значение выражения.</p><p>Простой пример использования приведён ниже:</p><p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/next">next</a> позволяет передать генератор дальше и вычислить новое выражение. Пример выше предельно прост, но на самом деле генераторы можно использовать для написания асинхронного кода в синхронном виде:</p><p>А вот функция-генератор, которая возвращает наши данные:</p><p>Благодаря силе yield мы можем быть уверены, что в entry1 будут нужные данные, которые будут переданы в data1.</p><p>Тем не менее, для обработки ошибок придётся что-то придумать. Можно использовать Promises:</p><p>И мы пишем функцию, которая будет проходить по генератору, используя next, который в свою очередь будет использовать метод request:</p><p>Дополняя обещанием наш генератор, мы получаем понятный способ передачи ошибок путём .catch и reject. При этом использовать генератор всё так же просто:</p><h3>Async Await</h3><p>Хотя эта функция появится только в ES2016, async await позволяет нам делать то же самое, что и в предыдущем примере, но с меньшими усилиями:</p><p>По сути, это работает так же, как и генераторы, но использовать лучше именно эту функцию.</p><h3>Геттеры и сеттеры</h3><p>ES6 привнесла поддержку геттеров и сеттеров. Вот пример:</p><p>Свежие браузеры также позволяют использовать геттеры / сеттеры в объектах, и тогда их можно использовать для вычисленных свойств, добавляя слушатели перед ними:</p><h3>Символы</h3><p>Символы существовали и до ES6, но теперь стал доступен публичный интерфейс для их прямого использования. Символы неизменяемы и уникальны, и их можно использовать в качестве ключей любого хеша.</p><h4>Symbol( )</h4><p>Вызов Symbol() или Symbol(description) создаст уникальный символ, недоступный глобально. Symbol() обычно используется для добавления своей логики в сторонние объекты или пространства имён, но нужно быть осторожным с дальнейшими обновлениями этих библиотек. Например, если вы хотите добавить метод refreshComponent в класс React.Component, убедитесь, что он не совпадёт с методом, добавленном в следующем обновлении:</p><h4>Symbol.for(key)</h4><p>Symbol.for(key) создаст символ, который по-прежнему будет неизменяемым и уникальным, но доступным глобально. Два идентичных вызова Symbol.for(key) вернут одну и ту же сущность Symbol.</p><blockquote>Примечание: это неверно для Symbol(description):</blockquote><p>Символы, в частности, Symbol.for(key), обычно используют для интероперабельности, производя поиск символьного поля в аргументах стороннего объекта с известным интерфейсом, например:</p><p>А в другой библиотеке:</p><blockquote>В качестве примера использования символов для интероперабельности стоит отметить Symbol.iterator, существующий во всех итерируемых типах ES6: массивах, строках, генераторах и т.д. При запуске метода возвращается объект с интерфейсом итератора.</blockquote><p>Кстати, познакомиться с примерами использования всех новых возможностей можно, пройдя <a href="https://tproger.ru/news/learn-modern-javascript/">обучающий видеокурс по JavaScript</a>, о котором мы писали ранее.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что и как в ES6: хитрости, лучшие практики и примеры. Часть первая. let/const, блоки, стрелочные функции, строки, деструктуризация, модули, параметры, классы</title>
      <link>https://tproger.ru/translations/es6-cheatsheet-1</link>
      <comments>https://tproger.ru/translations/es6-cheatsheet-1?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/es6-cheatsheet-1</guid>
      <description><![CDATA[<p>Шпаргалка по ES2015 объясняет, чем let и const отличаются от var: у новых идентификаторов блочная область видимости, а вызов до объявления даёт ReferenceError.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/es6-cheatsheet-1">Что и как в ES6: хитрости, лучшие практики и примеры. Часть первая. let/const, блоки, стрелочные функции, строки, деструктуризация, модули, параметры, классы</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 27 Nov 2016 18:21:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>Шпаргалка для повседневного использования, содержащая подборку советов по ES2015 [ES6] с примерами. Делитесь своими советами в комментариях!</p><h3>var против let / const</h3><blockquote>Кроме var нам теперь доступны 2 новых идентификатора для хранения значений — let и const. В отличие от var, let и const обладают блочной областью видимости.</blockquote><p>Пример использования var:</p><p>А вот что происходит при замене var на let:</p><p>Такое изменение в поведении показывает, что нужно быть осторожным при рефакторинге старого кода, в котором используется var. Простая замена var на let может привести к непредсказуемому поведению программы.</p><blockquote>Примечание: let и const видимы лишь в своём блоке. Таким образом, попытка вызвать их до объявления приведёт к ReferenceError.</blockquote><blockquote>Лучшая практика: Оставьте var в legacy-коде для дальнейшего тщательного рефакторинга. При работе с новым кодом используйте let для переменных, значения которых будут изменяться, и const — для неизменных переменных.</blockquote><h3>Замена немедленно вызываемых функций (IIFE) на блоки (Blocks)</h3><blockquote>Обычно немедленно вызываемые функции используют для ограждения значений в их областях видимости. В ES6 можно создавать блочные области видимости.</blockquote><p>Пример ES6 Blocks:</p><h3>Стрелочные функции</h3><p>Часто при использовании вложенных функций бывает нужно отделить контекст this от его лексической области видимости. Пример приведён ниже:</p><p>Распространённым решением этой проблемы является хранение контекста this в переменной:</p><p>Также мы можем передать нужный контекст this:</p><p>Или привязать контекст:</p><p>Используя стрелочные функции, лексическое значение this не скрыто, и вышеприведённый код можно переписать так:</p><blockquote>Лучшая практика: используйте стрелочные функции всегда, когда вам нужно сохранить лексическое значение this.</blockquote><p>Стрелочные функции также более понятны, когда используются для написания функций, просто возвращающих значение:</p><blockquote>Лучшая практика: используйте стрелочные функции вместо функциональных выражений, когда это уместно.</blockquote><h3>Строки</h3><p>С приходом ES6 стандартная библиотека сильно увеличилась. Кроме предыдущих изменений появились строчные методы, такие как .includes() и .repeat().</p><h4>.includes( )</h4><p>Вместо проверки возвращаемого значения &gt; -1 для проверки на наличие подстроки можно использовать .includes(), возвращающий логическую величину:</p><h4>.repeat( )</h4><p>В ES6 всё намного проще:</p><h4>Шаблонные литералы</h4><p>Используя шаблонные литералы, мы можем спокойно использовать в строках специальные символы.</p><p>Шаблонные литералы также поддерживают интерполяцию, что делает задачу конкатенации строк и значений:</p><p>Гораздо проще:</p><p>В ES5 мы обрабатывали переносы строк так:</p><p>Или так:</p><p>Шаблонные литералы сохраняют переносы строк:</p><p>Шаблонные литералы также могут обрабатывать выражения:</p><h3>Деструктуризация</h3><p>Деструктуризация позволяет нам извлекать значения из массивов и объектов (даже вложенных) и помещать их в переменные более удобным способом.</p><h4>Деструктуризация массивов</h4><h4>Деструктуризация объектов</h4><p>Подробнее о <a href="https://tproger.ru/translations/delaem-kod-chishhe-s-pomoshhju-destrukturizacii-obektov-v-javascript/">деструктуризации в JavaScript</a>.</p><h3>Модули</h3><p>До ES6 нам приходилось использовать библиотеки наподобие <a href="http://browserify.org/">Browserify</a> для создания модулей на клиентской стороне, и <a href="https://nodejs.org/api/modules.html#modules_module_require_id">require</a> в Node.js. С ES6 мы можем прямо использовать модули любых типов (AMD и CommonJS).</p><h4>Экспорт в CommonJS</h4><h4>Экспорт в ES6</h4><p>В ES6 мы можем использовать разные виды экспорта.</p><p>Именованный экспорт:</p><p>Экспорт списка объектов:</p><p>Также мы можем экспортировать функции, объекты и значения, просто используя ключевое слово export:</p><p>И наконец, можно экспортировать связывания по умолчанию:</p><blockquote>Лучшая практика: всегда используйте метод export default в конце модуля. Это чётко покажет, что именно экспортируется, и сэкономит время.</blockquote><h4>Импорт в ES6</h4><p>ES6 предоставляет различные виды импорта. Мы можем импортировать целый файл:</p><blockquote>Важно заметить, что импортирование всего файла приведёт к исполнению всего кода на внешнем уровне этого файла.</blockquote><p>Как и в Python, есть именованный импорт:</p><p>Который можно переименовывать:</p><p>Кроме того, можно импортировать пространство имён:</p><p>И наконец, список значений из модуля:</p><p>Импорт из связывания по умолчанию выглядит так:</p><p>Экспортирование лучше упрощать, но иногда можно смешивать импорт по умолчанию с чем-то ещё. Когда мы экспортируем так:</p><p>Импортировать их можно так:</p><p>При импортировании модуля, экспортированного с использованием синтаксиса CommonJS (как в React), можно сделать:</p><p>Это можно упростить:</p><blockquote>Примечание: экспортируемые значения — это связывания, не ссылки. Поэтому изменение в одном модуле повлечёт за собой изменение в другом.</blockquote><h3>Параметры</h3><p>В ES5 было несколько способов обработки функций со значениями по умолчанию, неопределёнными аргументами и именованными параметрами. В ES6 всё это реализуется, причём с понятным синтаксисом.</p><h4>Параметры по умолчанию</h4><p>В ES6 можно просто указать параметры функции по умолчанию:</p><h4>Остаточные параметры</h4><p>В ES5 неопределённое количество аргументов обрабатывалось так:</p><p>Используя остаточный оператор, можно передавать неопределённое число аргументов:</p><h4>Именованные параметры</h4><p>Одним из шаблонов ES5 для работы с именованными параметрами был шаблон options object, взятый из jQuery.</p><p>Тоже самое можно получить, используя деструктор в качестве формального параметра функции:</p><p>Если мы хотим сделать всё значение опциональным, можно деструктурировать пустой объект:</p><h4>Оператор расширения</h4><p>В ES5 можно было найти максимум массива, используя метод apply над Math.max:</p><p>В ES6 можно использовать оператор расширения для передачи массива значений в качестве параметров функции:</p><p>Также можно интуитивно конкатенировать массивы литералов:</p><h3>Классы</h3><p>До ES6 классы нужно было создавать, добавляя к функции-конструктору свойства, расширяя прототип:</p><p>А расширенные классы — так:</p><p>ES6 предоставляет весьма удобный синтаксический сахар. Классы можно создавать таким образом:</p><p>А расширять — используя ключевое слово extends:</p><blockquote>Лучшая практика: хотя такой синтаксис и скрывает реализацию, новичкам в нём будет проще разобраться, да и написанный код будет чище.</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Разнообразие нейронных сетей. Часть вторая. Продвинутые конфигурации</title>
      <link>https://tproger.ru/translations/neural-network-zoo-2</link>
      <comments>https://tproger.ru/translations/neural-network-zoo-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/neural-network-zoo-2</guid>
      <description><![CDATA[<p>Вторая часть обзора архитектур искусственных нейронных сетей начинается с глубинных свёрточных обратных графических сетей DCIGN и их вероятностной модели.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/neural-network-zoo-2">Разнообразие нейронных сетей. Часть вторая. Продвинутые конфигурации</a>»</p>]]></description>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 12 Oct 2016 19:08:10 GMT</pubDate>
      <content:encoded><![CDATA[<p>В <a href="https://tproger.ru/translations/neural-network-zoo-1/">первой части</a> мы разобрались с базовыми, не очень сложными видами архитектур искусственных нейронных сетей. Настало время закончить начатое.</p><p><a href="http://www.asimovinstitute.org/wp-content/uploads/2016/09/networkZooPoster.png"></a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/1-300x165.png" alt="" /></figure><p>Глубинные свёрточные обратные графические сети (deep convolutional inverse graphics networks, DCIGN) названы слегка некорректно, поскольку они по сути являются вариационными автокодировщиками, кодирующая и декодирующая части которых представлены свёрточной и развёртывающей НС соответственно. Сети такого типа моделируют свойства в виде вероятностей, поэтому их можно научить создавать картинку с собакой и кошкой, даже если сеть видела только картинки, на которых было только одно из животных. Возможно и удаление одного из двух объектов. Также были созданы сети, которые могли менять источник освещения и вращать объект. Сети такого типа обычно обучают методом обратного распространения ошибки.</p><p><a href="https://arxiv.org/pdf/1503.03167v4.pdf">Читать статью</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/2-300x123.png" alt="" /></figure><p>Генеративные состязательные сети (generative adversarial networks, GAN) — это сети другого вида, они похожи на близнецов. Такие сети состоят из любых двух (обычно из FF и CNN), одна из которых контент генерирует, а другая — оценивает. Сеть-дискриминатор получает обучающие или созданные генератором данные. Степень угадывания дискриминатором источника данных в дальнейшем участвует в формировании ошибки. Таким образом, возникает состязание между генератором и дискриминатором, где первый учится обманывать первого, а второй — раскрывать обман (похоже на ситуацию <a href="https://habrahabr.ru/post/275429/">“банкир-фальшивомонетчик”</a>). Обучать такие сети весьма тяжело, поскольку нужно не только обучить каждую из них, но и настроить баланс.</p><p><a href="https://arxiv.org/pdf/1406.2661v1.pdf">Читать статью</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/3-300x233.png" alt="" /></figure><p>Рекуррентные нейронные сети (recurrent neural networks, RNN) — это сети типа FFNN, но с особенностью: нейроны получают информацию не только от предыдущего слоя, но и от самих себя предыдущего прохода. Это означает, что порядок, в котором вы подаёте данные и обучаете сеть, становится важным. Большой сложностью сетей RNN является проблема исчезающего (или взрывного) градиента, которая заключается в быстрой потере информации с течением времени. Конечно, это влияет лишь на веса, а не состояния нейронов, но ведь именно в них накапливается информация. Обычно сети такого типа используются для автоматического дополнения информации.</p><p><a href="https://crl.ucsd.edu/~elman/Papers/fsit.pdf">Читать статью (стр. 179–211)</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/4-300x238.png" alt="" /></figure><p>Сети с долгой краткосрочной памятью (long short term memory, LSTM) стараются решить вышеупомянутую проблему потери информации, используя фильтры и явно заданную клетку памяти. У каждого нейрона есть клетка памяти и три фильтра: входной, выходной и забывающий. Целью этих фильтров является защита информации. Входной фильтр определяет, сколько информации из предыдущего слоя будет храниться в клетке. Выходной фильтр определяет, сколько информации получат следующие слои. Ну а забывающий фильтр, каким бы странным не казался, также выполняет полезную функцию: например, если сеть изучает книгу и переходит на новую главу, какие-то символы из старой можно забыть. Такие сети способны научиться создавать сложные структуры, например, писать как Шекспир или сочинять простую музыку, но и ресурсов они потребляют немало.</p><p><a href="https://web.archive.org/web/20161123045043/http://deeplearning.cs.cmu.edu:80/pdfs/Hochreiter97_lstm.pdf">Читать статью (стр. 1735–1780)</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/5-300x228.png" alt="" /></figure><p>Управляемые рекуррентные нейроны (gated recurrent units, GRU) — это небольшая вариация предыдущей сети. У них на один фильтр меньше, и связи реализованы иначе. Фильтр обновления определяет, сколько информации останется от прошлого состояния и сколько будет взято из предыдущего слоя. Фильтр сброса работает примерно как забывающий фильтр.</p><p><a href="https://arxiv.org/pdf/1412.3555v1.pdf">Читать статью</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/6-300x216.png" alt="" /></figure><p>Нейронные машины Тьюринга (neural Turing machines, NTM) можно рассматривать как абстрактную модель LSTM и попытку показать, что на самом деле происходит внутри нейронной сети. Ячейка памяти не помещена в нейрон, а размещена отдельно с целью объединить эффективность обычного хранилища данных и мощь нейронной сети. Собственно, поэтому такие сети и называются машинами Тьюринга — в силу способности читать и записывать данные и менять состояние в зависимости от прочитанного они являются тьюринг-полными.</p><p><a href="https://arxiv.org/pdf/1410.5401v2.pdf">Читать статью</a></p><p>Двунаправленные RNN, LSTM и GRU (bidirectional recurrent neural networks, bidirectional long / short term memory networks и bidirectional gated recurrent units, BiRNN, BiLSTM и BiGRU) не показаны в таблице, поскольку они ничем не отличаются от своих однонаправленных вариантов. Разница заключается в том, что эти сети используют не только данные из “прошлого”, но и из “будущего”. Например, обычную сеть типа LSTM обучают угадывать слово “рыба”, подавая буквы по одной, а двунаправленную — подавая ещё и следующую букву из последовательности. Такие сети способны, например, не только расширять изображение по краям, но и заполнять дыры внутри.</p><p><a href="http://www.di.ufpe.br/~fnj/RNA/bibliografia/BRNN.pdf">Читать статью (стр. 2673–2681)</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/8-300x76.png" alt="" /></figure><p>Глубинные остаточные сети (deep residual networks, DRN) — это очень глубокие сети типа FFNN с дополнительными связями между отделёнными друг от друга слоями. Такие сети можно обучать на шаблонах глубиной аж до 150 слоёв — гораздо больше, чем можно было бы ожидать. Однако, было показано, что эти сети мало чем отличаются от рекуррентных, и их часто сравнивают с сетями LSTM.</p><p><a href="https://arxiv.org/pdf/1512.03385v1.pdf">Читать статью</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/9-300x240.png" alt="" /></figure><p>Нейронная эхо-сеть (echo state networks, ESN) — это ещё одна разновидность рекуррентных сетей. Её особенностью является отсутствие сформированных слоёв, т.е. связи между нейронами случайны. Соответственно, метод обратного распространения ошибки не срабатывает. Вместо этого нужно подавать входных данные, передавать их по сети и обновлять нейроны, наблюдая за выходными данными.</p><p><a href="https://pdfs.semanticscholar.org/8922/17bb82c11e6e2263178ed20ac23db6279c7a.pdf">Читать статью (стр. 78–80)</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/10-300x240.png" alt="" /></figure><p>Метод экстремального обучения (extreme learning machines, ELM) — это, по сути, сеть типа FFNN, но со случайными связями. Они очень похожи на сети  LSM и ESN, но используются как FFNN. Так происходит не только потому, что они не рекуррентны, но и потому, что их можно обучать просто методом обратного распространения ошибки.</p><p><a href="https://web.archive.org/web/20170329055705/http://www.ntu.edu.sg:80/home/egbhuang/pdf/IEEE-IS-ELM.pdf">Читать статью (стр. 30–59)</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/11-300x242.png" alt="" /></figure><p>Метод неустойчивых состояний (liquid state machines, LSM) похож на эхо-сеть, но есть существенное отличие: сигмоидная активация заменена пороговой функцией, а каждый нейрон является накопительной ячейкой памяти. Таким образом, при обновлении нейрона его значение не становится равным сумме соседей, а прибавляется само к себе, и при достижении порога сообщается другим нейронам.</p><p><a href="https://web.archive.org/web/20120222154641/http://ramsesii.upf.es/seminar/Maass_et_al_2002.pdf">Читать статью (стр. 2531–2560)</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/12-300x228.png" alt="" /></figure><p>Метод опорных векторов (support vector machines, SVM) находит оптимальные решения задачи оптимизации. Классическая версия способна категоризировать линейно разделяемые данные: например, различать изображения с котом Томом и с котом Гарфилдом. В процессе обучения сеть как бы размещает все данные на 2D-графике и пытается разделить данные прямой линией так, чтобы с каждой стороны были данные только одного класса и чтобы расстояние от данные до линии было максимальным. Используя трюк с ядром, можно классифицировать данные размерности n. Что характерно, этот метод не всегда рассматривается как нейронная сеть.</p><p><a href="http://image.diku.dk/imagecanon/material/cortes_vapnik95.pdf">Читать статью (стр. 273–297)</a></p><figure><img src="https://media.tproger.ru/uploads/2016/10/13-300x229.png" alt="" /></figure><p>И наконец, нейронные сети Кохонена (Kohonen networks, KN), также известные как самоорганизующиеся карты (self organising (feature) maps, SOM, SOFM), завершают наш список. Эти сети используют соревновательное обучение для классификации данных без учителя. Сети подаются входные данные, после чего сеть определяет, какие из нейронов максимально совпадают с ними. После этого эти нейроны изменяются для ещё большей точности совпадения, в процессе двигая за собой соседей. Иногда карты Кохонена также не считаются нейронными сетями.</p><p><a href="http://cioslab.vcu.edu/alg/Visualize/kohonen-82.pdf">Читать статью (стр. 59–69)</a></p><p>Вот и всё! После прочтения наших статей и прилагающихся материалов вы точно будете уверенно разбираться в видах нейронных сетей ?</p>]]></content:encoded>
    </item>
    <item>
      <title>Шпаргалка по разновидностям нейронных сетей. Часть первая. Элементарные конфигурации</title>
      <link>https://tproger.ru/translations/neural-network-zoo-1</link>
      <comments>https://tproger.ru/translations/neural-network-zoo-1?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/neural-network-zoo-1</guid>
      <description><![CDATA[<p>Обзор основных видов искусственных нейронных сетей: похожие с виду схемы вроде автокодировщиков AE и VAE различаются обучением и применением.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/neural-network-zoo-1">Шпаргалка по разновидностям нейронных сетей. Часть первая. Элементарные конфигурации</a>»</p>]]></description>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 03 Oct 2016 20:28:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>Новые виды архитектуры нейронных сетей появляются постоянно, и в них можно запутаться. Мы собрали для вас своеобразную шпаргалку, содержащую большую часть существующих видов ИНС. Хотя все они представлены как уникальные, картинки свидетельствуют о том, что многие из них очень похожи.</p><p><a href="http://www.asimovinstitute.org/wp-content/uploads/2016/09/networkZooPoster.png"></a></p><p>Проблема нарисованных выше графов заключается в том, что они не показывают, как соответствующие сети используются на практике. Например, вариационные автокодировщики (VAE) выглядят совсем как простые автокодировщики (AE), но их процессы обучения существенно различаются. Случаи использования отличаются ещё больше, поскольку VAE — это генератор, которому для получения нового образца подаётся новый шум. AE же просто сравнивает полученные данные с наиболее похожим образцом, полученным во время обучения.</p><p>Стоит заметить, что хотя большинство этих аббревиатур общеприняты, есть и исключения. Под RNN иногда подразумевают рекурсивную нейронную сеть, но обычно имеют в виду рекуррентную. Также можно часто встретить использование аббревиатуры RNN, когда речь идёт про любую рекуррентную НС. Автокодировщики также сталкиваются с этой проблемой, когда вариационные и шумоподавляющие автокодировщики (VAE, DAE) называют просто автокодировщиками (AE). Кроме того, во многих аббревиатурах различается количество букв “N” в конце, поскольку в каких-то случаях используется “neural network”, а в каких-то — просто “network”.</p><p>Для каждой архитектуры будет дано очень краткое описание и ссылка на статью, ей посвящённую. Если вы хотите быстро познакомиться с нейронными сетями с нуля, следуйте переведенному нами <a href="https://tproger.ru/translations/learning-neural-networks/">руководству</a>, состоящему всего из четырех шагов.</p><p>Нейронные сети прямого распространения (feed forward neural networks, FF или FFNN) и перцептроны (perceptrons, P) очень прямолинейны, они передают информацию от входа к выходу. Нейронные сети часто описываются в виде слоёного торта, где каждый слой состоит из входных, скрытых или выходных клеток. Клетки одного слоя не связаны между собой, а соседние слои обычно полностью связаны. Самая простая нейронная сеть имеет две входных клетки и одну выходную, и может использоваться в качестве модели логических вентилей. FFNN обычно обучается по методу обратного распространения ошибки, в котором сеть получает множества входных и выходных данных. Этот процесс называется обучением с учителем, и он отличается от обучения без учителя тем, что во втором случае множество выходных данных сеть составляет самостоятельно. Вышеупомянутая ошибка является разницей между вводом и выводом. Если у сети есть достаточное количество скрытых нейронов, она теоретически способна смоделировать взаимодействие между входным и выходными данными. Практически такие сети используются редко, но их часто комбинируют с другими типами для получения новых.</p><p><a href="http://www.ling.upenn.edu/courses/cogs501/Rosenblatt1958.pdf">Читать статью (стр. 386)</a></p><p>Сети радиально-базисных функций (radial basis function, RBF) — это FFNN, которая использует радиальные базисные функции как функции активации. Больше она ничем не выделяется ?</p><figure><img src="https://media.tproger.ru/uploads/2016/09/3-4-296x300.png" alt="" /></figure><p>Нейронная сеть Хопфилда (Hopfield network, HN) — это полносвязная нейронная сеть с симметричной матрицей связей. Во время получения входных данных каждый узел является входом, в процессе обучения он становится скрытым, а затем становится выходом. Сеть обучается так: значения нейронов устанавливаются в соответствии с желаемым шаблоном, после чего вычисляются веса, которые в дальнейшем не меняются. После того, как сеть обучилась на одном или нескольких шаблонах, она всегда будет сводиться к одному из них (но не всегда — к желаемому). Она стабилизируется в зависимости от общей “энергии” и “температуры” сети. У каждого нейрона есть свой порог активации, зависящий от температуры, при прохождении которого нейрон принимает одно из двух значений (обычно -1 или 1, иногда 0 или 1).  Такая сеть часто называется сетью с ассоциативной памятью; как человек, видя половину таблицы, может представить вторую половину таблицы, так и эта сеть, получая таблицу, наполовину зашумленную, восстанавливает её до полной.</p><p><a href="https://bi.snu.ac.kr/Courses/g-ai09-2/hopfield82.pdf">Читать статью (стр. 2554–2558)</a></p><p>Цепи Маркова (Markov chains, MC или discrete time Markov Chains, DTMC) — это предшественники машин Больцмана (BM) и сетей Хопфилда (HN). Их смысл можно объяснить так: каковы мои шансы попасть в один из следующих узлов, если я нахожусь в данном? Каждое следующее состояние зависит только от предыдущего. Хотя на самом деле цепи Маркова не являются НС, они весьма похожи. Также цепи Маркова не обязательно полносвязны.</p><p><a href="http://www.americanscientist.org/libraries/documents/201321152149545-2013-03Hayes.pdf">Читать статью (стр. 252)</a></p><p>Машина Больцмана (Boltzmann machine, BM) очень похожа на сеть Хопфилда, но в ней некоторые нейроны помечены как входные, а некоторые — как скрытые. Входные нейроны в дальнейшем становятся выходными. Машина Больцмана — это стохастическая сеть. Обучение проходит по методу обратного распространения ошибки или по алгоритму сравнительной расходимости.  В целом процесс обучения очень похож на таковой у сети Хопфилда.</p><p>Читать статью (стр. 282–317)</p><p>Ограниченная машина Больцмана (restricted Boltzmann machine, RBM) удивительно похожа на машину Больцмана и, следовательно, на сеть Хопфилда. Единственной разницей является её ограниченность. В ней нейроны одного типа не связаны между собой. Ограниченную машину Больцмана можно обучать как FFNN, но с одним нюансом: вместо прямой передачи данных и обратного распространения ошибки нужно передавать данные сперва в прямом направлении, затем в обратном. После этого проходит обучение по методу прямого и обратного распространения ошибки.</p><p>Автокодировщик (autoencoder, AE) чем-то похож на FFNN, так как это скорее другой способ использования FFNN, нежели фундаментально другая архитектура. Основной идеей является автоматическое кодирование (в смысле сжатия, не шифрования) информации. Сама сеть по форме напоминает песочные часы, в ней скрытые слои меньше входного и выходного, причём она симметрична. Сеть можно обучить методом обратного распространения ошибки, подавая входные данные  и задавая ошибку равной разнице между входом и выходом.</p><p><a href="https://pdfs.semanticscholar.org/f582/1548720901c89b3b7481f7500d7cd64e99bd.pdf">Читать статью (стр. 291–294)</a></p><p>Разреженный автокодировщик (sparse autoencoder, SAE) — в каком-то смысле противоположность обычного. Вместо того, чтобы обучать сеть отображать информацию в меньшем “объёме” узлов, мы увеличиваем их количество. Вместо того, чтобы сужаться к центру, сеть там раздувается. Сети такого типа полезны для работы с большим количеством мелких свойств набора данных. Если обучать сеть как обычный автокодировщик, ничего полезного не выйдет. Поэтому кроме входных данных подаётся ещё и специальный фильтр разреженности, который пропускает только определённые ошибки.</p><p><a href="https://papers.nips.cc/paper/3112-efficient-learning-of-sparse-representations-with-an-energy-based-model.pdf">Читать статью</a></p><p>Вариационные автокодировщики (variational autoencoder, VAE) обладают схожей с AE архитектурой, но обучают их иному: приближению вероятностного распределения входных образцов. В этом они берут начало от машин Больцмана. Тем не менее, они опираются на байесовскую математику, когда речь идёт о вероятностных выводах и независимости, которые интуитивно понятны, но сложны в реализации. Если обобщить, то можно сказать что эта сеть принимает в расчёт влияния нейронов. Если что-то одно происходит в одном месте, а что-то другое – в другом, то эти события не обязательно связаны, и это должно учитываться.</p><p><a href="https://arxiv.org/pdf/1312.6114v10.pdf">Читать статью</a></p><p>Шумоподавляющие автокодировщики (denoising autoencoder, DAE) — это AE, в которые входные данные подаются в зашумленном состоянии. Ошибку мы вычисляем так же, и выходные данные сравниваются с зашумленными. Благодаря этому сеть учится обращать внимание на более широкие свойства, поскольку маленькие могут изменяться вместе с шумом.</p><p><a href="http://machinelearning.org/archive/icml2008/papers/592.pdf">Читать статью</a></p><p>Сеть типа “deep belief” (deep belief networks, DBN) — это название, которое получил тип архитектуры, в которой сеть состоит из нескольких соединённых RBM или VAE. Такие сети обучаются поблочно, причём каждому блоку требуется лишь уметь закодировать предыдущий. Такая техника называется “жадным обучением”, которая заключается в выборе локальных оптимальных решений, не гарантирующих оптимальный конечный результат. Также сеть можно обучить (методом обратного распространения ошибки) отображать данные в виде вероятностной модели. Если использовать обучение без учителя, стабилизированную модель можно использовать для генерации новых данных.</p><p><a href="https://papers.nips.cc/paper/3048-greedy-layer-wise-training-of-deep-networks.pdf">Читать статью (стр. 153)</a></p><p>Свёрточные нейронные сети (convolutional neural networks, CNN) и глубинные свёрточные нейронные сети (deep convolutional neural networks, DCNN) сильно отличаются от других видов сетей. Обычно они используются для обработки изображений, реже для аудио. Типичным способом применения CNN является классификация изображений: если на изображении есть кошка, сеть выдаст “кошка”, если есть собака — “собака”. Такие сети обычно используют “сканер”, не парсящий все данные за один раз. Например, если у вас есть изображение 200×200, вы не будете сразу обрабатывать все 40 тысяч пикселей. Вместо это сеть считает квадрат размера 20 x 20 (обычно из левого верхнего угла), затем сдвинется на 1 пиксель и считает новый квадрат, и т.д. Эти входные данные затем передаются через свёрточные слои, в которых не все узлы соединены между собой. Эти слои имеют свойство сжиматься с глубиной, причём часто используются степени двойки: 32, 16, 8, 4, 2, 1. На практике к концу CNN прикрепляют FFNN для дальнейшей обработки данных. Такие сети называются глубинными (DCNN).</p><p><a href="http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf">Читать статью (стр. 2278–2324)</a></p><p>Развёртывающие нейронные сети (deconvolutional networks, DN), также называемые обратными графическими сетями, являются обратным к свёрточным нейронным сетям. Представьте, что вы передаёте сети слово “кошка”, а она генерирует картинки с кошками, похожие на реальные изображения котов. DNN тоже можно объединять с FFNN. Стоит заметить, что в большинстве случаев сети передаётся не строка, а какой бинарный вектор: например, &lt;0, 1&gt; — это кошка, &lt;1, 0&gt; — собака, а &lt;1, 1&gt; — и кошка, и собака.</p><p><a href="http://www.matthewzeiler.com/pubs/cvpr2010/cvpr2010.pdf">Читать статью</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Подборка шпаргалок для программистов</title>
      <link>https://tproger.ru/digest/top-cheatsheets</link>
      <comments>https://tproger.ru/digest/top-cheatsheets?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/top-cheatsheets</guid>
      <description><![CDATA[<p>Страницы-шпаргалки по командной строке, базам данных и программированию помогут вспомнить свойство CSS или точное написание команды bash.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/top-cheatsheets">Подборка шпаргалок для программистов</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Perl]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 07 Sep 2016 21:11:17 GMT</pubDate>
      <content:encoded><![CDATA[<p>Даже самые опытные программисты не всегда могут вспомнить название какого-нибудь свойства в CSS или правильное написание команды bash. Поэтому всегда удобно иметь у себя в закладках страницу, попав на которую, можно вспомнить всё. Мы собрали для вас множество таких страниц-шпаргалок в этой статье.</p><figure><img src="https://media.tproger.ru/uploads/2016/09/tar.png" alt="" /></figure><h3>Командная строка</h3><ul><li><a href="http://www.ss64.com/nt/index.html">Командная строка Windows NT/XP</a></li><li><a href="http://www.ss64.com/bash/index.html">BASH</a></li><li><a href="http://www.csulb.edu/~murdock/dosindex.html">DOS</a></li></ul><h3>Базы данных</h3><ul><li><a href="http://www.vttoth.com/oracle.htm">Oracle DB</a></li><li><a href="http://www.yagc.ndo.co.uk/cheatsheets/plsql_cheatsheet.html">Oracle PL/SQL</a></li><li><a href="http://www.ss64.com/ora/index.html">Команды Oracle 9i</a></li><li><a href="http://www.petefreitag.com/cheatsheets/postgresql/">PostgreSQL</a></li><li><a href="http://www.ss64.com/sql/index.html">Команды SQL Server 2005</a></li></ul><h3>Программирование</h3><ul><li><a href="https://web.archive.org/web/20170215034632/http://www.digilife.be:80/quickreferences/QRC/Ada%20Syntax%20Card.pdf">Синтаксис Ada</a> (PDF)</li><li><a href="http://cs.fit.edu/~mmahoney/cse2050/how2cpp.html">C++</a></li><li><a href="http://www.dreamincode.net/downloads/ref_sheets/cpp_reference_sheet.pdf">C++</a> (PDF)</li><li><a href="https://web.archive.org/web/20161123044245/http://www.digilife.be:80/quickreferences/QRC/Delphi%20Technical%20Reference%20Card%207.20.pdf">Delphi</a> (PDF)</li><li><a href="http://lesliefranke.com/sandbox/ref/javacheatsheet.html">Синтаксис Java</a></li><li><a href="http://www4.ncsu.edu/~kaltofen/courses/Languages/JavaExamples/cpp_vs_java/">Сравнение Java и C++</a></li><li><a href="http://juerd.nl/site.plp/perlcheat">PERL</a></li><li><a href="http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlcheat.pod">PERL Reference Guide</a></li><li><a href="https://umanitoba.ca/computing/ist/internal/admin_sys/project_review/media/Perl_Regular_Expressions_Quick_Reference_Card.pdf">PERL Regular Expression Quick Reference</a> (PDF)</li><li><a href="http://www.blueshoes.org/en/developer/php_cheat_sheet">Шпаргалка PHP-разработчика</a></li><li><a href="https://web.archive.org/web/20170612092452/http://www.yukoncollege.yk.ca/~ttopper/COMP118/rCheatSheet.html">Python</a></li><li><a href="http://www.threaded.com/ruby_cheatsheet.htm">Сниппеты по Ruby</a></li></ul><h3>Unix/Linux</h3><ul><li><a href="https://tproger.ru/articles/cool-linux-commands/">Полезные команды Linux, о которых вы не знали</a></li><li><a href="http://www.unixguide.net/linux/linuxshortcuts.shtml">Горячие клавиши и команды Linux</a></li><li><a href="https://web.archive.org/web/20101204043357/http://homepage.powerup.com.au/~squadron/linux_manual.pdf">Одностраничный мануал по Linux</a> (PDF)</li><li><a href="http://www.gasmi.net/docs/tcp.html">TCP порты</a></li><li>Treebeard’s Unix Cheat Sheet</li><li><a href="http://www.pixelbeat.org/cmdline.html">Замечания по командной строке Unix</a></li></ul><h3>Веб-разработка</h3><ul><li><a href="https://www.kobzarev.com/wp-content/uploads/cheatsheets/css/css-cheat-sheet.pdf">Короткий гайд по CSS</a></li><li><a href="http://www.inmensia.com/files/pictures/internal/CheatSheetDrupal4.7.png">Drupal 4.7</a></li><li><a href="https://web.archive.org/web/20170321181133/http://thejackol.com:80/htaccess-cheatsheet/">.htaccess</a></li><li><a href="http://www.angelfire.com/nm/thehtmlsource/html/cheatsheet.html">HTML</a></li><li><a href="http://planetozh.com/download/refcards/DOM-HTML-2.pdf">HTML DOM</a> (PDF)</li><li><a href="http://www.define-web.com/jquery_cheat_sheet/jquery_cheat_sheet_080306_v1.pdf">JQuery</a> (PDF)</li><li><a href="http://www.define-web.com/jquery_cheat_sheet/jquery_cheat_sheet_080306_v1_pg2.pdf">JQuery</a> (вторая страница) (PDF)</li><li><a href="http://www.petefreitag.com/cheatsheets/xhtml/">XHTML &amp; HTML</a></li><li><a href="https://web.archive.org/web/20160315061514/http://www.digilife.be/quickreferences/QRC/XML%20Syntax%20Quick%20Reference.pdf">XML Syntax Quick Reference</a> (PDF)</li><li><a href="https://web.archive.org/web/20170110181756/http://www.digilife.be:80/quickreferences/QRC/XML%20Schema%20-%20Structures.pdf">XML Schema Reference</a> (PDF)</li><li><a href="https://web.archive.org/web/20170329010409/http://www.digilife.be:80/quickreferences/QRC/XSLT%20and%20XPath%20Quick%20Reference.pdf">XSLT и XPath</a> (PDF)</li></ul><h3>Прочее</h3><ul><li><a href="http://www.stdout.org/~winston/latex/latexsheet.pdf">LaTEX</a> (PDF)</li><li><a href="http://www.petefreitag.com/cheatsheets/ascii-codes/">ASCII Коды</a></li><li><a href="http://www.slac.stanford.edu/grp/cd/soft/cvs/cvs_cheatsheet.html">CVS</a></li><li><a href="https://tproger.ru/translations/regular-expression-python/">Регулярные выражения в Python</a></li><li><a href="http://www.tug.org/texshowcase/cheat.pdf">Теоретическая информатика</a> (PDF)</li><li><a href="https://web.archive.org/web/20170110130306/http://www.digilife.be:80/quickreferences/qrc/uml%20quick%20reference%20card.pdf">UML</a> (PDF)</li><li><a href="http://www.holub.com/goodies/uml/index.html">UML</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Шпаргалка для айтишника: как продать свою идею директору</title>
      <link>https://tproger.ru/articles/how-to-talk-to-manager</link>
      <comments>https://tproger.ru/articles/how-to-talk-to-manager?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Антон]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/how-to-talk-to-manager</guid>
      <description><![CDATA[<p>Тренер Microsoft по лицензированию Тимур Сабаев дал подсказки, как объяснить руководству риски экономии на лицензионном ПО и обновлениях.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/how-to-talk-to-manager">Шпаргалка для айтишника: как продать свою идею директору</a>»</p>]]></description>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Jun 2016 14:03:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>Поддержка IT-системы в работоспособном состоянии — одна из главных задач IT-специалиста, и чаще всего ее выполнению мешает вовсе не нехватка профессионализма, а отсутствие взаимопонимания между IT-специалистом и его руководством. Особенно ярко это проявляется тогда, когда руководство начинает экономить на лицензионном программном обеспечении или обновлениях — пропуская мимо ушей все аргументы о рисках такого подхода.</p><p>Тимур Сабаев, сертифицированный тренер Microsoft по лицензированию, выступая на семинаре ГК «ГЭНДАЛЬФ» «Создание безопасной отказоустойчивой IT-среды», дал подсказки, которые помогут IT-специалисту при общении с руководством.</p><h3>Делайте свою работу прозрачной</h3><p>Директор, который ставит задачу и видит только результат, вряд ли сможет адекватно проанализировать ситуацию. Специфика работы IT-специалиста для него остается загадкой. Приоткройте завесу тайны — для этого не нужно сыпать техническими терминами, объясните буквально на пальцах, почему вы сделаете так, а не иначе, и к чему приведут все варианты (желательно, в долгосрочной перспективе).</p><blockquote><b>Пример</b>: директор увеличивает бюджет проекту и видит на выходе упавшие показатели. Сокращает бюджет — и вдруг показатели растут. Сделав очевидные выводы, он не понимает, что падение показателей связано с этапом внедрения и освоения на выделенные средства новой, более качественной и продвинутой системы. А в условиях урезанного бюджета IT-специалисту буквально из двух машин пришлось собирать одну, что увеличило текущие показатели, но обернулось катастрофой в будущем.</blockquote><h3>Используйте конкретные цифры</h3><p>И IT-специалист, и директор говорят на языке цифр — и все равно друг друга не понимают. Цифры, которых понятны директору — это валюта, «человекочасы», KPI. Чтобы предоставить эти данные, проводите регулярный аудит своей инфраструктуры.</p><p>Посчитайте количество компьютеров и лицензий — и возле каждой единицы поставьте ценник, а затем распишите затраты человекочасов на обслуживание.</p><p>Пусть будет ясна стоимость привлечения нового рабочего места, стоимость владения рабочим местом, стоимость утилизации рабочего места. Оцените уровень безопасности своей системы в процентах, опишите допустимый — и вам будет несложно пояснить, что снижение этой цифры будет связано, например, с устаревшей программой. Руководство получит и инструмент для оценки реальной ситуации, и чувство контроля над происходящим — а к вам останется гораздо меньше вопросов.</p><h3>Помогите поменять точку зрения</h3><p>В современном мире уже не принято рассматривать необходимость лицензионного программного обеспечения с позиции «потратим деньги только для того, чтобы не разориться на штрафах за нелицензионное ПО». Лицензии и продвинутое оборудование бизнес начинает воспринимать как инвестицию. А считать прибыль всегда приятнее, чем предотвращать убытки — поэтому рисуйте перспективу роста вложенных денег.</p><p>Объясните, как новая CRM-система поможет компании быстрее продать, обойти конкурента, и, следовательно, выжить в сложной ситуации. Программа или оборудование станут не просто инструментом — а активом, в которой захочется вкладывать ресурсы и который необходимо будет защищать.</p><h3>Напомните, что платить приходится за все</h3><p>Штрафы и проверки далеко не всегда пугают руководство — кто-то надеется, что это обойдет стороной именно их фирму, кто-то полагается на связи. Но если вы столкнулись с ситуацией, когда руководитель предлагает использовать нелицензионное ПО, напомните, что бесплатный сыр бывает только в мышеловке.</p><p>Пора забыть о романтике пиратства: те, кто тратит свое время и деньги на создание нелицензионного программного обеспечения, в большинстве случаев рассчитывает вернуть эти средства другим путем. Например, получив доступ к ценным данным вашей организации через вирусы, которые могут быть изначально вшиты в пиратскую сборку программ.</p><blockquote><b>Расскажите директору следующую историю</b>: системный администратор небольшого подмосковного предприятия не смог добиться установки легального софта «хотя бы в бухгалтерии». В бухгалтерии — 15 компьютеров, благодаря которым контролируется работа со складом, поступление и списание сырья, оплачиваются услуги контрагентов, услуги транспортной компании и прочее. Нелегальный софт стал легкой мишенью для вирусной атаки, из-за которой работа бухгалтерии остановилась на неделю, и это обошлось предприятию в 1 миллион долларов.</blockquote><h3>Давайте выбирать — но из лучших готовых вариантов</h3><p>Если вам нужно продвинуть свою идею для оптимизации, подготовьте два варианта решения вашей задачи — не больше и не меньше. Опишите бюджет и сроки, дайте вашему руководству возможность сделать выбор на основе конкретных данных — это располагает. Если же вы сами придерживаетесь конкретного варианта, его преимущества должны быть очевидны.</p><h4>Покупать новую операционную систему или использовать старую, потому что за нее «уплочено»?</h4><p>Позвольте руководству сделать выводы с помощью следующего иллюстративного примера: с 8 апреля 2014 г. поддержка и выпуск обновлений для Windows XP больше не доступны –использовать ее по привычке или ради экономии все равно что гостеприимно распахнуть дверь киберпреступникам.</p><p>Связано это с тем, что с каждым обновлением для линейки своей продукции компания Microsoft рассказывает об обнаруженных уязвимостях, которые могут быть применены и для Windows XP как для предшественницы современных операционных систем Microsoft. Вот только обновления на Windows XP, закрывающие данные лазейки, уже недоступны — а значит, киберпреступники смогут использовать официальную информацию для взлома системы.</p><p>Подводя итоги, надо сказать, что это далеко не все пути для IT-специалиста найти подход к генеральному или финансовому директору компании для продвижения своих идей. Если же переговоры раз за разом заходят в тупик, есть еще один вариант: зовите на помощь продавца, у которого собираетесь закупать нужное программное обеспечение и оборудование. В конце концов, продавать — это его задача.</p><p>За материал выражаем благодарность специалистам <a href="https://gendalf.ru/">ГК «ГЭНДАЛЬФ»</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Большая подборка полезных практических и обучающих материалов по Java</title>
      <link>https://tproger.ru/digest/java</link>
      <comments>https://tproger.ru/digest/java?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/java</guid>
      <description><![CDATA[<p>Полезные материалы для изучения Java от начального до продвинутого уровня. Курсы, книги, библиотеки, практические задачи и ресурсы по Java 9 — все в одном месте.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/java">Большая подборка полезных практических и обучающих материалов по Java</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Для продвинутых]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Feb 2016 09:41:45 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Key Takeaways</b><br />- Java остается одним из самых востребованных языков программирования<br />- Для изучения доступны бесплатные курсы, книги и практические задачи<br />- Ключевые библиотеки (JUnit, HttpClient, Commons) ускоряют промышленную разработку<br />- Java 9 принесла модульную систему, JShell и улучшения Stream API</p><p>Java — язык программирования, который очень строго соответствует принципам объектно-ориентированного программирования. В этой статье вы найдете несколько полезных материалов, с которых стоит начать знакомство с языком.</p><h2>Для начинающих</h2><ul><li>Отличная <a href="http://www.skipy.ru/philosophy/beginning.html">статья</a>, в которой описано, как стоит подходить к изучению Java. После прочтения стоит заглянуть и в другие разделы сайта <a href="http://www.skipy.ru">Skipy.ru</a>, это уже будет полезно не только начинающим.</li><li>Study-Java — сайт, полностью состоящий из туториалов по Java, которые подскажут вам, в каком направлении стоит идти и какие навыки нужно вырабатывать в первую очередь.</li><li><a href="http://www.studytonight.com/java/">Курс</a> по основам языка Java.</li><li>Обширное <a href="http://beginnersbook.com/java-tutorial-for-beginners-with-examples/">руководство</a> по многим темам с примерами кода.</li><li><a href="https://stepik.org/course/Java-Базовый-курс-187">Базовый курс</a> по Java на ресурсе Stepik.</li><li>Более <a href="https://jsehelper.blogspot.ru/2016/01/blog-post_59.html">350 вопросов с ответами</a> для подготовки к интервью на позицию Junior Java Developer.</li><li>Наша <a href="https://tproger.ru/digest/java-learning-materials/">подборка материалов</a> для изучения языка Java.</li><li><a href="https://www.ntu.edu.sg/home/ehchua/programming/index.html">Подборка полезных советов</a> от Наньянского технологического университета — там есть аналогичные материалы и по другим темам.</li></ul><p>Форумы, на которых вы можете задать возникшие вопросы:</p><ul><li><a href="http://javatalks.ru/">JavaTalks</a>;</li><li><a href="http://forum.vingrad.ru/forum/java-forum.html">VPF:Java</a>;</li><li>Раздел Java на SQL.ru;</li><li>Раздел Java на <a href="http://www.cyberforum.ru/java/">CyberForum</a></li><li>Группа <a href="http://ru-java.livejournal.com/">ru-java</a> в ЖЖ;</li><li>И, конечно же, <a href="http://vk.com/topic-30666517_28097974">обсуждение</a> в нашей группе. Не забывайте про него.</li></ul><h2>Для продвинутых</h2><ul><li>Раздел Java на <a href="http://www.developer.com/java">developer.com</a> собрал в себе руководства как по целым пластам языка, вроде Enterprise Edition, так и разъяснения отдельных нюансов, вроде новомодных лямбда-выражений. Вот, например, <a href="http://www.developer.com/java/other/article.php/3556176/An-Introduction-to-Java-Annotations.htm">статья</a>, прочитав которую, вы разберётесь с тем, что такое аннотации, зачем они нужны и как правильно их использовать.</li><li>На сайте Tutorials Point есть <a href="http://www.tutorialspoint.com/java/index.htm">раздел</a> с исчерпывающим количеством туториалов по Java. Также там есть отдельный <a href="http://www.tutorialspoint.com/java8/index.htm">раздел для Java 8</a>.</li><li><a href="http://java2s.com/">Java2S</a> — коллекция примеров на все случаи жизни. Примечательно, что здесь есть не только чистая Java, но и работа с разными библиотеками, например JUnit. Хорошо описаны и нововведения Java 8 — Date-Time API, лямбды, потоки (streams).</li><li><a href="https://www.youtube.com/channel/UCxiBXBY1a-axNVGIvQKGcNA">Oskar Veerhoek</a> — канал на YouTube, посвящённый OpenGL. Если вы собираетесь связать свою жизнь с программированием, маловероятно, что вам никогда не придётся работать с графикой. В течение курса из 41 видео автор расскажет вам, как работать с OpenGL в Java. Курс начинается с самых основ и написания 2D Minecraft'а, а заканчивается шейдерами, освещением и созданием 3D комнаты.</li></ul><h2>Для всех</h2><ul><li><a href="http://www.java-tips.org/">Java-Tips</a> — сборник готовых рецептов, шпаргалок, туториалов и полезных библиотек… Сайт будет незаменим для любого Java-программиста, особенно если вы только начинаете изучать язык. Отдельное спасибо стоит сказать тому, кто сортировал это всё — вам не составит труда найти здесь то, что вам нужно. Присутствуют материалы как по Java SE, так и по Enterprise и Micro версиям.</li><li>Регулярно обновляемый <a href="http://javaconceptoftheday.com">список</a> вопросов и ответов.</li><li><a href="http://findnerd.com/NerdDigest/JAVA/">Примеры</a> решённых практических задач.</li><li>Структурированный <a href="https://metanit.com/java/tutorial/">справочник</a> по языку.</li><li>Подробное <a href="https://www.tutorialspoint.com/java/index.htm">руководство</a> с примерами по каждой теме.</li><li>Обучающий <a href="http://www.w3resource.com/java-tutorial/">материал</a> от w3resource.</li><li><a href="http://www.oracle.com/technetwork/java/index-138747.html">Учебное пособие</a> от Oracle, создателей языка.</li><li>Помните, что <a href="https://docs.oracle.com/javase/7/docs/api/">официальная документация</a> — это источник самой достоверной и качественной информации.</li><li>Напоминаем, что на нашем сайте тоже <a href="https://tproger.ru/tag/java/">есть</a> порядочное количество статей по этому языку.</li></ul><h2>Практика</h2><ul><li>Бесплатные задачи, отсортированные по категориям на Codingbat;</li><li>Cписок задач от автора блога eax.me;</li><li>Олимпиадные задачи с ACMP;</li><li>Олимпиадные задачи с Codeforces;</li><li>Задачи с ответами на <a href="https://www.codewars.com">Codewars</a>.</li></ul><h2>Полезные библиотеки</h2><ul><li><a href="http://www.junit.org/">JUnit</a><br />Любой код должен сопровождаться тестированием. Многие очень напрасно об этом забывают. Эта библиотека предназначена для автоматизации модульного тестирования. Еще несколько инструментов для тестирования в Java, вы найдете в <a href="https://tproger.ru/translations/12-tools-for-unit-tests/">нашей подборке</a>.</li><li><a href="http://hc.apache.org/httpclient-3.x/">HttpClient</a><br />Библиотека для работы с HTTP ресурсами.</li><li><a href="http://commons.apache.org/lang/">CommonsLang</a><br />То, что «забыли» включить в JDK.</li><li><a href="http://commons.apache.org/math/">CommonsMath</a><br />Отличное дополнение к java.math.</li><li><a href="http://commons.apache.org/logging/">CommonsLogging</a><br />Если вы используете для логирования System.out.println(), то вам стоит отрубить себе рук лучше воспользуйтесь этой библиотекой, так будет правильнее.</li><li><a href="http://commons.apache.org/net/">CommonsNet</a><br />Логическое продолжение java.net, множество классов для работы с сетевыми протоколами.</li><li><a href="http://commons.apache.org/vfs/">CommonsVFS</a><br />Библиотека, которая поможет вам абстрагироваться от способа хранения файлов — вы сможете достаточно обобщённо иметь к ним доступ по FTP, SFTP, WEBDAV, (G)ZIP и т.д.</li><li><a href="http://commons.apache.org/io/">CommonsIO</a><br />С ней работать с вводом-выводом станет значительно проще.</li></ul><h2>Java 9</h2><p>О том, какие изменения появились в Java 9, читайте в <a href="https://tproger.ru/translations/java-9-features-examples/">нашем обзоре</a> с примерами.</p><h3>Статьи</h3><ul><li><a href="https://www.sitepoint.com/ultimate-guide-to-java-9/">Подробный гайд по Java 9</a>;</li><li><a href="https://www.infoq.com/articles/Latest-Project-Jigsaw-Usage-Tutorial">Знакомство с Project Jigsaw</a>;</li><li>Java 9 Stream API:  <a href="http://blog.codefx.org/java/dev/java-9-stream/">введение</a> и <a href="http://www.baeldung.com/java9-stream-collectors">материал по коллекторам</a>;</li><li><a href="http://iteratrlearning.com/java/2017/03/12/java9-process-api.html">Java 9 Process API</a>;</li><li><a href="http://blog.joda.org/2017/02/java-time-jsr-310-enhancements-java-9.html">Улучшения в Java Time (JSR-310)</a>;</li><li><a href="https://www.voxxed.com/blog/2016/10/java-9-series-concurrency-updates/">Конкурентность</a>;</li><li><a href="http://blog.codefx.org/java/dev/java-9-optional/">Новое в Optional</a>;</li><li><a href="https://www.sitepoint.com/deep-dive-into-java-9s-stack-walking-api/">Разбираемся с Stack-Walking API</a>;</li><li><a href="http://www.baeldung.com/java-9-collections-factory-methods">Коллекции</a>;</li><li><a href="http://marxsoftware.blogspot.de/2016/08/applying-jdk-9-deprecated-enhancements.html">«Applying @Deprecated Enhancements»</a>;</li><li><a href="https://www.voxxed.com/blog/2016/11/java-9-series-variable-handles/">Variable Handles</a>;</li><li><a href="https://www.sitepoint.com/reflection-vs-encapsulation-in-the-java-module-system/">Рефлексия vs Инкапсуляция</a>;</li><li>Создание multi-release JAR-файлов при помощи Maven: <a href="http://word-bits.flurg.com/multrelease-jars/">о формате JAR</a>, и <a href="http://in.relation.to/2017/02/13/building-multi-release-jars-with-maven/">о формате JAR с использованием Maven</a>;</li><li><a href="https://www.infoq.com/news/2017/02/java-memory-limit-container">Ограничения памяти и Docker</a>;</li><li><a href="http://jakubdziworski.github.io/java/2016/07/31/jshell-getting-started-examples.html">Введение в JShell</a>.</li></ul><p>Больше статей можно найти на <a href="http://www.baeldung.com/java-9">этом сайте</a>.</p><h3>Блоги</h3><ul><li><a href="https://blogs.oracle.com/java/">Oracle</a> (нет тега Java 9);</li><li><a href="http://sitepoint.com/tag/java-9/">SitePoint</a>;</li><li><a href="https://www.voxxed.com/blog/tag/java-9/">Voxxed</a> (выделим <a href="https://www.voxxed.com/blog/tag/java-9-series/">отличный цикл</a>);</li><li><a href="http://www.baeldung.com/tag/java-9/">Baeldung</a>;</li><li><a href="http://iteratrlearning.com/articles">Iteratr Learning</a> (нет тега Java 9);</li><li><a href="http://blog.codefx.org/tag/java-9/">CodeFX</a>;</li><li><a href="http://blog.joda.org/search/label/java9">Joda.</a></li></ul><h3>Книги и курсы</h3><ul><li>Курс «Java 9 Modularity: First Look»;</li><li>Книга <a href="http://shop.oreilly.com/product/0636920049494.do">«Java 9 Modularity»</a>;</li><li>Книга «Mastering Java 9»;</li><li>Книга «Modular Programming in Java 9»;</li><li>Книга «Java 9 with JShell»;</li><li>Книга «Java 9 Module System».</li></ul><p>В комментариях пишите, какие ресурсы были полезны для вас при изучении Java, самое интересное добавим в статью.</p><h2>Часто задаваемые вопросы</h2><h3>Сколько времени нужно, чтобы выучить Java?</h3><p>Основы синтаксиса можно освоить за 2–3 месяца при регулярных занятиях. Для уверенного владения языком на уровне Junior-разработчика обычно требуется 6–12 месяцев практики, включая работу с библиотеками и фреймворками.</p><h3>С чего лучше начать изучение Java новичку?</h3><p>Начните с базового курса на Stepik или официального учебного пособия от Oracle. Параллельно решайте задачи на Codewars или Codingbat — практика важнее теории. Когда освоите основы, переходите к изучению библиотек JUnit и Apache Commons.</p><h3>Java или Kotlin — что выбрать в 2026 году?</h3><p>Оба языка работают на JVM и востребованы на рынке. Java остается стандартом для enterprise-разработки, банковских систем и масштабных серверных приложений. Kotlin чаще выбирают для Android и новых проектов. Знание Java даёт фундамент, с которым переход на Kotlin занимает считанные недели.</p>]]></content:encoded>
    </item>
    <item>
      <title>На замену гуглу: сборник полезных для программиста ссылок</title>
      <link>https://tproger.ru/digest/programming-useful-links</link>
      <comments>https://tproger.ru/digest/programming-useful-links?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лапа]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/programming-useful-links</guid>
      <description><![CDATA[<p>Подборка ссылок по популярным языкам и технологиям: Python, C, Git и другие материалы, чтобы не искать одно и то же в поиске заново.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/programming-useful-links">На замену гуглу: сборник полезных для программиста ссылок</a>»</p>]]></description>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 Feb 2016 18:18:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>Tproger подготовил для вас сборник полезных ссылок по наиболее распространенным технологиям и языкам программирования — чтобы не гуглить каждый раз.</p><h3>Python</h3><p><a href="https://automatetheboringstuff.com/chapter3/">Объяснение глобальной и локальной областей видимости</a></p><p><a href="https://developers.google.com/edu/python/regular-expressions">Регулярные выражения Python для начинающих</a></p><p><a href="https://pypi.python.org/pypi/psutil">Кросс-платформенная библиотека для получения системной информации</a></p><p>Потоки и глобальная блокировка интерпретатора Python</p><h3>C</h3><p><a href="http://www.gribblelab.org/CBootCamp/index.html">Небольшой учебник по С — наиболее важные темы в сжатом виде</a></p><p><a href="https://beej.us/guide/bgnet/">Книга «Сетевое программирование с Биджем», в электронном виде распространяется бесплатно, в том числе на русском языке</a></p><h3>Git</h3><p><a href="http://rogerdudler.github.io/git-guide/">Простое введение в Git, выполненное в виде удобной шпаргалки, есть русская версия</a></p><p><a href="http://www.vogella.com/tutorials/Git/article.html#gitdefintion_tools1">Объемный урок, охватывает множество команд и схему работы Git</a></p><h3>Vim</h3><p>Шпаргалка по действиям, назначенным на каждую кнопку клавиатуры</p><h3>Bash</h3><p><a href="https://github.com/stephenturner/oneliners">Шпаргалка с полезными однострочными командами Bash</a></p><p><a href="http://mywiki.wooledge.org/BashGuide/SpecialCharacters">Список используемых в Bash специальных символов</a></p><p><a href="http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html">Большое пособие по программированию на Bash</a></p><h3>Редакторы кода</h3><p><a href="http://www.vim.org/about.php">Vim</a></p><p><a href="https://atom.io/docs/v0.196.0/getting-started-why-atom">Atom</a></p><p><a href="http://brackets.io/">Brackets</a></p><p><a href="http://www.sublimetext.com/">Sublime Text</a></p><p><a href="https://www.gnu.org/software/emacs/">GNU Emacs</a></p><p><a href="https://notepad-plus-plus.org/">Notepad++</a></p><h3>Разное</h3><p><a href="https://web.archive.org/web/20170829215632/http://www.digilife.be/quickreferences/QRC/LINUX%20System%20Call%20Quick%20Reference.pdf">Системные вызовы Linux</a></p><p><a href="http://events.linuxfoundation.org/sites/events/files/slides/praesentation.pdf">Добиваемся загрузки Linux в 1 секунду, презентация</a></p><p><a href="https://github.com/Leo-G/DevopsWiki/wiki/Devops-Interview-Questions">Список вопросов, которые могут задать на собеседовании разработчику</a></p><p><a href="http://electron.atom.io/">Кроссплатформенная система разработки десктопных приложений</a></p><p>Сайт с видеоуроками по системному администрированию</p><p><a href="http://www.gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html">Структуры данных: стек или куча?</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Большая подборка шпаргалок</title>
      <link>https://tproger.ru/links/overapi-com</link>
      <comments>https://tproger.ru/links/overapi-com?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/links/overapi-com</guid>
      <description><![CDATA[<p>Вспоминать конструкцию языка или имя библиотечной функции быстрее по шпаргалке, чем по документации. На сайте собраны материалы от PHP до Haskell и sed.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/links/overapi-com">Большая подборка шпаргалок</a>»</p>]]></description>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Интересные ссылки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 11 Oct 2015 19:35:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда надо быстро вспомнить конструкцию языка или название библиотечной функции, открывать руководство или документацию к языку или библиотеке — это лишняя трата времени.</p><p>Гораздо проще иметь под рукой шпаргалку. На сайте <a href="http://overapi.com/">OverAPI</a> вы найдете шпаргалки по различным языкам и технологиям на любой вкус: от PHP до Haskell, от HTML до sed.</p>]]></content:encoded>
    </item>
    <item>
      <title>Шпаргалка по принципам ООП</title>
      <link>https://tproger.ru/translations/oop-principles-cheatsheet</link>
      <comments>https://tproger.ru/translations/oop-principles-cheatsheet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/oop-principles-cheatsheet</guid>
      <description><![CDATA[<p>Шпаргалка по принципам ООП: абстракция, полиморфизм, наследование, инкапсуляция и SOLID. Краткие определения и практические советы для начинающих разработчиков.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/oop-principles-cheatsheet">Шпаргалка по принципам ООП</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Объектно-ориентированное программирование]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 24 Aug 2015 16:40:26 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://tproger.ru/articles/kak-stat-programmistom/">Чтобы стать программистом</a>, нужно знать принципы ООП как Отче наш. Держите структурированную шпаргалку по объектно-ориентированному программированию.</p><p>• Четыре базовых принципа ООП: абстракция, полиморфизм, наследование и инкапсуляция
• Вместе с наследованием используйте делегацию, композицию и агрегацию
• Принципы SOLID помогают проектировать гибкие и поддерживаемые системы
• Правило DRY: каждая часть логики должна существовать в единственном месте</p><h2>Главное</h2><ul><li>Инкапсулируйте все, что может изменяться;</li><li>Уделяйте больше внимания интерфейсам, а не их реализациям;</li><li>Каждый класс в вашем приложении должен иметь только одно назначение;</li><li>Классы — это их поведение и функциональность.</li></ul><h2>Базовые принципы ООП</h2><ul><li>Абстракция — отделение концепции от ее экземпляра;</li><li>Полиморфизм — реализация задач одной и той же идеи разными способами;</li><li>Наследование — способность объекта или класса базироваться на другом объекте или классе. Это главный механизм для повторного использования кода. Наследственное отношение классов четко определяет их иерархию;</li><li>Инкапсуляция — размещение одного объекта или класса внутри другого для разграничения доступа к ним.</li></ul><h2>Используйте следующее вместе с наследованием</h2><ul><li>Делегация — перепоручение задачи от внешнего объекта внутреннему;</li><li>Композиция — включение объектом-контейнером объекта-содержимого и управление его поведением; последний не может существовать вне первого;</li><li>Агрегация — включение объектом-контейнером ссылки на объект-содержимое; при уничтожении первого последний продолжает существование.</li></ul><h2>Не повторяйся (Don't repeat yourself — DRY)</h2><p>Избегайте повторного написания кода, вынося в абстракции часто используемые задачи и данные. Каждая часть вашего кода или информации должна находиться в единственном числе в единственном доступном месте. Это один из <a href="https://tproger.ru/articles/how-to-write-readable-code/">принципов читаемого кода</a>.</p><h2>Принцип единственной обязанности</h2><p>Для каждого класса должно быть определено единственное назначение. Все ресурсы, необходимые для его осуществления, должны быть инкапсулированы в этот класс и подчинены только этой задаче.</p><h2>Принцип открытости/закрытости</h2><p>Программные сущности должны быть открыты для расширения, но закрыты для изменений.</p><h2>Принцип подстановки Барбары Лисков</h2><p>Методы, использующие некий тип, должны иметь возможность использовать его подтипы, не зная об этом.</p><h2>Принцип разделения интерфейсов</h2><p>Предпочтительнее разделять интерфейсы на более мелкие тематические, чтобы реализующие их классы не были вынуждены определять методы, которые непосредственно в них не используются.</p><h2>Принцип инверсии зависимостей</h2><p>Система должна конструироваться на основе абстракций "сверху вниз": не абстракции должны формироваться на основе деталей, а детали должны формироваться на основе абстракций.</p><h2>Часто задаваемые вопросы</h2><h3>Чем отличается инкапсуляция от абстракции?</h3><p>Абстракция скрывает сложность, выделяя только существенные характеристики объекта. Инкапсуляция скрывает внутреннюю реализацию, ограничивая прямой доступ к данным через модификаторы доступа (private, protected). Абстракция отвечает на вопрос «что делает объект», а инкапсуляция — «как именно он это делает и кто имеет доступ».</p><h3>Когда использовать наследование, а когда композицию?</h3><p>Наследование подходит, когда между классами есть отношение «является» (is-a): например, Кошка является Животным. Композицию выбирают при отношении «содержит» (has-a): Автомобиль содержит Двигатель. На практике композиция предпочтительнее, потому что она даёт более слабую связанность и гибкость при изменениях.</p><h3>Что такое SOLID простыми словами?</h3><p>SOLID — это пять принципов проектирования, которые помогают писать поддерживаемый код. S — один класс решает одну задачу. O — расширяйте классы, не меняя их код. L — подклассы должны работать везде, где работает родительский класс. I — лучше несколько маленьких интерфейсов, чем один большой. D — зависьте от абстракций, а не от конкретных реализаций.</p><p>Перевод статьи «Object-Orientated Design Principles»</p>]]></content:encoded>
    </item>
  </channel>
</rss>