Push 163 file(s) from Obsidian

This commit is contained in:
2026-09-24 13:22:58 +05:00
parent 4c6a45e2e8
commit 9777f9490f
163 changed files with 36730 additions and 0 deletions
@@ -0,0 +1,178 @@
---
title: 10 продвинутых советов по Git
source: https://nuancesprog.ru/p/24223/
author:
published: 2025-05-27
created: 2025-08-24
description: Git — один из самых широко применяемых инструментов совместной работы при разработке ПО. Даже разработчики программного обеспечения, работающие в одиночку, часто используют Git как систему контроля версий. Большинство людей работают с Git через командную строку, но многие редакторы кода и IDE имеют интеграцию Git со встроенными инструментами, упрощающими рабочий процесс. Git используется широко, но многие разработчики имеют лишь поверхностное представление обо всем, что он может предложить. Сегодня делимся некоторыми секретами инструмента.
tags:
- clippings
- "#git"
---
Git — один из самых широко применяемых инструментов совместной работы при разработке ПО. Даже разработчики программного обеспечения, работающие в одиночку, часто используют Git как систему контроля версий. Большинство людей работают с Git через командную строку, но многие редакторы кода и IDE имеют интеграцию Git со встроенными инструментами, упрощающими рабочий процесс. Git используется широко, но многие разработчики имеют лишь поверхностное представление обо всем, что он может предложить. Сегодня делимся некоторыми секретами инструмента.
Поскольку вы здесь, то, наверное, вы готовы выйти за рамки простого (но полноценного!) рабочего процесса:
```nginx
git add .
git commit -m "fix"
git push
```
Надеюсь, эти советы и рекомендации по Git повысят вашу эффективность и продуктивность. Если вы станете лучше применять инструменты, которые вам приходится использовать так же часто, как и Git, то вы сможете тратить больше времени на программирование. Разве не здорово тратить меньше времени в попытках решить, использовать `git merge` или `git rebase`?
## 10\. Пустые коммиты
Вы когда-нибудь вносили небольшие изменения в README, чтобы можно было запустить сборку CI (или какую-нибудь другую интеграцию) и попытаться отладить какую-то проблему? Раньше я делала это довольно часто, пока не узнала о следующей полезной команде:
```nginx
git commit --allow empty -m 'it works!'
```
Этот флаг git позволяет инициировать коммит без содержимого и миновать обычную ошибку, говорящую, что у вас нет подготовленных файлов. Этот прием особенно полезен для того, чтобы запустить рабочий процесс без мелких изменений в README или какого-нибудь другого файла. Команда `git diff` не покажет никаких изменений, но коммит полезен, когда нужно запустить CI-прогон или даже развертывание в продакшне, а отправлять какой-то произвольный код не нужно.
## 9\. Приятный лог
Команда `git log` — очень полезный способ просмотреть последние изменения кодовой базы, но глаза быстро разбегаются, если запускать ее в проекте с большим количеством веток. Еще одна хитрость git — сделать `git log` интереснее, добавив немного цвета, чтобы помочь глазам и мозгу лучше читать вывод на экране.
Чтобы получить улучшенный вывод `git log`, не меняя конфигурацию Git, просто запустите эту команду:
```sql
git log --pretty=oneline --graph --decorate --all</span >
```
Вот пример того, что можно ожидать:
Вы заметите как цветовое кодирование, так и разумное применение `|` и `\\`, чтобы обозначить ветки. Хотя эти флаги ничего не меняют в логе функционально, они, безусловно, значительно облегчают понимание вывода `git log`.
## 8\. Очистка локальных веток
Если вы похожи на меня, то вам нравится поддерживать относительный порядок на рабочем месте, в том числе на компьютере.
Разработка ПО способна быстро привести к замешательству, особенно если вы работаете с большим количеством репозиториев. Ситуацию усугубляет работа с Git, который в каждом репозитории может оставить несколько ветвей на долгое время уже после того, когда эти ветки не нужны.
Наверное, со временем вы добавили в конфигурацию Git разные вещи, чтобы изменить свои ощущения от работы. А мне очень понравился параметр `git config`, при выполнении `fetch` или `pull` удаляющий любую локальную ветку, которая удалена из репозитория на сервере.
Быстро установить этот параметр можно, выполнив:
```nginx
git config --global fetch.prune true
```
Еще один совет по Git, кроме изменения конфигурации, — пойти дальше и удалить локальные ветки, которые уже влиты в `master`.
Выполните эту команду:
```nginx
git branch --merged master | grep -v "master" | xargs -n 1 git branch -d
```
## 7\. Поиск убранного коммита через git reflog
Выполнять `git rebase` крайне полезно, особенно с флагом `--interactive`. Однако перебазирование может быть опасно. При локальном `git rebase` вам придется принудительно перезаписать изменения в репозитории на сервере. Выполняя перебазирование достаточно часто, вы в конечном счете случайно удалите коммит или несколько.
Если вам не повезло так же, как и мне, или вы не информированы, то можете даже случайно удалить работу, выполненную за неделю. Один из моих любимых советов — выполните `git reflog`, чтобы вернуть недостающие коммиты из мертвых.
Поскольку вы закоммитили свою работу, она все еще находится в вашей локальной рабочей копии репозитория вне зависимости от того, делали ли вы `git rebase`. С помощью `git reflog` можно найти хеш SHA1, который вам нужен. Затем запустите `git checkout <SHA1>`, скопируйте все, что вам нужно, и запустите `git checkout HEAD`, чтобы вернуться к самому последнему коммиту в локальной ветке. И кризис предотвращен!
## 6\. Алиас для git blame
Время от времени возникает ошибка, которую вы не сможете обнаружить самостоятельно. А иногда захочется или будет нужно обратиться к человеку, который, похоже, написал неработающий код. Возможно, вам даже захочется поговорить с автором, чтобы лучше понять контекст кода.
Чтобы выяснить, кто написал строку кода, часто используют `git blame`. Команда `git blame` показывает, кто на самом деле написал строку кода, когда написал ее и в каком коммите она добавлена в кодовую базу. Эта функциональность встроена во многие редакторы кода и IDE — имена отображаются рядом с каждой строкой кода!
Это недооцененная функция Git, но запускать `git blame` не очень приятно. Важно, чтобы команды разработчиков ПО формировали культуру без обвинений, а формулировка `git blame` может создать неподходящий прецедент.
И вот хорошая новость! На самом деле вы можете переименовать команду, используя алиас из вашей конфигурации Git. Это самый подвижнический из советов здесь. Чтобы создать псевдоним `git balme`, который будет вызываться как `git investigate`, выполните команду:
```cs
git config --global alias.investigate blame
```
`investigate` можно заменить на любое слово! Ваша конфигурация Git также может содержать псевдонимы для других команд, а не только `git blame`, если захотите.
## 5\. Команда git add -p для поэтапного коммита
В начале статьи я обещала, что мы оставим `git add` в прошлом. Наверное, вы уже знаете, что все изменения можно в локальном репозитории можно подготовить к коммиту через `git add`.
И, вероятно, *еще* вы знаете, что это делается более многословно. С просмотром того, какие изменены файлы, через `git status` и с проверкой изменения файла с помощью `git diff <filename>`, а также с подготовкой файлов по отдельности с помощью `git add <filename>`. Нормально, если вы готовите к коммиту один файл, но это может быстро стать проблемой, когда у вас большой набор локальных изменений.
Эта опция многословнее, но это важный шаг, чтобы проверить, что вы подготовили локальные изменения, которые собираетесь закоммитить. Нет ничего хуже, чем закоммитить что-нибудь случайно, особенно если код содержит конфиденциальные данные, например секрет приложения. К счастью, есть способ внести изменения еще лучше!
Вносить изменения можно *по кусочку*, выполнив:
```nginx
git add -p
```
Вероятно, этот совет сильнее всего ускорит вашу работу. При такой подготовке коммитов в Git открывается интерактивная подсказка. Она показывает разделы каждого файла, которые были изменены. Это дает возможности подготовить их к коммиту или пропустить и многие другие возможности.
Команда упрощает поэтапную обработку изменений валидацией каждого изменения, а еще она полезна, если вы хотите закоммитить только часть изменений файла. Иногда я увлекаюсь до степени понимания того, что изменений у меня в файле гораздо больше, чем имеет смысл коммитить вместе.
Вот пример:
## 4\. Кусочки кода в git stash
Флаг `-p` предназначен не только для подготовки кода! Его можно использовать с `git stash`, если не хочется выполнять `git stash` *на всех файлах* или на одном файле с изменениями целиком.
Чтобы поэтапно выполнить `git stash` для кода в рабочем каталоге, выполните:
```nginx
git stash -p
```
При запуске вы увидите интерактивный экран, аналогичный экрану команды `git add -p`, который шаг за шагом проведет вас через каждое изменение по одному разделу за раз.
## 3\. Автоматизация git bisect
Хотя это самый сложный из приемов Git, автоматизация `git bisect` со временем может принести пользу. Если вы уже понимаете, [как использовать git bisect](https://www.metaltoad.com/blog/beginners-guide-git-bisect-process-elimination), то знаете, что работа с `git bisect` может потребовать большого количества команд. А это, в свою очередь, может сделать ее не такой практичной.
Она сложная, поэтому вам может быть интересно узнать, что на самом деле можно написать скрипт, который автоматизирует часть процесса. [Написав скрипт git bisect](https://git-scm.com/docs/git-bisect#_bisect_run), для запуска скрипта вы сможете использовать простую команду:
`git bisect run my_script аргументы`
## 2\. Эмоджи в Git
Хотя это, наверное, самый бесполезный из этих советов этой статьи, эмоджи в сообщениях о коммитах — простой способ добавить веселья вам и вашим коллегам! Можно легко вставлять смайлы в сообщения о коммитах, если знаете их названия. Воспользуйтесь шпаргалкой [Gitmoji](https://gitmoji.dev/), чтобы выбрать подходящий смайлик и вставить его в виде текста в сообщение о коммите:
```nginx
git commit -m ":package: Add a docker container to the app"
```
## 1\. Справочная документация Git
Меня всегда удивляет, как быстро я забываю о встроенных справочных инструментах в ряде приложений и интерфейсах командной строки. Я буду пытаться найти ответ в бесконечном количестве ответов на Stack Overflow, чтобы решить свою проблему.
И, наконец, вспомню, что могу получить помощь, просто запустив:
```nginx
git help
```
Вся документация Git у вас под рукой как часть интерфейса командной строки Git! Если вы новичок в Git или просто хотите освежить знания, то командой ниже можете даже перейти к руководству:
```nginx
git help tutorial
```
В этом руководстве вы познакомитесь с основами.
Наконец, если вы хотите получить документацию по конкретной команде, то можете использовать `man`, чтобы получить мануал. Например, выполните `man git-log`, если хотите больше узнать о команде `git log`.
## Еще больше советов по Git
Вот и мои десять любимых советов и приемов с Git. Будь то настройка конфигурации, подготовка изменений через `git add -p`, `-p` с `git stash` или `git reflog`, эти трюки сделают Git полезнее для вас и вашей команды. Надеюсь, вы наткнулись на что-нибудь новое или освежили память о команде, которую забыли.
Git — удивительно мощный инструмент, и мы должны использовать его по максимуму. Если вы нашли какой-то трюк с Git полезным, поделитесь им со своими коллегами!
Читайте также:
- [Git: простое руководство о том, как стать мастером контроля версий](https://nuancesprog.ru/p/16934/)
- [Руководство по Git для новичков](https://nuancesprog.ru/p/21021/)
- [7 полезных репозиториев GitHub для JS-программистов](https://nuancesprog.ru/p/17131/)
Читайте нас в [Telegram](https://t.me/nuancesprog), [VK](https://vk.com/nuancesprog) и [Дзен](https://dzen.ru/nuancesprog.ru)
---
*Перевод статьи* [Julie Kent](https://nuancesprog.ru/p/24223/%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0_%D0%BD%D0%B0_%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B0):
@@ -0,0 +1,372 @@
---
title: Linux Bash Справочник
source: https://www.glukhov.org/ru/post/2024/04/bash-cheat-sheet/
author:
- "[[Рост Глухов | Персональный сайт и технический блог]]"
published: 2024-04-18
created: 2025-08-23
description: "Bash: Справочник"
tags:
- clippings
- "#linux"
- "#bash"
---
Не очень подробный список, просто несколько полезных для меня пунктов
![bash и shell день рождения!](https://www.glukhov.org/post/2024/04/bash-cheat-sheet/bash-n-shell-678.jpg "bash потрясающий!")
## Проверка версии Linux Ubuntu
Метод 1
```bash
lsb_release -a
```
выдаст что-то вроде
```bash
Нет доступных модулей LSB.
Идентификатор дистрибутива: Linuxmint
Описание: Linux Mint 22.1
Версия: 22.1
Кодовое имя: xia
```
Метод 2
```bash
cat /etc/os-release
```
выдаст что-то вроде
```bash
NAME="Linux Mint"
VERSION="22.1 (Xia)"
ID=linuxmint
ID_LIKE="ubuntu debian"
PRETTY_NAME="Linux Mint 22.1"
VERSION_ID="22.1"
HOME_URL="https://www.linuxmint.com/"
SUPPORT_URL="https://forums.linuxmint.com/"
BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/"
PRIVACY_POLICY_URL="https://www.linuxmint.com/"
VERSION_CODENAME=xia
UBUNTU_CODENAME=noble
```
## Архивирование и распаковка
Сжатие
```bash
tar -zcvf archive-name.tgz directory-name
```
Распаковка
```bash
tar -zxvf archive-name.tgz
```
## Удалённые серверы
Передача идентификатора пользователя на удалённый сервер
```bash
ssh-copy-id user@10.0.0.225
```
Это позволит войти без пароля в следующий раз, например:
```bash
ssh user@10.0.0.225
```
Загрузка файла
```bash
scp ~/file.ext user@host-ip:/home/user/file.ext
```
Загрузка папки с вложенными элементами рекурсивно
```bash
scp -r user@host-ip:/home/user/dir ~/dir
```
## Папки и файлы
Проверка на существование
```bash
# создать папку, если она не существует, со всеми промежуточными папками
[ -d $repdir ] || mkdir -p $repdir
# или
if [ -d $fname ]; then
echo "Файл не существует: $fname"
return
fi
```
Создание папки для определённого пользователя
```bash
sudo mkdir dir1
sudo chown specific_user dir1
sudo chown :specific_group dir1
```
Итерация по файлам в папке
```bash
# этот пример конвертирует все jpg файлы в некоторой папке в fits
for f in some-folder/*.jpg
do
convert "$f" "${f/.jpg/.fits}"
done
```
Объединение всех файлов в один
```bash
cat ./* > merged.txt
```
## Добавление выполнения команды в crontab
```bash
(crontab -l 2>/dev/null | \
grep -v control-marker-1; \
echo '*/15 * * * * /bin/bash /home/user/stest/stest.sh /home/user/stest >> /home/user/stest/stest.log 2>&1 #control-marker-1') | \
crontab -
```
здесь:
- \*/15 - выполняется каждые 15 минут
- control-marker-1 - идентификатор этой команды в конфигурации cron для обновления её в следующий раз с тем же скриптом
- /bin/bash - команда для выполнения
- /home/user/stest/stest.sh - параметр bash - bash выполнит этот скрипт
- /home/user/stest - параметр скрипта - будет доступен как $1
- /home/user/stest/stest.log - файл журнала с выводом консоли stest.sh
Проверка
```bash
grep /home/user/stest/stest.sh /var/log/syslog
crontab -e
```
## Журналы
Просмотр журнала в режиме реального времени
```bash
sudo tail -f /var/log/megalog.log
```
## Код состояния curl
```bash
response=$(curl --write-out '%{http_code}' --silent --output /dev/null servername)
# или
url='http://localhost:8080/'
status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})
[[ $status == 500 ]] || [[ $status == 000 ]] && echo restarting ${url} # выполнить логику запуска/перезапуска
```
## Оставить команду ssh работающей после выхода
[https://stackoverflow.com/questions/954302/how-to-make-a-program-continue-to-run-after-log-out-from-ssh](https://stackoverflow.com/questions/954302/how-to-make-a-program-continue-to-run-after-log-out-from-ssh)
Предположим, у вас запущена программа в переднем плане, нажмите
- ctrl-Z, затем:
\[1\]+ Остановлено myprogram
- disown -h %1
- bg 1
\[1\]+ myprogram &
- logout
## Генерация JSON
Установите jo
```bash
sudo apt-get install jo
```
```bash
a="123"
b="45语
jo "model=a" "prompt=b" "stream=false"
```
выдаст
```bash
{"model":"a", "prompt":"b", "stream":false}
```
Сlightly более сложный пример:
```bash
jo -p name=Jane point[]=1 point[]=2 geo[lat]=10 geo[lon]=20
{
"name": "Jane",
"point": [
1,
2
],
"geo": {
"lat": 10,
"lon": 20
}
}
```
## Форматирование JSON
Используйте
```bash
| jq .
```
Для форматирования JSON, созданного выше:
```bash
a="123"
b="456"
jo "model=$a" "prompt=$b" "stream=false" | jq .
```
Форматированный JSON будет:
```bash
{
"model": 123,
"prompt": 456,
"stream": false
}
```
## Парсинг JSON и возврат значения определённого поля
Сначала установите jq
```bash
sudo apt-get install jq
```
Используйте
```bash
| jq -r '.fieldName'
```
Например, парсинг вывода вызова Ollama:
```bash
curl http://localhost:11434/api/generate -d '{
"model": "llama3",
"prompt": "Why is the sky blue?",
"stream": false
}' | jq -r '.response'
```
## Подсчёт слов в файле
Подсчёт слов:
```bash
wc -w filename.txt
```
вернёт что-то вроде
```bash
261 filename.txt
```
Если вы хотите просто число, вы можете вырезать первое слово, которое является числом
```bash
words=\`wc -w filename.txt | cut -f1 -d' '\`
echo "$words слов"
```
Или используйте wc так:
```bash
words=\`wc -w < filename.txt\`
echo "$words слов"
```
## Проверка, сколько места занимает директория на HDD
```bash
du ~/dirname
```
## Получение имени папки, в которой находится выполняемый скрипт
```bash
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
```
## Измерение времени выполнения скрипта
Один из вариантов - использовать функцию time
```bash
time your_script.sh
```
Другой способ немного сложнее:
```bash
start=\`date +%s\`
# очень важный код
# здесь
end=\`date +%s\`
runtime=$((end-start))
```
## Сравнение двух файлов с помощью VS Code
```bash
code -d <файл 1> <файл 2>
```
## Проверка доступных пакетов в репозитории Ubuntu
```bash
sudo apt-cache policy <packageName>
```
## Полезные ссылки
- [Справочник по Python](https://www.glukhov.org/ru/post/2024/08/python-cheat-sheet/)
- [Справочник по Conda](https://www.glukhov.org/ru/post/2024/10/conda-cheatsheet/ "Справочник по Conda")
- [Синхронизация закладок с Floccus](https://www.glukhov.org/ru/post/2024/08/sync-bookmarks-floccus/)
- [Переустановка Linux](https://www.glukhov.org/ru/post/2024/04/reinstall-linux/)
- [Справочник по Ollama](https://www.glukhov.org/ru/post/2024/12/ollama-cheatsheet/ "Справочник по Ollama")
- [Справочник по Docker](https://www.glukhov.org/ru/post/2024/10/docker-cheatsheet/ "список и описание наиболее часто используемых и полезных команд Docker - справочник по Docker")
- [Справочник по Kubernetes](https://www.glukhov.org/ru/post/2024/10/kubernetes-cheatsheet/ "список и описание наиболее часто используемых и полезных команд k8s - справочник по k8s")
- [Справочник по Markdown](https://www.glukhov.org/ru/post/2024/03/markdown-cheatsheet/ "Полный справочник по Markdown")
- [Кодирование и декодирование Base64 в Windows, Linux и Mac](https://www.glukhov.org/ru/post/2025/04/base64/ "Справочник по кодированию/декодированию Base64 в Linux, Windows и Mac")
- [Декодирование и вывод JWT токена](https://www.glukhov.org/ru/post/2025/04/decode-and-print-jwt-token/ "Как декодировать и вывести полезную нагрузку JWT токена в Linux bash")
- [Параметры командной строки MinIO](https://www.glukhov.org/ru/post/2025/05/minio-cheatsheet/ "Справочник по параметрам командной строки MinIO")
@@ -0,0 +1,341 @@
---
title: "XML-формат: что это такое и как открыть файл — журнал «Код»"
source: https://thecode.media/chto-takoe-xml/
author:
published: 2025-06-30
created: 2025-08-24
description: Рассказываем и показываем на примерах, что такое XML-формат файлов, как он устроен и где применяется.
tags:
- clippings
- "#XML"
---
Когда мы говорили [о разметке в Маркдауне](https://thecode.media/markdown/), то там смысл был такой: есть текст, а мы его размечаем специальными символами, чтобы он хорошо выглядел. Теперь перейдём на этап выше — будем форматировать данные на уровне логики с помощью XML.
👉 XML нужен для работы с техническим текстом, где всё строго, упорядоченно и логично. Его, конечно, можно применить и к художественному тексту, но выйдет так себе.
## Что такое XML-формат
XML — это сокращение от eXtensible Markup Language, а переводится это как «расширяемый язык разметки». Смысл XML в том, чтобы выстроить внутри документа логическую структуру — чтобы было видно, что к чему относится и как всё связано между собой, в каком формате представлены данные.
### Зачем нужен
С помощью XML можно:
- записать оргструктуру компании или любую другую иерархию — «этот подчиняется тому»;
- разметить текст по смыслу — «тут важное, там второстепенное, вот это поясняет вон то»;
- хранить типовые данные — например, имена артистов, названия их альбомов и треки, или настройку какой-нибудь программы, или скрипты;
- разметить веб-страницу по смыслу и отдать эту разметку алгоритму, который сам нарисует дизайн;
- разметить текст для дальнейшего машинного обучения;
- хранить результаты работы программ, которые работают с текстом, — например, ничто не мешает текстовым редакторам хранить документы со всем оформлением в формате XML.
И многое другое, где нужен порядок, структура и работа с текстовыми данными.
![Что такое XML-формат и для чего он нужен](https://thecode.media/wp-content/uploads/2024/09/image9-1024x508.png)
Что такое XML-формат и для чего он нужен
## В чём сила XML
Сила XML в том, что данные здесь представляются как обычный текст, размеченный тегами (как в HTML). Например, чтобы записать оргструктуру компании в XML, не нужно рисовать схему в графическом редакторе, достаточно правильно разметить текст с именами и должностями. Файлики получаются маленькими, их легко обрабатывать.
[База по вёрстке: основы HTML](https://thecode.media/baza-po-vyorstke-osnovy-html/)
И ещё сила XML в том, что эти данные может прочитать и обработать компьютер. Например, если мы передаём ему оргструктуру компании, компьютер поймёт её: кто кому подчиняется, что куда входит и т. д. Для сравнения: если скормить компьютеру схему, нарисованную в графическом редакторе, он её не поймёт.
А вот если XML хорошо составлен, его также может понять человек.
Вам может быть интересно:
[![](https://thecode.media/wp-content/uploads/2020/09/photo_2020-09-24-13.58.07-320x213.jpeg) Markdown: что это и кому нужно](https://thecode.media/markdown/)
## Из чего состоит XML
Внешне XML очень похож на HTML: в нём тоже всё пишется в угловых скобках, есть закрывающие теги и параметры — аналоги классов и стилей. Но, в отличие от HTML, здесь нет обязательных тегов или вообще каких-то обязательных элементов. Объясним, как это работает, на примере.
[Самые частые ошибки в HTML-вёрстке](https://thecode.media/samye-chastye-oshibki-v-html-vyorstke/)
Допустим, у нас есть такой текст, из которого нужно сделать XML-документ:
*«По состоянию на 22 мая 2025 журнал „Код“ работает и в редакции есть главред Михаил Полянин и авторы Кристина Тульцева и Игорь Росляков».*
### Теги и атрибуты
Основное тело XML-документа состоит из тегов и атрибутов.
Теги образуют всю структуру файла. Если вы немного знакомы с HTML, то увидите, что здесь они выглядят так же. В основном теги бывают открывающие (`<tag>`) и закрывающие (`</tag>`). Но, в отличие от HTML, в XML можно использовать любые теги, которые нужны по логике создания файла.
Атрибуты — это дополнительные параметры тега, которые записываются внутри открывающего тега. Они заключены в кавычки. Может выглядеть так:
```markup
<tag attr="value">
```
### Комментарии и специальные символы
Комментарии в XML такие же, как в HTML. Это текстовые пометки, которые не влияют на остальной файл:
```markup
<!-- это комментарий, он не влияет на файл -->
```
Спецсимволы — это символы вроде угловых обозначений тегов. Мы не можем их использовать между настоящими тегами в чистом виде, потому что тогда файл сломается: он подумает, что мы открываем новый тег или делаем ещё какое-то действие, а нам на самом деле нужно просто поставить символ в текст.
[Что такое формат JSON и как с ним работать](https://thecode.media/json/)
Для работы со спецсимволами нужно использовать соответствующие им наборы других символов, которые ещё называются сущности. Если мы поставим в текст сущности, машина на выходе выведет как раз тот спецсимвол, который нам нужен.
Например, амперсанд `&` относится к числу спецсимволов, поэтому нельзя сделать так:
```markup
<title> Sanford&Son</title>
```
Вместо этого нужно так:
```markup
<title> Sanford&amp;Son</title>
```
Длиннее, зато работает.
Вот основные спецсимволы и соответствующие им сущности:
![Что такое XML-формат и для чего он нужен](https://thecode.media/wp-content/uploads/2024/09/image4-1-1024x370.png)
Источник: developer.mozilla.org
### Пролог
Любой XML начинается с пролога, это первая строка документа. В ней нужно написать, что перед нами именно XML:
```markup
<?xml version="1.0" encoding="UTF-8"?>
```
Пролог говорит, что ниже будет XML-разметка. Иначе программа-обработчик не будет знать, что с ним делать — рисовать как HTML или выводить как просто текст?
[Делаем сами себе игру для Android](https://thecode.media/stack-game-3/)
Что есть в прологе:
- Версия XML. Обычно 1.0.
- Кодировка для корректной работы с символами текста. В нашем примере это UTF-8.
### Корневой элемент
Внутри XML-документа всегда есть корневой тег-элемент — внутри него лежит всё остальное. Так как в XML мы придумываем названия для разметки сами, то пусть этот элемент будет называться `actual` (это название может быть любым):
```markdown
<?xml version="1.0" encoding="UTF-8"?>
<actual>
<!-- содержимое корневого элемента -->
</actual>
```
### Содержимое внутри корневого элемента
Теперь разбираем содержимое. Первое, что мы видим в документе, — это дата, поэтому можем сделать отдельный раздел со статусом издания. В него будет входить значение `Active` (издание работает) и два параметра — дата последней проверки и статус этой проверки. Сам элемент мы назовём `status`:
```markdown
<?xml version="1.0" encoding="UTF-8"?>
<actual>
<!-- содержимое корневого элемента -->
<status lastUpd = "22.05.2025" checked = "true">
Active
</status>
</actual>
```
Это очень похоже на стили и классы в HTML, но работает иначе: мы просто указываем параметры и их значения, а не подключаем какие-то внешние данные или правила.
Ещё вы могли заметить, что мы пишем дату в нестандартном формате (с точки зрения компьютера). Так можно: если мы потом будем писать обработчик этого XML, мы сможем научить его читать именно этот формат даты.
[Почему программистам сложно работать со временем в программах](https://thecode.media/timezone/)
👉 Это история о том, что XML — это просто полочки, на которые мы раскладываем данные. Какие там данные — ему не важно.
Добавим ниже сведения про название журнала:
```markdown
<?xml version="1.0" encoding="UTF-8"?>
<actual>
<!-- содержимое корневого элемента -->
<status lastUpd = "22.05.2025" checked = "true">
Active
</status>
<media type = "online">
Журнал «Код»
</media>
</actual>
```
Новый элемент мы назвали `media`  — так человеку будет проще прочитать и понять, что внутри, а компьютеру всё равно. Последнее — добавим информацию о составе редакции. Обратите внимание, что появилась вложенная структура: внутри элемента person есть три дочерних элемента: `name`, `lastname` и  `role`. Это значит, что они относятся к родительскому элементу, а не живут сами по себе:
```markdown
<?xml version="1.0" encoding="UTF-8"?>
<actual>
<!-- содержимое корневого элемента -->
<status lastUpd = "22.05.2025" checked = "true">
Active
</status>
<media type = "online">
Журнал «Код»
</media>
<!-- редакция -->
<person>
<name>
Михаил
</name>
<lastname>
Полянин
</lastname>
<role>
главред
</role>
</person>
<person>
<name>
Кристина
</name>
<lastname>
Тульцева
</lastname>
<role>
редактор
</role>
</person>
<person>
<name>
Игорь
</name>
<lastname>
Росляков
</lastname>
<role>
редактор
</role>
</person>
</actual>
```
Таким способом можно разобрать на логические составляющие любой технический или информационный документ — от инструкции к чайнику до ежегодного отчёта для инвесторов. Главное, не запутаться в элементах и чётко понимать, что от чего зависит и куда вкладывается.
### Секции CDATA
Это блок с дополнительными тегами внутри тега. Внутри можно вставить любой текст, даже спецсимволы. Выглядит так:
```markdown
<cdata_example>
<![CDATA[
Внутри CDATA можно писать <, >, & без экранирования
]]>
</cdata_example>
```
CDATA — способ сказать машине, чтобы она не обрабатывала этот блок как XML. Получается что-то вроде больших комментариев, но не совсем. CDATA затрудняет работу: поиск по этому разделу становится сложнее, он может мешать созданным шаблонам.
Главное, что XML создан для работы со структурированными данными, а CDATA работает как бы против этой идеи: это чёрный ящик, внутри которого может быть что угодно. Его нельзя проверить схемой, и он не поддерживает механизмы для усиления надёжности работы XML.
Иногда CDATA бывает полезен, но это особые случаи. Например, нужно встроить в файл фрагмент текста с большим количеством спецсимволов, такой как код.
## Где нужен XML-формат
XML применяют везде, где нужно выделить логическое содержимое документа, чтобы потом его можно было как-то обработать. Например, если у вас есть размеченный XML-файл с названием и характеристиками товаров, то можно научить сервер обрабатывать его как угодно: выводить название в заголовке или простым текстом, понимать, где лежит цена, откуда брать описание и к какому разделу отнести этот товар.
Ещё XML применяют в API, когда идёт ответ от сервера в виде XML-файлов.
## Как открыть XML-файл
Способов несколько. Всё зависит от того, что вы потом хотите сделать с файлом.
### На компьютере
Если файл нужно только открыть и просмотреть, проще всего перетащить его в поле адресной строки браузера. Редактировать нельзя, зато вся структура сразу видна:
![Что такое XML-формат и для чего он нужен](https://thecode.media/wp-content/uploads/2024/09/image8-1024x535.png)
Что такое XML-формат и для чего он нужен
Самый простой инструмент для редактирования — Блокнот на Windows и TextEdit на MacOS. Можно менять содержимое, но просматривать его не так удобно, потому что нет подсветки синтаксиса:
![Что такое XML-формат и для чего он нужен](https://thecode.media/wp-content/uploads/2024/09/image7-1024x847.png)
Что такое XML-формат и для чего он нужен
Более продвинутый вариант — использовать текстовые редакторы кода. Так будет выглядеть открытый файл в редакторе Sublime Text:
![Что такое XML-формат и для чего он нужен](https://thecode.media/wp-content/uploads/2024/09/image6-1-1024x682.png)
Что такое XML-формат и для чего он нужен
Самый мощный вариант — поставить IDE и всё делать в ней. Например, бесплатный настраиваемый Visual Studio Code:
![Что такое XML-формат и для чего он нужен](https://thecode.media/wp-content/uploads/2024/09/image1-2-1024x686.png)
Что такое XML-формат и для чего он нужен
### На мобильных устройствах
По умолчанию XML на смартфоне можно открыть в браузере, так же как на компьютере:
![Что такое XML-формат и для чего он нужен](https://thecode.media/wp-content/uploads/2024/09/image5-1024x709.jpg)
Что такое XML-формат и для чего он нужен
Если скачать отдельное приложение (их много, можно выбрать), файл можно открывать и редактировать в нём:
![Что такое XML-формат и для чего он нужен](https://thecode.media/wp-content/uploads/2024/09/image10-1024x709.jpg)
Что такое XML-формат и для чего он нужен
## Создание и редактирование XML файлов
Понадобится любой текстовый редактор или редактор кода. Минус текстового редактора в том, что там нет подсветки, поэтому лучше поставить что-нибудь для программирования.
Если не хотите разбираться в средах разработки, поставьте Sublime Text — он простой и удобный, там можно работать с любым текстом, его достаточно для всех простых задач, а если прокачать дополнительными плагинами, то можно спокойно писать и запускать код.
[Почему настоящие мастера пишут всё в Sublime Text](https://thecode.media/sublime-one-love/)
Для простого XML-файла нужно запомнить несколько правил.
Сначала пишем пролог:
```markup
<?xml version="1.0" encoding="UTF-8"?>
```
Потом ставим корневой тег:
```markup
<?xml version="1.0" encoding="UTF-8"?>
<root>
<!-- тут будет всё содержимое XML -->
</root>
```
Внутри корневого тега можно создавать любые другие, но нужно помнить:
- Не забывайте ставить парные теги — один открывающий, другой закрывающий. Если работаете в IDE, для этого можно установить дополнительный плагин, который будет делать это за вас.
- Регистр важен: нельзя написать один тег заглавными буквами, а другой строчными.
- Все атрибуты внутри тегов должны быть указаны в кавычках: `<book id="101">`.
- Спецсимволы, такие как угловые кавычки или амперсанд, нужно экранировать.
Созданный XML можно проверить валидаторами. Например, [jsonformatter.org](https://jsonformatter.org/xml-validator):
![Что такое XML-формат и для чего он нужен](https://thecode.media/wp-content/uploads/2024/09/image2-3-1024x641.png)
Что такое XML-формат и для чего он нужен
Или [w3schools.com](https://www.w3schools.com/xml/xml_validator.asp):
![Что такое XML-формат и для чего он нужен](https://thecode.media/wp-content/uploads/2024/09/image3-3-1024x697.png)
Что такое XML-формат и для чего он нужен
## Что дальше
В другой статье придумаем свой XML-формат и научим сервер с ним работать. Так тоже можно. В конце концов, это ИТ, тут можно вообще почти всё.
## Вам слово
Приходите к нам в соцсети поделиться своим мнением о формате XML и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот [тележка](https://v.thecode.media/gfjty), вот [ВК](https://v.thecode.media/lmw36) — велком!
@@ -0,0 +1,50 @@
---
title: "Кабель FT8 для Xiegu G90/G106"
source: "https://dzen.ru/a/aPVQ38CKA00Bm47l"
author:
- "[[RAZA Аномальные зоны России]]"
published:
created: 2026-01-27
description: "Статья автора «RAZA Аномальные зоны России» в Дзене ✍: Трансивер Xiegu G106 весьма привлекателен своей компактностью. При его 5 ваттах на выходе, вас прекрасно слышат в SSB."
tags:
- "clippings"
---
[RAZA Аномальные зоны России](https://dzen.ru/razaward)
Трансивер Xiegu G106 весьма привлекателен своей компактностью. При его 5 ваттах на выходе, вас прекрасно слышат в SSB. Но на нем можно и работать в FT8 через кабель со смартфона. Причем стандартные...
Трансивер Xiegu G106 весьма привлекателен своей компактностью. При его 5 ваттах на выходе, вас прекрасно слышат в SSB. Но на нем можно и работать в FT8 через кабель со смартфона. Причем стандартные кабеля, которые продаются на маркетах не определяются смартфоном. Я попробовал разобраться в этом вопросе и нашел простое решение.
![Готовый кабель](https://static.dzeninfra.ru/s3/zen-apps/subscriptions/1.7.0/k8Fq3/OFPO22693be0bc7T41FwaTtEL0E40QpUOvXYxNkeOpKXtEPzJzQI0Q0OAsLfj9kJ8AD5BHxR3aPVkZKnUMi58cJ474lAJjOGhESlTWeLZ52y3T4Ziefai6hOEnRMmBj4IbTghFh5JbBtylLz9sJrvGbpQbS2sZ0gL1l50YTyMv4n4MevKy3OkRdi1Ojmrhb6daAugQs2RgLt4bCbhkui0o5lEOcXFdMjmeGk5vsb5wqXi9rn5nIMuQ)
Готовый кабель
Разъем гарнитуры в смартфоне называется миниджек TRRS. Он имеет 4 контакта и отличается от обычного TRS тем, что корпусной контакт расположен не на основании разъема. Правильную распайку разъема вы видите на картинке.
![Распайка TRRS](https://static.dzeninfra.ru/s3/zen-apps/subscriptions/1.7.0/k8Fq3/OFPO22693be0bc7T41FwaTtEL0E40QpUOvXYxNkeOpKXtEPzJzQI0Q0OAsLfj9kJ8AD5BHxR3aPVkZKnUMi58cJ474lAJjOGhESlTWeLZ52y3T4Ziefai6hOEnRMmBj4IbTghFh5JbBtylLz9sJru4wp4dCCsJ9gL18Z1YZyAvzvkWyvKy3OkRdi1Ojmrhb6daAugQs2RgLt4bCbhkui0o5lEOcXFdMjmeGk5vsb5wqXi9rn5nIMuQ)
Распайка TRRS
Наша задача подать на микрофон смартфона сигнал AF-OUT и сигнал наушников на AF-IN. Все просто, да не просто. Если просто вставить джек в смартфон - ничего не произойдет и звук не пойдет в этот разъем. Все потому, что смартфон отпределяет по сопротивлению микрофона и наушников подключение гарнитуры. Как это обойти? Да просто припаять резисторы параллельно. 1.5 килоома к микрофону и 1 килоом к наушникам.
![Правильная распайка кабеля](https://avatars.dzeninfra.ru/get-zen_doc/271828/pub_68f550dfc08a034d019b8ee5_68f5519e9b16f276f8126406/scale_540)
Правильная распайка кабеля
После этого провод будет определяться смартфоном и звук пойдет куда нужно. Разъем ACC в трансивере имеет маркировку MDN-8M.
![Распайки на XIEGU](https://avatars.dzeninfra.ru/get-zen_doc/271828/pub_68f550dfc08a034d019b8ee5_68f5517bdd73ca4c23ff8a90/scale_540)
Распайки на XIEGU
Я припаял резисторы прямо на разъем, используя типоразмер 0805. А как сделаете вы?
![Резисторы типоразмера 0805 на разъеме trrs 3.5](https://avatars.dzeninfra.ru/get-zen_doc/271828/pub_68f550dfc08a034d019b8ee5_68f551bc967ee46a8a3df581/scale_540)
Резисторы типоразмера 0805 на разъеме trrs 3.5
Если нема такого разъема в телефоне ? через звуковую карту получится в USB перейти ?
Dima V, https://www.ozon.ru/product/usb-a-na-3-5-mm-trrs-adapter-belyy-port-tipa-c-2882482086/?at=99trQpqgqcD7x2OgHNZvZ7jU9jAGmwINOOlgxtjyO6kX
для юсб звуковухи синий общий провод на два разъема, красный в гнездо микрофона, зеленый в гнездо наушников.
@@ -0,0 +1,73 @@
---
title: "Как передать реальный ip клиента через nginx proxy manager lcx?"
source: "https://qna.habr.com/q/1253998"
author:
- "[[Хабр Q&A — вопросы и ответы]]"
published: 2023-02-18
created: 2026-02-10
description: "Всем привет!На роутере проброшен 80 и 44 порт на контейнер lxc (не докер) с nginx proxy manager, он в свою очередь перенаправляет на виртуалку с Xpenology, как в Xpenology получать реальные адреса пользователей ? В Xpenology все клиенты, которые подключаются через домен, им присваивается адрес контейнера с nginx Пробовал добавить вот такие \"префиксы\", все равно никакАдрес сети 192.168.8.0/24Адрес контейнера 192.168.8.9/24Адрес Xpenology 192.168.8.3/24Адрес роутера 192.168.8.1/24Ip бе"
tags:
- "clippings"
---
Всем привет!
На роутере проброшен 80 и 44 порт на контейнер lxc (не докер) с nginx proxy manager, он в свою очередь перенаправляет на виртуалку с Xpenology, как в Xpenology получать реальные адреса пользователей? В Xpenology все клиенты, которые подключаются через домен, им присваивается адрес контейнера с nginx
![63f06d825894a606825457.png](https://habrastorage.org/webt/63/f0/6d/63f06d825894a606825457.png)
![63f06d95ee682435782233.png](https://habrastorage.org/webt/63/f0/6d/63f06d95ee682435782233.png)
Пробовал добавить вот такие "префиксы", все равно никак
![63f06db55e15d214902926.png](https://habrastorage.org/webt/63/f0/6d/63f06db55e15d214902926.png)
Адрес сети 192.168.8.0/24
Адрес контейнера 192.168.8.9/24
Адрес Xpenology 192.168.8.3/24
Адрес роутера 192.168.8.1/24
Ip белый
- 4407 просмотров
Подписаться 1 Простой
[Реклама](https://company.habr.com/ru/advertising/ "Медийная реклама")
Решение проблемы
необходимо
на роутере с Openwrt (как в других - не подскажу)
1.Либо отключить Маскарадинг из WAN либо создать правило НАТ, которое бы разрешало для proxy сервера получать ip внешние, а не роутера
![6408c4287ddf4780805586.png](https://habrastorage.org/webt/64/08/c4/6408c4287ddf4780805586.png)
или
![6408c4398bd1d824965834.png](https://habrastorage.org/webt/64/08/c4/6408c4398bd1d824965834.png)
2\. Если вы используете Nginx Proxy Manager (в докере или в lxc контейнере), то в проксируемом хосте, вкладка advansed необходимо добавить следующее
proxy\_set\_header Host $http\_host;
proxy\_set\_header X-Real-IP $remote\_addr;
proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for;
proxy\_set\_header X-Forwarded-Proto $scheme;
(конфиг фаил править не нужно)
![6408c44a32f6b020126373.png](https://habrastorage.org/webt/64/08/c4/6408c44a32f6b020126373.png)
3\. в самом Synology (или Xpenology, разницы нет) необходимо зайти
Панель управления - Безопасность - вкладка Безопасность
![6408c45b655e8677374170.png](https://habrastorage.org/webt/64/08/c4/6408c45b655e8677374170.png)
В самом низу "Доверенные Прокси-серверы" и там указать адрес вашего прокси сервера с маской через слэш
![6408c46691b6a025962686.png](https://habrastorage.org/webt/64/08/c4/6408c46691b6a025962686.png)
Ответ написан
[Пригласить эксперта](https://qna.habr.com/q/#)
### Войдите, чтобы написать ответ
[Middle FullStack Developer (PHP / Laravel / Vue)](https://career.habr.com/vacancies/1000164345?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post)
[ЛЕДДЕР](https://career.habr.com/companies/ledder?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post) • Казань
от 150 000 ₽
[SRE / DevOps инженер (bare metal, highload media platform)](https://career.habr.com/vacancies/1000164894?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post)
[Karma8](https://career.habr.com/companies/karma8?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post)
от 350 000 ₽
[ML / NLP Engineer (чат-боты, LLM)](https://career.habr.com/vacancies/1000164752?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post)
[FIN](https://career.habr.com/companies/fin?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post) • Лимассол
от 4 000 до 6 000 $
@@ -0,0 +1,209 @@
---
title: "Что такое Swagger: инструмент для подготовки документации к API и проведения тестов API — журнал «Код»"
source: https://thecode.media/chto-takoe-swagger-i-kak-on-oblegchaet-rabotu-s-api/
author:
published: 2024-11-20
created: 2025-08-24
description: Swagger — инструмент, который умеет автоматически создавать описание для каждого ресурса в REST API, показывать доступные методы, параметры запроса и ответы.
tags:
- clippings
- "#swagger"
---
Мы уже рассказывали, что такое [API](https://thecode.media/api/), но на всякий случай напомним: это то, что может делать приложение по просьбе других приложений. Чтобы функциями API могли пользоваться другие люди, они должны знать, какие запросы можно отправлять, что нужно передавать в ответах и что вернётся. Всю эту информацию разработчики API указывают в документации. Но обычно вручную делать такие описания долго, особенно если API большой и функциональный, поэтому разработчики используют специальные инструменты для создания документации. Один из них — Swagger — мы сегодня и разберём.
## Что такое Swagger и как он связан с REST API
API — это набор команд, которые разработчики добавляют в приложение, чтобы другие программы могли с этим приложением взаимодействовать. Допустим, есть [сервис](https://github.com/alexwohlbruck/cat-facts) для получения фактов о кошках, и нужно, чтобы другие приложения тоже могли запрашивать эти факты. Для этого используется API, который задаёт правила для взаимодействия. С помощью запросов к этому API можно получить случайные факты о кошках.
Есть несколько подходов к созданию API. Один из самых популярных — архитектура REST API (Representational State Transfer). Она описывает, как должен быть устроен API, чтобы с ним всем было удобно работать.
В этой архитектуре каждый объект или ресурс в приложении («пользователи», «факты», «задачи») имеет свой уникальный URL, который называется эндпоинтом. Эндпоинт — это адрес, по которому отправляется запрос к API, и для работы с ним используются стандартные HTTP-методы: GET для получения данных или POST — для создания новых данных. REST API работает по принципу «без сохранения состояния» — то есть каждый запрос обрабатывается как самостоятельное действие, не зависящее от предыдущих запросов.
Чтобы объяснить другим принцип работы своего API, разработчики пишут документацию. Там они описывают, какие действия поддерживает API, как отправлять запросы, какие данные можно получить в ответ и так далее. Получается что-то вроде этого:
![Что такое Swagger и как он облегчает работу с API](https://thecode.media/wp-content/uploads/2024/11/image9-2-1024x561.png)
Что такое Swagger и как он облегчает работу с API
Пример документации API для приложения Cat Facts: указан основной URL, эндпоинты и модели данных
Чтобы упростить себе жизнь, разработчики используют разные инструменты, которые помогают создавать документацию. Один из них — [Swagger](https://swagger.io/). Он умеет автоматически создавать описание для каждого ресурса в REST API, показывать доступные методы, параметры запроса и ответы, поскольку заточен под REST API и работает с теми же стандартами URL и HTTP-методов.
Swagger берёт все ресурсы, методы и параметры, заданные в API, и превращает их в наглядное описание. В результате мы можем увидеть, какие запросы поддерживаются, какие данные нужно передавать и что возвращается в ответ. Документация, которую создаёт Swagger, будет выглядеть так:
![Что такое Swagger и как он облегчает работу с API](https://thecode.media/wp-content/uploads/2024/11/image4-4.png)
Что такое Swagger и как он облегчает работу с API
Пользователь сразу видит структуру API. Можно раскрыть запрос и протестировать его выполнение прямо в браузере:
![Что такое Swagger и как он облегчает работу с API](https://thecode.media/wp-content/uploads/2024/11/image2-8.png)
Что такое Swagger и как он облегчает работу с API
## Для чего используется Swagger
Мощь Swagger — в его интерактивности. Инструмент создаёт документацию, где каждый запрос, параметры и ответ можно сразу протестировать. Это позволяет быстро проверить, как работает каждый метод, и если нужно, то сразу сделать отладку.
Swagger стал настолько популярным, что сейчас разные разработчики и компании воспринимают его как стандартный инструмент для работы с API. Его используют для создания и документирования API как для внутренних целей, так и для внешних клиентов.
Инструмент могут использовать разные специалисты, которые работают с API: разработчики, системные аналитики, тестировщики, а также проектные и продуктовые менеджеры. В зависимости от роли и задач использование будет разным.
Теперь разберём подробнее.
### ➡️ Как используют Swagger разработчики API
**Создают и поддерживают документацию.** Это обязательный этап при проектировании API, особенно если он будет использоваться другими командами или клиентами. В Swagger разработчик может описать каждый эндпоинт, добавить методы, параметры и возможные ответы.
**Тестируют API.** Можно выбрать эндпоинт, задать параметры и отправить запрос, чтобы увидеть, как API обрабатывает данные. Это позволяет сразу проверить, правильно ли работает каждый метод. Swagger показывает, какой ответ приходит от API — формат JSON и коды ошибок.
**Генерируют клиентский код для API.** Если API нужно подключить к приложению, Swagger Codegen позволяет создать клиентский код для работы с этим API на более чем 40 языках программирования. Swagger также может создавать серверные заглушки, которые представляют API, но без фактической бизнес-логики. Это позволяет начать разработку клиентской части параллельно с серверной, так как клиент может тестировать API, даже если сервер ещё не готов.
**Синхронизируют работу в команде.** Swagger помогает командам избегать путаницы при разработке API и иметь доступ к актуальной документации. Если один разработчик добавляет новый эндпоинт, это сразу же видно всем, кто работает с этим API. Клиентская и серверная команды могут одновременно тестировать API и проверять, что все методы и параметры работают как нужно.
В общем, если нужно создавать с нуля свой API, то Swagger точно пригодится.
### ➡️ Как используют Swagger системные аналитики
У аналитиков всё несколько по-другому: их задача не столько в написании кода, сколько в анализе и координации работы API, а также в проверке соответствия требованиям. Вот что они делают.
**Анализируют текущее состояние API.** Swagger позволяет изучить структуру API и понять, какие данные он обрабатывает и какие функции поддерживает. Это помогает на этапе планирования: можно оценить, насколько API соответствует целям проекта, и сразу увидеть, какие ресурсы и методы уже реализованы, а какие нужно добавить.
**Взаимодействуют с разработчиками и заказчиками.** Документацию Swagger удобно демонстрировать заказчикам: используя Swagger, аналитики могут показать, какие возможности есть у API, и объяснить его работу простыми словами, не вдаваясь в технические аспекты.
**Проверяют соответствие API требованиям.** Аналитики проверяют, что каждый метод, ресурс и параметр соответствует установленным задачам. Если API меняется, аналитик может сразу увидеть, соответствует ли новое решение изначальным ожиданиям, и вовремя внести корректировки и передать задачи команде разработки.
Вам может быть интересно:
[![](https://thecode.media/wp-content/uploads/2020/05/photo_2020-05-26-10.32.29-320x213.jpeg) Что такое API](https://thecode.media/chto-takoe-api/) [![](https://thecode.media/wp-content/uploads/2023/03/1-10-320x224.jpg) Что такое вебхук](https://thecode.media/webhook/) [![](https://thecode.media/wp-content/uploads/2024/09/1s-1-2-320x224.png) Космическая Python-программа: следим за МКС](https://thecode.media/kosmicheskaya-python-programma-sledim-za-mks/) [![](https://thecode.media/wp-content/uploads/2025/02/1-6-320x180.png) Делаем HTTP-запросы на Python с библиотеками requests, aiohttp и httpx](https://thecode.media/delaem-http-zaprosy-na-python-s-bibliotekami-requests-aiohttp-i-httpx/)
## Компоненты Swagger
В Swagger есть два вида компонентов: компоненты-инструменты и компоненты спецификации.
Разные инструменты решают разные задачи. Допустим, если нужно только создать документацию, достаточно Swagger Editor, а если надо ещё и полноценно протестировать разные сценарии использования — то Swagger UI. Инструменты доступны через официальный сайт [https://swagger.io/](https://swagger.io/)
![Что такое Swagger и как он облегчает работу с API](https://thecode.media/wp-content/uploads/2024/11/image3-4.png)
Что такое Swagger и как он облегчает работу с API
Разберём три основных.
- [**Swagger Editor**](https://editor.swagger.io/)**:** позволяет писать документацию, проектировать и описывать новые API, а также редактировать существующие. Инструмент работает в браузере, визуально отображает документацию и подсвечивает ошибки. Можно сделать базовое тестирование запросов. Также можно установить и запустить локально.
- [**Swagger UI**](https://swagger.io/tools/swagger-ui/)**:** настраиваемый инструмент, который визуализирует документацию для API. Подключается к API и позволяет взаимодействовать с ним прямо в браузере. С его помощью можно изучить структуру API и полноценно протестировать его, задавая параметры и отправляя запросы в режиме реального времени.
- [**Swagger Codegen**](https://github.com/swagger-api/swagger-codegen)**:** создаёт готовый клиентский код для работы с уже описанным API. Если у вас есть документация, созданная вручную или с помощью Swagger UI, то Swagger Codegen может использовать эту документацию для автоматической генерации клиентских библиотек на разных языках. Codegen можно сразу подключить к проекту и использовать его как модуль для работы с API.
Компоненты спецификации — это то, из чего состоит документация API. Это разделы, которые организуют и структурируют описание:
Такая структура называется спецификацией OpenAPI:
![Что такое Swagger и как он облегчает работу с API](https://thecode.media/wp-content/uploads/2024/11/image6-4-1024x828.png)
Что такое Swagger и как он облегчает работу с API
Когда в документации мы выносим общие описания в отдельные компоненты, это сокращает код. Получается, что, описав один раз параметры или ответы, можно использовать их в разных местах. Если нужно что-то изменить, достаточно обновить компонент один раз, и изменения сразу отразятся во всех запросах, где он используется.
## Как начать работать со Swagger
Самый простой способ — использовать [онлайн-версию](https://editor.swagger.io/) Swagger Editor. При запуске редактор автоматически загружает пример API — шаблон в формате YAML, разбитый на компоненты. В формате YAML используются отступы и структура с вложенностью, а не скобки или кавычки, поэтому он выглядит более простым для восприятия — сразу понятно, что к чему относится.
Можно использовать его как основу, удаляя ненужные компоненты и добавляя свои данные. Swagger Editor сразу покажет, как будет выглядеть документация на основе описания.
![Что такое Swagger и как он облегчает работу с API](https://thecode.media/wp-content/uploads/2024/11/image8-1.png)
Шаблон OpenAPI по умолчанию
Если есть файл документации в формате OpenAPI (файл с расширением.yaml или.json), его можно загрузить в редактор. Для этого нажимаем на вкладку File, выбираем Import File и загружаем файл со своего компьютера:
![Что такое Swagger и как он облегчает работу с API](https://thecode.media/wp-content/uploads/2024/11/image7-4.png)
Что такое Swagger и как он облегчает работу с API
Если мы сделаем ошибку в структуре или синтаксисе файла, то инструмент подсветит её и даст рекомендации по исправлению. Например, есть убрать какое-то обязательное поле в документации (в примере ниже — `version`), то Swagger Editor укажет нам на ошибку в структуре:
![Что такое Swagger и как он облегчает работу с API](https://thecode.media/wp-content/uploads/2024/11/image1-7.png)
Что такое Swagger и как он облегчает работу с API
Если хотите работать локально, скачайте Swagger Editor с [GitHub](https://github.com/swagger-api/swagger-editor) и запустите его на своём компьютере.
Чтобы генерировать документацию из проекта, понадобится Swagger UI. Он умеет создавать спецификации OpenAPI, читая аннотации исходного кода API. Чтобы его установить, нужно скачать Swagger UI с GitHub. Для этого переходим на [GitHub Swagger UI](https://github.com/swagger-api/swagger-ui) и скачиваем репозиторий. Дальше в зависимости от того, на каком языке написан проект, можно либо подключить Swagger UI через фреймворк ([Flask-RESTX](https://flask-restx.readthedocs.io/en/latest/) для Python, [Springfox](https://springfox.github.io/springfox/) для Java), либо использовать Swagger UI как статическое веб-приложение и подключить к нему файл спецификации OpenAPI нашего API.
Дальше разберём более подробно, как это работает, на примере Python-проекта.
## Методы создания документации
Документацию в Swagger можно создавать двумя способами: вручную и через генератор.
Вручную документация пишется в [Swagger Editor](https://swagger.io/tools/swagger-editor/). Там мы подробно описываем весь наш API в компонентах OpenAPI: какие в нём есть команды, какие данные можно передавать, что API вернёт в ответ.
Второй способ — это генерация через [Swagger UI](https://github.com/swagger-api/swagger-ui). В исходном коде API разработчики добавляют специальные аннотации, которые описывают функции API: какие команды доступны, какие параметры принимают и что возвращают. Для создания таких аннотаций обычно подключают сторонние библиотеки.
Допустим, у нас есть Python-код какого-то API, который мы хотим задокументировать. В свой проект мы подключаем библиотеку Flask и расширение для аннотирования flask\_restx, чтобы с помощью аннотации `@api.doc` добавить описание для каждого метода. Swagger UI прочитает все аннотации и автоматически отобразит документацию по ним.
Сначала добавляем Flask и расширение Flask-RESTX, которые позволят дальше работать со Swagger. Открываем терминал и пишем команду:
```markup
pip install flask flask-restx
```
Теперь возьмём код нашего API и аннотируем метод:
```python
# Импортируем Flask для создания веб-приложения
from flask import Flask, request, jsonify
# Импортируем Api и Resource из flask_restx для создания и документирования API
from flask_restx import Api, Resource
# Создаём экземпляр приложения Flask
app = Flask(__name__)
# Создаём объект API с названием и описанием
api = Api(app, title="Главред API", description="API для проверки текста")
# Определяем маршрут /check для обработки запросов по этому URL
@api.route('/check')
# Создаём класс TextCheck, который наследует Resource
class TextCheck(Resource):
# Аннотация для Swagger с описанием, что делает этот метод
@api.doc(description="Проверка текста на стилистические ошибки")
# Определяем метод POST для маршрута /check
def post(self):
# Логика проверки текста
return jsonify({"result": "Текст проверен"})
# Проверяем, запущен ли этот файл напрямую
if __name__ == '__main__':
# Запускаем приложение Flask с включённым режимом отладки (debug)
app.run(debug=True)
```
Здесь мы создаём маршрут /check и добавляем к нему аннотацию `@api.doc`, которая автоматически включит описание этого маршрута в Swagger-документацию.
После этого запускаем наше приложение командой `python имя_файла.py`.
Чтобы увидеть документацию, нужно открыть приложение в браузере: его адрес будет в командной строке при запуске. В браузере увидим интерфейс Swagger и метод, который он нашёл в нашем коде. Там же можно просмотреть и протестировать API:
![Что такое Swagger и как он облегчает работу с API](https://thecode.media/wp-content/uploads/2024/11/image5-3-1024x512.png)
Что такое Swagger и как он облегчает работу с API
## Преимущества и недостатки Swagger
Swagger хорошо подходит для создания понятной документации к API, особенно если нужно, чтобы ею могли пользоваться не только разработчики, но и менеджеры или клиенты.
**Преимущества Swagger**
- Удобный интерфейс: Swagger UI показывает API в структурированном виде — сразу понятно, что к чему.
- Понятность: Swagger-документация понятна не только разработчикам, но и не техническим специалистам.
- Интерактивность: с помощью Swagger UI можно тестировать API прямо в документации, отправляя запросы и проверяя ответы.
- Просто редактировать: документация создаётся в форматах JSON и YAML, которые удобно читать и редактировать.
- Автоматизация процессов: Swagger помогает автоматизировать документирование, тестирование и поддержку API.
**Недостатки Swagger**
- Ограничения для сложных API: Swagger лучше всего подходит для простых REST API, но может ограничивать гибкость для более сложных сценариев.
- Не подходит для других архитектур: Swagger предназначен для REST API и не работает с gRPC или GraphQL.
- Громоздкие файлы: для больших API файлы спецификации могут быть громоздкими и трудными в поддержке.
- Порог входа: требует времени на изучение.
- Ограничения OpenAPI: ограничен функциями, поддерживаемыми стандартом OpenAPI, что не всегда удобно для специфичных требований.
## Аналоги Swagger
Если Swagger кажется сложным, или наоборот, его функций недостаточно, то можно рассмотреть другие подобные инструменты.
@@ -0,0 +1,230 @@
---
title: "Шпаргалка по Markdown - Самые полезные структуры и форматирование"
source: "https://www.glukhov.org/ru/post/2024/03/markdown-cheatsheet/"
author:
- "[[Рост Глухов | Персональный сайт и технический блог]]"
published: 2023-03-20
created: 2025-08-23
description: "Шпаргалка по Markdown - Самые полезные структуры и форматирование"
tags:
- "clippings"
---
Язык разметки [Markdown](https://www.glukhov.org/ru/post/2024/03/markdown-cheatsheet/ "Справочник по Markdown") используется в Википедии и [Hugo](https://www.glukhov.org/ru/post/2024/06/deploy-hugo-site-to-aws/ "Развертывание сайта Hugo на AWS S3"). Он поддерживает заголовки, списки, изменения стиля шрифта, изображения, цитаты кода и таблицы. Здесь я сохраняю краткое резюме форматирования Markdown.
![файл markdown в виртуальном пространстве](https://www.glukhov.org/post/2024/03/markdown-cheatsheet/markdown-files-2-680x496.jpg "файл markdown в виртуальном пространстве") Это изображение выше создано [Flux - AI для генерации изображений по тексту](https://www.glukhov.org/ru/post/2024/09/flux-text-to-image/ "Flux 1 dev - AI для генерации изображений по тексту").
Markdown — это [легковесный](https://www.glukhov.org/ru/ "сайт, сгенерированный с помощью Hugo, очень легковесный") язык разметки, который можно использовать для добавления элементов форматирования в текстовые документы с обычным текстом. Это руководство предоставляет всесторонний обзор наиболее часто используемого [синтаксиса Markdown](https://www.glukhov.org/ru/post/2024/03/markdown-cheatsheet/ "Справочник по Markdown"), помогая вам создавать хорошо структурированные и визуально привлекательные документы.
## Заголовки
Заголовки в Markdown создаются с помощью символа решетки (#). Количество решеток перед текстом заголовка указывает уровень заголовка.
```md
# H1
## H2
### H3
#### H4
##### H5
###### H6
```
## Выделение
Markdown предоставляет несколько способов выделения текста. Вы можете использовать звездочки (\*) или подчеркивания (\_) для курсива и двойные звездочки (\*\*) или двойные подчеркивания (\_\_) для жирного.
Курсив
```md
*Курсив* или _курсив_
```
Жирный
```md
**Жирный** или __жирный__
```
Жирный и курсив
```md
***Жирный и курсив*** или ___жирный и курсив___
```
## Списки
Markdown поддерживает как нумерованные, так и ненумерованные списки.
Ненумерованный список
```md
- Пункт 1
- Пункт 2
- Подпункт 1
- Подпункт 2
```
Нумерованный список
```md
1. Первый пункт
2. Второй пункт
1. Подпункт 1
2. Подпункт 2
```
## Ссылки
Ссылки создаются путем заключения текста ссылки в квадратные скобки (\[\]) и затем заключения URL в круглые скобки (()).
```md
[Текст ссылки](URL)
```
Пример
```md
Посетите [Руководство по Markdown](https://www.markdownguide.org/) для получения дополнительной информации.
```
## Изображения
Изображения добавляются с помощью восклицательного знака (!), за которым следует альтернативный текст в квадратных скобках и URL изображения в круглых скобках.
```md
![Альтернативный текст](URL изображения)
```
Пример
```md
![Логотип Markdown](https://www.markdownguide.org/assets/images/markdown-logo.png)
```
## Блочные цитаты
Блочные цитаты создаются с помощью символа больше чем (>).
```md
> Это блочная цитата.
```
Вложенные блочные цитаты
```md
> Это первый уровень цитирования.
>> Это вложенная блочная цитата.
```
## Встроенный код и блоки кода
Встроенный код можно добавить, заключив его в обратные кавычки (\`). Для блоков кода используйте тройные обратные кавычки (\`\`\`) до и после кода.
Встроенный код
```md
Используйте \`printf()\` для вывода текста в C.
```
Блоки кода
```md
\`\`\`python
def hello_world():
print("Hello, World!")
\`\`\`
```
Больше о блоках кода в Markdown — см. отдельный пост: [Использование блоков кода Markdown](https://www.glukhov.org/ru/post/2025/07/markdown-codeblocks/ "Блоки кода Markdown - подробное описание")
## Горизонтальные правила
Горизонтальные правила создаются с помощью трех или более тире (—), звездочек (\*\*\*) или подчеркиваний (\_\_).
```markdown
---
```
## Таблицы
Таблицы в Markdown создаются с помощью вертикальных линий (|) и тире (-).
```md
Пример
| Заголовок 1 | Заголовок 2 |
|-------------|-------------|
| Ячейка 1 | Ячейка 2 |
| Ячейка 3 | Ячейка 4 |
```
## Списки задач
Списки задач — это специальный тип списков, который позволяет создавать флажки.
```md
Пример
- [x] Выполненная задача
- [ ] Незавершенная задача
```
## Зачеркнутый текст
Зачеркнутый текст создается с помощью двойных тильд (~~).
```md
~~Это зачеркнутый текст.~~
```
## Выделение
Выделение текста не поддерживается нативно в Markdown, но некоторые рендереры поддерживают его с использованием синтаксиса ==.
Пример
```md
==Это выделенный текст.==
```
## Подстрочные и надстрочные индексы
Подстрочные индексы создаются с помощью символа caret (^) перед текстом, а надстрочные индексы — с помощью символа тильда (~) перед текстом.
Пример
```md
H 2 O — это вода.
E = mc^2
```
## Математические формулы
Математические формулы можно добавлять с использованием синтаксиса LaTeX внутри знаков доллара ($).
Пример
```md
$$ E = mc^2 $$
```
## Экранирование символов
Для экранирования специальных символов используйте обратную косую черту ().
Пример
```md
\*Курсив\* или \_курсив\_
```
Это всесторонний справочник, который охватывает основной синтаксис Markdown, необходимый для создания хорошо отформатированных документов. Для более сложных функций и настраиваемых параметров обратитесь к документации конкретного рендерера или дополнительным ресурсам.
## Полезные ссылки
- [Использование блоков кода Markdown](https://www.glukhov.org/ru/post/2025/07/markdown-codeblocks/ "Блоки кода Markdown - подробное описание")
- [Справочник по Hugo](https://www.glukhov.org/ru/post/2022/hugo-cheatsheet/ "Справочник по Hugo - список и описание полезных команд статического генератора сайтов Hugo")
- [Отправка формы Google в сайте Hugo](https://www.glukhov.org/ru/post/2025/04/submit-form-in-hugo-website/ "Инструкции по отправке формы в сайте Hugo с использованием Google Forms")
- [Использование Gitea Actions для развертывания сайта Hugo на AWS S3](https://www.glukhov.org/ru/post/2025/06/using-gitea-actions-deploy-hugo-to-s3/ "Использование Gitea Actions для развертывания сайта Hugo на AWS S3")
- [Справочник по Bash](https://www.glukhov.org/ru/post/2024/04/bash-cheat-sheet/)
- [Справочник по LaTeX](https://www.glukhov.org/ru/post/2024/12/latex-cheat-sheet/ "Справочник по LaTeX - добавление таблиц, диаграмм, изображений, оглавления и других полезных примеров")
- [Справочник по Ollama](https://www.glukhov.org/ru/post/2024/12/ollama-cheatsheet/ "Справочник по Ollama")
- [Справочник по Docker](https://www.glukhov.org/ru/post/2024/10/docker-cheatsheet/ "список и описание наиболее частых и полезных команд Docker - справочник по Docker")
- [Самые популярные темы для Hugo](https://www.glukhov.org/ru/post/2025/05/top-hugo-themes/ "Лучшие темы для Hugo")