From 80287870a32cf75e9d5f9cdffbf895e657349048 Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Sat, 20 Apr 2019 23:24:14 +0300 Subject: [PATCH] Text --- wiki/Latex/Висячие строки.md | 14 + wiki/Latex/Защита команд.md | 15 + wiki/Latex/Лигатуры.md | 14 + wiki/Latex/Многостраничные таблицы в LyX.md | 32 + wiki/Latex/Переносы.md | 11 + wiki/Latex/Русский в PDF.md | 19 + wiki/Linux/DPKG/APT.md | 12 + wiki/Linux/LXC/DNS в контейнере LXC.md | 17 + wiki/Linux/Runit/runit.md | 88 ++ wiki/Misc/Libgen.md | 30 + .../Prog/{Tools => Development}/PVS-Studio.md | 6 +- .../Подбор ключей компиляции GCC.md | 35 + wiki/Prog/Development/Профилирование кода.md | 55 + .../Построение профиля местности в QGis.md | 22 +- ...автоматическое сохранение в репозиторий.md | 17 +- ...it репозиторий на переносном устройстве.md | 6 +- .../Git/Git частичная копия репозитория.md | 8 +- .../Git/Gitlab выполнение по расписанию.md | 24 + .../Git/Установка и настройка GitLab в LXC.md | 3 +- .../CPP/Проверка именования в Clang Tidy.md | 1181 +++++++++++++++++ wiki/Prog/Links/Библиотеки C CPP.md | 28 + wiki/Prog/Time/Работа с датами и временем.md | 159 +++ wiki/Vim/Vimdiff.md | 21 + wiki/Vim/Замена выделенного блока.md | 24 + wiki/Vim/Клавиши Leader и LocalLeader.md | 48 + wiki/Vim/Клавиши PageUp и PageDown.md | 22 + wiki/Vim/Кодировка файла.md | 33 + wiki/Vim/Комментирование кода.md | 27 + wiki/Vim/Менеджер плагинов Plug.md | 44 + wiki/Vim/Навигация easymotion.md | 53 + wiki/Vim/Навигация по буферам.md | 17 + wiki/Vim/Нумерация строк.md | 35 + wiki/Vim/Проверка орфографии.md | 39 + wiki/Vim/Ссылки.md | 12 + wiki/Vim/Управление окнами.md | 22 + 35 files changed, 2167 insertions(+), 26 deletions(-) create mode 100644 wiki/Latex/Висячие строки.md create mode 100644 wiki/Latex/Защита команд.md create mode 100644 wiki/Latex/Лигатуры.md create mode 100644 wiki/Latex/Многостраничные таблицы в LyX.md create mode 100644 wiki/Latex/Переносы.md create mode 100644 wiki/Latex/Русский в PDF.md create mode 100644 wiki/Linux/DPKG/APT.md create mode 100644 wiki/Linux/LXC/DNS в контейнере LXC.md create mode 100644 wiki/Linux/Runit/runit.md create mode 100644 wiki/Misc/Libgen.md rename wiki/Prog/{Tools => Development}/PVS-Studio.md (95%) create mode 100644 wiki/Prog/Development/Подбор ключей компиляции GCC.md create mode 100644 wiki/Prog/Development/Профилирование кода.md create mode 100644 wiki/Prog/Git/Gitlab выполнение по расписанию.md create mode 100644 wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.md create mode 100644 wiki/Prog/Links/Библиотеки C CPP.md create mode 100644 wiki/Prog/Time/Работа с датами и временем.md create mode 100644 wiki/Vim/Vimdiff.md create mode 100644 wiki/Vim/Замена выделенного блока.md create mode 100644 wiki/Vim/Клавиши Leader и LocalLeader.md create mode 100644 wiki/Vim/Клавиши PageUp и PageDown.md create mode 100644 wiki/Vim/Кодировка файла.md create mode 100644 wiki/Vim/Комментирование кода.md create mode 100644 wiki/Vim/Менеджер плагинов Plug.md create mode 100644 wiki/Vim/Навигация easymotion.md create mode 100644 wiki/Vim/Навигация по буферам.md create mode 100644 wiki/Vim/Нумерация строк.md create mode 100644 wiki/Vim/Проверка орфографии.md create mode 100644 wiki/Vim/Ссылки.md create mode 100644 wiki/Vim/Управление окнами.md diff --git a/wiki/Latex/Висячие строки.md b/wiki/Latex/Висячие строки.md new file mode 100644 index 0000000..9c80061 --- /dev/null +++ b/wiki/Latex/Висячие строки.md @@ -0,0 +1,14 @@ +--- +title: "LaTeX: висячие строки" +category: LaTeX +tags: LaTeX, текст +summary: +... + +Пакет [`nowidow`](https://www.ctan.org/pkg/nowidow) используется для +изменения алгоритма размещения висячих строк. Пример: + +```latex +\usepackage[defaultlines=3,all]{nowidow} +``` + diff --git a/wiki/Latex/Защита команд.md b/wiki/Latex/Защита команд.md new file mode 100644 index 0000000..b8399e7 --- /dev/null +++ b/wiki/Latex/Защита команд.md @@ -0,0 +1,15 @@ +--- +title: "LaTeX: защита команд" +category: LaTeX +tags: LaTeX, текст +summary: +... + +Команда `\protect` используется для защиты инструкций внутри +хрупких команд. Например, для защиты команды переноса строки +внутри команды `section` нужно написать: + +```latex +\section{Первая строка\protect\\Вторая строка} +``` + diff --git a/wiki/Latex/Лигатуры.md b/wiki/Latex/Лигатуры.md new file mode 100644 index 0000000..50e266a --- /dev/null +++ b/wiki/Latex/Лигатуры.md @@ -0,0 +1,14 @@ +--- +title: "LaTeX: лигатуры" +category: LaTeX +tags: LaTeX, шрифты +summary: +... + +Команды для запрета использования лигатур: + +```latex +\usepackage{microtype} +\DisableLigatures[f]{encoding = *, family = *} +``` + diff --git a/wiki/Latex/Многостраничные таблицы в LyX.md b/wiki/Latex/Многостраничные таблицы в LyX.md new file mode 100644 index 0000000..bc32933 --- /dev/null +++ b/wiki/Latex/Многостраничные таблицы в LyX.md @@ -0,0 +1,32 @@ +--- +title: "LyX: многостраничные таблицы" +category: LaTeX +tags: LaTeX, текст, LyX, таблицы +summary: +... + +- Создать таблицу как минимум с четырьмя строками. +- Щелкнуть правой кнопкой мыши на таблице, выбрать во всплывающем +меню **Длинная таблица**. +- Щелкнуть правой кнопкой мыши на таблице, выбрать во всплывающем +меню **Настройки**. +- Установить курсор на первой строке таблицы, в окне настроек перейти +на вкладку **Длинная таблица**. +- Выбрать **Подпись** и **Первый заголовок**. +- Нажать **Применить**. +- Установить курсор на второй строке таблицы, в окне настроек перейти +на вкладку **Длинная таблица**. +- Выбрать **Подпись** и **Заголовок**. +- Нажать **Применить**. +- Установить курсор на третьей строке таблицы, в окне настроек перейти +на вкладку **Длинная таблица**. +- Выбрать **Заголовок** и **Первый заколовок**. +- Нажать **Применить**. +- Щелкнуть правой кнопкой мыши на второй строке таблицы, выбрать в меню +**Подпись (Ненумерованный)**. +- На первой строке таблицы установить метку и ввести текст подписи к +таблице на начальной странице. +- На второй строке таблицы сформировать текст подписи к таблице, +который будет использоваться на последующих страницах. +- На третьей строке нужно сформировать заголовок таблицы. + diff --git a/wiki/Latex/Переносы.md b/wiki/Latex/Переносы.md new file mode 100644 index 0000000..8f735de --- /dev/null +++ b/wiki/Latex/Переносы.md @@ -0,0 +1,11 @@ +--- +title: "LaTeX: переносы строк" +category: LaTeX +tags: LaTeX, текст +summary: +... + +Текст между командами `\sloppy` и `\fussy` или внутри блока +`\begin{sloppypar} ... \end{sloppypar}` будет переноситься +сразу при достижении края бокса. + diff --git a/wiki/Latex/Русский в PDF.md b/wiki/Latex/Русский в PDF.md new file mode 100644 index 0000000..af72ed9 --- /dev/null +++ b/wiki/Latex/Русский в PDF.md @@ -0,0 +1,19 @@ +--- +title: "LaTeX: русский язык в выходном PDF" +category: LaTeX +tags: LaTeX, текст, PDF +summary: +... + +Для поиска в файле PDF и копирования текста с правильной кодировкой +нужно использовать пакет [`cmap`](https://www.ctan.org/pkg/cmap). +Включать использование пакета нужно как можно раньше, чтобы правильно +формировалась служебная информация и титульные листы. + +```latex +\usepackage{cmap} +``` + +Полезная [информация](http://s.arboreus.com/2007/07/pdf-latex.html) +о выводе из $\LaTeX$ в PDF. + diff --git a/wiki/Linux/DPKG/APT.md b/wiki/Linux/DPKG/APT.md new file mode 100644 index 0000000..7929821 --- /dev/null +++ b/wiki/Linux/DPKG/APT.md @@ -0,0 +1,12 @@ +--- +title: "APT" +category: Linux +tags: linux, ubuntu, debian, apt +summary: "" +... + +Запрет загрузки переводов описаний пакетов: + +```sh +echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/99translations +``` diff --git a/wiki/Linux/LXC/DNS в контейнере LXC.md b/wiki/Linux/LXC/DNS в контейнере LXC.md new file mode 100644 index 0000000..d431e31 --- /dev/null +++ b/wiki/Linux/LXC/DNS в контейнере LXC.md @@ -0,0 +1,17 @@ +--- +title: "DNS в контейнере LXC" +category: Linux +tags: lxc, контейнеры, ubuntu, linux, dns +summary: +... + +В системе Ubuntu 18.04 работающей внутри контейнера LXC по умолчанию +не работает разрешение имён. Чтобы использовать DNS-сервер `8.8.8.8`, +нужно внутри контейнера выполнить команды: + +```sh +sed -i 's/#DNS=/DNS=8.8.8.8/' /etc/systemd/resolved.conf +systemctl restart systemd-resolved +rm /etc/resolv.conf +ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf +``` diff --git a/wiki/Linux/Runit/runit.md b/wiki/Linux/Runit/runit.md new file mode 100644 index 0000000..ea98047 --- /dev/null +++ b/wiki/Linux/Runit/runit.md @@ -0,0 +1,88 @@ +--- +title: runit +category: Linux +tags: Debian, Ubuntu, Linux, инициализация, runit +summary: Система инициализации со встроенными средствами контроля за процессами +... + +### Установка + +[runit](http://smarden.org/runit/) — это система инициализации со +встроенными средствами контроля за процессами. + +Установка в Ubuntu: + +```sh +sudo apt-get install runit runit-systemd +``` + +### Запуск сервисов от непривилегированного пользователя + +Чтобы разрешить непривилегированному пользователю `user` управлять +собственной конфигурацией для runit, нужно с правами суперпользователя +выполнить: + +```sh +mkdir -p /etc/service/run-user/supervise +cat > /etc/service/run-user/run << EOF +#!/bin/sh + +exec 2>&1 +exec chpst -u user runsvdir /home/user/sv +EOF +chmod +x /etc/service/run-user/run +``` + +В результате в каталоге `/home/user/sv` пользователь `user` сможет +создавать собственные правила управления сервисами. + +### Пример сервиса + +Для запуска сервера Redis пользователем `user` нужно создать файл +конфигурации `/home/user/redis/etc/redis.conf`: + +``` +daemonize no +port 5079 +tcp-backlog 128 +timeout 0 +tcp-keepalive 60 +loglevel warning +databases 1 +save 300 10 +dir /home/user/redis/var +dbfilename surok.rdb +client-output-buffer-limit normal 0 0 0 +client-output-buffer-limit slave 4mb 1mb 60 +client-output-buffer-limit pubsub 4mb 1mb 60 +maxclients 50 +``` + +Запускаемый сервер должен запускаться не в фоновом режиме, чтобы +runit мог контролировать его состояние. + +Скрипт `/home/user/sv/redis/run`, который `runit` использует для +запуска процесса: + +```sh +#!/bin/sh + +WORKDIR=/home/user/redis + +cd "${WORKDIR}" || exit 1 +exec 2>&1 +exec redis-server etc/redis.conf +``` + +Журналирование выполняется с помощью входящей в состав пакета +runit программы `svlogd`. Скрипт для его запуска должен находиться +в подкаталоге `log` (`/home/user/sv/redis/log/run`): + +```sh +#!/bin/sh -e + +LOGDIR=/home/user/redis/log + +mkdir -p "${LOGDIR}" +exec svlogd -tt "${LOGDIR}"" +``` diff --git a/wiki/Misc/Libgen.md b/wiki/Misc/Libgen.md new file mode 100644 index 0000000..2a25095 --- /dev/null +++ b/wiki/Misc/Libgen.md @@ -0,0 +1,30 @@ +--- +title: "Libgen: локальная база данных для Windows" +category: Windows +tags: windows, libgen, библиотеки, книги +summary: +... + +Программа [LibGen - Библиотекарь](http://libruslib.ucoz.com/index/libgen_bibliotekar/0-5) +позволяет просматривать локальную копию базы данных сервера [Libgen](http://libgen.io/). +Архив базы данных можно скачать [здесь](http://gen.lib.rus.ec/dbdumps/). +В архиве базы с именем вида `libgen_YYYY-MM-DD.rar` содержится полная информация +для полнотекстового поиска по описаниям книг, а в архиве с именем вида +`libgen-compact_YYYY-MM-DD.rar` описания удалены. + +Для обработки полного архива потребуется около 25 Гб свободного пространства. +Последовательность действий: + +1. [Скачать](https://yadi.sk/d/j_ToPE7D3SHGN6) и распаковать программу Libgen. +2. Скачать архив базы данных, распаковать его в каталог `upload` +и переименовать SQL-скрипт в `backup_ba.sql`. +3. [Скачать](https://yadi.sk/d/psnuXFJM3SHGR8) архив со скриптами для преобразования +базы данных и распаковать его в каталог `upload`. +4. Запустить программу `libgen.exe`. +5. Выбрать в меню **Databases | Update book database**. +6. Убрать галочки **Download from the Internet** и **Unpack** и поставить +**Prepare for import to the database**. +7. Нажать кнопку **Start**. +8. После завершения работы нажать кнопку **Done**. +9. Удалить из каталога `upload` файл `backup_ba1.sql`. + diff --git a/wiki/Prog/Tools/PVS-Studio.md b/wiki/Prog/Development/PVS-Studio.md similarity index 95% rename from wiki/Prog/Tools/PVS-Studio.md rename to wiki/Prog/Development/PVS-Studio.md index 88af7aa..d31fdce 100644 --- a/wiki/Prog/Tools/PVS-Studio.md +++ b/wiki/Prog/Development/PVS-Studio.md @@ -10,7 +10,7 @@ toc: yes ### Информация и лицензия -[PVS-Studio](https://www.viva64.com/ru/pvs-studio/) - это инструмент для +[PVS-Studio](https://www.viva64.com/ru/pvs-studio/) — это инструмент для статического анализа исходного кода программ, написанных на языках С, C++. Для использования в Linux нужно чтобы в каталоге `~/.config/PVS-Studio` @@ -23,7 +23,7 @@ toc: yes // PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com ``` -### Настройка и комплияция проекта +### Настройка и компиляция проекта Полное руководство для работы в Linux находится [здесь](https://www.viva64.com/ru/m/0036/), а ниже приведён список типовых команд. @@ -68,7 +68,7 @@ ninja -t compdb Выбор типов предупреждений осуществляется на основе побитовой маски из приведенных выше типов. Чтобы выполнить анализ, исключив проверки MISRA, -нужно выполнить: +нужно выполнить ```sh pvs-studio-analyzer analyze -a 29 -j$(nproc) -o pvs.log diff --git a/wiki/Prog/Development/Подбор ключей компиляции GCC.md b/wiki/Prog/Development/Подбор ключей компиляции GCC.md new file mode 100644 index 0000000..971f51c --- /dev/null +++ b/wiki/Prog/Development/Подбор ключей компиляции GCC.md @@ -0,0 +1,35 @@ +--- +title: Подбор ключей компиляции GCC +category: Программирование +tags: программирование, C, C++, отладка, оптимизация +summary: +... + +Подбор ключей компиляции основан на измерениях характеристик во +время выполнения программы. На первом этапе создаётся исполняемый +файл `program`, в который включается информация для профилировки. +Ключ `-fprofile-generate=data/pgo` указывает, что нужно собирать +информацию и сохранять в каталог `data/pgo`. Компиляцию следует +выполнять в последовательном режиме. + +```sh +env CXXFLAGS='-fprofile-generate=data/pgo' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" +make -j1 +``` + +После компиляцию программу следует выполнить, придерживаясь +типичного сценария использования. + +```sh +./program +``` + +Скомпилировать программу с использованием полученной статистики. +Для многопоточной программы следует указать флаг `-fprofile-correction`, +чтобы скорректировать данные, которые могут неустойчивыми из-за пропусков +обновлений счётчиков. Компиляцию следует выполнять в последовательном режиме. + +```sh +env CXXFLAGS='-fprofile-use=data/pgo -fprofile-correction' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" +make -j1 +``` diff --git a/wiki/Prog/Development/Профилирование кода.md b/wiki/Prog/Development/Профилирование кода.md new file mode 100644 index 0000000..4c477fd --- /dev/null +++ b/wiki/Prog/Development/Профилирование кода.md @@ -0,0 +1,55 @@ +--- +title: Профилирование кода +category: Программирование +tags: программирование, отладка, производительность, профилирование, gprof +summary: +... + +## Общее описание + +Чтобы профилировать приложения, компилируемые [GCC](http://gcc.gnu.org), +необходимо добавлять флаг `-fno-omit-frame-pointer` и желательно `-g`. + +## quickstack + +Утилита для отслеживания стеков вызовов функций [quicktrack](https://github.com/yoshinorim/quickstack). +Пример использования: + +```sh +quickstack -f -p $(pidof application) +``` + +## perf + +Утилита профилирования для ядра Linux (находится в дереве его исходных текстов +в каталоге `tools/perf`). + +Полезные ссылки: + +* [Официальная страница](https://perf.wiki.kernel.org/index.php/Main_Page) +* [Примеры](https://stackoverflow.com/questions/1777556/alternatives-to-gprof/10958510#10958510) +* [Примеры](http://www.brendangregg.com/perf.html) + + +## Systemtap + +[Установка и простые примеры использования SystemTap](https://eax.me/systemtap/) + + +## Valgrind + + +## gperftools + + +## Разное + +* [Профилирование кода на C/C++ в Linux и FreeBSD](https://eax.me/c-cpp-profiling/) +* [Примеры](http://gernotklingler.com/blog/gprof-valgrind-gperftools-evaluation-tools-application-level-cpu-profiling-linux/) + + +## Графическое отображение + +* [Flame Graphs](http://www.brendangregg.com/flamegraphs.html) +* [gprof2dot](https://github.com/jrfonseca/gprof2dot) + diff --git a/wiki/Prog/GIS/Построение профиля местности в QGis.md b/wiki/Prog/GIS/Построение профиля местности в QGis.md index 5fbb3ae..57c8ecc 100644 --- a/wiki/Prog/GIS/Построение профиля местности в QGis.md +++ b/wiki/Prog/GIS/Построение профиля местности в QGis.md @@ -6,7 +6,8 @@ summary: "" ... -1) В главном меню QGis **Слой** - **Добавить слой** - **Добавить векторный слой** выбрать и открыть файл с векторным слоем, например, `map.sxf`. +1) В главном меню QGis **Слой** — **Добавить слой** — **Добавить векторный слой** +выбрать и открыть файл с векторным слоем, например, `map.sxf`. 2) Среди слоёв выбрать слой с рельефом местности и типом геометрии `LineString`. @@ -19,26 +20,29 @@ summary: "" `"CLNAME" ILIKE '%ГОРИЗОНТАЛИ ОСНОВ%'` и нажить **OK**. 5) На панели **Панель слоёв** правой кнопкой мыши щелкнуть на слое, -содержащем данные о высотах, и выбрать **Сохранить как...**. Появишийся новый -слой **heights** следует удалить. +содержащем данные о высотах, и выбрать **Сохранить как...**. Появившийся +новый слой **heights** следует удалить. 6) В появившемся диалоговом окне выбрать имя выходного файла, например, `heights`. ![Имя выходного файла](files/qgis-heights2.png) -7) В каталоге `/home/a/work/map` выполнить команду, которая в файле `heights.shp` из слоя `heights` берёт данные о высотах из -поля `SC_4` и генерирует матрицу высот размером 2000 на 2000 в формате BMP. +7) В каталоге `/home/a/work/map` выполнить команду, которая в файле +`heights.shp` из слоя `heights` берёт данные о высотах из поля `SC_4` +и генерирует матрицу высот размером 2000 на 2000 в формате BMP. Настойки алгоритма посторения матрицы можно изменять с помощью параметра `-a`: ```sh gdal_grid -a invdist:power=3.0:smoothing=1.0 -outsize 2000 2000 -of BMP -ot Byte -zfield SC_4 -l heights heights.shp heights.bmp ``` -8) После построения матрицы её можно импортировать в QGis как растровый слой, для этого в главном меню QGis **Слой** - **Добавить слой** - **Добавить растровый слой** нужно выбрать и открыть файл `heights.bmp`. В результате на -панели **Панель слоёв** появится растровый слой **heights**. +8) После построения матрицы её можно импортировать в QGis как растровый +слой, для этого в главном меню QGis **Слой** — **Добавить слой** — +**Добавить растровый слой** нужно выбрать и открыть файл `heights.bmp`. +В результате на панели **Панель слоёв** появится растровый слой **heights**. -9) С помощью модуля Profile Tool можно построить провиль местности. В главном -меню нужно выбрать **Модуль** - **Profile Tool** - **Terrain profile**. +9) С помощью модуля Profile Tool можно построить профиль местности. В главном +меню нужно выбрать **Модуль** — **Profile Tool** — **Terrain profile**. 10) На панели **Панель слоёв** нужно перенести растровый слой **heights** в конец списка, выделить его и на панели **Profile Tool** нажать **Add Layer**. diff --git a/wiki/Prog/Git/Git автоматическое сохранение в репозиторий.md b/wiki/Prog/Git/Git автоматическое сохранение в репозиторий.md index 562bdb9..c284ea9 100644 --- a/wiki/Prog/Git/Git автоматическое сохранение в репозиторий.md +++ b/wiki/Prog/Git/Git автоматическое сохранение в репозиторий.md @@ -11,13 +11,18 @@ summary: "" Если нужно следить за каталогом `/home/user/dir` и записывать историю изменений в `/home/user/repo/dir`, то нужно инициализировать репозиторий: - git init --bare /home/user/repo/dir +```sh +git init --bare /home/user/repo/dir +``` -добавить шаблоны исключаемых файлов +добавить шаблоны исключаемых файлов: - printf '*.[oa]\n*.swp\n*~\n/.git' >> /home/user/repo/dir/info/exclude +```sh +printf '*.[oa]\n*.swp\n*~\n/.git' >> /home/user/repo/dir/info/exclude +``` -и запустить скрипт - - ./gitwatch.sh -g /home/user/repo/dir /home/user/dir +и запустить скрипт: +```sh +./gitwatch.sh -g /home/user/repo/dir /home/user/dir +``` diff --git a/wiki/Prog/Git/Git репозиторий на переносном устройстве.md b/wiki/Prog/Git/Git репозиторий на переносном устройстве.md index f529285..5e99139 100644 --- a/wiki/Prog/Git/Git репозиторий на переносном устройстве.md +++ b/wiki/Prog/Git/Git репозиторий на переносном устройстве.md @@ -5,7 +5,7 @@ tags: программирование, git summary: ... -Создание репозитория для нового проекта +Создание репозитория для нового проекта: ```sh ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git @@ -13,10 +13,10 @@ git --bare init /home/user/work/usbdisk/git/project.git cd /home/user/work/projects git clone /home/user/work/usbdisk/git/project.git cd project -git remote set-url origin file:///home/user/work/usbdisk/git/project.git/ +git remote set-url usb file:///home/user/work/usbdisk/git/project.git/ ``` -Добавление нового удалённого репозитория к существующему проекту +Добавление нового удалённого репозитория к существующему проекту: ```sh ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git diff --git a/wiki/Prog/Git/Git частичная копия репозитория.md b/wiki/Prog/Git/Git частичная копия репозитория.md index dfcf461..09ef6ca 100644 --- a/wiki/Prog/Git/Git частичная копия репозитория.md +++ b/wiki/Prog/Git/Git частичная копия репозитория.md @@ -10,8 +10,8 @@ summary: "" Допустим, по адресу `git://localhost/project.git` находится большой проект, в котором интересует только последнее состояние каталогов `src/driver` и `include/driver`. -Сначала нужно создать репозиторий и подготовить его для -получения только необходимых файлов: +Сначала нужно создать пустой репозиторий и подготовить его +для получения только необходимых файлов: ```sh git init project @@ -26,4 +26,6 @@ echo "include/driver/*" >> .git/info/sparse-checkout а, добавив ключ `--depth=1`, указать, что синхронизироваться должно только текущее состояние файлов без учёта истории. - git pull --depth=1 origin master +```sh +git pull --depth=1 origin master +``` diff --git a/wiki/Prog/Git/Gitlab выполнение по расписанию.md b/wiki/Prog/Git/Gitlab выполнение по расписанию.md new file mode 100644 index 0000000..bf9857e --- /dev/null +++ b/wiki/Prog/Git/Gitlab выполнение по расписанию.md @@ -0,0 +1,24 @@ +--- +title: "GitLab — выполнение по расписанию" +category: Программирование +tags: программирование, gitlab, git +summary: +... + +После помещения изменений (push) на сервер следует выполнять только задачи, +не требующие много ресурсов. Ресурсоёмкие задачи можно отложить на время +минимальной нагрузки сервера. Для этого нужно: + +* в секциях файла `.gitlab-ci.yml`, запускающих задачи с высокой нагрузкой, +добавить + +```yaml +only: + - schedules +``` + + подробнее это описано [здесь](https://docs.gitlab.com/ee/ci/yaml/#only-and-except-simplified) + +* в веб-интерфейсе в меню **CI/CD** / **Расписания** добавить **Новое расписание** +и назначить исполнение задачи на время, когда нагрузка на сервер минимальна. + diff --git a/wiki/Prog/Git/Установка и настройка GitLab в LXC.md b/wiki/Prog/Git/Установка и настройка GitLab в LXC.md index 584ff44..61d7d75 100644 --- a/wiki/Prog/Git/Установка и настройка GitLab в LXC.md +++ b/wiki/Prog/Git/Установка и настройка GitLab в LXC.md @@ -8,7 +8,7 @@ toc: yes [TOC] -Установка вылолняется в операционной системе Ubuntu Bionic. +Установка выполняется в операционной системе Ubuntu Bionic. ### LXC @@ -139,7 +139,6 @@ cat /etc/docker/daemon.json } - ### Ссылки * [GitLab Runner](https://docs.gitlab.com/runner/register/index.html) diff --git a/wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.md b/wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.md new file mode 100644 index 0000000..ce28bc9 --- /dev/null +++ b/wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.md @@ -0,0 +1,1181 @@ +--- +title: Проверка именования в Clang Tidy +category: Программирование +tags: C++, программирование, clang, clang-tidy +summary: +CSS: table-100.css +toc: yes +... + + +[TOC] + +Программа Clang Tidy проверяет стилистику регистра идентификаторов. +Возможные варианты стилей: + + lower_case + UPPER_CASE + camelBack + CamelCase + camel_Snake_Back + Camel_Snake_Case + aNy_CasE + +Также существует возможность проверки префиксов и суффиксов идентификаторов. + +Для включения проверки именования идентификаторов нужно в файле `.clang-tidy`, +находящемся в корне проекта, включить данный тип диагностики (опция +`clang-diagnostic-*,readability-identifier-naming`), а затем указать +список выполняемых проверок и их параметры в формате YAML, например: + +```yaml +--- +Checks: 'clang-diagnostic-*,readability-identifier-naming' +CheckOptions: + - key: readability-identifier-naming.VariableCase + value: lower_case + - key: readability-identifier-naming.VariablePrefix + value: '' + - key: readability-identifier-naming.VariableSuffix + value: '' +... +``` + +Перечень возможных параметров конфигурационного файла, их типовые значения +и примеры соответствующего кода приведены ниже. + + + + +## Синтаксис + + +### AbstractClass (Абстрактный класс) + +Параметр | Значение +-------------------------------|---------------- +AbstractClassCase | `CamelCase` +AbstractClassPrefix | `''` +AbstractClassSuffix | `''` + +Пример кода до форматирования: + +```cpp +class ABSTRACT_CLASS { +public: + ABSTRACT_CLASS(); +}; +``` + +Пример кода после форматирования: + +```cpp +class AbstractClass { +public: + AbstractClass(); +}; +``` + +### Class (Класс) + +Параметр | Значение +-------------------------------|---------------- +ClassCase | `CamelCase` +ClassPrefix | `''` +ClassSuffix | `''` + +Пример кода до форматирования: + +```cpp +class TEST_CLASS { +public: + TEST_CLASS(); + ~TEST_CLASS(); +}; +``` + +Пример кода после форматирования: + +```cpp +class TestClass { +public: + TestClass(); + ~TestClass(); +}; +``` + +### Struct (Структура) + +Параметр | Значение +-------------------------------|---------------- +StructCase | `CamelCase` +StructPrefix | `''` +StructSuffix | `''` + +Пример кода до форматирования: + +```cpp +struct TEST_struct { + int a; +}; + +``` + +Пример кода после форматирования: + +```cpp +struct TestStruct { + int a; +}; +``` + +### Union (Объединение) + +Параметр | Значение +-------------------------------|---------------- +UnionCase | `CamelCase` +UnionPrefix | `''` +UnionSuffix | `''` + +Пример кода до форматирования: + +```cpp +union TEST_union { + int a; + char b; +}; +``` + +Пример кода после форматирования: + +```cpp +union TestUnion { + int a; + char b; +}; +``` + +### Enum (Перечисление) + +Параметр | Значение +-------------------------------|---------------- +EnumCase | `CamelCase` +EnumPrefix | `''` +EnumSuffix | `''` + +Пример кода до форматирования: + +```cpp +enum TEST_enum { One, Two }; +``` + +Пример кода после форматирования: + +```cpp +enum TestEnum { One, Two }; +``` + + +### EnumConstant (Значение в перечислении) + +Параметр | Значение +-------------------------------|---------------- +EnumConstantCase | `CamelCase` +EnumConstantPrefix | `''` +EnumConstantSuffix | `''` + +Пример кода до форматирования: + +```cpp +enum TestEnum { one, two }; +``` + +Пример кода после форматирования: + +```cpp +enum TestEnum { One, Two }; +``` + + +### Namespace (Пространство имён) + +Параметр | Значение +-------------------------------|---------------- +NamespaceCase | `lower_case` +NamespacePrefix | `''` +NamespaceSuffix | `''` + +Пример кода до форматирования: + +```cpp +namespace TEST_ns { +... +} +``` + +Пример кода после форматирования: + +```cpp +namespace test_ns { +... +} +``` + + +### InlineNamespace (Вложенное пространство имён) + +Параметр | Значение +-------------------------------|---------------- +InlineNamespaceCase | `lower_case` +InlineNamespacePrefix | `''` +InlineNamespaceSuffix | `''` + +Пример кода до форматирования: + +```cpp +namespace test_ns { +inline namespace InlineNamespace { +... +} +} // namespace test_ns +``` + +Пример кода после форматирования: + +```cpp +namespace test_ns { +inline namespace inline_namespace { +... +} +} // namespace test_ns +``` + + +### TypeAlias (Псевдоним типа) + +Параметр | Значение +-------------------------------|---------------- +TypeAliasCase | `lower_case` +TypeAliasPrefix | `''` +TypeAliasSuffix | `''` + +Пример кода до форматирования: + +```cpp +using MY_STRUCT_TYPE = MyStructure; +``` + +Пример кода после форматирования: + +```cpp +using my_struct_type = MyStructure; +``` + +### Typedef (Объявление типа) + +Параметр | Значение +-------------------------------|---------------- +TypedefCase | `lower_case` +TypedefPrefix | `''` +TypedefSuffix | `''` + +Пример кода до форматирования: + +```cpp +typedef int MY_INT; +``` + +Пример кода после форматирования: + +```cpp +typedef int my_int; +``` + + +## Переменные + + +### Variable (Переменная) + +Параметр | Значение +-------------------------------|---------------- +VariableCase | `lower_case` +VariablePrefix | `''` +VariableSuffix | `''` + +Пример кода до форматирования: + +```cpp +unsigned TestVariable; +``` + +Пример кода после форматирования: + +```cpp +unsigned testvariable; +``` + + +### GlobalVariable (Глобальная переменная) + +Параметр | Значение +-------------------------------|---------------- +VariableCase | `lower_case` +VariablePrefix | `''` +VariableSuffix | `''` + +Пример кода до форматирования: + +```cpp +unsigned GlobalVariable; +``` + +Пример кода после форматирования: + +```cpp +unsigned globalvariable; +``` + + +### LocalVariable (Локальная переменная) + +Параметр | Значение +-------------------------------|---------------- +LocalVariableCase | `lower_case` +LocalVariablePrefix | `''` +LocalVariableSuffix | `''` + +Пример кода до форматирования: + +```cpp +unsigned Local_Variable; +``` + +Пример кода после форматирования: + +```cpp +unsigned local_variable; +``` + +### StaticVariable (Статическая переменная) + +Параметр | Значение +-------------------------------|---------------- +StaticVariableCase | `lower_case` +StatcVariablePrefix | `''` +StatucVariableSuffix | `''` + +Пример кода до форматирования: + +```cpp +unsigned staticVariable; +``` + +Пример кода после форматирования: + +```cpp +unsigned staticvariable; +``` + + +### ConstexptVariable (Переменная constexpr) + + +### GlobalPointer (Глобальный указатель) + + +### LocalPointer(Локальный указатель) + + +### Member (Член) + + +### ClassMember (Член класса) + + +### PrivateMember (Приватная переменная) + + +### ProtectedMember (Защищённая переменная) + + +### PublicMember (Публичная переменная) + + +## Константы + +### Constant (Константа) + + +### GlobalConstant (Глобальная константа) + + +### LocalConstant (Локальная константа) + + +### StaticConstant (Статическая контстанта) + + +### ClassConstant (Константа класса) + + +### GlobalConstantPointer (Глобальный константный указатель) + + +### LocalConstantPointer (Локальный константный указатель) + + +### ConstMember (Константный член) + + +## Функции + + +### Function (Функция) + + +### GlobalFunction (Глобальная функция) + + +### ConstexptFunction (Функция constexpr) + + +### Method (Метод) + + +### ClassMethod (Метод класса) + + +### ConstexprMethod (Метод constexpr) + + +### VirtualMethod (Виртуальный метод) + + +### PrivateMethod (Приватный метод) + + +### ProtectedMethod (Защищённый метод) + + +### PublicMethod (Публичный метод) + + + +## Параметры + + +### Параметр + +### Константный параметр + +### Константный указатель на параметр + +### Список парамтров + +### Параметр-укзатель + +### Параметр шаблона + +### Параметр шаблона шаблона + +### Типа параметра шаблона + +### Значение параметра шаблона + + + + + ConstantParameterCase, ConstantParameterPrefix, ConstantParameterSuffix + ConstantPointerParameterCase, ConstantPointerParameterPrefix, ConstantPointerParameterSuffix + ParameterCase, ParameterPrefix, ParameterSuffix + ParameterPackCase, ParameterPackPrefix, ParameterPackSuffix + PointerParameterCase, PointerParameterPrefix, PointerParameterSuffix + TemplateParameterCase, TemplateParameterPrefix, TemplateParameterSuffix + TemplateTemplateParameterCase, TemplateTemplateParameterPrefix, TemplateTemplateParameterSuffix + TypeTemplateParameterCase, TypeTemplateParameterPrefix, TypeTemplateParameterSuffix + ValueTemplateParameterCase, ValueTemplateParameterPrefix, ValueTemplateParameterSuffix + + + + +Лексическая единица Регистр имени абстрактного класса +Параметр readability-identifier-naming.AbstractClassCase +Значение CamelCase +Пример `ATestClass` +Пример кода: +```cpp +class ATestClass { +}; +``` + +Лексическая единица: Префикс имени абстрактного класса +Параметр: readability-identifier-naming.AbstractClassPrefix +Значение: 'A' +Пример: `ATestClass` +Пример кода: +```cpp +class ATestClass { +}; +``` + +Лексическая единица: Регистр имени класса +Параметр: readability-identifier-naming.ClassCase +Значение: CamelCase +Пример: `EasyTest` +Пример кода: +```cpp +class EasyTest { +}; +``` + +Лексическая единица: Префикс имени класса +Параметр: readability-identifier-naming.ClassPrefix +Значение: '' (было 'C') +Пример: `EasyTest` +Пример кода: +```cpp +class EasyTest { +}; +``` + +Лексическая единица: Регистр имена константы класса +Параметр: readability-identifier-naming.ClassConstantCase +Значение: CamelCase +Пример: `FixedValue` +Пример кода: +```cpp +class EasyTest { + const int FixedValue = 1; +}; +``` + +Лексическая единица: Префикс имени константы класса +Параметр: readability-identifier-naming.ClassConstantPrefix +Значение: '' (было 'k') +Пример: `FixedValue` +Пример кода: +```cpp +class EasyTest { + static const int FixedValue = 1; +}; +``` + +????? +Лексическая единица: Регистр имени члена класса +Параметр: readability-identifier-naming.ClassMemberCase +Значение: CamelCase +Пример: +Пример кода: +```cpp +????? +``` + +Лексическая единица: Регистр имени метода класса +Параметр: readability-identifier-naming.ClassMethodCase +Значение: camelBack +Пример: `getValue` +Пример кода: +```cpp +class EasyTest { +public: + int getValue(); +}; +``` + +Лексическая единица: Регистр имени константы +Параметр: readability-identifier-naming.ConstantCase +Значение: UPPER_CASE +Пример: `BLACK_COLOR` +Пример кода: +```cpp +const unsigned BLACK_COLOR = 0; +``` + +????? +Лексическая единица: Суффикс имени константы +Параметр: readability-identifier-naming.ConstantSuffix +Значение: '' (было '\_CST') +Пример: +Пример кода: +```cpp +????? +``` + +Лексическая единица: Регистр имени функции, возвращающей константное значение +Параметр: readability-identifier-naming.ConstexprFunctionCase +Значение: lower_case +Пример: `get_five` +Пример кода: +```cpp +constexpr int get_five() { + return ( 2 + 3 ); +}; +``` + +Лексическая единица: Регистт имени метода, возвращающего константное значение +Параметр: readability-identifier-naming.ConstexprMethodCase +Значение: lower_case +Пример: `get_five` +Пример кода: +```cpp +class EasyTest { + constexpr int get_five() { + return ( 2 + 3 ); + }; +}; +``` + +Лексическая единица: Регистр имени константной переменной, получающей значение из функции +Параметр: readability-identifier-naming.ConstexprVariableCase +Значение: lower_case +Пример: `const_five` +Пример кода: +```cpp +constexpr int get_five() { + return ( 2 + 3 ); +}; +constexpr int const_five = get_five(); +``` + +Лексическая единица: Регистр имени перечисления +Параметр: readability-identifier-naming.EnumCase +Значение: CamelCase +Пример: `CurrentState` +Пример кода: +```cpp +enum CurrentState { + OK = 0, + ERROR = 1 +}; +``` + +Лексическая единица: Префикс имени перечисления +Параметр: readability-identifier-naming.EnumPrefix +Значение: '' (было 'E') +Пример: +Пример кода: +```cpp +enum CurrentState { + OK = 0, + ERROR = 1 +}; +``` + +Лексическая единица: Регистр имени константы в перечислении +Параметр: readability-identifier-naming.EnumConstantCase +Значение: UPPER_CASE +Пример: `OK` +Пример кода: +```cpp +enum CurrentState { + OK = 0, + ERROR = 1 +}; +``` + +Лексическая единица: Регистр имени статической функции +Параметр: readability-identifier-naming.FunctionCase +Значение: camelBack +Пример: `staticFunction` +Пример кода: +```cpp +static void staticFunction(); +``` + +Лексическая единица: Регистр имени глобальной константы +Параметр: readability-identifier-naming.GlobalConstantCase +Значение: UPPER_CASE +Пример: `BLACK_COLOR` +Пример кода: +```cpp +const int BLACK_COLOR = 0; +``` + +Лексическая единица: Регистр имени глобальной функции +Параметр: readability-identifier-naming.GlobalFunctionCase +Значение: CamelCase +Пример: `GlobalFunction` +Пример кода: +```cpp +void GlobalFunction(); +``` + +Лексическая единица: Регистр имени глобальной переменной +Параметр: readability-identifier-naming.GlobalVariableCase +Значение: lower_case +Пример: `g_useful_variable` +Пример кода: +```cpp +int g_useful_variable = 0; +``` + +Лексическая единица: Префикс имени глобальной переменной +Параметр: readability-identifier-naming.GlobalVariablePrefix +Значение: 'g\_' +Пример: `g_useful_variable` +Пример кода: +```cpp +int g_useful_variable = 0; +``` + +???? +Лексическая единица: +Параметр: readability-identifier-naming.InlineNamespaceCase +Значение: lower_case +Пример: +Пример кода: +```cpp +????? +``` + +Лексическая единица: Регистр имени локальной константы +Параметр: readability-identifier-naming.LocalConstantCase +Значение: CamelCase +Пример: `BlackColor` +Пример кода: +```cpp +void GlobalFunc() { + const int BlackColor = 0; +} +``` + +Лексическая единица: Префикс имени локальной константы +Параметр: readability-identifier-naming.LocalConstantPrefix +Значение: '' (было 'k') +Пример: `BlackColor` +Пример кода: +```cpp +void GlobalFunc() { + const int BlackColor = 0; +} +``` + +Лексическая единица: Регистр имени локальной переменной +Параметр: readability-identifier-naming.LocalVariableCase +Значение: lower_case +Пример: `black_color` +Пример кода: +```cpp +void GlobalFunc() { + int black_color = 0; +} +``` + +????? +Лексическая единица: +Параметр: readability-identifier-naming.MemberCase +Значение: CamelCase +Пример: +Пример кода: +```cpp +???? +``` + +????? +Лексическая единица: +Параметр: readability-identifier-naming.MemberPrefix +Значение: 'm\_' +Пример: +Пример кода: +```cpp +???? +``` + +Лексическая единица: Регистр имени константного члена класса +Параметр: readability-identifier-naming.ConstantMemberCase +Значение: lower_case +Пример: `black_color` +Пример кода: +```cpp +class TestClass { +public: + const int black_color = 0; +}; +``` + +Лексическая единица: Префикс имени приватного члена класса +Параметр: readability-identifier-naming.PrivateMemberPrefix +Значение: '\_\_' +Пример: `__black_color` +Пример кода: +```cpp +class TestClass { +private: + int __black_color = 0; +}; +``` + +Лексическая единица: Префикс имени защищённого члена класса +Параметр: readability-identifier-naming.ProtectedMemberPrefix +Значение: '\_' +Пример: `_black_color` +Пример кода: +```cpp +class TestClass { +protected: + int _black_color = 0; +}; +``` + +Лексическая единица: Префикс имени публичного члена класса +Параметр: readability-identifier-naming.PublicMemberCase +Значение: lower_case +Пример: `black_color` +Пример кода: +```cpp +class TestClass { +public: + int black_color = 0; +}; +``` + +Лексическая единица: Регистр имени публичного метода +Параметр: readability-identifier-naming.MethodCase +Значение: camelBack +Пример: `testMethod` +Пример кода: +```cpp +class TestClass { +public: + void testMethod(); +}; +``` + +Лексическая единица: Регистр имени приватного метода +Параметр: readability-identifier-naming.PrivateMethodPrefix +Значение: '\_\_' +Пример: `__testMethod` +Пример кода: +```cpp +class TestClass { +private: + void __testMethod(); +}; +``` + +Лексическая единица: Регистр имени защищённого метода +Параметр: readability-identifier-naming.ProtectedMethodPrefix +Значение: '\_' +Пример: `_testMethod` +Пример кода: +```cpp +class TestClass { +protected: + void _testMethod(); +}; +``` + +Лексическая единица: Регистр имени пространства имён +Параметр: readability-identifier-naming.NamespaceCase +Значение: lower_case +Пример: `upper_ns` +Пример кода: +```cpp +namespace upper_ns { +} +``` + +Лексическая единица: Регистр имени параметра +Параметр: readability-identifier-naming.ParameterCase +Значение: camelBack +Пример: `inputValue` +Пример кода: +```cpp +void GlobalFunction(int inputValue) { +} +``` + +Лексическая единица: Префикс имени параметра +Параметр: readability-identifier-naming.ParameterPrefix +Значение: '' (было 'a\_') +Пример: `inputValue` +Пример кода: +```cpp +void GlobalFunction(int inputValue) { +} +``` + +Лексическая единица: Регистр имени констатного параметра +Параметр: readability-identifier-naming.ConstantParameterCase +Значение: camelBack +Пример: `inputValue` +Пример кода: +```cpp +void GlobalFunction(const int inputValue) { +} +``` + +Лексическая единица: Префикс имени константного параметра +Параметр: readability-identifier-naming.ConstantParameterPrefix +Значение: '' (было 'i\_') +Пример: +Пример кода: +```cpp +void GlobalFunction(const int inputValue) { +} +``` + +????? +Лексическая единица: +Параметр: readability-identifier-naming.ParameterPackCase +Значение: camelBack +Пример: +Пример кода: +```cpp +???? +``` + +????? +Лексическая единица: +Параметр: readability-identifier-naming.PureFunctionCase +Значение: lower_case +Пример: +Пример кода: +```cpp +????? +``` + +????? +Лексическая единица: +Параметр: readability-identifier-naming.PureMethodCase +Значение: camelBack +Пример: +Пример кода: +```cpp +????? +``` + +????? +Лексическая единица: Регистр имени статической константы +Параметр: readability-identifier-naming.StaticConstantCase +Значение: UPPER_CASE +Пример: `BLACK_COLOR` +Пример кода: +```cpp +void GlobalFunction() { + static const int BLACK_COLOR = 0; +} +``` + +Лексическая единица: Регистр имени статической переменной +Параметр: readability-identifier-naming.StaticVariableCase +Значение: camelBack +Пример: `blackColor` +Пример кода: +```cpp +void GlobalFunction() { + static int blackColor = 0; +} +``` + +Лексическая единица: Префикс имени статической переменной +Параметр: readability-identifier-naming.StaticVariablePrefix +Значение: '' (было 's\_') +Пример: `blackColor` +Пример кода: +```cpp +void GlobalFunction() { + static int blackColor = 0; +} +``` + +Лексическая единица: Регист имени структуры +Параметр: readability-identifier-naming.StructCase +Значение: lower_case +Пример: `pair_struct` +Пример кода: +```cpp +struct pair_struct { + int key; + char value; +}; +``` + +Лексическая единица: +Параметр: readability-identifier-naming.TemplateParameterCase +Значение: UPPER_CASE +Пример: +Пример кода: +```cpp +// +``` + +Лексическая единица: +Параметр: readability-identifier-naming.TemplateTemplateParameterCase +Значение: CamelCase +Пример: +Пример кода: +```cpp +// +``` + +Лексическая единица: +Параметр: readability-identifier-naming.TemplateUsingCase +Значение: lower_case +Пример: +Пример кода: +```cpp +// +``` + +Лексическая единица: +Параметр: readability-identifier-naming.TemplateUsingPrefix +Значение: 'u\_' +Пример: +Пример кода: +```cpp +// +``` + +Лексическая единица: Регистр имени шаблонного типа +Параметр: readability-identifier-naming.TypeTemplateParameterCase +Значение: СamelCase +Пример: +Пример кода: +```cpp +template class TestClass { + T1 __v; +}; +``` + +Лексическая единица: Суффикс имени шаблонного типа +Параметр: readability-identifier-naming.TypeTemplateParameterSuffix +Значение: '' (было '\_t') +Пример: +Пример кода: +```cpp +template class TestClass { + T1 __v; +}; +``` + +Лексическая единица: Регистр имени нового типа +Параметр: readability-identifier-naming.TypedefCase +Значение: lower_case +Пример: `i32_t` +Пример кода: +```cpp +typedef int32_t i32_t; +``` + +Лексическая единица: Суффикс имени нового типа +Параметр: readability-identifier-naming.TypedefSuffix +Значение: '\_t' +Пример: `i32_t` +Пример кода: +```cpp +typedef int32_t i32_t; +``` + +Лексическая единица: Регистр имени объединения +Параметр: readability-identifier-naming.UnionCase +Значение: CamelCase +Пример: `IntValue` +Пример кода: +```cpp +union IntValue { + int a; + unsigned b; +}; +``` + +Лексическая единица: Префикс имени объединения +Параметр: readability-identifier-naming.UnionPrefix +Значение: '' (было 'U') +Пример: `InvValue` +Пример кода: +```cpp +union IntValue { + int a; + unsigned b; +}; +``` + +Лексическая единица: +Параметр: readability-identifier-naming.UsingCase +Значение: lower_case +Пример: +Пример кода: +```cpp +// +``` + +Лексическая единица: +Параметр: readability-identifier-naming.ValueTemplateParameterCase +Значение: camelBack +Пример: +Пример кода: +```cpp +// +``` + +Лексическая единица: +Параметр: readability-identifier-naming.VariableCase +Значение: lower_case +Пример: +Пример кода: +```cpp +// +``` + +Лексическая единица: +Параметр: readability-identifier-naming.VirtualMethodCase +Значение: UPPER_CASE +Пример: +Пример кода: +```cpp +// +``` + +Лексическая единица: +Параметр: readability-identifier-naming.IgnoreFailedSplit +Значение: 0 +Пример: +Пример кода: +```cpp +// +``` + +Лексическая единица: Префикс виртуального метода +Параметр: readability-identifier-naming.VirtualMethodPrefix +Значение: 'v\_' +Пример: `v_Test` +Пример кода: +```cpp +class TestClass { +public: + virtual void v_Test() = 0; +}; +``` + + + +Лексическая единица: +Параметр: +Значение: +Пример: +Пример кода: +```cpp +// +``` + + + +Параметр | Значение +-------------------------------|---------------- +Case | `` +Prefix | `''` +Suffix | `''` + +Пример кода до форматирования: + +```cpp +// +``` + +Пример кода после форматирования: + +```cpp +// +``` diff --git a/wiki/Prog/Links/Библиотеки C CPP.md b/wiki/Prog/Links/Библиотеки C CPP.md new file mode 100644 index 0000000..11a3f04 --- /dev/null +++ b/wiki/Prog/Links/Библиотеки C CPP.md @@ -0,0 +1,28 @@ +--- +title: "Библиотеки для C, C++" +category: Программирование +tags: программирование, C, C++, Qt +summary: +toc: yes +... + +[TOC] + +### C + +* [nanomsg](http://nanomsg.org): сетевое взаимодействие +* [noping](https://noping.cc): работа с ICMP-пакетами +* [openblas](https://github.com/xianyi/OpenBLAS): оптимизированная версия +[BLAS](https://ru.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) + +### C++ + +* [JSON](https://github.com/nlohmann/json) +* [fmtlib](https://github.com/fmtlib/fmt): форматирование строк +* [spdlog](https://github.com/gabime/spdlog): журналирование +* [cpptoml](https://github.com/skystrife/cpptoml): чтение [TOML](https://github.com/toml-lang/toml) + + +### Qt + +* [Обработка сигналов UNIX](https://github.com/sjinks/qt_signalwatcher) diff --git a/wiki/Prog/Time/Работа с датами и временем.md b/wiki/Prog/Time/Работа с датами и временем.md new file mode 100644 index 0000000..c984994 --- /dev/null +++ b/wiki/Prog/Time/Работа с датами и временем.md @@ -0,0 +1,159 @@ +--- +title: Работа с датами и временем +category: Программирование +tags: программирование, время, часы, дата +summary: +toc: yes +toc-depth: 4 +... + +[TOC] + +### Временные шкалы + +В идеале системы учёта времени должны обладать тремя характеристиками: + +1. _точность_ (время базируется на атомном стандарте, каждая секунда +отсчитывается как секунда в системе СИ, нет високосных секунд, переводов +на зимнее или летнее время и т.п.); +2. _простота_ (каждый "день" состоит из 86400 "секунд"); +3. _календарные дни_ (дни календаря точно соответствуют вращению Земли). + +На практике есть возможность выбрать шкалу только с двумя характеристиками +из трёх. + +1. точность и календарные дни. Примером такой шкалы является UTC, +в которой отсчёт дней и секунд ведётся разными методами (секунды +исчисляются по атомному стандарту, а дни по суточному вращению Земли), +а соответствие достигается вводом _секунды координации_; + +2. календарные дни и простота. Примером такой шкалы является POSIX +(IEEE Std 1003.1-1988), в которой день всегда равен 86400 секундам; + +3. точность и простота. Этими характеристиками обладают технические +шкалы (атомные часы, GPS), в которых не важен учёт дней. + + +### Классы времени + +Время можно условно поделить на два класса: физическое и гражданское. + +1. _Физическое_ время представляет собой точки на непрерывной шкале, такую +концепцию достаточно точно отражает UTC, если можно пренебречь _секундой +координации_ (дополнительная секунда, добавляемая к UTC 30 июня или 31 декабря +для согласования со средним солнечным временем UT1. В этот момент время +условно обозначается как 23:59:60, а на шкале UTC две секунды отображаются +как одна). + +2. _Гражданское_ время представляется полями (год, месяц, число, час, минута, +секунда, доли секунды, а также временная зона и календарь, который по умолчанию +считается Григорианским). + +Почти всегда существует возможность однозначно перевести физическое время +в гражданское и наоборот, но при этом следует различать их свойства и +применение (ближайшая аналогия — массивы байтов и символьные строки). + +Основная проблема состоит в том, что в обычном употреблении не всегда можно +сделать вывод о том, какой класс времени подразумевается, и гражданское +время меняется на основании юридических актов (указов, постановлений и т.п.), +что приводит к неоднозначности при планировании событий. + +### Обработка на компьютере + +#### Хранение и отображение + +Для ссылки на момент во времени необходимо использовать единую шкалу, +на которой нет разрывов, связанных с летним временем. Примером стандарта +времени с такой шкалой является UTC. Локальное или местное время для таких +целей не подходит, так как на его шкале имеются разрывы и неоднозначности, +связанные с переходами на летнее время и обратно. + +Если нужно сохранить значение локального времени, то необходимо сохранить +также смещение относительно UTC, чтобы временную отметку можно было +интерпретировать однозначно. Необходимо помнить, что местное время может +отличаться от UTC на интервал не кратный часу (например, в Нидерландах +с 1909-05-01 по 1937-06-30 смещение времени от UTC составляло +19 минут и 32.13 секунд). + +Правила хранения и отображения времени: + +1. Время всегда хранится в UTC. При необходимости дополнительно сохраняется +информация о временной зоне (смещение и/или название). + +2. Для вывода на экран время переводится в местное. + +3. При выводе на экран отличного от местного времени необходимо указывать +название часового пояса или типа исчисления (например, Юлианский календарь). + + +#### Системное время для администратора + +Системный администратор должен следить за тем, чтобы файлы базы данных +описания временных зон **tzdata** имели одну версию в рамках комплекса +и обновлялись регулярно, чтобы минимизировать расхождения с внешними +системами. Особенно это важно делать при издании новых правил учёта +зимнего или летнего времени. + +На серверах аппаратные часы всегда должны использовать UTC. Операционные +системы тоже должны использовать UTC, чтобы при возникновении проблем +в файлах журналов было указано время в едином формате. + +В рамках комплекса следует использовать синхронизацию времени, даже +если нет доверенного источника более высокого уровня. + + +#### Клиентские приложения + +В общем случае нельзя доверять временным отметкам внешних клиентов, +так как невозможно гарантировать их корректность. Программа должна +самостоятельно ставить временные отметки для происходящих событий. +Исключением являются программные комплексы, в которых предусмотрено +наличие доверенных приложений, ответственных за установку временных отметок. + + +#### Postgresql + +Сервер базы данных должен использовать только временную зону UTC. Для этого +в файле настройки сервера `postgresql.conf` должна быть строка + +``` +timezone = 'UTC' +``` + +При создании таблиц необходимо использовать типы данных `timestamp without time zone` +и `time without time zone`. Если данные о времени должны содержать информацию +о временной зоне или смещении относительно UTC, то нужно создать дополнительные +столбцы, информацию из которых должно обрабатывать клиентское приложение. +Например, временные отметки можно хранить в таком виде + +```sql +CREATE TABLE time_stamps ( + time_stamp time without time zone, -- временная отметка + time_zone character(12), -- текстовое название временной зоны + shift integer -- смещение локального времени относительно UTC в секундах +); +``` + +Смещение следует записывать в четырёхбайтное знаковое целое, так как оно +может быть как положительным, так и отрицательным, а его максимальное +значение может составлять 14 * 60 * 60 = 50400 секунд. Несмотря на приведённый +выше пример с временной зоной Нидерландов, микросекундами можно пренебречь, +так как современные временные зоны имеют смещения кратные минутам, а точность +до микросекунд в далёком прошлом обычно не требуется. + +Чтобы клиентская программа могла получить выборку, привязанную к некоторой +временной зоне можно использовать оператор `AT TIME ZONE`, например + +```sql +SELECT TIMESTAMP '2001-02-16 20:38:40Z' AT TIME ZONE 'MSK'; +``` + +В результате время будет преобразовано из временной зоны UTC в MSK. +Модификатор `Z` в записи времени указывает на принадлежность зоне UTC. + + +#### Qt + +Класс `QTimeZone` предназначен для получения информации о временной зоне +и перевода времени из одной временной зоны в другую. + diff --git a/wiki/Vim/Vimdiff.md b/wiki/Vim/Vimdiff.md new file mode 100644 index 0000000..2f96343 --- /dev/null +++ b/wiki/Vim/Vimdiff.md @@ -0,0 +1,21 @@ +--- +title: Vimdiff +category: Vim +tags: Vim, команды Vim +summary: +CSS: table-100.css +... + +Команды режима `diff` для сравнения и слияния файлов: + +Команда | Назначение +-------------|------------ +`do` | Получить изменения из второго окна в текущее окно +`dp` | Вставить изменения из текущего окна во второе окно +`]c` | Перейти к следующему отличию +`[c` | Перейти к предыдущему отличию +`C-W` `C-W` | Переход между окнами + +[Видеоурок](http://vimcasts.org/episodes/fugitive-vim-resolving-merge-conflicts-with-vimdiff/) +по трехпутевому слиянию. + diff --git a/wiki/Vim/Замена выделенного блока.md b/wiki/Vim/Замена выделенного блока.md new file mode 100644 index 0000000..850f82b --- /dev/null +++ b/wiki/Vim/Замена выделенного блока.md @@ -0,0 +1,24 @@ +--- +title: "Vim: замена выделенного блока" +category: Vim +tags: Vim, команды Vim +summary: +CSS: table-100.css +... + +Замену блока, выделенного в режиме VISUAL, можно выполнить +последовательностью команд `y:%s/"/заменитель/g`. + +Команда | Назначение +---------------|------------- +`y` | Копирование в регистр " +`:` | Перейти в командный режим +`%` | Применить ко всему буферу +`s` | Замена +`Сtrl-r` | Вставка из регистра +`"` | Имя регистра (будет предложено по умолчанию) +`/` | Разделитель +`заменитель` | Новый текст +`/` | Разделитель +`g` | Для всех вхождений в строке + diff --git a/wiki/Vim/Клавиши Leader и LocalLeader.md b/wiki/Vim/Клавиши Leader и LocalLeader.md new file mode 100644 index 0000000..446192a --- /dev/null +++ b/wiki/Vim/Клавиши Leader и LocalLeader.md @@ -0,0 +1,48 @@ +--- +title: "Vim: клавиши Leader и LocalLeader" +category: Vim +tags: Vim, команды Vim +summary: +... + +Клавиши `Leader` и `LocalLeader` представляют собой префиксы для команд. +Их текущие значения можно посмотреть командами + +```vim +:echo mapleader +:echo maplocalleader +``` + +Часто их значения переназначают в файле `$HOME/.vimrc`, например так + +```vim +let mapleader = "\" +let maplocalleader = "," +``` + +Новое значение команды генерируется с помощью текущих значений этих +переменных, таким образом последовательность команд + +```vim +let mapleader = "," +nnoremap a :echo "Hey there ," + +let mapleader = "\" +nnoremap a :echo "Hey there space" +``` + +приведёт к тому, что будут созданы две команды `,a` и `a`, +следовательно для получения единообразных команд следует помещать +переназначения в начало файла `$HOME/.vimrc`. + +`LocalLeader` отличается от `Leader` тем, что действует только для +текущего буфера, поэтому обычно используется в плагинах, загружаемых +для определённых типов файлов. + +Таймауты для ввода команд, использующих клавиши `Leader` и +`LocalLeader`, настраиваются командой + +```vim +set timeout timeoutlen=5000 ttimeoutlen=100 +``` + diff --git a/wiki/Vim/Клавиши PageUp и PageDown.md b/wiki/Vim/Клавиши PageUp и PageDown.md new file mode 100644 index 0000000..2076960 --- /dev/null +++ b/wiki/Vim/Клавиши PageUp и PageDown.md @@ -0,0 +1,22 @@ +--- +title: "Vim: клавиши PageUp и PageDown" +category: Vim +tags: Vim, команды Vim +summary: +... + +Чтобы поведение клавиш `PageUp` и `PageDown` совпадало с более +привычным, можно добавить в `$HOME/.vimrc` следующий код: + +```vim +" Более привычные PgUp / PgDown, когда курсор остаётся в той же строке, " +" а не переносится вверх / вниз экрана, как при стандартном PgUp / PgDown. " +" Поскольку по умолчанию прокрутка по C-U / C-D, при которой курсор остаётся +" на месте, происходит на полэкрана, привязка делается к двойному нажатию +" этих комбинаций. " +nmap +nmap +imap +imap +``` + diff --git a/wiki/Vim/Кодировка файла.md b/wiki/Vim/Кодировка файла.md new file mode 100644 index 0000000..9b95683 --- /dev/null +++ b/wiki/Vim/Кодировка файла.md @@ -0,0 +1,33 @@ +--- +title: "Vim: кодировка файла" +category: Vim +tags: Vim +summary: +... + +Для управления кодировкой файлов можно создать дополнительное меню, +позволяющее открыть файл в выбранной кодировке, проверить её +корректность и сохранить в нужном виде. Пример кода: + +```vim +" кодировка для чтения файла +set encoding=utf-8 +" кодировка терминала +set termencoding=utf-8 +" кодировка для записи файла +set fileencoding=utf-8 +" список предполагаемых кодировок в порядке предпочтения +set fileencodings=utf8,koi8r,cp1251,cp866,latin1,ucs-2le + +set wildmenu +set wcm= +menu Encoding.Open\ as\ KOI8-R :e ++enc=koi8-r +menu Encoding.Open\ as\ CP1251 :e ++enc=cp1251 +menu Encoding.Open\ as\ CP866 :e ++enc=cp866 +menu Encoding.Open\ as\ LATIN1 :e ++enc=latin1 +menu Encoding.Open\ as\ UCS-2LE :e ++enc=ucs-2le +menu Encoding.Open\ as\ UTF-8 :e ++enc=utf-8 +menu Encoding.Convert\ to\ UTF-8 :set fenc=utf-8 +map :emenu Encoding. +``` + diff --git a/wiki/Vim/Комментирование кода.md b/wiki/Vim/Комментирование кода.md new file mode 100644 index 0000000..922cdc6 --- /dev/null +++ b/wiki/Vim/Комментирование кода.md @@ -0,0 +1,27 @@ +--- +title: "Vim: комментирование кода" +category: Vim +tags: Vim, команды Vim +summary: +CSS: table-100.css +... + +Отмена автоматического комментирования кода при вставке из буфера: + +```Vim +autocmd FileType * setlocal formatoptions-=cro +``` + +Для управления комментированием можно использовать плагин +[NerdCommenter](https://github.com/scrooloose/nerdcommenter). +Основные команды: + +Команда | Назначение +----------------------|---------------------------- +`[n]cc` | комментировать блок +`[n]cn` | комментировать с учётом вложенности +`[n]cl` | символ комментария помещать в начало строки +`[n]ci` | инвертирование комментариев +`cA` | добавить комментарий в конец строки +`[n]cu` | раскомментировать блок + diff --git a/wiki/Vim/Менеджер плагинов Plug.md b/wiki/Vim/Менеджер плагинов Plug.md new file mode 100644 index 0000000..3d17800 --- /dev/null +++ b/wiki/Vim/Менеджер плагинов Plug.md @@ -0,0 +1,44 @@ +--- +Title: "Vim: менеджер плагинов Plug" +Category: Vim +Tags: Vim, плагины Vim +Summary: +... + +Автоматическое управление плагинами в Vim можно организовать +с помощью менеджера [Plug](https://github.com/junegunn/vim-plug), +установить который можно командой + +```sh +curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ + https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +``` + +Чтобы использовать Plug, нужно добавить в `$HOME/.vimrc`: + +1. Строку `call plug#begin('~/.vim/plugged')` +2. Список строк, начинающихся с команды `Plug`, для загрузки плагинов +3. Закончить список командой `call plug#end()` + +Пример: + +```vim +" Обязательно использовать одиночные кавычки +call plug#begin('~/.vim/plugged') + +" Краткая запись для работы с github: https://github.com/junegunn/vim-easy-align +Plug 'junegunn/vim-easy-align' + +" Вариант с полным адресом +Plug 'https://github.com/junegunn/vim-github-dashboard.git' + +" Загрузка при выполнении команды +Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } + +" Загрузка для определённого типа файлов +Plug 'tpope/vim-fireplace', { 'for': 'clojure' } + +" Окончание списка плагинов +call plug#end() +``` + diff --git a/wiki/Vim/Навигация easymotion.md b/wiki/Vim/Навигация easymotion.md new file mode 100644 index 0000000..716ddf9 --- /dev/null +++ b/wiki/Vim/Навигация easymotion.md @@ -0,0 +1,53 @@ +--- +title: "Vim: навигация по тексту с помощью easymotion" +category: Vim +tags: Vim, команды Vim +summary: +... + +Плагин [easymotion](https://github.com/easymotion/vim-easymotion) +предоставляет функции для удобного перемещения по тексту. +Пример настройки: + +```vim +" Не включать команды по умолчанию +let g:EasyMotion_do_mapping = 0 + +" Умный регистр +let g:EasyMotion_smartcase = 1 + +" ec{char} для перехода к {char} +map ec (easymotion-bd-f) +nmap ec (easymotion-overwin-f) + +" s{char}{char} для перехода к {char}{char} +nmap s (easymotion-overwin-f2) + +" Переход к строке +map eg (easymotion-bd-jk) +nmap eg (easymotion-overwin-line) + +" Переход к слову +map ew (easymotion-bd-w) +nmap ew (easymotion-overwin-w) + +" Навигация по строкам +map el (easymotion-lineforward) +map ej (easymotion-j) +map ek (easymotion-k) +map eh (easymotion-linebackward) + +" Повторить последний переход +map er (easymotion-repeat) + +" Замена стандартного поиска по тексту +map / (easymotion-sn) +omap / (easymotion-tn) + +" These `n` & `N` mappings are options. You do not have to map `n` & `N` to EasyMotion. +" Without these mappings, `n` & `N` works fine. (These mappings just provide +" different highlight method and have some other features ) +map n (easymotion-next) +map N (easymotion-prev) +``` + diff --git a/wiki/Vim/Навигация по буферам.md b/wiki/Vim/Навигация по буферам.md new file mode 100644 index 0000000..6fca46f --- /dev/null +++ b/wiki/Vim/Навигация по буферам.md @@ -0,0 +1,17 @@ +--- +title: "Vim: навигация по буферам" +category: Vim +tags: Vim, команды Vim +summary: +CSS: table-100.css +... + +Команда | Назначение +------------------|----------------- +`:bn` | следующий буфер +`:bp` | предыдущий буфер +`:ls` | список открытых буферов +`:bd` | закрыть текущий буфер +`:b имя_буфера` | переключиться на буфер +`:bdа имя_буфера` | удалить буфер по имени + diff --git a/wiki/Vim/Нумерация строк.md b/wiki/Vim/Нумерация строк.md new file mode 100644 index 0000000..d31ba47 --- /dev/null +++ b/wiki/Vim/Нумерация строк.md @@ -0,0 +1,35 @@ +--- +title: "Vim: нумерация строк" +category: Vim +tags: Vim, команды Vim +summary: +... + +Для переключения режимов отображения слева столбца нумерации +строк можно добавить в `$HOME/.vimrc` следующий код: + +```vim +" Нумерация строк включена +set number +" Нумерация строк абсолютная +set nornu + +function! ChangeNumbering() + if &number + if &rnu + set nornu + else + set nonumber + endif + else + set number + set rnu + endif +endfunc + +map # :call ChangeNumbering() +``` + +В результате по команде `#` будет осуществляться +циклическое переключение между абсолютной, относительной нумерацией +строк и отключением нумерации. diff --git a/wiki/Vim/Проверка орфографии.md b/wiki/Vim/Проверка орфографии.md new file mode 100644 index 0000000..9c352ed --- /dev/null +++ b/wiki/Vim/Проверка орфографии.md @@ -0,0 +1,39 @@ +--- +title: "Vim: проверка орфографии" +category: Vim +tags: Vim, команды Vim, словарь, орфография +summary: +... + +Код в `$HOME/.vimrc` для циклического переключения режимов проверки +орфографии: два языка, английский, русский и без проверки: + +```Vim +" По умолчанию проверка орфографии для русского и английского. +setlocal spell spelllang=ru,en +set spellsuggest=9 + +function! ChangeSpellLang() + if &spelllang == "ru,en" + setlocal spell spelllang=en + echo "spelllang: en" + elseif &spelllang == "en" + setlocal spell spelllang=ru + echo "spelllang: ru" + elseif &spelllang == "ru" + setlocal nospell spelllang= + echo "spelllang: off" + else + setlocal spell spelllang=ru,en + echo "spelllang: ru,en" + endif +endfunc + +" map spell on/off for English/Russian +map :call ChangeSpellLang() + +" выбор альтернатив +imap z=i +map z= +``` + diff --git a/wiki/Vim/Ссылки.md b/wiki/Vim/Ссылки.md new file mode 100644 index 0000000..8d4d727 --- /dev/null +++ b/wiki/Vim/Ссылки.md @@ -0,0 +1,12 @@ +--- +title: "Vim: полезные ссылки" +category: Vim +tags: Vim +summary: +... + +* [Vim](http://vim.org) +* [Usevim](http://usevim.com/) +* [How I boosted my Vim](http://nvie.com/posts/how-i-boosted-my-vim/) +* [How to boost your Vim productivity](https://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/) +* [Vim Awesome](https://vimawesome.com/) diff --git a/wiki/Vim/Управление окнами.md b/wiki/Vim/Управление окнами.md new file mode 100644 index 0000000..f17b41d --- /dev/null +++ b/wiki/Vim/Управление окнами.md @@ -0,0 +1,22 @@ +--- +title: "Vim: управление окнами" +category: Vim +tags: Vim, команды Vim +summary: +CSS: table-100.css +... + +Команда | Назначение +--------------------|------------------------- +`:split filename` | открыть в новом окне (горизонтальное разделение) +`:vsplit filename` | открыть в новом окне (вертикальное разделение) +`` `` | перейти к следующему окну +`` `q` | закрыть текущее окно +`` `o` | развернуть окно полностью +`` `_` | развернуть окно по высоте +`` `|` | развернуть окно по ширине +`` `=` | выровнять размер окон +`` `+` | увеличить окно на 1 строку +`` `-` | уменьшить окно на 1 строку +`` `стрелки` | перемещение между окнами +