<?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>unix</title>
    <description/>
    <link>https://tproger.ru/tag/unix</link>
    <atom:link href="https://tproger.ru/tag/unix/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 23:32:34 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>unix</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Своя self-hosted двухсерверная VPN-архитектура. Подробный путь разработки и ошибки, с которыми вы можете столкнуться</title>
      <link>https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r</link>
      <comments>https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Роман Фролов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r</guid>
      <description><![CDATA[<p>Проект представляет из себя быстрый способ воссоздать архитектуру состоящую из 2 серверов (локальный + удаленный) с определенными сервисами, которые решают специфические задачи. Проект сделан прежде всего для меня, а также для людей которые хотят свой готовый self-hosted сервер из коробки с полной системой обслуживания</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r">Своя self-hosted двухсерверная VPN-архитектура. Подробный путь разработки и ошибки, с которыми вы можете столкнуться</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Музыка]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[NFT]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 26 Jul 2026 15:46:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Всё
 началось с того, что меня перестал устраивать мой подход к 
развертыванию личных сервисов. Я решил переписать всё с нуля. К тому же 
это был отличный повод получить новые навыки и попробовать инструменты, 
до которых давно не доходили руки.</p><p>Арендовать мощные VPS под 
ресурсоемкие задачи в текущих реалиях выходит неоправданно дорого. При 
этом дома у меня уже был выделенный неттоп (мини-ПК) с 16 ГБ оперативной
 памяти на базе энергоэффективного процессора Intel N95.</p><p>Пройдя 
путь от простых Bash-скриптов и сторонних туннелей до полностью 
автоматизированной инфраструктуры, я создал проект ServeHub-2. В этой 
статье я подробно разберу, как эволюционировала сеть проекта, почему 
декларативный подход победил императивный и с какими неочевидными багами
 пришлось столкнуться в процессе автоматизации.</p><h2>История настройки сетевой архитектуры</h2><h3>Использование Tuna</h3><p>В
 самом начале проекта я еще не думал о VPN как о способе пробития NAT и 
основе, на которой будет строиться вся система. Первое, к чему я пришел —
 сервис Tuna. Если кратко, это аналог Cloudflare Tunnel за условные 300 
рублей. У него очень приятный веб-интерфейс и невероятно простая 
настройка. Однако для полноценной независимой архитектуры он не подошел 
по двум причинам:</p><ul><li>Сервера Tuna находятся вне контроля пользователя.</li><li>На удаленном сервере нельзя развернуть свои сопутствующие сервисы.</li></ul><p>В целом сервис действительно удобный, но для моих задач он оказался слишком ограничивающим.</p><p>Вот
 пример конфига для tuna (все максимально просто, создаем контейнеры для
 ssh туннеля, чтобы был доступ ssh, а также основной http туннель с 
привязкой к nginx или любому другому прокси если такой есть):</p><h3>В поисках гибкости: тесты Pangolin и переход к FRP</h3><p>После Tuna я решил двигаться в сторону собственного контроля и попробовал Pangolin.
 Однако решение быстро отвалилось: для дешёвого сервера оно оказалось 
слишком «тяжёлым» и избыточным. Главные минусы — ощутимый оверхед по 
ресурсам и лишний слой принудительной веб-аутентификации перед самими 
сервисами. Это ломало нормальное взаимодействие с родными мобильными 
клиентами (вроде Element для Matrix или Bitwarden для паролей), где 
повторная авторизация в браузере просто не нужна.</p><p>На смену пришел FRP (Fast Reverse Proxy).
 Он выполнял ту же функцию проброса, но хостил я его уже на собственном 
арендованном VPS в режиме Layer 4 (TCP). Это дало абсолютную гибкость: 
внешний VPS не заглядывал внутрь пакетов и ничего не расшифровывал, а 
просто пересылал сырой поток домой. Кроме того, это отлично 
оптимизировало расходы: вместо 300 рублей за Tuna и ещё 300 рублей за 
отдельный VPN, я стал платить всего 500 рублей за один стойкий VPS, 
который мог настраивать как хочу. (к тому же можно было обойтись даже 
дешевле, так как VPS с 4 гб оперативки загружен всего лишь на 40%, 
процессор всего на 20%-40%)</p><p>FRP состоит из 2 конфигурационных 
файлов (один на удаленном сервере frp server, другой на локальном frp 
client), все также довольно просто, однако его можно использовать на 
разных слоях. У меня он брал трафик за стандартный TCP и передавал его 
на локальный сервер.</p><p>Также доп. фишка в том что основная 
конфигурация происходит именно в frpc, который, в свою очередь, передает
 часть настроек на frp на удаленном сервере.</p><p>frpc.toml:</p><p>frps.toml:</p><h3>Полноценный переезд на WireGuard (AmneziaWG) и 8 часов отладки</h3><p>Со временем архитектура эволюционировала в сторону полноценной VPN-сети на базе WireGuard, а точнее — его модификации AmneziaWG. Причин для этого шага было несколько:</p><ul><li>Безопасность: FRP всё же открывал внутренние ресурсы в публичный интернет, оставляя их доступными для сканеров портов.</li><li>Удобство маршрутизации:
 Все участники сети стали равноправными узлами в одной виртуальной 
локальной подсети. Больше не нужно было настраивать постоянные 
односторонние пробросы.</li><li>Дополнительный бонус:
 Поскольку удаленный VPS был куплен в Нидерландах, через этот же VPN я 
автоматически получил безопасный доступ ко всем зарубежным ресурсам.</li></ul><p>Для реализации схемы на удаленном VPS был развернут контейнер wg-easy с поддержкой AmneziaWG, а на домашнем мини-ПК — клиентский контейнер Amnezia (сборка из Dockerfile с использованием amnezia-tools  и модулем ядра хоста).</p><p>И
 именно здесь я поймал самый изнурительный баг проекта. После 
развертывания трафик упорно шёл только в одну сторону. Часов 8 ушло на 
диагностику iptables, маршрутов и чтение зарубежных форумов (что 
бесполезно, учитывая специфику наших блокировок). Оказалось, провайдер 
просто дропал обратный трафик стандартного WireGuard, так как пакеты шли
 без маскировки. Причина крылась в docker-compose.yml: у меня было прописано image: ghcr.io/wg-easy/wg-easy:latest. Как выяснилось, тег latest  на Docker Hub намертво прилип к старой 14-й версии, а поддержка параметров AmneziaWG появилась только в ветке 15.x. Изменение тега на конкретную версию (15.3) решило проблему за секунду.</p><p>Благодаря
 переходу конфигурация получилась максимально простой, основные отличия 
от стандартной документации выделил в коде: (в основном то, на что 
пришлось долго рыть информацию)</p><h3>Настройка Nginx</h3><p>Чтобы
 сервисы были доступны исключительно внутри подсети VPN, я задействовал 
Nginx. Доступ к приложениям был жестко ограничен на уровне конфигурации —
 веб-сервер принимает запросы только из диапазона IP-адресов 10.8.0.0/24. Любые попытки постучаться на сервер из внешнего интернета без активного VPN-туннеля автоматически сбрасываются Nginx.</p><p>Логика
 распределения завязана на proxy-протоколе: Nginx на удаленном VPS 
выступает основным входным узлом, принимает зашифрованный трафик, 
заворачивает его в заголовки с реальным IP-адресом клиента и через 
туннель перекидывает на локальный Nginx домашнего сервера. Локальный 
веб-сервер уже сам расшифровывает SSL и распределяет трафик по конечным 
Docker-контейнерам, сохраняя реальные IP в логах безопасности.</p><p>Вставлю
 один кусок кода из nginx на удаленной машине для примера, так все 
остальное примерно похоже (конфиги использовались в виде .template):</p><h3>SSL-сертификаты</h3><p>Для получения валидных SSL-сертификатов я настроил работу через автоматический Certbot по challenge-валидации DNS-01 c API Webnames. Сам домен привязан к внутреннему IP-адресу 10.8.0.1.
 Проверка через DNS позволила выпустить единый wildcard-сертификат на 
весь домен и его поддомены без необходимости держать открытым 80-й порт 
веб-сервера наружу.</p><p>Уточню, что certbot запускается автоматически 
во время выполнения Ansible плейбука, поэтому самому кроме указания 
переменных ничего делать не нужно.</p><p>В
 итоге получилась схема, при которой все сервисы доступны по красивым 
доменным именам с HTTPS, но абсолютно невидимы для внешнего интернета.</p><p>Вот настройка certbot:</p><h2>История софта</h2><p>Параллельно
 с сетевой структурой развивался и сам набор приложений. Изначально я 
хотел собрать в одном месте утилиты, которыми пользуюсь каждый день, но в
 процессе селфхостинга быстро понимаешь: нельзя просто накидать 
контейнеров и надеяться, что мини-ПК справится, а конфигурационные файлы
 не превратятся в кашу.</p><h3>Первый стек и оптимизация</h3><p>Первыми на домашнем сервере прижились медиа-сервисы: Navidrome для стриминга музыки и Audiobookshelf
 для аудиокниг и подкастов. Они легковесные, имеют отличные мобильные 
клиенты с синхронизацией прогресса и полностью закрывают мои 
потребности. Позже к ним добавился Nextcloud как единое независимое облако для файлов, контактов и семейных документов.</p><p>Затем встал вопрос безопасного хранения паролей. Сначала я смотрел в сторону оригинального Bitwarden, но в итоге я выбрал Vaultwarden
 — альтернативный сервер на Rust, полностью совместимый с API Bitwarden.
 Он потребляет считанные мегабайты оперативной памяти и работает 
идеально. Дополнительно для удобства управления всей этой распределенной
 Docker-инфраструктурой в локальный стек был добавлен Portainer. (+ Portainer Agent на удаленный сервер)</p><p>Из интересных моментов, где мне пришлось немного больше возиться, чем с остальными сервисами это nextcloud настройка:</p><h3>Ошибки проектирования: почему я удалил Matrix (Synapse)</h3><p>Не все решения прошли проверку временем. На этапе использования Tuna и FRP я развернул сервер Matrix (Synapse)
 для защищенного обмена сообщениями. Мне казалось это крутой идеей, но 
когда я окончательно перешел на AmneziaWG, целесообразность мессенджера 
внутри закрытого туннеля сошла на нет.</p><p>Synapse требовал слишком 
много ресурсов, впустую расходовал оперативку домашнего ПК и усложнял 
конфиг Nginx. При этом реальной пользы для семьи он не приносил. Для 
критических алертов инфраструктуры и повседневного общения проще и 
эффективнее оказалось использовать Telegram. (плюс алертинг настроен 
именно через него) В итоге я полностью выпилил Synapse из стека, 
освободив ресурсы.</p><p>Вместо него я добавил в связку к wg-easy локальный AdGuard Home.
 Теперь он работает прямо внутри VPN-сети: очищает весь трафик от 
рекламы и трекеров на лету, кэширует DNS-запросы и не дает истории 
веб-серфинга улетать внешним провайдерам.</p><p>Основной проблемой с 
которой я столкнулся при использовании AdGuard Home, так это то что я 
так и не понял как заставить использовать AmneziaVPN клиент AdGuard как 
основной DNS, при этом AmneziaWG работает прекрасно. Как я понимаю дело в
 том что AmneziaWG работает намного проще на уровне ip и у него нету 
никаких доп фильтров, настроек и подобного, поэтому он просто берет 
данные из конфига.</p><h3>От костылей на Bash к декларативному Ansible</h3><p>Весь
 стек на обоих серверах разворачивался через bash скрипты, что было уж 
очень плохо с точки зрения идемпотентности. Во первых из-за bash мне 
постоянно приходилось очищать сервера, так как нормальных проверок у 
меня не было и писать я их не хотел, а также было много костылей с 
импортом переменных, записями в файлы и подобным.</p><p>Так я пришел к декларативному подходу и Ansible.
 Теперь вся конфигурация описывается в виде плейбуков и ролей, 
отражающих конечное желаемое состояние серверов. Конфиденциальные данные
 перенесены в файл secrets.yml, а хрупкие конструкции 
автоматизированы через шаблоны Jinja2. Проект стал идемпотентным: если 
шаги уже выполнены, Ansible их просто пропускает.</p><p>В итоге 
получилось несколько yaml файлов для стандартной настройки системы 
(bootstrap_os.yml) и для настройки каждого из хостов (setup_local.yml и 
setup_remote.yml). В итоге теперь все что нужно чтобы полностью с нуля 
развернуть проект - скачать Ansible, несколько других зависимостей на 
свой рабочий пк и запустить один manage_deploy.sh, в котором можно будет
 выбрать сценарий как будет вести себя Ansible и спокойно дождаться 
разворачивания сервисов.</p><p>Также благодаря Ansible я удобно 
реализовал переносимость проекта. Так как я решил не использовать тома 
docker, и вместо этого храню все в папках, чтобы перенести старые данные
 проекта нужно просто скопировать папку apps-data и положить ее в нужное
 место и все само заработает после повторного развертывания проекта. В 
Ansible выделяется отдельная пауза для этого.</p><p>Вот пример основного плейбука deploy.yml:</p><h3>Тестирование мультидистрибутивности с помощью Vagrant</h3><p>Проект
 изначально затачивался под работу на трех дистрибутивах: Ubuntu, Debian
 и Arch Linux. Тестировать Ansible-плейбуки прямо на рабочей локальной 
машине (в моем случае — EndeavourOS) слишком рискованно, а создавать 
виртуальные машины руками — долго и неудобно.</p><p>Решением стал Vagrant,
 позволяющий за пару минут развернуть чистые ОС в VirtualBox из готовых 
образов. Но в процессе настройки мультивендорного стенда в режиме 
сетевого моста (public_network) всплыли две критические проблемы:</p><ol><li>Конфликт DNS:
 По умолчанию Vagrant создает NAT-интерфейс для управления нодой. При 
включении второго (публичного) интерфейса для локальной сети ломался 
дефолтный DNS-резолвер. Проблему пришлось решать принудительной очисткой
 и перезаписью файла /etc/resolv.conf через inline-скрипт автоматизации Vagrant.</li><li>Проблема с GRUB на Debian: В используемом базовом образе generic/debian12
 конфигурация GRUB сохраняла жесткую привязку к конкретному имени диска 
из окружения сборщика. При повторном развертывании плейбуков на тестовом
 стенде это приводило к сбоям загрузчика. Чтобы автоматизировать 
очистку, пришлось внедрить скрипт, который на лету определяет имя 
системного диска через lsblk и автоматически передает правильные параметры в загрузчик через утилиту debconf-set-selections.</li></ol><p>Вот код Vagrantfile: (в node.vm.provision происходит основное решение ошибок)</p><p>Надежная система бэкапов на базе BorgmaticДля создания резервных копий я внедрил Borgmatic
 (удобную надстройку над дедуплицирующим инструментом Borg Backup). Весь
 процесс автоматизирован с помощью связки системных юнитов borgmatic.service и borgmatic.timer. В бэкап уходят две ключевые директории: apps-data (конфигурации приложений и баз данных) и PersonalData (медиатека: музыка, книги, подкасты, файлы Nextcloud).</p><p>Развертывание
 системы бэкапов полностью берет на себя Ansible. Мне достаточно указать
 UUID внешнего жесткого диска — скрипт сам проверит его наличие в 
системе, примонтирует в нужную директорию, создаст зашифрованный 
репозиторий и настроит политику ротации (хранение 7 ежедневных, 4 
еженедельных и 6 ежемесячных копий). Также в Prometheus выведен 
мониторинг самого репозитория .borg для отслеживания его размера и статуса успешности архивации.</p><p>Главная
 проблема при бэкапе работающих Docker-контейнеров — риск скопировать 
базу данных в «битом» или неконсистентном состоянии, если в момент 
создания архива в нее шла активная запись. Чтобы решить эту проблему, я 
задействовал механизм хуков в конфигурации Borgmatic.</p><p>Перед началом резервного копирования автоматически срабатывает команда остановки контейнеров проекта (docker-compose down),
 а после успешного завершения (или в случае возникновения непредвиденной
 ошибки) контейнеры автоматически поднимаются обратно в фоновом режиме. 
Для удобного просмотра архивов и быстрого восстановления файлов я 
развернул веб-интерфейс Borg UI.</p><p>Конфигурация borgmatic: (использую как Jinja2 шаблон, чтобы Ansible в плейбуках сам подставил переменные)</p><h2>Наблюдаемость (Observability) уровня Enterprise</h2><p>В последних релизах (v1.2.0 и v1.3.0) фокус проекта сместился на мониторинг и работу с логами.</p><h3>Эволюция алертинга и переход на Gatus</h3><p>Изначально для мониторинга доступности я смотрел на Uptime Kuma, но отказался из-за отсутствия удобной декларативной настройки через конфиги. Затем я развернул связку Blackbox Exporter и Alertmanager
 с уведомлениями в Matrix. Но тут крылась логическая несостыковка: весь 
алертинг был завязан на локальном ПК, и в случае его аппаратного отказа я
 бы просто лишился уведомлений.</p><p>Тогда я решил вернуть Uptime Kuma,
 но развернуть его на удаленном VPS в качестве внешнего «сторожа» и 
автоматизировать его настройку через Python-скрипт с библиотекой uptime-kuma-api. Но и тут ждали «грабли» — библиотека не обновлялась три года и намертво ломалась на свежих версиях Kuma.</p><p>В итоге идеальным решением стал Gatus.
 Он изначально проектировался под управление через YAML-конфиги и 
поддерживает отправку алертов, если сервер не отвечает. Из-за специфики 
фронтенда Gatus (он не умеет работать из подкаталога типа /gatus), мне пришлось перенести его и wg-easy на полноценные субдомены gatus. и wireguard.</p><p>Для Gatus получился простой конфиг:</p><p>Для мониторинга аппаратных ресурсов удаленного и локального серверов была развернута связка node-exporter + cAdvisor. Все уведомления теперь приходят мгновенно в Telegram-бота. Чтобы 
избежать лавины одинаковых сообщений (например, при перезагрузке хоста),
 в Alertmanager настроена жесткая группировка и дедупликация событий. 
Также добавлен экспортер для AdGuard Home, выводящий статистику 
заблокированных запросов в Grafana.</p><h3>Централизованные логи: Loki + Grafana Alloy</h3><p>В релизе v1.3.0 в стек была добавлена централизованная система сбора логов Loki. Вместо устаревшего Promtail в качестве агента сбора я применил Grafana Alloy.</p><p>Он
 эффективно собирает логи со всех запущенных Docker-контейнеров, парсит 
их и передает в Loki. Теперь вся история событий, ошибок веб-сервера 
Nginx или падений внутренних приложений доступна в едином интерфейсе 
Grafana с возможностью удобной фильтрации через LogQL, что значительно 
упрощает отладку.</p><p>Конфиг Loki:</p><p>Конфиг Grafana Alloy: (локальный конфиг)</p><h2>Интерфейс: переход на Homepage</h2><p>Изначально для 
домашней страницы я написал кастомную минималистичную HTML-панель с 
Glassmorphism-дизайном. Выглядело это красиво, но добавлять новые 
сервисы вручную через постоянную правку исходного кода было крайне 
неудобно.</p><figure><img src="https://media.tproger.ru/user-uploads/139471/2026-07-15/8a8f2752-8aac-4aa5-898e-98affd01cdff.webp" alt="" /><figcaption>HTML + CSS</figcaption></figure><p>В итоге я заменил самописную страницу на полноценный комьюнити-проект Homepage.
 Это дало некоторую гибкость: вся панель настраивается через простые 
YAML-файлы и поддерживает встроенные виджеты интеграции. Пока что она 
простенькая, но возможно в будущем сделаю что-то более продвинутое.</p><figure><img src="https://media.tproger.ru/user-uploads/139471/2026-07-15/90c65d4a-1310-4a30-b1ad-9e4d3083959d.webp" alt="" /><figcaption>Homepage</figcaption></figure><h2>Заключение</h2><p>Постарался
 подробно рассказать о структуре проекта и как я к этому пришел, очень 
много я не добавил, если пост зайдет, то я обязательно более подробно 
пройдусь по некоторым моментам: как я настраивал Matrix и на каком 
моменте я решил его убрать, как собирал локальный amnezia 
контейнер-клиент, что нового я добавил в релизе 1.4.0 и другое.</p><p>Также
 я перешел с manage_deploy.sh на отдельный GUI клиент, который 
будет полностью автоматизировать процесс подготовки к deploy. (написан на Go Wails). Про это тоже возможно сделаю статью.</p><p>Вся кодовая база проекта, подробная документация, инструкции по развертыванию открыты и доступны для сообщества:</p><p>🔗 GitHub-репозиторий: <a href="https://github.com/canntstand/ServeHub-2" rel="noopener noreferrer nofollow">https://github.com/canntstand/ServeHub-2</a></p><p>Это
 моя первая статья на этом сайте и в то же время первый личный проект, которому я 
отдал так много времени (3 месяца). Буду рад вашему фидбеку в 
комментариях!</p>]]></content:encoded>
    </item>
    <item>
      <title>Единственный мейнтейнер sudo попросил о финансовой поддержке спустя 30 лет разработки</title>
      <link>https://tproger.ru/news/edinstvennyj-mejntejner-sudo-poprosil-o-finansovoj-podderzhke-spu</link>
      <comments>https://tproger.ru/news/edinstvennyj-mejntejner-sudo-poprosil-o-finansovoj-podderzhke-spu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/edinstvennyj-mejntejner-sudo-poprosil-o-finansovoj-podderzhke-spu</guid>
      <description><![CDATA[<p>Единственный мейнтейнер sudo после 30 лет работы попросил финансирование: без спонсора развитие и безопасность утилиты под угрозой</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/edinstvennyj-mejntejner-sudo-poprosil-o-finansovoj-podderzhke-spu">Единственный мейнтейнер sudo попросил о финансовой поддержке спустя 30 лет разработки</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 06 Feb 2026 10:49:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик <b>sudo</b> Тодд Миллер, который поддерживает утилиту с 1993 года, публично попросил о финансовой поддержке, чтобы продолжать ее развитие и разработку.</p><p>Об этом Миллер <a href="https://www.theregister.com/2026/02/03/sudo_maintainer_asks_for_help/">написал</a> на своем личном сайте, отметив, что уже более 30 лет остается фактически единственным мейнтейнером одного из ключевых инструментов Unix- и Linux-систем.</p><h2>Что произошло</h2><p>До февраля 2024 года разработку sudo спонсировала компания Quest Software (позже — One Identity). После завершения сотрудничества и ухода Миллера из компании, финансирование прекратилось. С тех пор поддержка проекта ведется без стабильного источника дохода.</p><p>При этом разработка sudo не останавливалась: за последние два года выходили обновления и исправления, включая патчи для критических уязвимостей. Однако, по словам Миллера, из-за нехватки времени и ресурсов работа над проектом заметно замедлилась.</p><h2>Почему это проблема</h2><p>Sudo — базовая утилита для управления привилегиями, от которой напрямую зависит безопасность системы.</p><p>За последние годы в ней неоднократно находили серьезные уязвимости, включая баги, позволявшие локальным пользователям получать root-доступ. Некоторые из них существовали в коде более 10 лет.</p><p>Именно из-за регулярных проблем с безопасностью в экосистеме появился sudo-rs — новая реализация утилиты на Rust, ориентированная на безопасную память. В Ubuntu 25.10 она уже используется по умолчанию.</p><h2>Что будет дальше</h2><p>Миллер подчеркивает, что не планирует бросать sudo, но и не видит очевидного преемника. После истории с закладкой в xz-utils, он с осторожностью относится к передаче проекта сторонним разработчикам.</p><p>При этом он считает, что в долгосрочной перспективе именно sudo-rs станет основной версией инструмента. Он уже даже сотрудничает с командой этого проекта.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышла PatchworkOS — минималистичная ОС, где «все — файл» даже больше, чем в UNIX</title>
      <link>https://tproger.ru/news/vywla-patchworkos---minimalistichnaya-os--gde--vse---fajl--dazhe-bolwe--chem-v-unix</link>
      <comments>https://tproger.ru/news/vywla-patchworkos---minimalistichnaya-os--gde--vse---fajl--dazhe-bolwe--chem-v-unix?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywla-patchworkos---minimalistichnaya-os--gde--vse---fajl--dazhe-bolwe--chem-v-unix</guid>
      <description><![CDATA[<p>PatchworkOS — экспериментальная минималистичная ОС, где процессы, события и ядро представлены как файлы. Проект исследует радикальное развитие идеи «все — файл» в духе UNIX</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywla-patchworkos---minimalistichnaya-os--gde--vse---fajl--dazhe-bolwe--chem-v-unix">Вышла PatchworkOS — минималистичная ОС, где «все — файл» даже больше, чем в UNIX</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 22 Dec 2025 07:05:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик Кай Норберг <a href="https://github.com/KaiNorberg/PatchworkOS">представил</a> <b>PatchworkOS</b> — минималистичную операционную систему, построенную вокруг принципа <b>«все есть файл»</b>.</p><p>Но если в UNIX это скорее философия с оговорками, то в PatchworkOS идея <b>доведена почти до абсолюта</b>. Здесь файлами считаются не только данные, но и процессы, события, таймеры и даже взаимодействие с ядром.</p><p>Проект носит исследовательский характер и не претендует на роль универсальной ОС для повседневного использования.</p><h2>Как работает «все — файл» в PatchworkOS</h2><p>В PatchworkOS файловая система — это главный интерфейс ко всему, что происходит в системе.</p><p>Процессы представлены <b>в виде каталогов</b>, их состояние — <b>в виде файлов</b>, а управление ими сводится к обычным <b>операциям чтения</b> и <b>записи</b>.</p><p>Например, чтобы отправить сигнал процессу или изменить его параметры, не нужен отдельный системный вызов. Достаточно записать нужное значение в соответствующий файл. Аналогичным образом работают таймеры, события и даже планировщик задач.</p><p>Сам автор проекта описывает PatchworkOS как <b>систему, где файловая и процессная модели слиты воедино, а граница между «данными» и «поведением» намеренно размыта</b>.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-12-22/bbeeffe1-d861-4ee2-9d98-1f0a680c6381.jpeg" alt="" /></figure><h2>Минимум абстракций и максимум прозрачности</h2><p>PatchworkOS написана с упором на <b>простоту и читаемость</b>. В системе нет привычного набора пользовательских утилит, сложных демонов или развитой экосистемы.</p><p>Зато есть понятная структура, которую можно изучать, модифицировать и расширять. ОС запускается в эмуляторе и ориентирована в первую очередь на разработчиков, студентов и энтузиастов, которым интересно устройство операционных систем на низком уровне.</p><p>Норберг отдельно отмечает, что его операционка — это <b>не Linux-дистрибутив</b> и <b>не попытка конкурировать с существующими ОС</b>.</p><h2>Ограничения и честные предупреждения</h2><p>Автор прямо говорит о лимитах своего проекта. PatchworkOS не поддерживает многопользовательский режим, не рассчитана на безопасность в привычном смысле и не оптимизирована для производительности.</p><p>Многие механизмы реализованы намеренно наивно — ради наглядности, а не скорости. Именно поэтому проект сопровождается подробной документацией, объясняющей, почему система устроена так, а не иначе.</p>]]></content:encoded>
    </item>
    <item>
      <title>В США нашли утерянную ленту с одной из первых версий Unix — спустя 50 лет после релиза</title>
      <link>https://tproger.ru/news/v-swa-nawli-uteryannuyu-lentu-s-odnoj-iz-pervyh-versij-unix---spustya-50-let-posle-reliza</link>
      <comments>https://tproger.ru/news/v-swa-nawli-uteryannuyu-lentu-s-odnoj-iz-pervyh-versij-unix---spustya-50-let-posle-reliza?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-swa-nawli-uteryannuyu-lentu-s-odnoj-iz-pervyh-versij-unix---spustya-50-let-posle-reliza</guid>
      <description><![CDATA[<p>В США нашли магнитную ленту с Unix V4 1973 года. Ее восстанавливают побитово — это может стать важнейшим открытием в истории ОС</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-swa-nawli-uteryannuyu-lentu-s-odnoj-iz-pervyh-versij-unix---spustya-50-let-posle-reliza">В США нашли утерянную ленту с одной из первых версий Unix — спустя 50 лет после релиза</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 10 Nov 2025 03:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В хранилище Университета Юты <a href="https://ponderwall.com/index.php/2025/11/09/unix-lost-tape/">нашли</a> <b>магнитную ленту с надписью «UNIX Original From Bell Labs V4»</b>. Предположительно, это четвертая версия Unix, датированная примерно <b>1973 годом</b>.</p><p>Если находка подтвердится, перед нами — одна из старейших копий легендарной операционной системы.</p><h2>Как нашли ленту</h2><p>Ленту обнаружил профессор <b>Роберт Риччи</b> во время уборки в школе вычислительной техники Университета Юты.</p><p>Она лежала в обычной коробке на пыльной полке — без особых отметок. После публикации фотографии находки, на нее обратили внимание историки и инженеры по сохранению ПО.</p><p>Чтобы не повредить артефакт, Риччи передал его в <b>Computer History Museum</b> в Калифорнии. И там, прямо сейчас, ленту осторожно побитово «снимают», не запуская на обычных магнитофонах. Это нужно для того, чтобы не стереть данные.</p><h2>Почему это важно</h2><p>Unix V4 — одна из первых версий, <b>переписанных на языке C</b>. Именно этот шаг сделал систему переносимой между разными машинами. И уже из этого решения выросли <b>Linux</b>, <b>macOS</b> и <b>Android</b>, а архитектура Unix до сих пор лежит в основе большинства современных ОС.</p><p>До последнего считалось, что <b>оригинальная V4 утеряна</b> — в архивах сохранились лишь обрывки кода и фрагменты мануалов.</p><p>Если лента окажется полной, это закроет огромный пробел в истории вычислительной техники.</p><h2>Проблема «цифровой археологии»</h2><p>Ленты 70-х часто страдают от <b>деградации оксидного слоя</b> и «осыпания» носителя. Иногда их приходится буквально запекать при низкой температуре, чтобы стабилизировать материал перед чтением.</p><p>Кроме того, формат данных может быть уникальным — в те годы каждый разработчик использовал свои схемы записи.</p><h2>Почему Unix из Юты — особенный</h2><p>В 1970-х Юта была одним из ключевых узлов ARPANET и первых университетов, получивших Unix по исследовательской лицензии Bell Labs. Местные студенты и инженеры активно модифицировали систему.</p><p>Именно из таких экспериментов, например, позже выросли BSD и многие современные утилиты.</p><h2>Что дальше</h2><p>Эксперты из Computer History Museum планируют оцифровать ленту и, при возможности, опубликовать исходники для исследователей.</p><p>Если восстановление удастся, это будет <b>самое значимое возвращение утерянного программного кода за последние десятилетия</b> — своеобразная «цифровая археология» уровня открытия древнего манускрипта.</p>]]></content:encoded>
    </item>
    <item>
      <title>Конвейер DevOps, часть 3: пайплайны и хуки в Git</title>
      <link>https://tproger.ru/articles/konvejer-devops--chast-3--pajplajny-i-huki-v-git</link>
      <comments>https://tproger.ru/articles/konvejer-devops--chast-3--pajplajny-i-huki-v-git?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Олег Филон]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/konvejer-devops--chast-3--pajplajny-i-huki-v-git</guid>
      <description><![CDATA[<p>В этой серии статей Олег Филон, ментор Эйч Навыки, рассказывает, как прийти к крутому CI/CD пайплайну. Сегодня разбираемся, как работать с пайплайнами и хуками в Git.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/konvejer-devops--chast-3--pajplajny-i-huki-v-git">Конвейер DevOps, часть 3: пайплайны и хуки в Git</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 26 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Я — Олег Филон,<a href="https://h.careers/curators/oleg-philon"> ментор Эйч Навыки</a> и Senior DevOps Engineer. В этой статье расскажу, как организовать CI/CD пайплайн для контейнеризованного проекта с использованием утилиты make, сравню подходы для Docker и Podman, а также поделюсь хаком с использованием Git bare репозитория для автоматизации деплоя.</p><p>Первые две части лежат здесь: <a href="https://tproger.ru/articles/konvejer-devops--chast-1--kak-organizovat-rabochee-mesto-i-nastroit-oblako-iz-kvm-libvirt">рабочее место/облако</a> и <a href="https://tproger.ru/articles/konvejer-devops--chast-2--polzuemsya-fedora-core-i-mise">Fedora Core/mise</a>.</p><h2>Начало проекта и утилита make</h2><p>Представим идеальную ситуацию: я не только девопс, но и проектный менеджер, выбираю архитектуру проекта, и инструменты, и команду разработчиков, то есть полностью контролирую проект. В жизни такое вряд ли встретишь, но нам это нужно для примера, чтобы рассмотреть разные варианты.</p><p>Первый — классический пайплайн — это утилита make. Обычно она используется для сборки программ из исходного кода. На самом деле make хорошо подходит для решения сразу нескольких задач.</p><ul><li>Первая задача — отслеживание зависимостей одних файлов от других, например, при изменении сервиса пересобрать только соответствующий контейнер.</li><li>Вторая задача, легко реализуемая через make — сборка в один файл много команд или скриптов, чтобы удобно их организовать. Как правило, сборка образа, его загрузка в репо, удаление временных файлов и прочее делается несколькими рутинными командами. Точно так же можно поместить в Makefile команды запуска сервисов и тестирование приложения локально.</li><li>Если эти этапы прошли успешно, можно выполнить коммит кода в репо проекта, сделать деплой в dev или stage environment. В github actions это называется jobs и steps. В make такая группа команд называется целью, она указывается параметром при вызове.</li></ul><p>Так, несмотря на разную терминологию, по сути можно создать полноценный пайплайн для современного проекта с контейнеризованными сервисами.</p><h3>Разбираемся на практике</h3><p>Возьмём для примера проект с прокси сервером traefik и бэкендом на golang из репозитария <a href="https://github.com/ophilon/awesome-pods">awesome-pods</a>. Этот репо задуман как форк замечательного проекта <a href="https://github.com/docker/awesome-compose">awesome-compose</a>, в котором собраны конфиги docker compose для 41 самого популярного сервиса. Я же пытаюсь сделать что-то похожее для манифестов podman. Приглашаю к сотрудничеству начинающих девопс — сможете поучаствовать в открытом проекте, заработать почётные гитхаб-бейджи и улучшить своё резюме. Подробнее — <a href="https://github.com/ophilon/awesome-pods/blob/main/CONTRIBUTING.md">здесь</a>.</p><p>Мой проект в интересном положении: сделаны манифесты для нескольких сервисов, опробованы описанные выше подходы для миграции конфигов compose.yaml в манифесты kube.yaml. Но захотелось большего: а почему бы не сделать сразу пайплайны для тестирования, коммита в апстрим, деплоя и прочее. Зайдём в каталог traefik-golang и создадим пару мейк-файлов. Для начала сделаем всё это локально, начнём с make_compose:</p><p>Этот файл уже в истории, равно как и соответствующий README.md, привожу его для примера. Так как я делаю конфиги сразу для двух платформ — docker и podman, для включения соответствующего Makefile’а нужно сделать линк на него: ln -s make_compose Makefile.</p><p>Отлично, основную идею обсудили, идём дальше. В docker’е есть замечательная опция context, позволяющая работать с любыми серверами, где настроен доступ. В нашем случае список контекстов выглядит так:</p><p>Здесь я использовал простейший хак — сделал копию дефолтного контекста с именем localhost. Теперь мы можем сделать наш пайплайн способным на удалённый деплой. Достаточно прописать в /etc/hosts имя и адрес нашего dev сервера. Вот новая версия make_compose:</p><p>Поясню немного подробнее.</p><ul><li>Самая первая строка — стандартное объявление списка целей.</li><li>Строки 2-4 задают дефолтное значение переменной, если оно не задано в текущем env.</li><li>В хелп — строки 5-10 — добавлено предупреждение о текущем контексте, он задаётся в глобальной переменной, например, export DKR_CONTEXT=localhost для локального контекста.</li><li>Также добавлена цель commit в репо — строки 17-21 — после выполнения цели test.</li><li>Test — строки 31-32 — в свою очередь, выполняется для текущего контекста, см. хак #1. Имя контекста должно совпадать с именем хоста нашего dev-сервера.</li><li>Добавлена также цель clean: очистка старых образов с локальном репо,и зависимости в цель up. Здесь убеждаемся, что образ пересобран и старые контейнеры остановлены.</li></ul><p>Отлично, пайплайн для докера работает. Пробуем сделать то же самое для подмана. Здесь нас ждёт сюрприз, попробую рассказать в стиле прямого репортажа. Первоначально наш пайплайн для podman выглядел вот так:</p><p>В строке 5 определяются зависимости: target back соберёт исполняемый файл только в том случае, если код main.go или сам make_pods новее уже собранного бинарника.</p><p>Строка 6 удаляет backend контейнер с едва заметным знаком минус -, чтобы игнорировать ошибку, если контейнер с именем backend не существует.</p><p>Строки 7–10 создают контейнер с именем backend из пустого (scratch) контейнера — команды buildah следуют обычным командам Dockerfile, но в нижнем регистре: FROM -&gt; from, COPY -&gt; copy, RUN -&gt; run, ENTRYPOINT -&gt; config –entrypoint и т. д. Здесь вы видите основное отличие от традиционного docker buildx подхода — вы работаете в двух контекстах одновременно: в локальном контексте, используя установленный компилятор go, и в контексте контейнера, копируя файлы в/из контейнера, запуская команды внутри контейнера и т. д. Другая новая возможность buildah — вы можете собирать образ шаг за шагом, то есть отлаживать процесс сборки.</p><p>Строка 8 компилирует main.go в исполняемый файл back с соответствующими флагами.</p><p>Строка 11 создаёт из контейнера новый образ (image) с тегом backend:latest.</p><p>Цель up — строка 16 — зависит от цели down — строка 14, — то есть она сначала останавливает pod и удаляет контейнеры, если они всё ещё запущены, затем запускает новый под.</p><p>Цель down в строке 15 подставляет глобальную переменную $XDG_RUNTIME_DIR из env пользователя в kube.yaml, используемый далее в podman kube командах, принимая новый манифест со стандартного ввода. Это также специфика podman — он работает полностью в пространстве пользователя, контейнеры взаимодействуют через собственный podman.sock. Таким образом, делаем пайплайн независимым от UID.</p><p>В подмане есть фунциональность наподобие docker context, под другим именем, в подкоманде system connection:</p><p>Первым в списке стоит настроенная в <a href="https://tproger.ru/articles/konvejer-devops--chast-2--polzuemsya-fedora-core-i-misel">прошлой статье ВМ</a>. Пока искал правильные опции для создания коннекшена (aka контекст в докере), столкнулся с подсказкой от подмана — «создайте сначала машину», а именно:</p><p>Выполнил эти рекомендации, подман выкачал, настроил и добавил два новых коннекшена для новой ВМ. Какой же меня ждал сюрприз, когда я стал смотреть, что же это за machine. Во-первых, в моём HOME появились новые файлы и каталоги:</p><p>Во-вторых, это полноценная ВМ fedora coreos:</p><p>Конечно, приятно, что моё мнение совпало с мнением авторов подмана, точнее, со стратегией RedHat — fedora coreos наиболее подходящая система для контейнерных приложений. С другой стороны, ВМ в подмане крутится полностью внутри пространства пользователя. У меня уже настроена почти такая же для удалённой работы всей команды разрабов. Решено: останавливаем новую виртуалку и правим мейкфайл для подмана по образцу компоуза, делаем пайплайн для деплоя и локально, и на удалённый дев-сервер.</p><p>Но прежде нам понадобится ещё один хак #2. Если в случае докера переключение контекста можно было сделать любой переменной, то для подмана между локальным соединением через сокет и удалённым, через uri:ssh, имя переменной фиксировано <a href="https://docs.podman.io/en/stable/markdown/podman.1.html">CONTAINER_HOST</a>. Вот как выглядит пайплайн make_pods.v1, настроенный и для локальной сборки, и для деплоя в наш дев-сервер:</p><p>По большей части цели мейкфайла остались теми же, но для удалённого деплоя настраиваем переменную export CONTAINER_HOST=ssh://dev@fc42dev:22/run/user/1001/podman/podman.sock — берём её из коннекшена, она служит переключателем между локальным и удалённым контекстом. Для локального контекста эту переменную надо удалить: unset CONTAINER_HOST. Команды в строках 19, 21 и 23 — это обычные команды шелла, они также меняются на локальное либо удалённое исполнение, переопределяются на основе этой же переменной CONTAINER_HOST.</p><p>Как заметил внимательный читатель, в цели back исчезла сборка контейнера утилитой buildah. Как и для docker compose, используется возможность самого подмана создавать образы на основе Containerfile, он же Dockerfile, эти названия синонимичны. Это намёк: пора отвыкать от слова докер, контейнеры уже давно стали основой облачных вычислений, для них созданы сотни приложений, например, <a href="https://www.cncf.io/">CNCF</a> и <a href="https://adriancitu.com/2021/12/30/containers-landscape-seen-through-oci-and-cncf-standards-lens/">общепризнанные стандарты</a>.</p><h2>Принципиальный вопрос о контейнерах</h2><p>Основное их преимущество — новый способ доставки приложений в облака, решение проблем с зависимостями, версиями библиотек, фреймворков и проч. Сборка контейнеров в контейнерах — побочный эффект облачных сервисов Github, Gitlab и других, с одной стороны, и ограничения Docker — с другой. Он не умеет, в отличие от подмана, точнее, от его сопутствующей утилиты buildah, выполнять билд и создавать образ, используя локальное окружение.</p><p>Основная проблема сборки образа внутри контейнера — неэффективное использование кэша. Да, появились возможности как-то сохранять объемные загрузки внешних библиотек, модулей: это опции --mount=type=cache для <a href="https://docs.docker.com/build/cache/optimize/#use-bind-mounts">некоторых языков</a>. Но, во-первых, эти возможности используются далеко не всегда. Во-вторых, опции для кэширования отличаются в podman и buildah, см. podman-build(1), придётся делать отдельный Containerfile. В-третьих, эффект от такого кэширования минимален. Предлагаю замерить время сборки, сделав ещё одну, третью версию пайплайна. Сначала соберём команды для buildah в отдельный файл:</p><p>и поправим пару строк в пайплайне:</p><p>Уточню условия нашего эксперимента — мы настроили одинаковую среду разработки с помощью утилиты mise (<a href="https://tproger.ru/articles/konvejer-devops--chast-2--polzuemsya-fedora-core-i-mise">предыдущая статья</a>) на нашем дев-сервере и у каждого из разрабов команды. Репозитарий git использует этот же дев-сервер, доступ к репо и серверу по ключу, парольный доступ закрыт. Пайплайны настроены как для локальной сборки, так и на дев-сервере. Перед запуском 3-й версии пайплайна на дев-сервере нужно сделать коммит изменений в репо — buildah не знает о коннекшенах, работает с кодом в текущем каталоге (строка 1): после логина на сервер переключается в корень проекта. Предварительно выкачиваем образ компилятора go для сборки в контейнере — это вполне честно, мы же выкачали и настроили компилятор golang заранее. Замеряем:</p><p>Мы получили 10+-кратный выигрыш по времени сборки образа для подмана. Абсолютные времена не важны, также не влияет, запускали мы сборку локально или на дев-сервере — мы сравниваем только билд в контейнере и в настроенном локальном окружении. Третье измеренное время — сборка в Docker. Он умеет собирать только в контейнере, для него настроили кэширование в Containerfile:</p><p>Но оно не сильно помогло. Конечно, наш проект игрушечный, golang кэширует лучше других языков, но в целом вывод понятен: сборка в контейнере далеко не оптимальный вариант, если есть возможность настроить дев-сервер для работы команды.</p><p>Ещё замечание: конечно, образы, собираемые buildah, совместимы с Docker, их можно использовать в конфигах compose.yaml. Но для этого надо настроить репозиторий образов и сначала загрузить образ в него. Локальные репозитории отличаются: Docker использует общий репо для всех пользователей — Docker Root Dir: /var/lib/docker, а в подмане всё хранится в домашнем каталоге пользователя — graphRoot: /home/$USER/.local/share/containers/storage.</p><p>Как я предположил в самом начале, мы попробовали вариант с гипотетической идеальной командой разрабов, работающей в Линукс и умеющей в make. А как быть обычному девопсу с разношерстой командой, где кто-то сидит на Винде, а кто-то ни за что не откажется от привычного Макбука на M4? Есть вариант и для этого случая. Пусть они пишут код и тестируют его как им нравится, а в нашем репо на дев-сервере мы сделаем хак #3, а именно git hook и bare репозиторий — githooks(5), выполняющий наши цели сборки и старта приложения при коммите в репо.</p><p>Для этого на пару минут придётся стать безжалостным хакером, удаляющим лишнее и открывающим скрытые возможности гита. Выполняем следующие шаги:</p><ol><li>Заходим под юзером dev на сервер, создадим пустой каталог, например, mkdir -pv ~/bare/t0. Это станет новым GIT_DIR, зайдём в него и выполним cd ~/bare/t0;git init --bare.</li><li>Видим, что файлы, обычно спрятанные в каталоге .git, лежат прямо в корне. Сделаем дополнительно каталог для логов mkdir logs. Переходим в каталог hooks и создаём файл, где укажем команды выполнения при каждом изменении в репо.</li></ol><p>Закомментированные строки 3, 8, 9 полезны при отладке пайплайна. Строки 4 и 5 задают, что есть, собственно, репозиторий, переменная GIT_DIR и переменная WORK_TREE (куда будут записываться файлы проекта). В цикле от строки 6 до 14 читаются и обрабатываются три переменные, с которыми гит вызывает этот хук. Строка 11 принимает все изменения в репо и обновляет WORK_TREE — всё то, что гит обычно делает в общем каталоге, как видим, в bare репо они разные. Далее, в 12 строим имя лога и строка 13 — собственно, пайплайн.</p><ol><li>Идём в каталог, где расположен репо проекта. Без страха и сожаления удаляем старый и создаём новый под тем же именем: cd ~/src;rm -rf traefik-golang;mkdir traefik-golang.</li><li>Завершаем сессию на дев-сервере, возвращаемся на рабочий комп и заходим в репо проекта. Конечно, репо цел, клоны репо не так просто уничтожить, пока есть хотя бы одна копия. Теперь смотрим старые настройки git remote -v и удаляем их git remote remove fc42dev в моём случае. Создаём новый remote, указывая новый гит bare репо: git remote add bare.t0 dev@fc42dev:~/bare/t0. Это также нужно сделать всем разрабам в их локальных копиях.</li><li>Проверяем результат. Возможно, нужно сделать новый комит и push в новый remote. Стоит посмотреть подробнее, как изменился репо проекта на сервере: проверить логи в ~/bare/t0/logs, сравнить конфиги обычного репо проекта и на сервере, проверить, какие команды перестали работать в серверном репо. Например, в WORK_TREE не работают команды гит status; branch; commit; log. То есть наш хак #3 с git --bare не только позволил делать деплой на сервере, но также защитил репо от локальных изменений, а серверный репо всегда в чистоте и порядке. Можно редактировать код, но закомитить его только через обычный репо. Изменения на сервере удалятся после любого коммита.</li></ol><p>Надеюсь, мне удалось показать, что пайплайны можно делать на основе древней забытой утилиты make. В следующей статье разберём, как можно добавить в наш скромный дев-сервер нечто похожее на монстров гит-сервисов, Gitlab и Github, создавать пайплайны, совместимые с github Actions, предоставить команде разрабов привычный интерфейс репо в браузере.</p>]]></content:encoded>
    </item>
    <item>
      <title>Файловая система Linux: что скрывается под капотом?</title>
      <link>https://tproger.ru/articles/kak-ustroena-fajlovaya-sistema-v-linux</link>
      <comments>https://tproger.ru/articles/kak-ustroena-fajlovaya-sistema-v-linux?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ustroena-fajlovaya-sistema-v-linux</guid>
      <description><![CDATA[<p>Особенности файловой системы в ОС Linux, как ей управлять и что такое монтирование. Типы файлов и файловых системы в Линукс. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ustroena-fajlovaya-sistema-v-linux">Файловая система Linux: что скрывается под капотом?</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 16 Jan 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Пользователям, которые знакомы только с Windows, файловые системы в Linux могут показаться очень странными. Никаких дисков C и D, как в винде, тут нет, вместо них — каталоги с непонятными буквенными обозначениями.</p><p>В целом структуру файловых систем (ФС) в Линукс определяет унифицированный стандарт FHS (Filesystem Hierarchy Standard), однако есть множество нюансов, в которых стоит разобраться, прежде чем работать с этой ОС.</p><p>Выясним, что собой представляет файловые системы, доступные в Linux, какие директории и типы файлов в них содержатся, как управлять ФС и что такое монтирование в Линуксе.</p><h2>Общий обзор файловой системы Linux</h2><p>Еще на стадии установки Linux предоставляет пользователю выбор файловой системы — разные типы ФС уже встроены в ядро ОС. Выбирать нужно в соответствии с требованиями и задачами владельца устройства, поскольку у каждой системы свои функциональные возможности. В Windows опции выбора нет — в этом одно из принципиальных отличий этой ОС от Linux.</p><p>Различается и иерархическое устройство ФС, а также структура каталогов. В Линукс поддерживается разбивка жесткого диска на разделы. В специальной таблице определяются физические границы разделов, где содержатся метки и адреса расположения начальных и конечных точек.</p><p>В каждый раздел можно поставить свою файловую систему, отвечающую за способ организации данных. Основу ФС составляет базовый набор правил, который определяет, где и как хранится информация. Технический слой отвечает за структурирование данных на конкретных типах носителей.</p><p>Правильный выбор файловой системы влияет на следующие показатели:</p><ul><li>скорость выполняемых операций;</li><li>сохранность файлов;</li><li>скорость записи данных;</li><li>размер и другие параметры файлов.</li></ul><p>От типа файловой системы в Линукс зависит и то, будет ли информация сохраняться в оперативной памяти устройства и каким способом пользователь может воздействовать на конфигурацию ядра.</p><p>Архитектура файловой системы размещается на жестком диске или в оперативной памяти компьютера. ФС отвечает не только за организацию данных, но и за управление ими в соответствии с базовыми правилами.</p><p>В Линукс ФС представляет собой пространство, разделенное на блоки определенных размеров, кратных 1024, 2048, 4096 байт и т.д. Вместимость блоков известна заранее и ограничена максимальным объемом ФС.</p><p>Обмен данными реализуется двумя способами:</p><ul><li>С помощью VHS — виртуальной файловой системы. В таких системах ядро и установленные приложения работают совместно без учета особенностей конкретных ФС;</li><li>С помощью драйверов, отвечающих за обмен данными между железом и софтом.</li></ul><p>Список систем, поддерживаемых ядром, находится в файле /proc/filesystems. Наиболее востребованные ФС мы подробно рассмотрим в одном из следующих разделов.</p><h2>Структура ФС и каталога</h2><p>В Linux файловая система отвечает также за иерархию, то есть порядок распределения файлов. Структура подобна дереву — в основе лежит корневой каталог root directory, от которого отходят «ветви».</p><p>В такой ФС работает принцип целостности — изменения, которые внесли в один файл, никак не повлияют на другой, если он не связан напрямую с первым. Данные хранятся в физической памяти. Целостность системы можно проверить с помощью команды fsck.</p><p>В Linux используется несколько типов файлов. Часть из них повторяет аналогичные пакеты в Windows — это текстовые документы, медиа различного формата, музыка. Принципиальные различия начинаются с каталогов, представленных отдельными типами файлов.</p><p>Жесткие диски в такой структуре относятся в блочным устройствам, принтеры — к символьным, в отдельной группе — символические ссылки, о которых расскажем позднее. В типы файлов входят каналы взаимодействия между процессами и гнезда центрального процессора. Тип файла можно определить через команду ls.</p><p>Структура каталога выглядит следующим образом:</p><figure><img src="https://media.tproger.ru/user-uploads/101528/2025-01-13/b0c9bace-2cd5-4455-9702-42af79a4b50d.jpeg" alt="" /><figcaption>Структура файловой системы в Linux</figcaption></figure><p>Помимо единственного корневого раздела root, присутствуют подкаталоги, к которым привязаны соответствующие каталоги. Типовая структура первых двух уровней выглядит так:</p><p>├── bin -&gt; usr/bin</p><p>├── boot</p><p>│   ├── grub</p><p>│   └── lost+found</p><p>├── dev</p><p>│   ├── block</p><p>│   └── …</p><p>├── etc</p><p>│   ├── …</p><p>│   ├── update-manager</p><p>│   ├── update-motd.d</p><p>│   └── xdg</p><p>├── home</p><p>├── lib -&gt; usr/lib</p><p>├── lib32 -&gt; usr/lib32</p><p>├── lib64 -&gt; usr/lib64</p><p>├── libx32 -&gt; usr/libx32</p><p>├── lost+found</p><p>├── media</p><p>├── mnt</p><p>├── opt</p><p>├── proc</p><p>│   ├── …</p><p>│   └── tty</p><p>├── root</p><p>├── run</p><p>│   └── …</p><p>├── sbin -&gt; usr/sbin</p><p>├── srv</p><p>├── sys</p><p>├── tmp</p><p>│   └── …</p><p>├── usr</p><p>└── var</p><p>Каждый файл в ФС Линукса имеет конкретный индекс Inode. У одного файла в такой структуре может быть несколько имен, т.е. путей. В структуре системы файлы могут различаться, но на жестком диске им соответствует один файл. Такое свойство называют перекрестной иерархичностью — ветви дерева пересекаются.</p><p>Inode — индексный дескриптор, который используется в UNIX-системах. В нем хранятся все мета-данные о файле: владелец, время последнего обращения, размер, другая информация.</p><p>Каталог можно переместить в другую ФС, после этого его дескриптор будет создан заново. Только после этого исходник будет удален. В пределах одной системы изменится только путь файла. Каталоги и файлы существуют до момента, пока хранятся данные об их имени или пути к ним. При удалении этой информации блоки освобождаются под другие файлы.</p><p>В числе других особенностей Linux — ссылки двух типов:</p><ul><li>жесткая ссылка (то есть hard link) — путь файла, заданный командой ls -li;</li><li>символьная ссылка (symbolic link) — файл стандарта UNIX с текстовой строкой, задающей путь к оригинальному файлу.</li></ul><p>Существует также суперблок, где хранятся все параметры ФС — общее количество блоков и Inode, наличие свободных блоков и данные о них. Суперблок должен сохранять целостность —  это напрямую влияет на стабильность и работу всей системы. Для безопасности в Линукс создается несколько копий для восстановления информации в случае ее потери.</p><h2>Ключевые директории и их назначение</h2><p>В Linux директория — фундаментальный элемент системы. Это каталог (папка), где содержатся другие файлы, расположенные согласно иерархии. Отправной точкой, а точнее, базой выступает корневой каталог «/», на котором выстраивается вся система.</p><p>В некоторых источниках этот каталог сравнивают с диском С на винде, но это не совсем корректное сравнение — в Линуксе нет буквенных дисков. В Windows дополнительный раздел расположен на диске D, в Линукс это будет отдельная папка с тем же корнем. Иными словами, путь к любому файлу проходит через корень.</p><p>Пример. Файл /home/user/alien имеет структуру root -&gt; home -&gt; user -&gt; documents, и никакую другую.</p><p>Рассмотрим наиболее востребованные директории и их функции.</p><h3>Пользовательские файлы /bin и /sbin</h3><p>В этой директории расположены бинарные исполняемые файлы, которые требуются для загрузки системы и ее работы. Именно здесь вы найдете команды ls, cp, grep, mv, ping и прочие утилиты, доступные каждому юзеру. В /usr/bin хранятся и такие приложения, как браузер Chrome, Firefox и другие.</p><p>В каталоге /sbin, который имеет схожую конфигурацию, содержатся важные исполняемые файлы для системного администрирования. Это iptables, reboot, fdisk и т.д..</p><h3>Пользовательские данные /home (домашняя папка)</h3><p>В этом каталоге хранится домашняя папка с личными файлами и настройками. Например, если ваше имя юзера — denis, у вас будет домашняя папка /home/denis. Сюда записываются, например, скачанные файлы. Если пользователей несколько, они будут записывать файлы в свои папки. Для изменения других системных файлов потребуются права root.</p><h3>Конфигурационные файлы /etc</h3><p>Это место хранения файлов конфигурации — сетевых настроек, приложений, файлов инициализации различных служб (серверов печати, хостов и т.д). Папка крайне важна для работы всей системы. При необходимости общие файлы можно редактировать вручную в текстовом редакторе.</p><h3>Файлы устройств /dev и системные файлы /proc</h3><p>В директории /dev хранятся интерфейсы системных и периферийных устройств — дисков, принтеров, динамиков и прочих. В Линуксе устройства представлены в виде файлов. Стоит понимать, что это не совсем файлы в том виде, к которому мы привыкли. Псевдоустройства из этого каталога — это, например, генераторы случайных чисел /dev/random.</p><p>Файлы ядра и процессов содержатся в каталоге /proc. В нем, как и в /dev, нет стандартных файлов, а есть специфические области данных о системах и процессах. Здесь есть информация о процессоре /proc/cpuinfo; сведения о памяти, используемой системой — /proc/meminfo; время — /proc/uptime. Тут же содержится информация о системных ресурсах.</p><h3>Переменные (изменяемые) данные /var</h3><p>В этой директории лежат данные, которые в процессе работы системы постоянно меняются. Сюда относятся логи, кэши, системные журналы, почтовые очереди и прочие файлы, создаваемые программами.</p><p>Это записываемая директория, которая в стандартном режиме доступна только для чтения. Логи содержатся в /var/log, базы данных в /var/lib, файлы для перезагрузки в /var/tmp.</p><h3>Статические файлы для загрузки /boot</h3><p>Это важные файлы для загрузки ОС, в том числе ядра Линукс. Запуск системы без этой папки проблематичен. При этом файлы конфигурации загрузчика находятся в другой папке — /etc, о которой мы писали выше.</p><h3>Общие файлы библиотеки /lib</h3><p>В директории /lib находятся файлы, которые обеспечивают работу системных программ и ядра. Эти данные приложения и бинарные файлы /bin и /sbin используют для выполнения заданных функций.</p><h3>Съемный носитель /media</h3><p>В этом директории монтируются съемные носители. К примеру, когда вы используете компакт-диск или флешку, автоматически создается каталог. Юзеры получают полный доступ к содержимому носителей.</p><h3>Временные файлы /tmp</h3><p>В директории хранятся временные файлы, которые создаются приложениями в процессе работы. При перезагрузке содержимое этого каталога, как правило, очищается. Можно удалить файлы без перезагрузки с помощью соответствующих утилит.</p><h3>Восстановленные данные /lost+found</h3><p>В любой ФС Linux есть такая директория. Если в системе случится сбой, при следующей загрузке произойдет автоматическая проверка, и любые обнаруженные поврежденные файлы отправятся в каталог /lost+found, чтобы пользователь при необходимости смог восстановить данные.</p><h3>Файлы состояния приложений /run</h3><p>Относительно новая директория в Линукс. Здесь хранятся необходимые приложениям временные файлы — сокеты, идентификаторы процессов и другие. В отличие от каталога /tmp данные в /run нельзя удалить.</p><h2>Типы файлов в Linux</h2><p>Линукс подчиняется концепции «Всё есть файл», то есть работа с системой — это по сути взаимодействие с файлами. Применяются разные файлы, используемые как для стандартных данных, так и для устройств.</p><p>Плюс этой концепции в том, что система не тратит ресурсы на реализацию отдельных API для каждого приложения, так как все стандартные программы и процессы реализуются через работу с файлами.</p><p>Рассмотрим типы файлов, которые используются в Linux:</p><ul><li>Обычные (regular). Это стандартные файлы, используемые чаще других — данные, текст, исходный код, медиа и все остальное;</li><li>Файлы устройств. Сюда входят символьные и блочные файлы (char и block devices), представляющие внешние устройства — принтеры, жесткий диск и другие;</li><li>Именованные каналы. Файлы named pipes требуются для взаимодействия между процессами и передачи данных;</li><li>Ссылки. Используется два типа ссылок. Символические (так называемые симлинки) — работают как ярлыки для указания других каталогов и файлов; жесткие — отвечают за альтернативные способы доступа к физическим данным на диске и выступают дубликатами файлов, но без их фактического дублирования;</li><li>Каталоги. Папки со ссылками на файлы и другие папки. Отвечают за организацию данных и их распределение по категориям, упрощают доступ к различным разделам;</li><li>Сокеты. Файлы, предназначенные для обмена данными при выполнении рабочих задач. Используются как внутри системы, так и при взаимодействии устройств друг с другом. По сути, это своего рода почтовые службы, с помощью которых программы пересылают информацию друг другу;</li><li>Двери. Еще один механизм, ответственный за взаимодействие между процессами.</li></ul><p>В Линукс у каждого типа файла своя задача в системе управления. Такая схема работы обеспечивает мощность, придает ей гибкость и устойчивость. Поскольку внешние устройства представлены блочными файлами, с ними можно работать с помощью стандартных методов.</p><h2>Управление файловой системой</h2><p>Через консоль управления (терминал) в Linux доступен целый арсенал для работы с директориями и файлами.</p><p>Основные команды управления:</p><ul><li>Is. Просмотр содержимого папки и навигация. При использовании с различными опциями возможности расширяются, например, команда ls -l создает  подробный список;</li><li>cd. Путь к папке — меняет текущую директорию на указанную пользователем;</li><li>pwd. Обозначает текущие местоположение юзера в структуре каталогов;</li><li>mkdir. Используется для создания новой папки с присвоением ей имени;</li><li>cp. Копирует файлы из исходной папки в целевую;</li><li>mv. Перемещает или переименовывает каталоги и файлы;</li><li>rm. Удаляет указанные файлы;</li><li>cat. Выводит содержимое указанного файла в окно панели управления;</li><li>less. Используется для постраничного пролистывания файла;</li><li>touch. Создает новый пустой файл (с новым именем);</li><li>ln -s. Генерирует символьную ссылку, указывающую на выбранный каталог или файл;</li><li>which. Демонстрирует пошаговый путь к исполняемым файлам;</li><li>nano. Используется для текстовой редактуры файла;</li><li>locate. Применяется для поиска файлов по заданным шаблонам.</li></ul><p>Указанные выше команды формируют основу для взаимодействия с ФС. При необходимости используется более расширенный список.</p><h2>Монтирование и файловые системы Linux</h2><p>Монтирование — подключение файловых систем, жестких дисков и внешних носителей, получение доступа к ним, ручное и автоматическое отключение. При загрузке ядро устройства на Linux автоматически монтирует разделы, считывая данные из конфигурации /etc/fstab.</p><p>При подключении устройств каталог ассоциируется с ними с помощью драйвера, которому передается сгенерированная ссылка. В случае успешного взаимодействия ядро вносит данные в таблицу монтирования.</p><p>Монтирование системы реализуется с помощью команд mount и umount, подготавливающих устройства и точки монтирования. Они реализуют автоматическое подключение ФС. К виртуальной машине подключается диск /dev/sdc, на котором создаются разделы для файловой системы. После создания точки монтирования процесс загрузки ФС запускается.</p><p>Какие файловые системы на Linux наиболее востребованные:</p><ul><li>Ext. Первая ФС, разработанная специально для Линукс. Система значительно превзошла предыдущие решения по производительности и функционалу;</li><li>Ext2. Улучшенная версия первой ФС. Повышает надежность, улучшает управление и позволяет работать с большим количеством данных и файлов;</li><li>Ext3. Третье поколение ФС для Линукс. Поддерживает журналирование, что делает работу более стабильной и минимизирует риски потери данных после сбоев системы;</li><li>Ext4. Новейшая версия с повышенной эффективностью и масштабируемостью. Технически более совершенный вариант, упрощающий работу с большим объемом данных;</li><li>JFS. Разработка компании IBM. Эффективно использует ресурсы, отличается высокой производительностью, рассчитана на сильные нагрузки;</li><li>XFS. Высокопроизводительная ФС, разработанная компанией SGI. Подходит для работы с серверами и системами хранения данных;</li><li>ReiserFS. Разработка программиста Ганса Райзера. Главная особенность — возможность при необходимости увеличивать размер блока, тем самым избегая фрагментации;</li><li>Btrfs. Продукт компании Oracle. Обеспечивает гибкость при управлении данными, предоставляет опции оперативной проверки и восстановления файлов, интегрирует разные устройства в единую ФС;</li><li>Swap. Позволяет использовать дисковое пространство как виртуальную память, если физические возможности RAM исчерпаны. Технически этот инструмент нельзя назвать файловой системой, но он обеспечивает широкие возможности для управления данными в Линукс.</li></ul><p>ОС Linux уникальна в плане адаптации к разным сценариям использования, поскольку поддерживает работу многих файловых систем. Функциональное разнообразие обогащает платформу, позволяя тестировать и внедрять в практику множество полезных инноваций.</p><p>При этом у пользователя всегда есть свобода выбора — например, между стабильностью линейки Ext и гибкими возможностями файловых систем XFS, JFS. Безграничные возможности выбора отражают дух сообщества Linux, где независимые разработчики постоянно предлагают новые решения, обеспечивая постоянное развитие экосистемы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Энтузиаст разобрал, насколько сложен «Hello,  World!» на самом деле</title>
      <link>https://tproger.ru/news/--entuziast-razobral--naskolko-slozhen--hello---world---na-samom-dele</link>
      <comments>https://tproger.ru/news/--entuziast-razobral--naskolko-slozhen--hello---world---na-samom-dele?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--entuziast-razobral--naskolko-slozhen--hello---world---na-samom-dele</guid>
      <description><![CDATA[<p>Разбор программы «Hello, World!» показал скрытую сложность: ELF-структуры, системные вызовы и роль компилятора раскрывают весь процесс</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--entuziast-razobral--naskolko-slozhen--hello---world---na-samom-dele">Энтузиаст разобрал, насколько сложен «Hello,  World!» на самом деле</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 26 Dec 2024 03:37:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>Энтузиаст разобрал, насколько сложной на самом деле является программа «Hello, World!».</p><p>В своём материале он <a href="https://4zm.org/2024/12/25/a-simple-elf.html">показал</a>, что даже этот простой пример скрывает множество технических деталей, которые обычно остаются за кадром.</p><p>Так, при компиляции, она превращается в исполняемый файл, полный символов и зависимостей.</p><p>Например, команда objdump -x hello показывает, что даже базовая программа содержит множество секций, таблиц символов и метаданных:</p><h2>Попытка минимализма</h2><p>Чтобы понять работу программы на низком уровне, автор предлагает создать минималистичный исполняемый файл без стандартной библиотеки C.</p><p>Это требует непосредственного написания системных вызовов Linux. Например, вызов write можно реализовать напрямую:</p><h2>Разбор структуры ELF-файла</h2><p>Статья подробно объясняет структуру ELF (Executable and Linkable Format) — стандартного формата для Unix-систем.</p><p>Заголовки ELF, секции и сегменты взаимодействуют друг с другом для создания исполняемого файла.</p><p>Например, заголовок ELF содержит ссылки на таблицы символов и разделы, такие как .text (код программы) и .data (данные).</p><h2>Линкер и оптимизация</h2><p>Автор также разбирает использование кастомных скриптов линковки для создания минималистичных исполняемых файлов.</p><p>Например, с помощью линкера ld можно исключить ненужные зависимости и сократить размер программы.</p><h2>Выводы</h2><p>Как оказалось, даже простая программа «Hello, World!» скрывает сложность, связанную с взаимодействием компилятора, линкера и операционной системы.</p><p>Материал автора в очередной раз подчеркнул важность понимания базовых элементов программного обеспечения и их влияния на процесс выполнения программ.</p>]]></content:encoded>
    </item>
    <item>
      <title>Линукс против новичков: разбираемся с драйверами</title>
      <link>https://tproger.ru/articles/linuks-protiv-novichkov--razbiraemsya-s-drajverami</link>
      <comments>https://tproger.ru/articles/linuks-protiv-novichkov--razbiraemsya-s-drajverami?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ирина Тюльпакова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/linuks-protiv-novichkov--razbiraemsya-s-drajverami</guid>
      <description><![CDATA[<p>Рассказываем, почему проблема драйверов в Линуксе  — всё ещё актуальная вещь, в какой момент может всё сломаться и что делать, если драйвер в Линуксе не работает.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/linuks-protiv-novichkov--razbiraemsya-s-drajverami">Линукс против новичков: разбираемся с драйверами</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 09 Apr 2024 09:30:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Старожилы, которые работали с Unix-системами лет 10-15 назад, помнят, как часто на форумах возникали вопросы «как скачать драйвер для linux» или «не работает аудиовыход — как починить». Сейчас, пусть и реже, какой-нибудь драйвер нет-нет, да и отвалится. Основных причин, почему такое возникает, две:</p><ol><li>Все драйверы содержатся в ядре системы. Обновляется дистрибутив — ядро пересобирается, обновляются или удаляются старые драйверы, и устройство, прекрасно работающее долгие годы, просто «отваливается».</li><li>Политика некоторых дистрибутивов достаточно жесткая: например, в ядре содержатся только драйвера со свободной лицензией. Поэтому с компонентами от AMD и Intel проблем не возникает, а вот для того, чтобы настроить видеокарту от NVidia, нужно заморочиться.</li></ol><p>С мышками, клавиатурами и прочими мелочами, как правило, бед не случается. Управление этими устройствами происходит через стандартные интерфейсы. Туда же можно отнести флэш-накопители, устройства NVMe и даже контроллеры USB и SATA — для них нет специфичных Linux драйверов. Что нельзя сказать про wifi-адаптер: для каждого придётся вручную подбирать необходимое ПО.</p><p><a href="https://tproger.ru/articles/v-chyom-linux-luchwe-windows">https://tproger.ru/articles/v-chyom-linux-luchwe-windows</a></p><h2>А это нормально, что ядро Линукса так сильно раздуто драйверами?</h2><p>Да, всё окей. Большая часть кода драйверов в ядре была хорошо абстрагирована, поэтому добавление другого устройства может означать добавление всего нескольких строк кода.  В Linux драйверы могут занимать не более нескольких десятков кБ для правильной работы контроллера.</p><p>Для примера, около 380 драйверов будут весить столько же, сколько .txt-файл с первым томом «Войны и мира», или как трехминутный качественный mp3-трек. При этом Unix-системы оставляют возможность перекомпилировать ядро, избавиться от ненужных модулей и сократить его вес почти в 10 раз. Но мы настоятельно не рекомендуем заниматься этим на рабочих машинах, особенно если о такой возможности вы только что узнали.</p><p>К тому же, образ Windows тоже содержит огромное количество предустановленных драйверов. Например, для того, чтобы live usb корректно работал на любой машине.</p><h2>Что не стоит делать в Linux с драйверами</h2><p>Последнее, к чему советуют прибегать — это скачивать драйверы с сайтов-производителей и вручную запускать их в Unix-системе. На это есть ряд причин, рассмотрим на примере установки драйверов NVidia в Linux:</p><ul><li>драйвер может перезаписать библиотеку с графическим интерфейсом Mesa GL, из-за чего перестанет работать открытый драйвер (если вы работаете со встроенной AMD и дискретной NVidia-картой, то система при обновлении не сможет распознать даже AMD);</li><li>установленный с сайта драйвер не обновится с ядром, его нужно будет переустанавливать вручную;</li><li>в случае, если у вас отвалятся оба драйвера, придётся накатывать обновления через CLI (терминал).</li></ul><p>Так что в Linux драйверы видеокарты лучше ставить более изящным способом, через добавления в систему репозитория.</p><h2>Что делать, если что-то не работает в Линукс?</h2><h3>1. Воспользуйтесь встроенным ПО</h3><p>В Линуксе нет привычного для Windows-пользователей диспетчера устройств. Но можно воспользоваться аналогами, например, «<a href="https://askubuntu.com/questions/47506/how-do-i-install-additional-drivers">Additional driver</a>» в Ubunta или <a href="https://help.gnome.org/users/gnome-packagekit/stable/add-remove.html.en">менеджером пакетов для GNOME</a> в других дистрибутивах. На крайний случай скачать утилиту <a href="https://github.com/Nokse22/inspector">Inspector</a>.</p><h3>Посмотрите, какие драйверы уже установлены</h3><p>Прежде чем устанавливать драйвер, не лишним будет проверить, находится ли он в системе вообще. В первую очередь проверьте список устройств, распознанных системой — это можно сделать вручную через терминал. Кстати, мы писали уже про <a href="https://tproger.ru/articles/100-komand-linux-dlya-ezhednevnoj-raboty">полезные команды в Linux</a>.</p><p>Если у вас есть название драйвера — то можно воспользоваться командой grep (она помогает фильтровать вывод по ключевому слову).</p><p>Например, вы можете ввести lspci | grep NVIDIA, если хотите узнать, установлен ли драйвер NVidia.</p><p>Дальше можно посмотреть драйверы устройств, которые были распознаны ядром:</p><p>или, по аналогии,</p><p>Если команды dmesg  или lscpi вывели нужный вам драйвер, значит, проблема не в нём. А вот если они ничего не дали, значит, драйвер не установлен или не распознаётся. Тут нужно проверить, есть ли драйвер в файловой системе:</p><p>и</p><p>Тут тоже можно использовать | grep SOME_DRIVER_KEYWORD. Если драйвер распознается этими командами, но не lscpi или dmesg, это означает, что драйвер находится на диске, но не в ядре. В этом случае загрузите модуль с помощью команды modprobe:</p><h3>Обратитесь к wiki</h3><p>Если вам нужны проприетарные драйверы, перейдите в документацию вашего дистрибутива или на специальную wiki и найдите, для чего вам нужны драйверы (например, для "nvidia"). Скорее всего, правильному способу это сделать будет посвящена целая страница. Вот для примера <a href="https://wiki.astralinux.ru/pages/viewpage.action?pageId=158610328">вики по Astra Linux и установке NVidia-драйверов</a>.</p><p><a href="https://tproger.ru/books/linux">https://tproger.ru/books/linux</a></p><h2>Заключение</h2><p>Проблема с драйверами в Линуксе достаточно масштабная: при очередном обновление ядра устройства могут внезапно выйти из строя, начать греться или наоборот, лучше работать. Хорошая новость заключается в том, что по каждому популярному оборудованию можно найти репозитории с проприетарными драйверами, а также пошаговую инструкцию, как их накатить. Если вы всё же нацелены перейти на Linux и хотите выбрать хороший дистрибутив, то <a href="https://tproger.ru/digest/vybiraem-distributiv-linux-dlja-novichka">наш материал</a> может помочь.</p>]]></content:encoded>
    </item>
    <item>
      <title>Библиотека программиста: 37 книг для того, чтобы разобраться в IT</title>
      <link>https://tproger.ru/articles/knigi-po-programmirovaniyu</link>
      <comments>https://tproger.ru/articles/knigi-po-programmirovaniyu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ирина Тюльпакова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/knigi-po-programmirovaniyu</guid>
      <description><![CDATA[<p>Подборка из 37 книг по программированию от Winderton: Computer Science, алгоритмы, Python, C++, Java, C#, JavaScript. Узнайте, с чего начать в IT.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/knigi-po-programmirovaniyu">Библиотека программиста: 37 книг для того, чтобы разобраться в IT</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Фронтенд-разработка с нуля]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Mar 2024 13:50:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Два года назад IT-блогер Winderton опубликовал собственную подборку из книг про программирование. Его библиотека включает как базовые книги по алгоритмике и основам компьютерных наук, так и более конкретные, посвященные языкам. Несмотря на то, что к 2024 году некоторые книги получили переиздание, список всё так же можно назвать мощной подготовительной базой для начинающего специалиста.</p><p>Ниже — транскрибация ролика, дополненная ссылками.</p><p>Шесть лет назад я,
Виндертон, будучи в состоянии аффекта,
выкладываю вот этот вот ролик, который
посмотрело уже больше 100 тысяч человек: «Техническая литература для программистов».
Чтобы сэкономить вам 10 минут вашего
времени, там были показаны вот эти вот
книги.</p><figure><img src="https://media.tproger.ru/user-uploads/88534/2024-03-29/f07dfe38-506e-480f-b7c7-2f70bdd6fb46.png" alt="" /></figure><p>Вопросов нет. Кнут — это классный автор
с крутыми материалами. На кто его
потянется со всей этой математикой, если даже
вот эти челы не тянут, а конкретно тот,
что с бородой — Шон Магресс. Тадембаум —
та же самая история. Классный материал,
но настолько сложное задание, что порой
вгоняет в депрессию. Корман заставляет
писать вас вообще деревья с нуля без
примеров.</p><p>Поэтому, если вы хотите освоить основу
программирования, влиться в компьютер-сайенс,
или вам просто нужны хорошие книжки по
программированию, то за следующие
несколько минут я на вас вывалю все
то, что есть на 2022 год, дам по каждой
комментарии, рекомендации и антирекомендации.
Грубо говоря, мы сейчас сделаем с вами
выборку.</p><p>Ну а мы разбиваем видео на три части:</p><ol><li>Введение в программирование и ядро computer science.</li><li>Моя библиотека. GameDev, прочее.</li><li>Языки программирования.</li></ol><h2>Введение и основы computer science</h2><p>«Внутри машины», или как работает ваш
компьютер, у нас это называется еще «архитектура ЭВМ». Как устроен процессор,
память и вся организация железа. Если
у вас нулевой бэкграунд, вам нравятся
картинки и тоненькие книжки (~300 страниц), то это то,
с чего вам точно стоит начать.</p><p>«Введение в компьютерные системы». Тут
автор начинает буквально с того, почему
процессор делается из кремния, потому
что они сами делали процессоры из
кремния. И проходится по всему
абстракционному стеку, начиная от
железа, через периферию, BIOS, операционную
систему, ассемблер, язык программирования
C, пишут на нем потом программы и покажут,
как это дело все между собой связано,
взаимодействует в очень интерактивной
манере.</p><p>«Код» Петцольда. Эта книга, как и
первая, тоже для полных новичков, без
бэкграунда в сфере. Там рассказывается
про то, что такое железо, операционная
система, компиляторы, языки программирования,
как это дело все между собой взаимодействует.
Если вам когда-нибудь было интересно,
почему компьютер именно такой, а программы
пишутся именно так, то Петцольд в очень
простой манере за 400 страниц вам об этом
простенько расскажет.</p><p>Если вдруг по каким-то причинам вы эти
книги не найдете или вам их будет мало,
то вот еще две.</p><p>Первое — это «Теоретический
минимум по Computer Science». Уровень подачи тут
не дотягивает до предыдущих трёх, он
немножко мудрёнее и сложнее, но тут
реально покрывается весь тот компьютер-сайенс необходимый, который вам нужен, и
в книге всего 150-200 страниц.</p><p>Единственный
минус, который связан у меня с этой
книгой — она вся развалилась пока я её читал.</p><p>«Computer Science: an Overview». Эта книга реально местами
довольно часто очень сложная. То есть,
если вы не знаете, что такое транзистор,
а там об этом узнаете, то вы вряд ли
поймете, что такое транзистор.</p><p>Но, (а) эта
книга реально походится по всему курсу
Computer Science, где говорят даже про базы
данных и графику, и, (б) там копают чуть
глубже, чем в этой, этой или этой. Поэтому,
если у вас есть хоть немного опыта
программирования, то смело берите эту
книгу и изучите Computer Science.</p><h3>Алгоритмы и структуры данных</h3><p>Как вы все
знаете, это Корман и Седжик.</p><p>Но Корман — это очень много математики
прямо с первых страниц, а Седжик — это
Java, которая, ну, не особо всем нравится.</p><p>Но нам везет, и со временем появляются
реально годные альтернативы. И одна из
них — это Grokking Algorithms. Я о ней узнал
года три назад, и года два назад полностью
заменил ею Кормана в менторинге. Книгу написал очередной гений, который
программирует с двух лет и продает свои
первые игры чуть ли не в 10 лет. Но она
реально написана простым языком, и хочу
сделать небольшую ремарку, если будете
читать перевод. В переводах есть ошибки,
поэтому просто будьте осторожны и всегда
рекомендую только оригинал.</p><h3>Операционные системы</h3><p>Для меня
это был и остается Томас Андерсон с вот
этой вот книжкой, потому что книги
Тененбаума более сухие, наверное, и выше
по уровню сложности. Поэтому, если вы
понимаете, что написано в этой книге,
можете перейти к Тененбауму, но не Вайзверсу.</p><p>Тут, наверное, есть какой-то
баланс, она не слишком глубокая и не
слишком поверхностная.</p><p>Также мне нравится
вот эта книжка, она супер просроченная,
я давным-давно ее купил, но если вы хотите
знать, как работает Unix, и вам нужен
туториал, как написать свой Unix, то это
как раз-таки то, и не важно, что ей 200 с
лишним лет.</p><h3>Компиляторы и дизайн языков</h3><p>Книгу с драконом сразу отсюда
убираем, потому что она, ну, прям
слишком сложная.</p><p>Берем сюда Николаса Вирза, 150 страниц,
и добавляем сюда Нистерна с его Crafting
Interpreters. Кстати, Нистерн — это тот самый
чел, который делал паттерны для геймдева,
которые являются чуть ли не аналогом
Банды Четырех.</p><h3>Software development</h3><p>Clean Code, Code Complete и так далее — ребят, это классные книги,
не поймите меня неправильно, они написаны
лучшими из нас, но читать их нужно только
тогда, когда вы имеете уже от двух до
трех лет опыта в программировании. Они
учат вас, как делать правильно, и вы,
скорее всего, не поймете, как делать
правильно, если вы сначала не поделаете
неправильно. Тут нереально учиться на
чужих ошибках. Рекомендую читать только
тогда, когда у вас будет пару пэт-проектов
и два-три года опыта в программировании
в целом.</p><p>Касаемо ООП, все советуют «Банду
Четырёх», которая прилично так всем уже
надоела.</p><p>А я посоветую вам вот эту книгу,
которая, на мой взгляд, будет лучше. Единственный момент, то, что там С++, но
его там на самом деле почти нет. Не
пугайтесь.</p><h2>Моя библиотека, GameDev, прочее</h2><p>Джейсон Грегори — это автор,
который написал Uncharted и, соответственно,
эту книгу. У него супер-обширные познания
в игровых движках как минимум и как
максимум в производстве игр. В моменте
этот человек решает написать вот эту
вот книгу, которая уже третье издание.
Отличная подача материала, углубление
в самый раз, максимально широченный
охват тем. И вот, например, то, что делает тот же
самый Ян Черников — это процентов 20-30
вот от этой вот как раз книги. Чаще всего
я читаю именно её.</p><p>Опять же, Андерсон «Операционки». Тут лучшее объяснение
виртуальной памяти, на мой взгляд. Книга
по введению в CS и программирование.
Просто всем советую. Конечно же, Корман
со своей бандой. Они тут явно борщат с
математикой, но, может быть, это просто
я тупой [здесь не даются ссылки на книги т.к. автор повторяет их из первого раздела, — прим.редактора].</p><p>Не особо классная книга по C++,
но как референс или подставка для
монитора вполне сходит.</p><p>Ещё одна классная книга — это Game Coding
Complete. Сложные темы рассказывают достаточно
простым языком. И именно отсюда я узнал,
что такое анимация и как они работают.</p><p>Конечно же «Си» Кернигана и Ричи, но я не
советую, если у вас с психикой не все в
порядке.</p><p>Ассембль от Apress, чтобы
хоть какое-то понимание было, что это
такое, как на него смотреть вообще&lt;...&gt;</p><h2>Языки программирования</h2><h3>Python</h3><p>Тут идёт, конечно же, Лутц с его громким именем. Книжка прям для
суперновичков, и Лутц, самое главное, не
страдает болезнью. Вот это вы пока не
понимаете, но через 10 страниц я вам это
объясню. Нет, он как в бакалее: всё сразу
по полочкам вам раскладывает, и вы
перелистываете страницу за страницей,
с приятным чувством, что вы все понимаете,
вы весь такой вообще умный и сообразительный.</p><p>Еще одна книга на уровне этой — «Краш-курс Питона», которая была написана
тоже автором, у которого куча классных
книг по питону. Он программирует с 5 лет
и пишет полжизни книги. Отличие от Лутца в том, что эта книга
подходит как и начинающим, так и типам
с опытом, поэтому читать ее реально не
скучно.</p><p>Еще одна классная книга и классный
автор — это Дэвид Бизли с его «Python
Cookbook». Вообще, Дэвид Бизли — это бывший
С-шник, который полжизни пишет на C и
в моменте решает преподавать Python. И
расскажет про всякие супер интересные
и занимательные штуки по типу, почему
на Python нельзя программировать многопоточные
приложения, почему на нем нельзя
программировать мобильные приложения.
И у него еще есть всякие видео на YouTube,
где он показывает всякие хаки с Python.
Поэтому Python Cookbook, если уже знаете основу,
то там вас научат расширять даже
питоновский интерпретатор.</p><h3>C</h3><p>Тут сразу запомните одно. Никогда не
читайте книгу Learn C the Hard Way, потому что
там автор сразу видно, что не знает, о
чем говорит, и упрощает то, что упрощать
не надо. У этой книги прям очень много
хейта в интернете, как и у книг Шилта,
который классно знает Java, но не знает
C++ и C, или как минимум не умеет их
преподавать.</p><p>Волк в овечьей шкуре или
Брайан Керниган и Денис Ричи и C, второе
издание. Книгу рекомендуют до сих пор
изучать по C, но на самом деле там есть
куча проблем. Во-первых, это то, что эта
книга подразумевает то, что вы уже знаете
компьютер-сайенс, как работает вообще
все, начиная от железа и вплоть до
операционных систем. Во-вторых, то, что
она по факту страниц 250, хотел сказать,
она по факту 2500, и там нет такого понятия,
как best practices, то есть книги 100 лет, и там
просто не знали, что такое хорошо, а что
такое плохо. Поэтому не рекомендую, если
вы не понимаете компьютер-сайенс.</p><p>Beginning C. Книга от Apress, которая, как вы
видели, у меня уже есть x86 Assembly. Классная
книга, классное издательство. Фишка
этой книги то, что там рассказывают про
C99, про C11, про многопоточность в C.</p><p>Эта книга
отлично работает как туториал, как
референс, как подставка. И там много
всяких работающих маленьких программулек
на C.</p><p>И напоследок, хочу скачать что мне запомнилась,
вот эта книга, которая называется Expert
C. Она была написана челами, которые
классно знают и разбираются в
интерпретаторах и работают в САН.</p><h3>C++</h3><p>Конкретно от меня, у меня Primer Plus, которая
не лучшая из этих книг, но мне хватило
ее как референса [автор упоминал её ранее, — прим.редактора].</p><p>Мне также очень нравятся
книги Скотта Майер Effective C++, которые
нравятся вообще всем.</p><p>Плюс я почитываю
вот эти вот две книги по метапрограммированию,
не самые хорошие, но выбора просто нет
никакого.</p><p>Само собой, многопоточность и C++
Concurrency in Action, потому что также нет никакого
выбора. Ну и само собой, Александр Эску,
которого почитывать нужно как минимум
для того, чтобы видеть, как делать не
надо, а это всегда в C++ интересно
посмотреть.</p><h3>Java</h3><p>Джава за
один день, всем советую, конечно же,
шучу, это полная фигня. Всегда избегайте
этих книг, каких бы отзывов вы там не
видели, потому что это чушь собачья, а
не книги. Простите, авторы.</p><p>А вот книга Шилда Java Complete Reference,
последний, который я читал, шестой и
седьмой, мне всегда нравились, потому
что простая подача, и они очень похожи
на GLS. Наверное, даже проще. Да и вообще,
у Шилда читать, мне кажется, можно всё,
что угодно, потому что он как бы папа джавы.</p><p>Конечно же, как только вы знаете
джаву-основу, это Джошуа Блок с ее Effective Java, это аналог Скотта Майера с Effective C++. На моей первой работе на Java, когда я
пришел и сказал своему тимлиду, что я
читаю Effective Java, он мне говорит, блин, это
классная книга, я там дженерики сейчас
изучаю. А я стоял в этот момент и думал,
что, блин, я ее тоже уже читаю. Было очень
приятное чувство, но меня тогда, типа,
я так и остался работать джуном, а он
так и остался работать тимлидом. Ничего
не поменялось. В этой книге реально
много практик использования джава в
реальном продакшене, поэтому, если
знаете основу, смело ее рекомендую.</p><p>Java Concurrency in Practice. То есть Java — это
исключение, это многопоточность, это
OOП. Такие книги, как Java Concurrency in Practice,
показывают вам, как использовать ту же
самую многопоточность, ее неотъемлемую
часть. А такие книги, как Хедферст или
какой-нибудь Шилдт, показывают вам, что
такое Java Core. Также на уровне с Шилдтом есть тип, которого зовут Кей Хорсман. У
него много всяких книг по типу «Как
работать с синхронизацией» или «Ближележащие топики». То есть какой-то Advanced
Java. Поэтому советую присмотреться тоже.</p><h3>C#</h3><p>Пусть Рихтера читают, пусть больше
ничего не читают.</p><h3>Javascript</h3><p>Симпсон «Вы не знаете
JavaScript». Неоднократно слышал про эти книги
от классных JS-ников, потому что там много
всяких how-to, то есть как работает это,
как работает это, почему не работает
это.</p><p>Советовать
Фленнегана или Дугласа Кроуфорда,
который хотел назвать JavaScript C++++ я не
буду, потому что, если бы вы хотели читать
книги, вы бы, наверное, изучали C++. Все-таки JavaScript — это попробовать,
потыкать и поучиться на практике.</p><h3>Assembly</h3><p>Я
покупал себе вот эту книгу и ни разу в
ней не разочаровался. Возможно, потому
что я прочитал ее только процентов на
30, но какая разница. Наверное, будет
хороший вопрос, если вы скажете, зачем
мне вообще ассембли в 2022 году. Да, он вам
не нужен, вы на нем писать ничего точно
не будете, но если вы пишете на плюсах,
то чтение ассембли во время дебаггинга,
что занимает большую часть вообще
времени в программировании, как минимум на C++, как минимум у меня,
понимать ассембли хотя бы нужно, поэтому
такая вот книга в этом отлично помогает.</p><p>Еще есть вот такая вот книга, но она прям
суперпростая, поэтому я бы рекомендовал
читать сразу вот эту.</p><p>Читайте также: <a href="https://tproger.ru/articles/kak-stat-programmistom">Как стать программистом с нуля — полный гайд</a>, <a href="https://tproger.ru/articles/backend-2024">Что знать бэкендеру в 2024 году</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что общего и в чем разница между MacOS и Linux</title>
      <link>https://tproger.ru/articles/chto-obshhego-i-v-chem-raznica-mezhdu-macos-i-linux</link>
      <comments>https://tproger.ru/articles/chto-obshhego-i-v-chem-raznica-mezhdu-macos-i-linux?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-obshhego-i-v-chem-raznica-mezhdu-macos-i-linux</guid>
      <description><![CDATA[<p>Разбираемся, справедлив ли аргумент о схожести Linux и MacOS, и объясняем, чем похожи и чем отличаются две операционные системы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-obshhego-i-v-chem-raznica-mezhdu-macos-i-linux">Что общего и в чем разница между MacOS и Linux</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 08 Sep 2023 11:17:31 GMT</pubDate>
      <content:encoded><![CDATA[<p>Помимо вечной битвы между пользователями Linux и Windows, существует еще один холивар между пользователями Linux и MacOS. Первые утверждают, что MacOS можно считать невероятно переоцененным дистибутивом Linux, а вторые возражают, что ничего общего между этими ОС нет.</p><p>Правда, как всегда, находится посередине. В этой статье мы разберемся, справедлив ли аргумент о схожести Linux и MacOS, и объясним, чем похожи и чем отличаются две операционные системы.</p><h2>Что общего между MacOS и Linux</h2><p>В первую очередь, обе системы в своей современной итерации разработаны на основе Unix. Также и Linux, и macOS совместимы с POSIX.</p><p>POSIX – это стандарт, который определяет совместимость операционных систем, основанных на UNIX.</p><p>POSIX (Portable Operating System Interface) был разработан с целью обеспечить переносимость программного обеспечения между различными UNIX-подобными системами.</p><p>POSIX включает в себя набор спецификаций и интерфейсов для программирования, обеспечивающих единообразие взаимодействия приложений с операционной системой. Этот стандарт определяет функции, системные вызовы, переменные окружения, файловую систему и другие компоненты операционной системы.</p><p>Поддержка POSIX приводит к легкой переносимости серверного программного обеспечения и программ на языках программирования вроде Ruby, Python, gcc, clang, Erlang и многих других, с одной ОС на другую.</p><p>Файловая система в ОС выполнена практически идентично, за исключением того, что macOS не чувствителен к регистру.</p><p>Также почти все программное обеспечение GNU, то есть практически каждая программа, работающая на компьютере с Linux, доступна для macOS.</p><p>GNU – это проект свободного программного обеспечения (Free Software Foundation’s GNU Project), который был запущен Ричардом Столлманом в 1983 году. GNU является сокращением от “GNU’s Not Unix” и представляет собой усовершенствованную и свободную реализацию операционной системы Unix.</p><p>Ключевой элемент GNU – это GNU General Public License (GNU GPL), который предоставляет пользователю свободу использовать, изменять и распространять программное обеспечение под лицензией.</p><p>Лицензия GNU GPL гарантирует, что программное обеспечение, распространяемое под ее знаком, остается свободным и доступным для всех.</p><p>Разработчик может точно воссоздать среду, в которой будет выполняться код, при переходе с MacOS на Linux и наоборот.</p><p>В общем, и Linux, и macOS поддерживают эти стандарты, поэтому и складывается ощущение, что операционные системы похожи друг на друга.</p><h2>В чем разница между macOS и Linux</h2><p>MacOS почти никак не связана с Linux. На самом деле, родословная macOS старше, чем родословная Linux.</p><p>То, что мы сегодня называем macOS, основано на NeXTstep, операционной системе, разработанной NeXT Computing в 1980-х годах.</p><p>NeXT — это компания, которую Стив Джобс основал после того, как покинул Apple в 1985 году после конфликта с советом директоров. Да, есть и такая строчка в биографии Джобса.</p><p>Стив Джобс основал новую компанию и нанял Ави Теваняна в качестве руководителя отдела разработки программного обеспечения.</p><p>Теванян был одним из программистов, разработавших ядро ​​BSD Mach в Университете Карнеги-Меллона, и Джобс попросил его создать на его основе новую многозадачную ОС.</p><p>В качестве основы для NeXTstep использовалась Berkeley Unix BSD 4. Berkeley Unix была разработана Калифорнийским университетом в Беркли после Unix System 3.</p><p>В Unix System 3 вносили различные улучшения, после чего ОС назвали BSD 4. Более поздняя версия BSD под названием Mach была разработана как раз в Карнеги-Меллоне.</p><p>Теванян придумал новую ОС, которая превосходила аналоги на тот момент времени. К примеру, Тим Бернерс-Ли изобрел Всемирную паутину в 1990 году именно на компьютере NeXTstation с NeXTstep в качестве ОС.</p><figure><img src="https://media.tproger.ru/user-uploads/48741/2023-09-08/79032e2d-2aa2-443d-a5e2-64560c0757fb.jpeg" alt="" /></figure><p>В это же время Apple без Стива Джобса пыталась создать собственную ОС, но все было тщетно. Они пришли к решению выкупить NeXT, и Джобс вернулся в компанию.</p><p>Теванян, который стал новым руководителем отдела разработки программного обеспечения Apple, затем переработал NeXTstep в Mac OS X.</p><p>Это до сих пор влияет на работу macOS: в ней инструменты командной строки взяты из *BSD, а в Linux они заимствованы из GNU.</p><figure><img src="https://media.tproger.ru/user-uploads/48741/2023-09-08/62ca6710-339a-4934-bb7a-7e926a16e69e.png" alt="" /></figure><p>Даже сегодня, если вы посмотрите на API macOS, вы заметите, что многие вызовы API, имена классов и функции AppKit начинаются с «NS», например, NSOpenPanel, NSSavePanel, NSWindow, NSResponder и так далее.</p><p>«NS» здесь означает «NeXTSTEP». Даже объект, который обрабатывает основной цикл событий в приложении AppKit, называется NSApplication.</p><p>Linux был разработан позже. Ядро ​​Linux было написано только в 1991 году, а первые дистрибутивы GNU/Linux появились в 1992 году. NeXTstep была выпущена 18 сентября 1989 года и была уже отполированной ОС, которую можно было использовать для серьезных проектов. Этих высот Linux смогла добиться только несколько лет спустя.</p><p>Таким образом, macOS — это не просто дорогая и симпатичная Linux. Это симпатичная NeXTSTEP, которая была симпатичной BSD Unix.</p><p>MacOS — это операционная система BSD UNIX на основе микроядра с собственной собственной подсистемой отображения, архитектурой драйверов и оконным менеджером.</p><p>Linux представляет собой монолитное ядро ​​без родословной UNIX, но благодаря библиотекам и утилитам GNU обеспечивает UNIX-подобную среду POSIX.</p><h2>Почему различия между Linux и macOS важны</h2><p>Теперь, после того как мы выяснили, что у Linux и macOS разные ядра, поговорим о том, почему это вообще важно для пользователя. Дело в том, что Linux с его монолитным ядром выиграл «войну ядер», которая до сих пор не закончена.</p><p>Монолитное ядро Linux – это тип архитектуры ядра операционной системы, в котором все основные функции и драйверы находятся внутри одной исполняемой программы – ядра. В монолитном ядре все части ядра работают в одном адресном пространстве и имеют прямой доступ к аппаратным ресурсам компьютера.</p><p>В монолитной архитектуре ядра, все функции, такие как управление процессами, файловой системой, памятью, сетью и устройствами ввода-вывода, реализованы внутри ядра и взаимодействуют друг с другом напрямую. Это позволяет ядру эффективно управлять ресурсами и обеспечивать высокую производительность системы.</p><p>Как правило, монолитное ядро ​​работает быстрее, но микроядро лучше спроектировано с точки зрения архитектуры: микроядро очень легкое, а основные службы распределены и передают сообщения друг другу.</p><p>К сожалению, в микроядрах задержка больше, чем в монолитном ядре, объединяющем все в одном месте. Mach был одним из первых экспериментов по разработке серьезного микроядра, и многие говорят, что он провалился с точки зрения производительности.</p><p>В macOS (ранее известной как Mac OS X и OS X) используется микроядро XNU (X is Not Unix). XNU является гибридным ядром, в котором сочетаются микроядро и некоторые элементы архитектуры монолитного ядра. Хотя ядро XNU является гибридным, его основной архитектурой является микроядро.</p><p>В микроядре ядро обеспечивает только базовые механизмы, а остальные функции, такие как файловая система и сеть, выполняются в виде отдельных служб, работающих в пользовательском пространстве.</p><p>Но и у macOS есть преимущество. Микроядро стабильнее. Если один модуль даст сбой, все остальные модули будут работать и дальше.</p><p>В этом смысле, вам решать, что важнее: надежность или скорость.</p>]]></content:encoded>
    </item>
    <item>
      <title>25 современных замен Unix-командам собрали в одном GitHub-репозитории</title>
      <link>https://tproger.ru/news/25-sovremennyh-zamen-unix-komandam-sobrali-v-odnom-github-repozitorii</link>
      <comments>https://tproger.ru/news/25-sovremennyh-zamen-unix-komandam-sobrali-v-odnom-github-repozitorii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/25-sovremennyh-zamen-unix-komandam-sobrali-v-odnom-github-repozitorii</guid>
      <description><![CDATA[<p>Удобно, что полезные утилиты можно найти в одном месте, с ссылками на их GitHub-страницы, без необходимости перерывать половину интернета.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/25-sovremennyh-zamen-unix-komandam-sobrali-v-odnom-github-repozitorii">25 современных замен Unix-командам собрали в одном GitHub-репозитории</a>»</p>]]></description>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 17 Jun 2021 06:28:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Unix-команды — очень полезный инструмент, который в правильных руках увеличивает продуктивность. Но стоит признать, что во многих вопросах он устарел.</p><p>И чтобы освежить знакомые всем команды, не меняя сильно логику их работы, было создано множество альтернатив. И 25 из них были собраны на GitHub-репозитории <a href="https://github.com/ibraheemdev/modern-unix">Modern Unix</a>.</p><h2>bat</h2><p>Например, команду cat можно заменить с помощью <a href="https://github.com/sharkdp/bat">bat</a>. Она, как и оригинал, позволяет выводить на экран содержимое файлов. Только в отличие от устаревшей Unix-утилиты поддерживает подсветку и прочие современные возможности.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/1_3.png" alt="" /><figcaption>bat</figcaption></figure><h2>lsd</h2><p>Есть и продвинутая версия ls — <a href="https://github.com/Peltoche/lsd">lsd</a>. Эта утилита написана на Rust, что делает её достаточно быстрой. При этом имеются версии практически на все платформы: от <a href="https://github.com/Peltoche/lsd#on-archlinux">Archlinux</a> и <a href="https://github.com/Peltoche/lsd#on-fedora">Fedora</a> до <a href="https://github.com/Peltoche/lsd#on-macos">macOS</a> и <a href="https://github.com/Peltoche/lsd#on-windows">Windows</a>.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/1_1-3.png" alt="" /><figcaption>lsd</figcaption></figure><h2>zoxide</h2><p>В подборку попала и «умная» замена базовой команде cd — <a href="https://github.com/ajeetdsouza/zoxide">zoxide</a>. В отличие от предмета своего вдохновения, новинка умеет понимать, какая директория наиболее подходит под ваши запросы.</p><p>С полным списком альтернатив Unix-команд можно ознакомиться на странице <a href="https://github.com/ibraheemdev/modern-unix">Modern Unix</a>. Там же есть ссылки на все проекты.</p>]]></content:encoded>
    </item>
    <item>
      <title>Обновление BIOS «сломало» загрузку Linux на части компьютеров Intel NUC</title>
      <link>https://tproger.ru/news/obnovlenie-bios-slomalo-zagruzku-linux-na-chasti-kompjuterov-intel-nuc</link>
      <comments>https://tproger.ru/news/obnovlenie-bios-slomalo-zagruzku-linux-na-chasti-kompjuterov-intel-nuc?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/obnovlenie-bios-slomalo-zagruzku-linux-na-chasti-kompjuterov-intel-nuc</guid>
      <description><![CDATA[<p>BIOS 0058 для Intel NUC7PJYH ломает загрузку Linux, FreeBSD и NetBSD из-за проблем с ACPI, тогда как Windows 10 работает штатно. Intel убрала апдейт.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/obnovlenie-bios-slomalo-zagruzku-linux-na-chasti-kompjuterov-intel-nuc">Обновление BIOS «сломало» загрузку Linux на части компьютеров Intel NUC</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Windows 10]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 26 Feb 2021 06:12:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>Владельцы мини-компьютеров Intel NUC7PJYH столкнулись с проблемой. Из-за свежего обновления BIOS они не могут загрузить Linux и Unix-подобные системы. Один из пользователей опубликовал соответствующий <a href="https://community.intel.com/t5/Intel-NUCs/Intel-NUC7PJYH2-BIOS-Upgrade-to-0058-causes-boot-failure-Linux/td-p/1246048">пост</a> на официальном форуме Intel NUC, на что компания уже успела отреагировать.</p><p>«Сломал» загрузку систем апдейт BIOS под номером 0058. Из-за проблем с ACPI, при работе с Linux, FreeBSD, NetBSD возникли ошибки, в то время как Windows 10 работает в штатном режиме, <a href="https://www.opennet.ru/opennews/art.shtml?num=54651">пишет</a> OpenNET.</p><figure><img src="https://media.tproger.ru/uploads/2021/02/IntelNUC7PJYH2-Bios0058-FreeBSD.jpg" alt="" /><figcaption>Linux-пользователи видят чёрный экран, а при загрузке FreeBSD нечто подобное / Источник: форум Intel NUC</figcaption></figure><p>На момент написания материала, более десяти владельцев Intel NUC подтвердили наличие проблемы. Компания Intel уже убрала «испорченное» обновление BIOS из «Центра Загрузки ПО», а пострадавшим предложила заменить компьютеры либо дождаться следующего патча.</p><p>Также стало известно, что прямо сейчас проходит бета-тестирование новой версии BIOS, которая должна исправить имеющиеся «дыры». Пока что доступ к ней имеет ограниченный круг лиц. Но как только тестировщики подтвердят, что апдейт исправил ситуацию, он появится в открытом доступе.</p><p>Источник: <a href="https://www.opennet.ru/opennews/art.shtml?num=54651">OpenNET</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Проблема 2038 года: что делать, когда кончится время?</title>
      <link>https://tproger.ru/articles/problema-2038-goda-chto-delat-kogda-konchitsja-vremja</link>
      <comments>https://tproger.ru/articles/problema-2038-goda-chto-delat-kogda-konchitsja-vremja?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Мария Кривоченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/problema-2038-goda-chto-delat-kogda-konchitsja-vremja</guid>
      <description><![CDATA[<p>Отсчёт «Эпохи Unix» начался в полночь 1 января 1970 года, и принятая в POSIX-совместимых ОС система описания времени создала проблему 2038 года.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/problema-2038-goda-chto-delat-kogda-konchitsja-vremja">Проблема 2038 года: что делать, когда кончится время?</a>»</p>]]></description>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 01 Jan 2021 11:20:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>В полночь первого января 1970 года началась «Эпоха Unix». В Unix и других POSIX-совместимых ОС приняли систему описания моментов времени. Но одновременно с новой эпохой у инженеров и разработчиков <a href="https://tproger.ru/articles/top-program-bugs/">возникли новые проблемы</a>. Одна из них — «Проблема 2038 года». Рассказываем, что это такое и ждёт ли нас «Апокалипсис» через 18 лет.</p><h2>Минутка истории</h2><p>Ошибка Y2K заключалась в следующем. В 1950-х и 60-х годах, когда создавался софт для первых компьютеров, разработчики отображали год в дате двумя последними цифрами. Для экономии ресурсов. Поэтому они переживали, что 1 января 2000 года компьютеры, отображающие новую дату «00», ошибочно решат, что это 1900 год.</p><p>Это звучало правдоподобно, и многие люди сделали бизнес на консультациях по этому вопросу. Вырос спрос на COBOL-разработчиков — им приходилось исправлять старые приложения. По мере приближения Миллениума люди готовились к глупым коммунальным платежам, гаснущим фонарям и падающим самолётам</p><p>В конце концов, появились Y2K-совместимые системы, и 2000 год начался почти без шума. Но «проблема 2038 года» немного сложнее.</p><h2>Что произойдёт в 2038 году</h2><p>Время Unix — это количество секунд, начиная с полуночи 1 января 1970 года. Отсчёт начался с 0, и любое значение времени или даты выражается числом секунд, следующих за 0. Так, значение 919642718 равно 919 642 718 секундам после 00:00:00 часов 1 января 1970 года. То есть воскресенью 16:18:38 21 февраля 1999 года.</p><p>Это удобный формат, потому что если вы вычтете любые два значения, то получите количество секунд — то есть разницу во времени — между ними. Так можно определить, сколько минут, часов, дней, месяцев или лет прошло между двумя любыми датами.</p><p>Старые 32-разрядные процессоры способны считать только до 2 147 483 647. Таким образом, 19 января 2038 года в 03:14:07 по Всемирному времени (UTC) они достигнут максимальной мощности.</p><p>Проблема 2038 года приведёт к тому, что часы на некоторых устройствах перестанут работать. По одной из теорий, время обернётся назад к «началу» и будет храниться в виде отрицательных чисел. И из-за того, как написан код, компьютеры будут интерпретировать это время как происходящее 13 декабря 1901 года, а не 19 января.</p><h2>Всё не так плохо</h2><p>Большинство компьютеров и смартфонов, сделанных в последнее время, 64-разрядные и могут содержать числа размером 9 223 372 036 854 775 807. То есть будут отсчитывать время до 292 277 026 596 года. Так что их основная часть (за исключением действительно старых) не пострадает.</p><p>Что касается банкоматов, медицинской и военной техники и прочего, то к 2038 году, вполне вероятно, большинство (если не все) 32-битных устройств не будут использовать. Им на замену придут более современные системы, которые не нужно исправлять. Главной головной болью может стать модернизация оборудования. Но инженеров есть ещё 18 лет, чтобы с ней справиться.</p>]]></content:encoded>
    </item>
    <item>
      <title>Cron Jobs — пособие для начинающих</title>
      <link>https://tproger.ru/translations/guide-to-cron-jobs</link>
      <comments>https://tproger.ru/translations/guide-to-cron-jobs?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Ланский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/guide-to-cron-jobs</guid>
      <description><![CDATA[<p>Cron планирует выполнение команд в Unix-системах: синтаксис заданий, работа с crontab и веб-инструменты, упрощающие составление расписания.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/guide-to-cron-jobs">Cron Jobs — пособие для начинающих</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 19 May 2019 08:51:27 GMT</pubDate>
      <content:encoded><![CDATA[<p>Cron — один из часто используемых инструментов для Unix-систем. Его используют для планирования выполнения команд на определённое время. Эти «отложенные» команды или задания принято называть «Cron Jobs». Такой инструмент отлично подходит для регулярных бэкапов, мониторинга дискового пространства, удаления файлов (например, логов) и много чего ещё. В этой статье будет рассказано о работе с Cron на Linux.</p><h2>Введение</h2><p>Шаблон задания для Cron выглядит примерно так:</p><p>Вот иллюстрация этого же шаблона, которую можно сохранить себе:</p><figure><img src="https://media.tproger.ru/uploads/2019/05/Screenshot_10.png" alt="" /></figure><p>Звёздочками обозначены конкретные блоки времени.</p><p>Для отображения содержимого crontab-файла текущего пользователя используйте команду:</p><p>Для редактирования заданий пользователя есть команда:</p><p>Если эта команда выполняется в первый раз, вам предложат выбрать редактор для Cron:</p><p>Выбирайте на своё усмотрение. Вот так изначально выглядит crontab-файл:</p><figure><img src="https://media.tproger.ru/uploads/2019/05/cron-jobs-1.png" alt="" /></figure><p>В этом файле как раз нужно перечислять одну за другой все команды.</p><p>Чтобы изменить crontab-файл другого пользователя (например, ostechnix):</p><p>Ниже приведены несколько примеров cron-заданий:</p><ol><li>Чтобы выполнять команду каждую минуту, задание должно быть такое:* * * * * &lt;исполняемая-команда&gt;</li><li>Похожее задание, только команда будет вызываться каждые пять минут:*/5 * * * * &lt;исполняемая-команда&gt;</li><li>Вызывать команду 4 раза в час (каждые 15 минут):*/15 * * * * &lt;исполняемая-команда&gt;</li><li>Чтобы выполнить команду каждый час в 30 минут, пишем:30 * * * * &lt;исполняемая-команда&gt;Т. е. команда будет выполняться не каждые 30 минут, а тогда, когда значение минут будет равно 30 (например, 10:30, 11:30, 12:30 и т. д.).</li><li>Значения времени можно комбинировать, перечислив их через запятую. Следующий код будет выполнять команду три раза в час: в 0, 5 и 10 минут.0,5,10 * * * * &lt;исполняемая-команда&gt;</li><li>Выполнять команду каждый час будет следующее задание:0 * * * * &lt;исполняемая-команда&gt;</li><li>Выполнение команды каждые два часа:0 */2 * * * &lt;исполняемая-команда&gt;</li><li>Чтобы выполнять команду каждый день (в 00:00):0 0 * * * &lt;исполняемая-команда&gt;</li><li>Выполнение команды каждый день в 03:00:0 3 * * * &lt;исполняемая-команда&gt;</li><li>Выполнение команды каждое воскресенье (sunday):0 0 * * SUN &lt;исполняемая-команда&gt;</li><li>Другой вариант задания, которое будет выполнять команду каждое воскресенье (естественно, тоже в 00:00):0 0 * * 0 &lt;исполняемая-команда&gt;</li><li>Выполнение команды каждый день с понедельника по пятницу:0 0 * * 1-5 &lt;исполняемая-команда&gt;</li><li>Следующее задание будет выполнять команду каждый месяц, 1-го числа в 00:00:0 0 1 * * &lt;исполняемая-команда&gt;</li><li>Выполнять команду в 16:15 каждого первого числа месяца будет это задание:15 16 1 * * &lt;исполняемая-команда&gt;</li><li>Выполнение команды каждые три месяца:0 0 1 */3 * &lt;исполняемая-команда&gt;</li><li>Выполнение команды в строго определённое время и месяц:5 0 * 4 * &lt;исполняемая-команда&gt;</li><li>Задание будет вызывать команду в начале каждого полугодия (в 00:00 1-го дня):0 0 1 */6 * &lt;исполняемая-команда&gt;</li><li>Выполнение команды каждый год 1-го января в 00:00:0 0 1 1 * &lt;исполняемая-команда&gt;</li></ol><p>Ещё существуют готовые задания:</p><ul><li>@reboot — одиночное выполнение команды при загрузке;</li><li>@yearly — раз в год;</li><li>@annually — тоже раз в год;</li><li>@monthly — раз в месяц;</li><li>@weekly — один раз в неделю;</li><li>@daily —  раз в день;</li><li>@midnight — тоже раз в день;</li><li>@hourly — раз в час.</li></ul><p>Чтобы выполнять команду каждый раз после перезапуска сервера, используйте это задание:</p><p>Команда для очистки всех заданий текущего пользователя:</p><p>Чтобы узнать о подробностях, есть команда:</p><p>Вышеперечисленного уже должно хватить для базовой работы с Cron и составления заданий.</p><h2>Синтаксис crontab-генераторов</h2><p>Процесс написания заданий сильно упрощают веб-инструменты. Они не требуют знаний синтаксиса Cron, потому что у них графический интерфейс, а задания генерируются в соответствии с вводимыми данными. Сайт генерирует задание, которое можно будет просто скопировать и вставить в crontab-файл.</p><h3>Crontab.guru</h3><p><a href="https://crontab.guru/">crontab.guru</a> — отличный сайт, чтобы изучить различные примеры cron-заданий. Просто введите данные и сайт самостоятельно сгенерирует конечное задание.</p><figure><img src="https://media.tproger.ru/uploads/2019/05/crontab-guru.png" alt="" /></figure><p>На сайте есть разделы, посвящённые <a href="https://crontab.guru/examples.html">примерам</a> и <a href="https://crontab.guru/tips.html">советам</a>.</p><h3>Crontag Generator</h3><p><a href="https://crontab-generator.org/">crontab-generator.org</a> — ещё один сайт, который помогает быстро сгенерировать crotab-выражения. Принцип такой же: нужно ввести все необходимые данные в формы и нажать кнопку «Generate Crontab Line» внизу страницы.</p><figure><img src="https://media.tproger.ru/uploads/2019/05/Crontab-Generator-1-1-768x1005.jpg" alt="" /></figure><p>Вот такое конечное выражение вы увидете на сайте:</p><figure><img src="https://media.tproger.ru/uploads/2019/05/Crontab-Generator-2-768x222.jpg" alt="" /></figure><p>Помимо этого, есть веб-инструмент «Crontab UI», который обеспечивает не только простоту создания crontab-заданий, но и безопасность. Вот <a href="https://www.ostechnix.com/how-to-easily-and-safely-manage-cron-jobs-in-linux/">статья</a>, посвящённая этому инструменту.</p>]]></content:encoded>
    </item>
    <item>
      <title>Консольный текстовый редактор GNU nano обновили до версии 3.2</title>
      <link>https://tproger.ru/news/gnu-nano-3-2-release</link>
      <comments>https://tproger.ru/news/gnu-nano-3-2-release?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Артем Гаврилов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/gnu-nano-3-2-release</guid>
      <description><![CDATA[<p>В GNU nano 3.2 исправлена работа с символами Unicode, снята привязка действий к клавишам F13, F14 и F15 и добавлена обработка nanorc в ограниченном режиме.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/gnu-nano-3-2-release">Консольный текстовый редактор GNU nano обновили до версии 3.2</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 12 Nov 2018 15:24:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Бенно Шуленберг (Benno Schulenberg) <a href="https://www.mail-archive.com/info-gnu@gnu.org/msg02520.html">сообщил</a> о выходе текстового редактора GNU nano 3.2. В новой версии разработчики решили проблему с игнорированием символов Unicode в строках, добавили обработку файлов nanorc в ограниченном режиме и реализовали отображение курсора в режиме справки с помощью функции --showcursor.</p><h3>Изменения в обновлении</h3><p>Помимо исправления багов, в новой версии разработчики:</p><ul><li>Убрали привязку действий по умолчанию к клавишам F13, F14 и F15.</li><li>Добавили учёт функции --fill при изменении размера файлов.</li><li>Реализовали возможность открыть другие файлы в режиме просмотра (использование --restricted вместе с --view запрещает её).</li><li>Добавили обработку файлов nanorc в ограниченном режиме. Пользователь может отключить чтение файлов с помощью функции --ignorercfiles.</li><li>Переименовали функции prevhistory и nexthistory в older и newer(для этого необходимо изменить файлы nanorc).</li><li>Функция --zap привязана к комбинации клавиш Alt и Delete для строк, а также к Backspace и Delete для выделенных областей. С помощью функции разработчик удаляет строки или выделенные области без изменения буфера удалённой информации.</li><li>Изменили комбинацию клавиш по умолчанию для вызова функции linter. Она вызывается одновременным нажатием Meta и B, а сочетание Ctrl и T изменяет цвет строки состояния и текст заголовка. При этом его можно использовать в режиме анализа приложения.</li></ul><p>GNU nano — это свободный текстовый редактор для использования в консоли UNIX и Unix-подобных систем. Он является копией редактора Pico, встроенного в почтовый клиент Pine. Разработчики nano <a href="https://tproger.ru/news/gnu-nano-3-0-release/">объявили</a> о выходе третьей версии в начале сентября 2018 года. В nano 3.0 они ускорили обработку ASCII и чтение файлов, добавили новые сочетания клавиш и исправили ошибки, связанные с отображением текста.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышло обновление консольного текстового редактора GNU nano до версии 3.0</title>
      <link>https://tproger.ru/news/gnu-nano-3-0-release</link>
      <comments>https://tproger.ru/news/gnu-nano-3-0-release?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/gnu-nano-3-0-release</guid>
      <description><![CDATA[<p>Третья версия редактора для Unix-систем ускорила обработку ASCII и чтение файлов, получила новые сочетания клавиш и правки ошибок отображения текста.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/gnu-nano-3-0-release">Вышло обновление консольного текстового редактора GNU nano до версии 3.0</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 10 Sep 2018 13:18:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики <a href="https://nano-editor.org/docs.php">nano</a>, текстового редактора для Unix-систем, <a href="http://lists.gnu.org/archive/html/info-nano/2018-09/msg00000.html">объявили</a> о выпуске третьей версии программы. В nano 3.0 ускорена обработка ASCII и чтения файлов, добавлены новые сочетания клавиш и исправлены ошибки, связанные с отображением текста.</p><h3>Что нового в nano 3.0</h3><ul><li>Скорость чтения файлов возросла на 70 %, а обработки ASCII-текста — удвоилась.</li><li>Изменен способ удаления слова в конце строки.</li><li>Сочетание клавиш Ctrl+Delete теперь стирает следующее за кареткой слово, Ctrl+Shift+Delete — предыдущее, а Alt+Q выполняет поиск в обратном направлении.</li><li>Проверку орфографии внешними инструментами можно запретить.</li><li>Исправлена ошибка нумерации строк при открытии нескольких файлов.</li><li>Удалена команда formatter и функция searchagain, поэтому Alt+W теперь по умолчанию выполняет findnext.</li><li>Кнопка No-Convert перемещена в меню Insert.</li><li>Кнопки Backup и New-Buffer удалены из главного меню, но остались в Write-Out и Insert соответственно.</li><li>Программа игнорирует нажатие на Esc, если за ним следует командное сочетание клавиш.</li><li>Сообщения об ошибке rcfile теперь не скрываются в Linux-консоли.</li></ul><p>GNU nano — это свободный текстовый редактор для использования в консоли UNIX и Unix-подобных систем. Он является копией редактора Pico, встроенного в почтовый клиент Pine. В дальнейшем приложение получило подсветку синтаксиса, поддержку регулярных выражений при поиске и замене, а также многоуровневый буфер обмена и другие возможности, отсутствовавшие в Pico.</p>]]></content:encoded>
    </item>
    <item>
      <title>Доступен релиз FreeBSD 11.2</title>
      <link>https://tproger.ru/news/freebsd-11-2</link>
      <comments>https://tproger.ru/news/freebsd-11-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тимур Кондратьев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/freebsd-11-2</guid>
      <description><![CDATA[<p>Релиз FreeBSD 11.2 обновил системные компоненты, добавил драйверы mlx5io, ocs_fc и smartpqi, а также новые утилиты для ОС.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/freebsd-11-2">Доступен релиз FreeBSD 11.2</a>»</p>]]></description>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Jun 2018 10:18:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда разработчиков FreeBSD <a href="https://lists.freebsd.org/pipermail/freebsd-announce/2018-June/001835.html">опубликовала</a> анонс новой версии ОС — 11.2. Релиз подготовлен для систем на базе amd64, i386, powerpc, powerpc64, sparc64, aarch64 и armv6, а также систем виртуализации (QCOW2, VHD, VMDK, raw) и облачных платформ Amazon EC2. Специалисты добавили ряд новых утилит и драйверов, а также улучшили существующие инструменты работы с ОС.</p><h3>Компоненты FreeBSD 11.2</h3><p>Компоненты Clang, libc++, compiler-rt, LLDB, LLD и LLVM получили обновления и улучшения, их актуальная версия теперь — 6.0.0. Новые возможности Clang:</p><ul><li>включение по умолчанию стандарта С++14, поддержка возможностей С++2а в будущем;</li><li>интеграция патчей retpoline для блокирования второго варианта уязвимости Spectre;</li><li>работающий по умолчанию фреймворк GlobalISel для архитектуры AArch64 при сборке с уровнем оптимизации -O0;</li><li>новые предупреждения компилятора.</li></ul><h3>Драйверы и сторонние проекты</h3><p>Новые версии получили сторонние проекты, поставляемые вместе с ОС: libarchive 3.3.2, libxo 0.8.4, Subversion 1.9.7, OpenSSH 7.5p1, tcpdump 4.9.2, NTP 4.2.8p11, bmake 20180222, OpenSSL 1.0.2o, LLVM (clang, lld, lldb, compiler-rt) 6.0.0.</p><p>Обновлены драйверы устройств cxgbe, ixl и ng_pppoe. Кроме того, в FreeBSD добавлены новые драйверы mlx5io для сетевых адаптеров Connect-X 4 и Connect-X 5, ocs_fc для хост-адаптеров Fibre Channel от компании Emulex и smartpqi для SCSI-контроллеров Microsemi.</p><h3>Утилиты</h3><p>В систему добавлен ряд новых утилит:</p><ul><li><a href="https://www.freebsd.org/cgi/man.cgi?query=efibootmgr&amp;sektion=8&amp;manpath=freebsd-release-ports">efibootmgr</a> для настройки менеджера загрузки EFI;</li><li><a href="https://www.freebsd.org/cgi/man.cgi?query=dwatch&amp;sektion=1&amp;manpath=freebsd-release-ports">dwatch</a> для наблюдения за процессами с использованием механизма трассировки DTrace;</li><li><a href="https://www.freebsd.org/cgi/man.cgi?query=etdump&amp;sektion=1&amp;manpath=freebsd-release-ports">etdump</a> для просмотра информации из загрузочного каталога El Torito.</li></ul><p>Разработчики также выпустили для существующих инструментов большое количество исправлений и новых функций, с полным списком которых можно ознакомиться <a href="https://www.freebsd.org/releases/11.2R/relnotes.html#userland-programs">в техническом документе</a> релиза.</p><p>Среди остальных изменений можно отметить поддержку Wake On LAN по умолчанию для систем на базе процессоров Intel Ice Lake и Cannon Lake, многопротокольных адаптеров TAIO USB (TUMPA), а также уменьшенный размер инсталлятора, который теперь умещается в 700 МБ.</p><p>Популярные ОС нередко становятся объектами хакерских атак и поиска уязвимостей. В мае 2018 года исследователями кибербезопасности <a href="https://tproger.ru/news/kernel-os-hack/">была найдена</a> брешь, затрагивающая Windows, macOS, Linux, FreeBSD, Red Hat, Ubuntu и некоторые реализации гипервизора Xen.</p>]]></content:encoded>
    </item>
    <item>
      <title>Курс «[UNИX]» по GNU/Linux</title>
      <link>https://tproger.ru/video/unix-architecture</link>
      <comments>https://tproger.ru/video/unix-architecture?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лапа]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/video/unix-architecture</guid>
      <description><![CDATA[<p>Курс МГУ посвящён Linux-based операционным системам и UNIX-like системам, а также их использованию слушателями с небольшим опытом.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/video/unix-architecture">Курс «[UNИX]» по GNU/Linux</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Видео]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 May 2017 18:43:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Курс, датируемый 2011 годом и записанный в МГУ лектором Георгием Курячим. Серия посвящена различным аспектам использования Linux-based операционных систем. В курсе рассматриваются:</p><ul><li>Структура и архитектура некоторых современных дистрибутивов Linux.</li><li>Вопросы установки и начальной настройки Linux-based операционных систем.</li><li>Вопросы повседневного использования Linux-based операционных систем.</li><li>Подход к использованию UNIX-system («UNIX way»).</li><li>Основные понятия и концепции современных Linux-based дистрибутивов.</li></ul><p>Курс ориентирован на слушателей, имеющих малый практический опыт в использовании UNIX-like систем и современных Linux-based дистрибутивов операционных систем. Кстати, когда освоитесь с терминалом, обратите внимание на нашу <a href="https://tproger.ru/articles/cool-linux-commands/">подборку интересных команд</a> — они сделают вашу повседневную работу проще и приятнее.</p><p>Конспекты, видео- и аудиозаписи всех лекций можно скачать на на <a href="http://uneex.org/LecturesCMC/GnuLinuxSoftware2011">сайте информационной поддержки курса</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как работают демоны, процесс Init и как у процессов рождаются потомки — изучаем основы Unix</title>
      <link>https://tproger.ru/translations/unix-basics</link>
      <comments>https://tproger.ru/translations/unix-basics?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/unix-basics</guid>
      <description><![CDATA[<p>Аарон Краус объясняет, что такое фоновые процессы-демоны, как устроен процесс init с PID 1 и каким образом у процессов появляются потомки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/unix-basics">Как работают демоны, процесс Init и как у процессов рождаются потомки — изучаем основы Unix</a>»</p>]]></description>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 03 Jan 2017 17:37:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Аарон Краус</p><p>Если вы когда-нибудь работали c Unix-системами, то наверняка слышали термин “демон”. В этой статье я хочу объяснить, что это за демоны и как они работают, тем более что их название заставляет думать, что это что-то плохое.</p><p>Вообще <a href="https://ru.wikipedia.org/wiki/Демон_(программа)">демон</a> — это фоновый процесс, который не привязан к терминалу, в котором был запущен. Но как они создаются, как они связаны с другими процессами, как они работают? Об этом мы и поговорим, но сперва давайте узнаем, как работает процесс init и как происходит рождение новых процессов.</p><h3>Как работает процесс Init</h3><p>Для начала поговорим о <a href="https://ru.wikipedia.org/wiki/Init">процессе init</a>, также известном как PID 1 (поскольку его ID всегда равен 1). Это процесс создаётся сразу при запуске системы, то есть все другие процессы являются его потомками.</p><p>Обычно init запускается, когда ядро вызывает конкретный файл, обычно находящийся по адресу /etc/rc или /etc/inittab. Процесс устанавливает путь, проверяет файловую систему, инициализирует серийные порты, задаёт время и т.д. В последнюю очередь он запускает все необходимые фоновые процессы — в виде демонов. Все демоны обычно расположены в папке /etc/init.d/; принято оканчивать имена демонов на букву d (например, httpd, sshd, mysqld и т.п.), поэтому вы можете подумать, что директория названа так по этому же принципу, но на самом деле существует соглашение об именовании папок, содержащих конфигурационные файлы, именем с суффиксом .d. Итак, init запускает демонов, но мы так и не выяснили, как это происходит. Процесс init запускает демонов, создавая свои ответвления для запуска новых процессов.</p><h3>Как работает разветвление процессов</h3><p>Единственный способ создать новый процесс в Unix — скопировать существующий. Этот метод, известный как <a href="https://ru.wikipedia.org/wiki/Fork">разветвление</a> или форкинг, включает в себя создание копии процесса в виде потомка и системный вызов <a href="https://en.wikipedia.org/wiki/Exec_(computing)">exec</a> для запуска новой программы. Мы использовали слово “форкинг”, поскольку <a href="http://linux.die.net/man/2/fork">fork</a> — это реальный метод C в стандартной библиотеке Unix, который создаёт новые процессы именно таким образом. Процесс, вызывающий команду fork, считается родительским по отношению к созданному. Процесс-потомок почти полностью совпадает с родительским: отличаются лишь ID, родительские ID и некоторые другие моменты.</p><p>В современных дистрибутивах Unix и Linux процессы можно создавать и другими способами (например, при помощи <a href="http://pubs.opengroup.org/onlinepubs/009696899/functions/posix_spawn.html">posix_spawn</a>), но большая часть процессов создаётся именно так.</p><p>Теперь, когда вы узнали о традиционном значении термина “fork”, становится понятно, почему такое же понятие используется на GitHub. Но я отвлекся — вернемся к нашим демонам!</p><h3>Как работают демоны</h3><figure><img src="https://media.tproger.ru/uploads/2016/12/maxwells-demon.png" alt="" /></figure><p>Прежде чем мы углубимся в работу демонов, давайте выясним, откуда взялось это название. Термин “демон” возник из <a href="https://en.wikipedia.org/wiki/Project_MAC">Project MAC</a>, который в свою очередь получил своё имя от <a href="https://ru.wikipedia.org/wiki/Демон_Максвелла">демона Максвелла</a> — вымышленного существа из мысленного эксперимента, которое постянно сортирует молекулы. Само слово демон происходит от греческого <a href="https://en.wikipedia.org/wiki/Daemon_(classical_mythology)">daemon</a>, являющегося сверхъестественным существом, которое постоянно работает на заднем плане и не является добрым или злым (в отличие от обычного современного значения). То есть, термин “демон” (в смысле Unix-процесса) на самом деле произошёл от вымышленного сверхъестественного существа.</p><p>Демоны — это фоновые процессы, работающие отдельно от терминала и почти всегда созданные процессом init; обычно они занимаются такими вещами, как сетевые запросы, работой аппаратного обеспечения и прочими заданиями типа “жди и смотри”.</p><p>Демоны появляются двумя способами. Их может создать процесс init, либо же они возникают в следущей ситуации: процесс создаёт своего потомка и тут же завершается. Первый случай ясен, но что происходит во втором: как процесс init становится родительским для этих демонов?</p><p>Когда вы создаёте процесс-потомок и тут же “убиваете” его родителя, потомок становится <a href="https://ru.wikipedia.org/wiki/Процесс-сирота">процессом-сиротой</a> (не стоит путать с <a href="https://ru.wikipedia.org/wiki/Процесс-зомби">процессом-зомби</a>, например, потомком, который был завершен, но всё ещё ждёт, когда родитель прочтёт его exit-статус). По умолчанию, если процесс становится сиротой, то его “приёмным” родителем становится init. Вот и всё, что делает демонов уникальными!</p><h3>Заключение</h3><p>В целом демоны — это очень простая для понимания концепция, но чтобы полностью в них разобраться, нам понадобилось узнать, что такое init-процесс и как устроено разветвление процессов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Новый год для гиков --- празднуем шесть hex-нулей в конце UNIX времени!</title>
      <link>https://tproger.ru/news/unix-new-year</link>
      <comments>https://tproger.ru/news/unix-new-year?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/unix-new-year</guid>
      <description><![CDATA[<p>UNIX-время дойдёт до значения 0x58000000 в 21:43:28 по Гринвичу, и его шестнадцатеричная запись закончится шестью нулями — такое случается раз в полгода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/unix-new-year">Новый год для гиков --- празднуем шесть hex-нулей в конце UNIX времени!</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Perl]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Oct 2016 20:07:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>В UNIX и других <a href="https://ru.wikipedia.org/wiki/POSIX">POSIX</a>-совместимых системах (в том числе Linux, разумеется) принято измерять время в количестве секунд, прошедших с начала UNIX-эпохи — с 1 января 1970 года. И сегодня (14 октября) наступает круглая дата по UNIX-времени — его шестнадцатеричное представление будет заканчиваться на шесть нулей (то есть двоичное — на 24 нуля). Это происходит примерно один раз в полгода.</p><p>UNIX-время будет равняться 0x58000000 в 21:43:28 по Гринвичу (заметим, что по UTC это ещё 13 октября, тогда как по московскому временеи будет уже 14-е). Достаём шампанское! Чтобы узнать, когда это произойдёт в вашем часовом поясе, можно воспользоваться простеньким Perl-скриптом:</p><p>Наблюдать за UNIX-временем в онлайн режиме вы можете прямо на этой странице:</p><p>C «Новым полугодом», коллеги!</p>]]></content:encoded>
    </item>
    <item>
      <title>Почему Джон Кармак решил разрабатывать Doom и Quake на компьютерах компании Стива Джобса NeXT</title>
      <link>https://tproger.ru/news/carmack-like-lq-shut-up-and-take-my-money</link>
      <comments>https://tproger.ru/news/carmack-like-lq-shut-up-and-take-my-money?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/carmack-like-lq-shut-up-and-take-my-money</guid>
      <description><![CDATA[<p>Ответ соучредителя id Software пользователю Quora: первый NeXT он купил из личного интереса, узнав о преимуществах систем на основе Unix.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/carmack-like-lq-shut-up-and-take-my-money">Почему Джон Кармак решил разрабатывать Doom и Quake на компьютерах компании Стива Джобса NeXT</a>»</p>]]></description>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 02 Sep 2016 16:26:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>Один из пользователей Quora поинтересовался, почему Doom разрабатывался на компьютерах фирмы NeXT (которая была основана Стивом Джобсом, а ныне поглощена Apple), несмотря на то, что Doom предназначался в основном для ПК. Ответил ему сам Джон Кармак — программист, а так же соучредитель и совладелец компании idSoftware, которая и разрабатывала Doom. Ниже приводим перевод его ответа.</p><blockquote>Я купил первый наш NeXT (ColorStation) из личного интереса. Джейсон Блочуйак рассказал мне о преимуществах систем, основанных на Unix, и мне было очень интересно, что же крутого снова сделал Стив Джобс. Забавно сейчас вспоминать об этом — я тогда на полном серьёзе обдумывал, какие же преимущества для разработки даёт мультипроцессное окружение, если сравнивать с DOS и старыми окружениями Apple, которые мы тогда использовали. Использование NeXT открыло мне глаза, и мне сразу стало ясно, что преимуществ много и они для нас вполне осязаемы. Поэтому мы перенесли всю разработку на NeXT, за исключением пиксель-арта (который выполнялся в Deluxe Paint на DOS). Одним из уникальных преимуществ NeXT (но далеко не единственным) была возможность использовать Interface Builder. Не хватало только Turbo Debugger 386, он был гораздо лучше аналога для NeXT. В итоге Кевин Клауд даже делал мануалы к нашим играм (начиная с Wolfenstein 3D) в Framemaker на NeXT.Нужно понимать, что альтернативой тогда были DOS и Windows 3.x; то, что теперь система не крашилась постоянно, было прорывом. К моменту выхода Quake 2, Windows NT тоже пришла в состояние “уже-не-крашится-каждую-минуту”, в ней было аппаратное ускорение OpenGL, Visual Studio стала становиться довольно хорошей… В итоге я оценил все наши рабочие станции на Unix и не нашёл причин не перейти обратно на продукты Microsoft.В итоге за время разработки Doom и Quake 1 мы потратили около 100 тысяч долларов на компьютеры NeXT, что, в общем-то, не слишком много. Впоследствии мы потратили гораздо больше на серверные системы Unix SMP.</blockquote><p>Говоря о Кармаке, стоит помнить, что речь идёт о человеке, который в 1995-м году <a href="http://www.geek.com/games/john-carmack-coded-quake-on-a-28-inch-169-1080p-monitor-in-1995-1422971/">пользовался</a> 28-дюймовым монитором.</p><figure><img src="https://media.tproger.ru/uploads/2016/09/mega_display1.jpg" alt="" /></figure><p>Этот монстр поддерживал разрешения до 1920 х 1080 (16:9!) и потреблял 180 ватт электроэнергии (17″ ЭЛТ-монитор потребляет примерно 70–80 Вт, современный 22″ ЖК-монитор потребляет порядка 35 Вт). Если говорить совсем честно, то диагональ самого экрана была только 25.9″, но этого всё равно хватало, чтобы вызывать зависть у большинства программистов (и геймеров) в 1995 году.</p>]]></content:encoded>
    </item>
    <item>
      <title>Симулятор PDP-11 и UNIX V7</title>
      <link>https://tproger.ru/news/pdp-11-simulator-with-unix-v7</link>
      <comments>https://tproger.ru/news/pdp-11-simulator-with-unix-v7?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/pdp-11-simulator-with-unix-v7</guid>
      <description><![CDATA[<p>Программист Google Майкл Рингад собрал образ, позволяющий запустить UNIX так, как это делали Деннис Ритчи и Кен Томпсон в 1979 году.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/pdp-11-simulator-with-unix-v7">Симулятор PDP-11 и UNIX V7</a>»</p>]]></description>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 24 Jan 2016 01:22:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Программист из Google Майкл Рингад (Michael Ringgaard) <a href="http://www.jbox.dk/sanos/pdp11.htm">создал</a> порт <a href="http://simh.trailing-edge.com/">симулятора PDP-11</a> под <a href="http://www.jbox.dk/sanos/">Sanos</a> (минималистичное x86 ядро ОС) и добавил туда <a href="http://simh.trailing-edge.com/kits/uv7swre.zip">UNIX V7</a>. Получился готовый комплект для запуска UNIX в том виде, в котором это делали Деннис Ритчи и Кен Томпсон в 1979 году — настоящий подарок для любителей UNIX!</p><p>Чтобы запустить всё это, нужно сначала скачать ISO образ. Затем либо записать его на обычный CD, либо промонтировать к виртуальной машине (VMware или VirtualBox, например). Также доступен исходник, из которого собирался образ.</p><p>После включения начала стартует Sanos, который запускает симулятор PDP-11. А уже симулятор, в свою очередь, загружает UNIX V7 из образа.</p><ul><li>При первом запросе ввода пишем b</li><li>При следующем (появится символ @): boot&lt;enter&gt;</li><li>Затем rl(0,0)rl2unix&lt;enter&gt;</li><li>Когда увидите # нажмите &lt;ctrl-d&gt;</li><li>Заходим в систему с логином root, паролем root</li></ul><p>Готово, седьмая версия UNIX запущена. Теперь можно использовать обычные команды UNIX вроде cat, ls, man и т.д.</p><p>Можно даже скомпилировать и запустить простую программу на Си:</p>]]></content:encoded>
    </item>
    <item>
      <title>Реализации echo.c в разных ОС</title>
      <link>https://tproger.ru/articles/implementations-of-echo-c</link>
      <comments>https://tproger.ru/articles/implementations-of-echo-c?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/implementations-of-echo-c</guid>
      <description><![CDATA[<p>Команда echo в Unix просто выводит строку на стандартное устройство вывода, а её реализации на C в разных ОС интересно сравнить по количеству кода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/implementations-of-echo-c">Реализации echo.c в разных ОС</a>»</p>]]></description>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 22 Feb 2015 22:48:58 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда <a href="https://ru.wikipedia.org/wiki/Echo">echo</a> в Unix предназначена для отображения строки текста. Она просто выводит текст на стандартное устройство вывода. Далее представлена небольшая подборка реализаций этой команды на языке С в различных ОС. Интересно сравнить количество кода.</p><p>Код взят с GitHub Gist.</p>]]></content:encoded>
    </item>
  </channel>
</rss>