Русский
Русский
English
Статистика
Реклама

Основные команды bash, git, npm и yarn, а также немного о package.json и semver

Доброго времени суток, друзья!

Предлагаю вашему вниманию небольшую шпаргалку по основным командам bash, git, npm, yarn, package.json и semver.

Условные обозначения: [dir-name] означает название директории, | означает или.

Рекомендую вводить каждую команду в терминале и внимательно изучать вывод, так вы быстро их запомните и определите, какие команды вам нужны, а какие нет.

Без дальнейших предисловий.

Оглавление:


bash


bash представляет собой инструмент командной строки, позволяющий выполнять некоторые распространенные действия.

Установка: в моем случае bash был установлен вместе с git.

Справка:

help

История команд:

history

Очистка терминала:

clear

Выход из терминала:

exit

Создание директории:

// make directorymkdir [dir-name]// примерmkdir my-app// несколько диреторийmkdir -p {dir1,dir2}// несколько вдложенных директорийmkdir -p my-app/{css,js}

Смена директории:

// change directorycd [dir-name]// примерcd my-app// сразу после созданияcd !$// родительская директорияcd ..// на два уровня вышеcd ../..// предыдущая директорияcd -// домашняя директорияcd ~

Путь к текущей директории:

// print work directorypwd

Список файлов:

// listls// включая скрытые файлыls -a | -f// больше информации// например, права доступаls -l

Создание файла:

touch [file-name]// примерtouch index.html// несколько файловtouch my-app/{index.html,css/style.css,js/script.js}

Содержимое файла:

cat [file-name]// примерcat index.html// сортировка и выборка уникальных значенийcat [file-name] | sort | uniq// меньше контентаless [file-name] // q - exit// n строк с начала файлаhead -50 [file-name]// n строк с конца файлаtail -50 [file-name]// поиск словаgrep [string] [file-name]// распаковка и просмотр содержимого архиваunzip [achive-name]// тип файлаfile [file-name]

Копирование, перемещение и удаление файла:

// copycp [file1] [file2]// movemv [file1] [file2]// пример// перемещение всех файлов из одной директории в другуюmv [dir1]/*.* [dir2]// removerm [file-name]// удаление пустой директорииrmdir [dir-name]// удаление непустой директорииrm -r [dir-name]// илиrm -rf [dir-name]

Вывод в терминал строки:

echo [string]// примерecho hello// создание или перезапись файлаecho hello > greet.txt// добавление строки в файлecho hello >> greet.txt

Загрузка файла:

wget [url]

Коннекторы:

true && echo hellofalse || echo helloecho hello ; ls

Конвейер:

// количество переносов строки - \ncat [file] | wc -l

git


git представляет собой распределенную систему контроля версий, позволяющую контролировать процесс внесения изменений в проект.

Книга Pro Git.

Скринкаст Ильи Кантора.

Быстрый старт: Git How To.

Установка: git-scm.com.

Проверка установки:

git --version

Справка:

git helpgit help [command-name]git [command-name] --help | -h

Минимальные настройки:

// --local - настройки для текущего репо// --global - настройки для текущего пользователя// --system - настройки для всей системы, т.е. для всех пользователейgit config --global user.name "My Name"git config --global user.email "myemail@example.com"

Дополнительные настройки:

// список глобальных настроекgit config --list | -l --global// редактирование глобальных настроекgit config --global --edit | -e

Создание репозитория:

git init

Очистка репозитория:

// -d - включая директории, -x - включая игнорируемые файлы, -f - принудительнаяgit clean | -dxf

Удаление файлов и директорий:

// removegit rm [file-name]git rm -r [dir-name]git rm --force | -f

Перемещение файлов:

// git add + git remove// movegit mv [old-file] [new-file]

Просмотр состояния репозитория:

git status

Добавление изменений:

git add [file-name]git add --force | -f// все файлыgit add . | --all | -A// для добавления пустой директории можно создать в ней пустой файл .gitkeep

Добавление сообщения (коммита):

// редактирование коммитаgit commit// коммит для одного изменения, если не выполнялось git add . | -A// если выполнялось, сообщение будет добавлено для всех измененийgit commit --message | -m "My Message"// для всех изменений, если git add [file-name] выполнялось несколько разgit commit --all | -a -m | -am "My Message"// исправление коммитаgit commit --amend "My Message" | --no-edit

Просмотр коммита:

// последний коммитgit show// другой коммитgit show [hash] // минимум первые 4 символа// поиск изменений по сообщению или части сообщенияgit show :/[string]// поиск коммита по тегуgit show [tag-name]

Просмотр разницы между коммитами:

git diff HEAD | @ // HEAD - как правило, текущая ветка; @ - алиас для HEAD// stagedgit diff --staged | --cachedgit diff [hash1] [hash2]// разница между веткамиgit diff [branch1]...[branch2]// просмотр разницы между коммитами при редактировании сообщенияgit commit --verbose | -v// кастомизация выводимого сообщенияgit diff --word-diff | --color-words

Просмотр истории изменений:

git log// n - количество измененийgit log -n// --since, --after - после// --until, --before - до// разницаgit log -p// быстрое форматированиеgit log --graph --oneline --stat// кастомное форматированиеgit log --pretty=format// примерgit log --pretty=format:'%C(red)%h %C(green)%cd %C(reset)| %C(blue)%s%d %C(yellow)[%an]' --date=short | format-local:'%F %R'// поиск изменений по слову, файлу, ветке; i - без учета регистраgit log --grep | -G [string] | [file] | [branch] & -i// поиск по нескольким строкамgit log --grep [string1] --grep [string2] --all-match// поиск в определенном блоке файлаgit log -L '/<head>/','/<\/head>/':index.html// поиск по авторуgit log --author=[name]

Отмена изменений:

git reset// --hard - включая рабочую директорию и индекс// --soft - без рабочей директории и индекса// --mixed - по умолчанию: без рабочей директории, но с индексомgit reset --hard [hash] | @~ // @~ - последний коммит в HEAD// аналогичноgit reset --hard ORIG_HEAD// не путать с переключением веткиgit checkoutgit restore

Работа с ветками:

// список ветокgit branch// создание веткиgit branch [branch-name]// переключение на веткуgit checkout [branch-name]// branch + checkoutgit checkout -b [branch-name]// переименованиеgit branch -m [old-branch] [new-branch]// удаление веткиgit branch -d [branch-name]// слияние ветокgit merge [branch-name]

Разрешение конфликтов при слиянии:

// обычно, при возникновении конфликта, открывается редактор// принять изменения из сливаемой веткиgit checkout --ours// принять изменения из текущей веткиgit checkout --theirs// отмена слиянияgit reset --mergegit merge --abort// получение дополнительной информацииgit checkout --conflict=diff3 --merge [file-name]// продолжить слияниеgit merge --continue

Удаленный репозиторий:

// клонированиеgit clone [url] & [dir]// просмотрgit remotegit remote showgit remote add [shortname] [url]git remote rename [old-name] [new-name]// получение изменений// git fetch + git mergegit pull// отправка измененийgit push

Теги:

// просмотрgit tag// легковесная меткаgit tag [tag-name]//примерgit tag v1-beta// аннотированная меткаgit tag -a v1 -m "My Version 1"// удалениеgit tag -d [tag-name]

Отладка

git bisectgit blamegit grep

Сохранение незакоммиченных изменений:

// сохранениеgit stash// извлечениеgit stash pop

Копирование коммита:

git cherry-pick | -x [hash]// если возник конфликт// отменаgit cherry-pick --abort// продолжитьgit cherry-pick --continuegit cherry-pick --no-commit | -n// --cherry = --cherry-mark --left-right --no-mergesgit log --oneline --cherry [branch1] [branch2]

Перебазирование:

git rebase [branch]// при возникновении конфликта// отменаgit rebase --abort// пропуститьgit rebase --skip// продолжитьgit rebase --continue// предпочтение коммитов слиянияgit rebase --preserve-merges | -p// интерактивное перебазированиеgit rebase -i [branch]

Автозавершение повторных конфликтов:

// rerere - reuse recorder resolution// rerere.enabled true | false// rerere.autoUpdate true | false// rerere-train.sh - скрипт для обучения rereregit rerere forget [file-name]

Обратные коммиты:

git revert @ | [hash]// отмена слияния// git reset --hard @~ не сработаетgit revert [hash] -m 1// git merge [branch] не сработает// отмена отменыgit revert [hash]// повторное слияние с rebasegit rebase [branch1] [branch2] | --onto [branch1] [hash] [branch2]git merge [branch]git rebase [hash] --no-ff

Пример алиасов (сокращений) для .gitconfig:

[alias]    aa = add -A    co = checkout    ci = commit -m    st = status    br = branch

Пример .gitconfig:
[user]name = [My Name]email = [myemail@example.com]username = [myusername][core]editor = [myeditor]whitespace = fix,-indent-with-non-tab,trailing-space,cr-at-eolpager = delta[web]browser = google-chrome[instaweb]httpd = apache2 -f[rerere]enabled = 1autoupdate = 1[push]default = matching[color]ui = auto[color "branch"]current = yellow boldlocal = green boldremote = cyan bold[color "diff"]meta = yellow boldfrag = magenta boldold = red boldnew = green boldwhitespace = red reverse[color "status"]added = green boldchanged = yellow bolduntracked = red bold[difftool]prompt = false[delta]features = line-numbers decorationsline-numbers = true[delta "decorations"]minus-style = red bold normalplus-style = green bold normalminus-emph-style = white bold redminus-non-emph-style = red bold normalplus-emph-style = white bold greenplus-non-emph-style = green bold normalfile-style = yellow bold nonefile-decoration-style = yellow boxhunk-header-style = magenta boldhunk-header-decoration-style = magenta boxminus-empty-line-marker-style = normal normalplus-empty-line-marker-style = normal normalline-numbers-right-format = "{np:^4} "[github]user = [username]token = token[gitflow "prefix"]versiontag = v[sequence]editor = interactive-rebase-tool[alias]a = add --allai = add -i###ap = applyas = apply --statac = apply --check###ama = am --abortamr = am --resolvedams = am --skip###b = branchba = branch -abd = branch -dbdd = branch -Dbr = branch -rbc = rev-parse --abbrev-ref HEADbu = !git rev-parse --abbrev-ref --symbolic-full-name "@{u}"bs = !git-branch-status###c = commitca = commit -acm = commit -mcam = commit -amcem = commit --allow-empty -mcd = commit --amendcad = commit -a --amendced = commit --allow-empty --amend###cl = clonecld = clone --depth 1clg = !sh -c 'git clone git://github.com/$1 $(basename $1)' -clgp = !sh -c 'git clone git@github.com:$1 $(basename $1)' -clgu = !sh -c 'git clone git@github.com:$(git config --get user.username)/$1 $1' -###cp = cherry-pickcpa = cherry-pick --abortcpc = cherry-pick --continue###d = diffdp = diff --patiencedc = diff --cacheddk = diff --checkdck = diff --cached --checkdt = difftooldct = difftool --cached###f = fetchfo = fetch originfu = fetch upstream###fp = format-patch###fk = fsck###g = grep -p###l = log --onelinelg = log --oneline --graph --decorate###ls = ls-fileslsf = !git ls-files | grep -i###m = mergema = merge --abortmc = merge --continuems = merge --skip###o = checkoutom = checkout masterob = checkout -bopr = !sh -c 'git fo pull/$1/head:pr-$1 && git o pr-$1'###pr = prune -v###ps = pushpsf = push -fpsu = push -upst = push --tags###pso = push originpsao = push --all originpsfo = push -f originpsuo = push -u origin###psom = push origin masterpsaom = push --all origin masterpsfom = push -f origin masterpsuom = push -u origin masterpsoc = !git push origin $(git bc)psaoc = !git push --all origin $(git bc)psfoc = !git push -f origin $(git bc)psuoc = !git push -u origin $(git bc)psdc = !git push origin :$(git bc)###pl = pullpb = pull --rebase###plo = pull originpbo = pull --rebase originplom = pull origin masterploc = !git pull origin $(git bc)pbom = pull --rebase origin masterpboc = !git pull --rebase origin $(git bc)###plu = pull upstreamplum = pull upstream masterpluc = !git pull upstream $(git bc)pbum = pull --rebase upstream masterpbuc = !git pull --rebase upstream $(git bc)###rb = rebaserba = rebase --abortrbc = rebase --continuerbi = rebase --interactiverbs = rebase --skip###re = resetrh = reset HEADreh = reset --hardrem = reset --mixedres = reset --softrehh = reset --hard HEADremh = reset --mixed HEADresh = reset --soft HEADrehom = reset --hard origin/master###r = remotera = remote addrr = remote rmrv = remote -vrn = remote renamerp = remote pruners = remote showrao = remote add originrau = remote add upstreamrro = remote remove originrru = remote remove upstreamrso = remote show originrsu = remote show upstreamrpo = remote prune originrpu = remote prune upstream###rmf = rm -frmrf = rm -r -f###s = statussb = status -s -b###sa = stash applysc = stash clearsd = stash dropsl = stash listsp = stash popss = stash savessk = stash save -ksw = stash showst = !git stash list | wc -l 2>/dev/null | grep -oEi '[0-9][0-9]*'###t = tagtd = tag -d###w = showwp = show -pwr = show -p --no-color###svnr = svn rebasesvnd = svn dcommitsvnl = svn log --oneline --show-commit###subadd = !sh -c 'git submodule add git://github.com/$1 $2/$(basename $1)' -subrm = !sh -c 'git submodule deinit -f -- $1 && rm -rf .git/modules/$1 && git rm -f $1' -subup = submodule update --init --recursivesubpull = !git submodule foreach git pull --tags origin master###assume = update-index --assume-unchangedunassume = update-index --no-assume-unchangedassumed = !git ls -v | grep ^h | cut -c 3-unassumeall = !git assumed | xargs git unassumeassumeall = !git status -s | awk {'print $2'} | xargs git assume###bump = !sh -c 'git commit -am \"Version bump v$1\" && git psuoc && git release $1' -release = !sh -c 'git tag v$1 && git pst' -unrelease = !sh -c 'git tag -d v$1 && git pso :v$1' -merged = !sh -c 'git o master && git plom && git bd $1 && git rpo' -aliases = !git config -l | grep alias | cut -c 7-snap = !git stash save 'snapshot: $(date)' && git stash apply 'stash@{0}'bare = !sh -c 'git symbolic-ref HEAD refs/heads/$1 && git rm --cached -r . && git clean -xfd' -whois = !sh -c 'git log -i -1 --author=\"$1\" --pretty=\"format:%an <%ae>\"' -serve = daemon --reuseaddr --verbose --base-path=. --export-all ./.git###behind = !git rev-list --left-only --count $(git bu)...HEADahead = !git rev-list --right-only --count $(git bu)...HEAD###ours = "!f() { git checkout --ours $@ && git add $@; }; f"theirs = "!f() { git checkout --theirs $@ && git add $@; }; f"subrepo = !sh -c 'git filter-branch --prune-empty --subdirectory-filter $1 master' -human = name-rev --name-only --refs=refs/heads/*[filter "lfs"]clean = git-lfs clean -- %fsmudge = git-lfs smudge -- %fprocess = git-lfs filter-processrequired = true


Пример .gitignore:
### Node #### Logslogsnpm-debug.log*yarn-debug.log*yarn-error.log*# Optional npm cache directory.npm# Dependency directories/node_modules/jspm_packages/bower_components# Yarn Integrity file.yarn-integrity# Optional eslint cache.eslintcache# dotenv environment variables file(s).env.env.*#Build generateddist/build/# Serverless generated files.serverless/### SublimeText #### cache files for sublime text*.tmlanguage.cache*.tmPreferences.cache*.stTheme.cache# workspace files are user-specific*.sublime-workspace# project files should be checked into the repository, unless a significant# proportion of contributors will probably not be using SublimeText# *.sublime-project### VisualStudioCode ###.vscode/*!.vscode/settings.json!.vscode/tasks.json!.vscode/launch.json!.vscode/extensions.json### Vim ###*.sw[a-p]### WebStorm/IntelliJ ###/.ideamodules.xml*.ipr*.iml### System Files ###*.DS_Store# Windows thumbnail cache filesThumbs.dbehthumbs.dbehthumbs_vista.db# Folder config fileDesktop.ini# Recycle Bin used on file shares$RECYCLE.BIN/# Thumbnails._*# Files that might appear in the root of a volume.DocumentRevisions-V100.fseventsd.Spotlight-V100.TemporaryItems.Trashes.VolumeIcon.icns.com.apple.timemachine.donotpresent


npm


npm представляет собой пакетный менеджер, позволяющий устанавливать зависимости проекта.

Официальный сайт: npmjs.com.

Установка.

npm устанавливается вместе с Node.js.

Также вместе с Node.js устанавливается npx, позволяющий запускать исполняемые файлы без установки: npx create-react-app my-app.

Проверка установки:

node --version | -vnpm --version | -v

Обновление:

npm i -g npm@latest

Список доступных команд:

npm helpnpm help [command-name]

Инициализация проекта:

npm init// autonpm init --yes | -y

Установка зависимостей

npm install | i// проверка конкретной зависимостиnpm explore [package-name]// проверка всех зависимостейnpm doctor// очисткаnpm ci

Принудительная переустановка зависимостей:

npm i --force | -f

Установка только продакшн-пакетов:

npm i --only=production | --only=prod

Добавление зависимости:

npm i [package-name]npm i [package-name@version]// примерnpm i express

Добавление зависимости для разработки:

npm i --save-dev | -D [package-name]// примерnpm i -D nodemon

Обновление зависимости:

npm update | up [package-name]

Удаление зависимости:

// dependencynpm remove | rm | r [package-name]// devDependencynpm r -D [package-name]

Глобальная установка/обновление/удаление пакета:

npm i/up/r -g [package-name]// примерnpm i -g create-react-app// использованиеcreate-react-app my-app

Определение устаревших пакетов:

npm outdatednpm outdated [package-name]

Список установленных зависимостей:

npm list | ls// top levelnpm ls --depth=0 | --depth 0// global + top levelnpm ls -g --depth 0

Информация о пакете:

npm view | v [package-name]// примерnpm v reactnpm v react.description

Запуск скрипта/выполнение команды:

npm run [script]// пример// package.json: "scripts": { "dev": "nodemon server.js" }npm run dev// script start или node server.jsnpm startnpm stop

Удаление дублирующихся пакетов:

npm dedupe | ddp

Удаление посторонних пакетов:

npm prune

Обнаружение уязвимостей (угроз безопасности):

npm audit// jsonnpm audit --json// plain textnpm audit --parseable

Автоматическое исправление уязвимостей:

npm audit fix

yarn


yarn, как и npm, представляет собой пакетный менеджер, позволяющий устанавливать зависимости проекта.

Официальный сайт: yarnpkg.com.

Установка:

npm i -g yarn

Команда yarn dlx позволяет запускать исполняемые файлы без установки: yarn dlx create-react-app my-app. Для этого yarn необходимо обновить до второй версии: yarn set version berry.

Проверка установки:

yarn --version | -v

Обновление:

yarn set version latest

Список доступных команд:

yarn helpyarn help [command-name]

Инициализация проекта:

yarn init// autoyarn init --yes | -y// "private": true в package.jsonyarn init --private | -p// auto + privateyarn init -yp

Установка зависимостей:

yarn// илиyarn install// тихая установкаyarn install --silent | -s// проверкаyarn --check-files

Принудительная переустановка зависимостей:

yarn install --force

Установка только продакшн-пакетов:

yarn install --production | --prod

Добавление зависимости:

yarn add [package-name]yarn add [package-name@version]// примерyarn add express// тихая установкаyarn add --silent// илиyarn add -s

Добавление зависимости для разработки:

yarn add --dev | -D [package-name]// примерyarn add -D nodemon

Обновление зависимости:

yarn upgrade [package-name]

Удаление зависимости:

yarn remove [package-name]

Глобальная установка/обновление/удаление пакета:

yarn global add/upgrade/remove [package-name]// примерyarn global add create-react-app// использованиеcreate-react-app my-app

Список установленных зависимостей:

yarn list// top levelyarn list --depth=0 | --depth 0

Информация о пакете:

yarn info [package-name]// илиyarn why [package-name]// примерyarn info reactyarn info react descriptionyarn why webpack

Запуск скрипта/выполнение команды:

yarn [script]// илиyarn run [script]// пример// package.json: "scripts": { "dev": "nodemon server.js" }yarn dev

package.json


{  "name": "my-app",  "version": "1.0.0",  "description": "my awesome app",  "keywords": [    "amazing",    "awesome",    "best"  ],  "private": true,  "main": "server.js",  "license": "MIT",  "homepage": "https://my-website.com",  "repository": {    "type": "git",    "url": "https://github.com/user/repo.git"  },  "repository": "github:user/repo",  "author": {    "name": "My Name",    "email": "myemail@example.com",    "url": "https://my-website.com"  },  "author": "My Name <myemail@example.com> (http://personeltest.ru/aways/my-website.com)",  "contributers": [    {      "name": "Friend Name",      "email": "friendemail@example.com",      "url": "https://friend-website.com"    }  ],  "contributors": "Friend Name <friendemail.com> (http://personeltest.ru/aways/friend-website.com)",  "dependencies": {    "express": "^4.17.1"  },  "devDependencies": {    "nodemon": "^2.0.4"  },  "scripts": {    "start": "react-scripts start",    "dev": "nodemon server.js"  }}

  • name название проекта
  • version версия проекта (см. версионирование)
  • description описание проекта (зачем нужен пакет?)
  • keywords ключевые слова (облегчает поиск в реестре npm)
  • private установка значения в true предотвращает случайную публикацию пакета в реестре npm
  • main основная точка входа для функционирования проекта
  • repository ссылка на репозиторий (один из вариантов)
  • author автор проекта (один из вариантов)
  • contributors участники проекта (люди, внесшие вклад в проект)
  • dependencies зависимости проекта (пакеты, без которых приложение не будет работать)
  • devDependencies зависимости для разработки (пакеты, без которых приложение будет работать)
  • scripts команды (выполняемые сценарии, задачи), предназначенные для автоматизации, например, команда yarn dev запустит скрипт nodemon server.js

Полный список доступных полей файла package.json: npm-package.json

Файлы package-lock.json и yarn.lock содержат более полную информацию об установленных пакетах, чем package.json, например, конкретные версии пакетов вместо диапазона допустимых версий.

Версионирование


Каждый пакет имеет версию, состоящую из трех цифр (например, 1.0.0), где первая цифра мажорная версия (major), вторая минорная версия (minor), третья патчевая версия (патч, patch). Новые версии называются релизами.

Увеличение каждой из этих цифр согласно правилам семантического версионирования (semver) означает следующее:

  • major внесение несовместимых с предыдущей версией изменений
  • minor новая функциональность, совместимая с предыдущей версией
  • patch исправление ошибок, незначительные улучшения

Диапазоны версий или допустимые релизы определяются с помощью следующих операторов (компараторов):

  • * любая версия (аналогично пустой строке)
  • <1.0.0 любая версия, которая меньше 1.0.0
  • <=1.0.0 любая версия, которая меньше или равна 1.0.0
  • >1.0.0 любая версия, которая больше 1.0.0
  • >=1.0.0 любая версия, которая больше или равна 1.0.0
  • =1.0.0 только версия 1.0.0 (оператор "=" можно опустить)
  • >=1.0.0 <2.0.0 больше или равно 1.0.0 и меньше 2.0.0
  • 1.0.0-2.0.0 набор версий включительно
  • ^1.0.0 минорные и патчевые релизы (>=1.0.0 <2.0.0)
  • ~.1.0.0 только патчевые релизы (>=1.0.0 <1.1.0)

Подробные сведения о semver: node-semver.

Благодарю за внимание.
Источник: habr.com
К списку статей
Опубликовано: 05.10.2020 14:22:06
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Javascript

Программирование

Разработка веб-сайтов

Разработка

Bash

Git

Npm

Yarn

Package.json

Semver

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru