diff --git a/.gitignore b/.gitignore index da8c2c0..c22ecac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ cache/* +cache-ascii/* cache-full/* cache-html/* output/* @@ -6,4 +7,6 @@ __pycache__ wiki/trash wiki/notes.sqlite upload.sh +wiki/**/*.png +wiki/**/*.png.cache diff --git a/.gitmodules b/.gitmodules index 07a184a..8371206 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,3 +23,6 @@ [submodule "plugins/thirdparty/replacer"] path = plugins/thirdparty/replacer url = git@github.com:/narusemotoki/replacer +[submodule "plugins/thirdparty/asciidoctor"] + path = plugins/thirdparty/asciidoctor + url = git@git.246060.ru:f1x1t/pelican-asciidoctor diff --git a/pelicanconf-full.py b/pelicanconf-full.py index 39ff68e..5b8a777 100644 --- a/pelicanconf-full.py +++ b/pelicanconf-full.py @@ -1,6 +1,7 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # from __future__ import unicode_literals +import os class i18n(object): # looks for translations in @@ -54,23 +55,12 @@ AUTHOR_FEED_RSS = None USE_FOLDER_AS_CATEGORY = True DEFAULT_DATE = 'fs' STATIC_PATHS = [ 'images', 'files', 'extras' ] +DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search') EXTRA_PATH_METADATA = { 'extras/favicon.ico': {'path': 'favicon.ico'}, } -MARKDOWN = { - 'extension_configs': { - 'markdown.extensions.codehilite': {'css_class': 'highlight'}, - 'markdown.extensions.extra': {}, - 'markdown.extensions.meta': {}, - 'markdown.extensions.toc': { - 'title': 'Содержание' - }, - } , - 'output_format': 'html5', -} - DISPLAY_CATEGORIES_ON_MENU = False DISPLAY_CATEGORIES_ON_SIDEBAR = True DISPLAY_TAGS_ON_SIDEBAR = True @@ -85,50 +75,31 @@ I18N_GETTEXT_DOMAIN = 'messages' JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']} PLUGIN_PATHS = ["plugins/official", "plugins/thirdparty"] -PLUGINS = [i18n(), "pandoc_reader", "pelican-css", "pelidoc", "series", "subcategory", "tag_cloud", "tipue_search", "plantuml", "replacer"] -#PLUGINS = ["better_tables", "just_table"] +PLUGINS = [i18n(), "pelican-css", "series", "subcategory", "tag_cloud", "tipue_search", "replacer", "asciidoctor"] -PDF_PROCESSOR = True -PANDOC_OUTPUTS = { - 'pdf': 'pdf', -} - -PANDOC_ARGS = [ - "--variable=documentclass:extarticle", - "--variable=toc-title:Содержание", - "--filter=skip-toc-tag", - "--filter=pandoc_plantuml_filter.py", - "--highlight-style=tango", - "--template=wiki", - "--resource-path=wiki:." +ASCIIDOCTOR_CMD = "asciidoctor" +ASCIIDOCTOR_EXTRA_OPTIONS = [ + '--require', 'asciidoctor-diagram', + '--attribute=imagesdir={}/wiki/images'.format(os.getcwd()), + '--attribute=source-highlighter=pygments', + '--attribute=pygments-style=manni', + '--attribute=pygments-css=class', + '--attribute=lang=ru', + '--attribute=figure-caption=Рис.', + '--attribute=toc-title=Содержание', + '--attribute=experimental', ] -PANDOC_EXTRA_OPTIONS = PANDOC_ARGS + [ "--pdf-engine=xelatex" ] - -PANDOC_MARKDOWN_EXTENSIONS = [ - "+smart", - "+backtick_code_blocks", - "+fenced_code_blocks", - "+fenced_code_attributes", - "+fenced_divs", - "+native_divs", - "+bracketed_spans", - "+native_spans" -] - -PANDOC_EXTENSIONS = PANDOC_MARKDOWN_EXTENSIONS - REPLACES = ( - (u'output/images/', u'images/'), + ('{}/wiki/'.format(os.getcwd()), u''), ) - YUICOMPRESSOR_EXECUTABLE = "yui-compressor" YUICOMPRESSOR_EXTRA_OPTIONS = ["--nomunge"] PLUGINS += ["yuicompressor-opt"] -DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search') +PDF_PROCESSOR = True # Blogroll LINKS = () @@ -142,7 +113,7 @@ SOCIAL = () # SOCIAL = (('You can add links in your config file', '#'), # ('Another social link', '#'),) -PYGMENTS_STYLE='pastie' +PYGMENTS_STYLE='asciidoctor-pastie' DEFAULT_PAGINATION = 20 diff --git a/pelicanconf.py b/pelicanconf.py index a80ac5f..88ac103 100644 --- a/pelicanconf.py +++ b/pelicanconf.py @@ -1,6 +1,7 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # from __future__ import unicode_literals +import os class i18n(object): # looks for translations in @@ -35,7 +36,7 @@ SITENAME = 'ДСП' SITEURL = 'https://dsp.246060.ru' PATH = 'wiki' -CACHE_PATH = 'cache-html' +CACHE_PATH = 'cache' TIMEZONE = 'Europe/Moscow' @@ -54,23 +55,12 @@ AUTHOR_FEED_RSS = None USE_FOLDER_AS_CATEGORY = True DEFAULT_DATE = 'fs' STATIC_PATHS = [ 'images', 'files', 'extras' ] +DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search') EXTRA_PATH_METADATA = { 'extras/favicon.ico': {'path': 'favicon.ico'}, } -MARKDOWN = { - 'extension_configs': { - 'markdown.extensions.codehilite': {'css_class': 'highlight'}, - 'markdown.extensions.extra': {}, - 'markdown.extensions.meta': {}, - 'markdown.extensions.toc': { - 'title': 'Содержание' - }, - } , - 'output_format': 'html5', -} - DISPLAY_CATEGORIES_ON_MENU = False DISPLAY_CATEGORIES_ON_SIDEBAR = True DISPLAY_TAGS_ON_SIDEBAR = True @@ -85,50 +75,31 @@ I18N_GETTEXT_DOMAIN = 'messages' JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']} PLUGIN_PATHS = ["plugins/official", "plugins/thirdparty"] -PLUGINS = [i18n(), "pandoc_reader", "pelican-css", "pelidoc", "series", "subcategory", "tag_cloud", "tipue_search", "plantuml", "replacer"] -#PLUGINS = ["better_tables", "just_table"] +PLUGINS = [i18n(), "pelican-css", "series", "subcategory", "tag_cloud", "tipue_search", "replacer", "asciidoctor"] -#PDF_PROCESSOR = True -PANDOC_OUTPUTS = { - 'pdf': 'pdf', -} - -PANDOC_ARGS = [ - "--variable=documentclass:extarticle", - "--variable=toc-title:Содержание", - "--filter=skip-toc-tag", - "--filter=pandoc_plantuml_filter.py", - "--highlight-style=tango", - "--template=wiki", - "--resource-path=wiki:." +ASCIIDOCTOR_CMD = "asciidoctor" +ASCIIDOCTOR_EXTRA_OPTIONS = [ + '--require', 'asciidoctor-diagram', + '--attribute=imagesdir={}/wiki/images'.format(os.getcwd()), + '--attribute=source-highlighter=pygments', + '--attribute=pygments-style=manni', + '--attribute=pygments-css=class', + '--attribute=lang=ru', + '--attribute=figure-caption=Рис.', + '--attribute=toc-title=Содержание', + '--attribute=experimental', ] -PANDOC_EXTRA_OPTIONS = PANDOC_ARGS + [ "--pdf-engine=xelatex" ] - -PANDOC_MARKDOWN_EXTENSIONS = [ - "+smart", - "+backtick_code_blocks", - "+fenced_code_blocks", - "+fenced_code_attributes", - "+fenced_divs", - "+native_divs", - "+bracketed_spans", - "+native_spans" -] - -PANDOC_EXTENSIONS = PANDOC_MARKDOWN_EXTENSIONS - REPLACES = ( - (u'output/images/', u'images/'), + ('{}/wiki/'.format(os.getcwd()), u''), ) - YUICOMPRESSOR_EXECUTABLE = "yui-compressor" YUICOMPRESSOR_EXTRA_OPTIONS = ["--nomunge"] #PLUGINS += ["yuicompressor-opt"] -DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search') +#PDF_PROCESSOR = True # Blogroll LINKS = () @@ -142,7 +113,7 @@ SOCIAL = () # SOCIAL = (('You can add links in your config file', '#'), # ('Another social link', '#'),) -PYGMENTS_STYLE='pastie' +PYGMENTS_STYLE='asciidoctor-pastie' DEFAULT_PAGINATION = 20 diff --git a/plugins/official b/plugins/official index cfc7a3f..8cea2c6 160000 --- a/plugins/official +++ b/plugins/official @@ -1 +1 @@ -Subproject commit cfc7a3f224f1743063b034561f89a6a712d13587 +Subproject commit 8cea2c6492f98e11341c48556978da7f6756f8a0 diff --git a/plugins/thirdparty/asciidoctor b/plugins/thirdparty/asciidoctor new file mode 160000 index 0000000..9e0019a --- /dev/null +++ b/plugins/thirdparty/asciidoctor @@ -0,0 +1 @@ +Subproject commit 9e0019a728113f8502d04eeca8bf2682219086b6 diff --git a/themes/bootstrap4 b/themes/bootstrap4 index 4471139..ce6b186 160000 --- a/themes/bootstrap4 +++ b/themes/bootstrap4 @@ -1 +1 @@ -Subproject commit 4471139a1a419abc4e2aa94c09f0ef7550c65b00 +Subproject commit ce6b18660a933855dbe996fc5b5d3d0ac1c25223 diff --git a/wiki/Latex/Висячие строки.adoc b/wiki/Latex/Висячие строки.adoc new file mode 100644 index 0000000..f304f82 --- /dev/null +++ b/wiki/Latex/Висячие строки.adoc @@ -0,0 +1,12 @@ += LaTeX: висячие строки +:title-separator: {sp}| +:category: LaTeX +:tags: LaTeX, текст, + +Пакет https://www.ctan.org/pkg/nowidow[`nowidow`] используется для +изменения алгоритма размещения висячих строк. Пример: + +[source,latex] +---- +\usepackage[defaultlines=3,all]{nowidow} +---- diff --git a/wiki/Latex/Висячие строки.md b/wiki/Latex/Висячие строки.md deleted file mode 100644 index 040115e..0000000 --- a/wiki/Latex/Висячие строки.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -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/ЕСПД в LyX.adoc b/wiki/Latex/ЕСПД в LyX.adoc new file mode 100644 index 0000000..b10f245 --- /dev/null +++ b/wiki/Latex/ЕСПД в LyX.adoc @@ -0,0 +1,105 @@ += LyX: редактирование ЕСПД +:title-separator: {sp}| +:category: LaTeX +:tags: LaTeX, текст, LyX, + + +Установить пакеты: + +[source,sh] +---- +sudo apt-get install lyx texlive-xetex +---- + +Установить стили LaTeX для http://tiny.cc/u8eo7y[ЕСПД]: + +[source,sh] +---- +git clone https://git.246060.ru/f1x1t/latex-style-esdpx ~/texmf/tex/latex/espdx +---- + +Установить шаблоны для LyX: + +[source,sh] +---- +git clone https://git.246060.ru:/f1x1t/lyx-layout-espdx.git ~/.lyx/layouts +---- + +Запустить LyX и в меню выбрать menu:Инструменты[Обновить конфигурацию] и +перезапустить программу. + +Скачать link:files/espdx-template.lyx[шаблон] для LyX, открыть файл +*espdx-template.lyx* и в меню выбрать menu:Документ[Настройки…]. +В появившемся окне нажать кнопку btn:[Сохранить как параметры +документа по умолчанию]. + +Пример настройки: + +[.text-center] +.Класс документа +image::lyx-espdx/01.png[Класс документа] + +[.text-center] +.Модули +image::lyx-espdx/02.png[Модули] + +[.text-center] +.Шрифты +image::lyx-espdx/03.png[Шрифты] + +[.text-center] +.Макет текста +image::lyx-espdx/04.png[Макет текста] + +[.text-center] +.Макет страницы +image::lyx-espdx/05.png[Макет страницы] + +[.text-center] +.Поля страницы +image::lyx-espdx/06.png[Поля страницы] + +[.text-center] +.Язык +image::lyx-espdx/07.png[Язык] + +[.text-center] +.Нумерация и содержание +image::lyx-espdx/08.png[Нумерация и содержание] + +[.text-center] +.Библиография +image::lyx-espdx/09.png[Библиография] + +[.text-center] +.Предметный указатель +image::lyx-espdx/10.png[Предметный указатель] + +[.text-center] +.Свойства PDF / Общие +image::lyx-espdx/11.png[Свойства PDF / Общие] + +[.text-center] +.Свойства PDF / Гиперссылки +image::lyx-espdx/12.png[Свойства PDF / Гиперссылки] + +[.text-center] +.Свойства PDF / Закладки +image::lyx-espdx/13.png[Свойства PDF / Закладки] + +[.text-center] +.Параметры математики +image::lyx-espdx/14.png[Параметры математики] + +[.text-center] +.Размещение плавающих объектов +image::lyx-espdx/15.png[Размещение плавающих объектов] + +[.text-center] +.Форматы +image::lyx-espdx/16.png[Форматы] + +[.text-center] +.Преамбула LaTeX +image::lyx-espdx/17.png[Преамбула LaTeX] + diff --git a/wiki/Latex/ЕСПД в LyX.md b/wiki/Latex/ЕСПД в LyX.md deleted file mode 100644 index 43dee5a..0000000 --- a/wiki/Latex/ЕСПД в LyX.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "LyX: редактирование ЕСПД" -category: LaTeX -tags: LaTeX, текст, LyX, -summary: -... - - -Установить пакеты: - -```sh -sudo apt-get install lyx texlive-xetex -``` - -Установить стили LaTeX для ЕСПД: - -``` -git clone https://git.246060.ru/f1x1t/latex-style-esdpx ~/texmf/tex/latex/espdx -``` - -Установить шаблоны для LyX: - -``` -git clone https://git.246060.ru:/f1x1t/lyx-layout-espdx.git ~/.lyx/layouts -``` - -Запустить LyX и в меню __Инструменты__ выбрать __Обновить конфигурацию__ -и перезапустить программу. - -Скачать [шаблон](files/espdx-template.lyx) для LyX, открыть файл -**espdx-template.lyx** и в меню выбрать __Документ / Настройки...__. -В появившемся окне нажать кнопку __Сохранить как параметры документа по умолчанию__. - -Пример настройки: - -![Класс документа](images/lyx-espdx/01.png) - -![Модули](images/lyx-espdx/02.png) - -![Шрифты](images/lyx-espdx/03.png) - -![Макет текста](images/lyx-espdx/04.png) - -![Макет страницы](images/lyx-espdx/05.png) - -![Поля страницы](images/lyx-espdx/06.png) - -![Язык](images/lyx-espdx/07.png) - -![Нумерация и содержание](images/lyx-espdx/08.png) - -![Библиография](images/lyx-espdx/09.png) - -![Предметный указатель](images/lyx-espdx/10.png) - -![Свойства PDF / Общие](images/lyx-espdx/11.png) - -![Свойства PDF / Гиперссылки](images/lyx-espdx/12.png) - -![Свойства PDF / Закладки](images/lyx-espdx/13.png) - -![Параметры математики](images/lyx-espdx/14.png) - -![Размещение плавающих объектов](images/lyx-espdx/15.png) - -![Форматы](images/lyx-espdx/16.png) - -![Преамбула LaTeX](images/lyx-espdx/17.png) - diff --git a/wiki/Latex/Защита команд.adoc b/wiki/Latex/Защита команд.adoc new file mode 100644 index 0000000..5b675bb --- /dev/null +++ b/wiki/Latex/Защита команд.adoc @@ -0,0 +1,13 @@ += LaTeX: защита команд +:title-separator: {sp}| +:category: LaTeX +:tags: LaTeX, текст, + +Команда `\protect` используется для защиты инструкций внутри хрупких +команд. Например, для защиты команды переноса строки внутри команды +`section` нужно написать: + +[source,latex] +---- +\section{Первая строка\protect\\Вторая строка} +---- diff --git a/wiki/Latex/Защита команд.md b/wiki/Latex/Защита команд.md deleted file mode 100644 index e90c7d5..0000000 --- a/wiki/Latex/Защита команд.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "LaTeX: защита команд" -category: LaTeX -tags: LaTeX, текст, -summary: -... - -Команда `\protect` используется для защиты инструкций внутри -хрупких команд. Например, для защиты команды переноса строки -внутри команды `section` нужно написать: - -```latex -\section{Первая строка\protect\\Вторая строка} -``` - diff --git a/wiki/Latex/Лигатуры.md b/wiki/Latex/Лигатуры.adoc similarity index 55% rename from wiki/Latex/Лигатуры.md rename to wiki/Latex/Лигатуры.adoc index d9562f6..3e8ab6d 100644 --- a/wiki/Latex/Лигатуры.md +++ b/wiki/Latex/Лигатуры.adoc @@ -1,14 +1,12 @@ ---- -title: "LaTeX: лигатуры" -category: LaTeX -tags: LaTeX, шрифты, -summary: -... += LaTeX: лигатуры +:title-separator: {sp}| +:category: LaTeX +:tags: LaTeX, шрифты, Команды для запрета использования лигатур: -```latex +[source,latex] +---- \usepackage{microtype} \DisableLigatures[f]{encoding = *, family = *} -``` - +---- diff --git a/wiki/Latex/Многостраничные таблицы в LyX.adoc b/wiki/Latex/Многостраничные таблицы в LyX.adoc new file mode 100644 index 0000000..403ce2a --- /dev/null +++ b/wiki/Latex/Многостраничные таблицы в LyX.adoc @@ -0,0 +1,29 @@ += LyX: многостраничные таблицы +:title-separator: {sp}| +:category: LaTeX +:tags: LaTeX, текст, LyX, таблицы, + +* Создать таблицу как минимум с четырьмя строками. +* Щёлкнуть правой кнопкой мыши на таблице, выбрать во всплывающем меню +*Длинная таблица*. +* Щёлкнуть правой кнопкой мыши на таблице, выбрать во всплывающем меню +*Настройки*. +* Установить курсор на первой строке таблицы, в окне настроек перейти на +вкладку *Длинная таблица*. +* Выбрать *Подпись* и *Первый заголовок*. +* Нажать *Применить*. +* Установить курсор на второй строке таблицы, в окне настроек перейти на +вкладку *Длинная таблица*. +* Выбрать *Подпись* и *Заголовок*. +* Нажать *Применить*. +* Установить курсор на третьей строке таблицы, в окне настроек перейти +на вкладку *Длинная таблица*. +* Выбрать *Заголовок* и *Первый заголовок*. +* Нажать *Применить*. +* Щёлкнуть правой кнопкой мыши на второй строке таблицы, выбрать в меню +*Подпись (Ненумерованный)*. +* На первой строке таблицы установить метку и ввести текст подписи к +таблице на начальной странице. +* На второй строке таблицы сформировать текст подписи к таблице, который +будет использоваться на последующих страницах. +* На третьей строке нужно сформировать заголовок таблицы. diff --git a/wiki/Latex/Многостраничные таблицы в LyX.md b/wiki/Latex/Многостраничные таблицы в LyX.md deleted file mode 100644 index 033f385..0000000 --- a/wiki/Latex/Многостраничные таблицы в LyX.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "LyX: многостраничные таблицы" -category: LaTeX -tags: LaTeX, текст, LyX, таблицы, -summary: -... - -- Создать таблицу как минимум с четырьмя строками. -- Щелкнуть правой кнопкой мыши на таблице, выбрать во всплывающем -меню **Длинная таблица**. -- Щелкнуть правой кнопкой мыши на таблице, выбрать во всплывающем -меню **Настройки**. -- Установить курсор на первой строке таблицы, в окне настроек перейти -на вкладку **Длинная таблица**. -- Выбрать **Подпись** и **Первый заголовок**. -- Нажать **Применить**. -- Установить курсор на второй строке таблицы, в окне настроек перейти -на вкладку **Длинная таблица**. -- Выбрать **Подпись** и **Заголовок**. -- Нажать **Применить**. -- Установить курсор на третьей строке таблицы, в окне настроек перейти -на вкладку **Длинная таблица**. -- Выбрать **Заголовок** и **Первый заколовок**. -- Нажать **Применить**. -- Щелкнуть правой кнопкой мыши на второй строке таблицы, выбрать в меню -**Подпись (Ненумерованный)**. -- На первой строке таблицы установить метку и ввести текст подписи к -таблице на начальной странице. -- На второй строке таблицы сформировать текст подписи к таблице, -который будет использоваться на последующих страницах. -- На третьей строке нужно сформировать заголовок таблицы. - diff --git a/wiki/Latex/Переносы.adoc b/wiki/Latex/Переносы.adoc new file mode 100644 index 0000000..9bedb46 --- /dev/null +++ b/wiki/Latex/Переносы.adoc @@ -0,0 +1,8 @@ += LaTeX: переносы строк +:title-separator: {sp}| +:category: LaTeX +:tags: LaTeX, текст, + +Текст между командами `\sloppy` и `\fussy` или внутри блока +`\begin{sloppypar} ... \end{sloppypar}` будет переноситься сразу при +достижении края бокса. diff --git a/wiki/Latex/Переносы.md b/wiki/Latex/Переносы.md deleted file mode 100644 index 0a96ff5..0000000 --- a/wiki/Latex/Переносы.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "LaTeX: переносы строк" -category: LaTeX -tags: LaTeX, текст, -summary: -... - -Текст между командами `\sloppy` и `\fussy` или внутри блока -`\begin{sloppypar} ... \end{sloppypar}` будет переноситься -сразу при достижении края бокса. - diff --git a/wiki/Latex/Русский в PDF.adoc b/wiki/Latex/Русский в PDF.adoc new file mode 100644 index 0000000..5370556 --- /dev/null +++ b/wiki/Latex/Русский в PDF.adoc @@ -0,0 +1,20 @@ += LaTeX: русский язык в выходном PDF +:title-separator: {sp}| +:category: LaTeX +:tags: LaTeX, текст, PDF, + +Данный метод используется только в LaTeX, в XeTeX (XeLaTeX) генерация +PDF работает изначально. + +Для поиска в файле PDF и копирования текста с правильной кодировкой +нужно использовать пакет https://www.ctan.org/pkg/cmap[`cmap`]. Включать +использование пакета нужно как можно раньше, чтобы правильно +формировалась служебная информация и титульные листы. + +[source,latex] +---- +\usepackage{cmap} +---- + +Полезная http://s.arboreus.com/2007/07/pdf-latex.html[информация] о +выводе из LaTeX в PDF. diff --git a/wiki/Latex/Русский в PDF.md b/wiki/Latex/Русский в PDF.md deleted file mode 100644 index 66b7b18..0000000 --- a/wiki/Latex/Русский в PDF.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "LaTeX: русский язык в выходном PDF" -category: LaTeX -tags: LaTeX, текст, PDF, -summary: -... - -Данный метод используется только в LaTeX, в XeTeX (XeLaTeX) генерация PDF -работает изначально. - -Для поиска в файле 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/Astra/Авторизация в PostgreSQL.md b/wiki/Linux/Astra/Авторизация в PostgreSQL.adoc similarity index 54% rename from wiki/Linux/Astra/Авторизация в PostgreSQL.md rename to wiki/Linux/Astra/Авторизация в PostgreSQL.adoc index e23006c..34b607e 100644 --- a/wiki/Linux/Astra/Авторизация в PostgreSQL.md +++ b/wiki/Linux/Astra/Авторизация в PostgreSQL.adoc @@ -1,26 +1,26 @@ ---- -title: "Astra: авторизация в PostgreSQL через PAM" -category: Linux -tags: Linux, Astra, postgresql, базы данных, -summary: -... += Astra: авторизация в PostgreSQL через PAM +:title-separator: {sp}| +:category: Linux +:tags: Linux, Astra, postgresql, базы данных, + Для обеспечения авторизации пользователей через PAM системному -пользователю `postgres`, с правами которого выполняется сервер -базы данных, необходимо выдать права на чтение информации из базы -данных пользователей и сведений о мандатных метках и привилегиях: +пользователю `postgres`, с правами которого выполняется сервер базы +данных, необходимо выдать права на чтение информации из базы данных +пользователей и сведений о мандатных метках и привилегиях: -```sh +[source,sh] +---- usermod -a -G shadow postgres setfacl -d -m u:postgres:r /etc/parsec/macdb setfacl -R -m u:postgres:r /etc/parsec/macdb setfacl -m u:postgres:rx /etc/parsec/macdb -``` +---- Для обеспечения возможности авторизации пользователя `user`, зарегистрированного в системе PAM, нужно выполнить команду -```sh +[source,sh] +---- usermac -c 0:0 -l 0:0 user -``` - +---- diff --git a/wiki/Linux/CUPS.md b/wiki/Linux/CUPS.adoc similarity index 60% rename from wiki/Linux/CUPS.md rename to wiki/Linux/CUPS.adoc index eac88af..b8b0880 100644 --- a/wiki/Linux/CUPS.md +++ b/wiki/Linux/CUPS.adoc @@ -1,42 +1,46 @@ ---- -title: "CUPS: команды" -category: Linux -tags: Linux, печать, CUPS -... += CUPS: команды +:title-separator: {sp}| +:category: Linux +:tags: Linux, печать, CUPS, -Текущее состояние принтера (см. также [lpstat](http://cheat.sh/lpstat)): +Текущее состояние принтера (см. также http://cheat.sh/lpstat[lpstat]): -```sh +[source,sh] +---- lpstat -h hostname -p printer_name -``` +---- Возобновить работу принтера: -```sh +[source,sh] +---- lpadmin -h hostname -p printer_name -E -``` +---- -Печать (см. также [lp](http://cheat.sh/lp)): +Печать (см. также http://cheat.sh/lp[lp]): -```sh +[source,sh] +---- lp -h hostname -d printer_name file.pdf -``` +---- Просмотр очереди: -```sh +[source,sh] +---- lpq -h hostname -p printer_name -``` +---- Удаление задания job-id из очереди: -```sh +[source,sh] +---- lprm -h hostname -p printer_name job-id -``` +---- Удаление всех заданий из очереди: -```sh +[source,sh] +---- lprm -h hostname -p printer_name - -``` - +---- diff --git a/wiki/Linux/DPKG/APT.md b/wiki/Linux/DPKG/APT.adoc similarity index 63% rename from wiki/Linux/DPKG/APT.md rename to wiki/Linux/DPKG/APT.adoc index f86fce3..cb90454 100644 --- a/wiki/Linux/DPKG/APT.md +++ b/wiki/Linux/DPKG/APT.adoc @@ -1,12 +1,10 @@ ---- -title: "APT" -category: Linux -tags: linux, ubuntu, debian, apt, -summary: -... += APT +:category: Linux +:tags: linux, ubuntu, debian, apt, Запрет загрузки переводов описаний пакетов: -```sh +[source,sh] +---- echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/99translations -``` +---- diff --git a/wiki/Linux/GnuPG/Шифрование файлов с помощью GnuPG.md b/wiki/Linux/GnuPG/Шифрование файлов с помощью GnuPG.adoc similarity index 51% rename from wiki/Linux/GnuPG/Шифрование файлов с помощью GnuPG.md rename to wiki/Linux/GnuPG/Шифрование файлов с помощью GnuPG.adoc index 6cc3ed2..68b66a2 100644 --- a/wiki/Linux/GnuPG/Шифрование файлов с помощью GnuPG.md +++ b/wiki/Linux/GnuPG/Шифрование файлов с помощью GnuPG.adoc @@ -1,32 +1,36 @@ ---- -title: "GnuPG: шифрование файлов" -category: Linux -tags: Linux, GnuPG, безопасность -... += GnuPG: шифрование файлов +:title-separator: {sp}| +:category: Linux +:tags: Linux, GnuPG, безопасность -Для шифрования файлов с использованием публичного ключа адресата можно выполнить команду: +Для шифрования файлов с использованием публичного ключа адресата можно +выполнить команду: -```sh +[source,sh] +---- tar cp files_list | pv | gpg -e --recipient user@domain.tld > archive.tar.gpg -``` +---- -По умолчанию во время шифрования данные сжимаются компрессорами `zip` или `gzip`, -поэтому сжимать данные до `gpg` не нужно. Можно отключить стандартный алгоритм сжатия и -использовать собственный компрессор, например `xz`: +По умолчанию во время шифрования данные сжимаются компрессорами `zip` +или `gzip`, поэтому сжимать данные до `gpg` не нужно. Можно отключить +стандартный алгоритм сжатия и использовать собственный компрессор, +например `xz`: -```sh +[source,sh] +---- tar cp files_list | pv | xz -9 | gpg -e --compress-algo none --recipient user@domain.tld > archive.tar.xz.gpg -``` +---- Для шифрования с использованием пароля: -```sh +[source,sh] +---- tar cf files_list | pv | gpg -c > archive.tar.gpg -``` +---- Для расшифровки нужно выполнить команду: -```sh +[source,sh] +---- gpg -d archive.tar.gpg --output archive.tar -``` - +---- diff --git a/wiki/Linux/Hardware/GPE.adoc b/wiki/Linux/Hardware/GPE.adoc new file mode 100644 index 0000000..ccef71e --- /dev/null +++ b/wiki/Linux/Hardware/GPE.adoc @@ -0,0 +1,28 @@ += Прерывания GPE +:category: Linux +:tags: Linux, hardware, железо, + +Неисправная аппаратура может генерировать большое количество прерываний, +что приводит к заметному ухудшению отзывчивости системы. Проверить +наличие подобной ситуации можно командой + +[source,sh] +---- +find /sys/firmware/acpi/interrupts | sort | while read i; do echo "$i:"; cat $i; done +---- + +Если в выводе будет присутствовать очень большое число, то значит +проявляется именно данная проблема. Для временного исправления можно +заблокировать прерывание, выполнив команду + +[source,sh] +---- +echo 0 > /sys/firmware/acpi/interrupts/gpeXX 2>/dev/null +---- + +где XX номер прерывания, для которого зафиксировано большое число +срабатываний. Для полного исправления проблемы нужно разбираться с +аппаратурой. + +https://unix.stackexchange.com/questions/242013/disable-gpe-acpi-interrupts-on-boot[См. +также] diff --git a/wiki/Linux/Hardware/GPE.md b/wiki/Linux/Hardware/GPE.md deleted file mode 100644 index 7883866..0000000 --- a/wiki/Linux/Hardware/GPE.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: "Прерывания GPE" -category: Linux -tags: Linux, hardware, железо, -summary: -... - -Неисправная аппаратура может генерировать большое количество прерываний, -что приводит к заметному ухудшению отзывчивости системы. Проверить -наличие подобной ситуации можно командой - -```sh -find /sys/firmware/acpi/interrupts | sort | while read i; do echo "$i:"; cat $i; done -``` - -Если в выводе будет присутствовать очень большое число, то значит проявляется -именно данная проблема. Для временного исправления можно заблокировать прерывание, -выполнив команду - -```sh -echo 0 > /sys/firmware/acpi/interrupts/gpeXX 2>/dev/null -``` - -где XX номер прерывания, для которого зафиксировано большое число срабатываний. -Для полного исправления проблемы нужно разбираться с аппаратурой. - -[См. также](https://unix.stackexchange.com/questions/242013/disable-gpe-acpi-interrupts-on-boot) - diff --git a/wiki/Linux/LXC/DNS в контейнере LXC.adoc b/wiki/Linux/LXC/DNS в контейнере LXC.adoc new file mode 100644 index 0000000..cc90934 --- /dev/null +++ b/wiki/Linux/LXC/DNS в контейнере LXC.adoc @@ -0,0 +1,15 @@ += DNS в контейнере LXC +:category: Linux +:tags: lxc, контейнеры, ubuntu, linux, dns, + +В системе Ubuntu 18.04 работающей внутри контейнера LXC по умолчанию не +работает разрешение имён. Чтобы использовать DNS-сервер `8.8.8.8`, нужно +внутри контейнера выполнить команды: + +[source,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/LXC/DNS в контейнере LXC.md b/wiki/Linux/LXC/DNS в контейнере LXC.md deleted file mode 100644 index 8bbe329..0000000 --- a/wiki/Linux/LXC/DNS в контейнере LXC.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -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.adoc similarity index 64% rename from wiki/Linux/Runit/runit.md rename to wiki/Linux/Runit/runit.adoc index 31ff5aa..34af23f 100644 --- a/wiki/Linux/Runit/runit.md +++ b/wiki/Linux/Runit/runit.adoc @@ -1,28 +1,28 @@ ---- -title: "runit: система инициализации" -category: Linux -tags: Debian, Ubuntu, Linux, инициализация, runit, -summary: -... += runit: система инициализации +:title-separator: {sp}| +:category: Linux +:tags: Debian, Ubuntu, Linux, инициализация, runit, -### Установка +== Установка -[runit](http://smarden.org/runit/) — это система инициализации со +http://smarden.org/runit/[runit] — это система инициализации со встроенными средствами контроля за процессами. Установка в Ubuntu: -```sh +[source,sh] +---- sudo apt-get install runit runit-systemd -``` +---- -### Запуск сервисов от непривилегированного пользователя +== Запуск сервисов от непривилегированного пользователя Чтобы разрешить непривилегированному пользователю `user` управлять собственной конфигурацией для runit, нужно с правами суперпользователя выполнить: -```sh +[source,sh] +---- mkdir -p /etc/service/run-user/supervise cat > /etc/service/run-user/run << EOF #!/bin/sh @@ -31,17 +31,18 @@ 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`: -``` +[source,text] +---- daemonize no port 5079 tcp-backlog 128 @@ -56,33 +57,36 @@ 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 мог контролировать его состояние. +Запускаемый сервер должен запускаться не в фоновом режиме, чтобы `runit` +мог контролировать его состояние. -Скрипт `/home/user/sv/redis/run`, который `runit` использует для -запуска процесса: +Скрипт `/home/user/sv/redis/run`, который `runit` использует для запуска +процесса: -```sh -#!/bin/sh +[source,sh] +---- +#!/bin/sh -e 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`): +Журналирование выполняется с помощью входящей в состав пакета runit +программы `svlogd`. Скрипт для его запуска должен находиться в +подкаталоге `log` (`/home/user/sv/redis/log/run`): -```sh +[source,sh] +---- #!/bin/sh -e LOGDIR=/home/user/redis/log mkdir -p "${LOGDIR}" exec svlogd -tt "${LOGDIR}"" -``` +---- + diff --git a/wiki/Linux/System/Сервер NTP в локальной сети.md b/wiki/Linux/System/Сервер NTP в локальной сети.adoc similarity index 63% rename from wiki/Linux/System/Сервер NTP в локальной сети.md rename to wiki/Linux/System/Сервер NTP в локальной сети.adoc index 5ecaa31..d4f9c9f 100644 --- a/wiki/Linux/System/Сервер NTP в локальной сети.md +++ b/wiki/Linux/System/Сервер NTP в локальной сети.adoc @@ -1,16 +1,14 @@ ---- -title: "Сервер времени NTP в локальной сети" -category: Linux -tags: Linux, NTP, время, -summary: -... += Сервер времени NTP в локальной сети +:category: Linux +:tags: Linux, NTP, время, Если в локальной сети необходимо синхронизировать время, не имея -авторитетного источника времени, то можно использовать локальные -часы сервера в качестве базовых. В этом случае файл настройки -`/etc/ntp.conf` на сервере `192.168.0.1` будет выглядеть так: +авторитетного источника времени, то можно использовать локальные часы +сервера в качестве базовых. В этом случае файл настройки `/etc/ntp.conf` +на сервере `192.168.0.1` будет выглядеть так: -``` +[source,text] +---- driftfile /var/lib/ntp/ntp.drift logfile /var/log/ntp.log tinker panic 0 @@ -19,11 +17,12 @@ server 127.127.1.0 minpoll 4 maxpoll 7 fudge 127.127.1.0 stratum 8 restrict 192.168.0.0 mask 255.255.255.0 restrict default nomodify notrap -``` +---- Файл `/etc/ntp.conf` на клиенте из подсети `192.168.0.0/24` имеет вид: -``` +[source,text] +---- driftfile /var/lib/ntp/ntp.drift logfile /var/log/ntp.log tinker panic 0 @@ -32,5 +31,4 @@ server 127.127.1.0 minpoll 4 maxpoll 7 fudge 127.127.1.0 stratum 12 server 192.168.0.1 minpoll 4 maxpoll 7 iburst restrict default nomodify nopeer -``` - +---- diff --git a/wiki/Linux/Xorg/Терминал Rxvt-Unicode.md b/wiki/Linux/Xorg/Терминал Rxvt-Unicode.adoc similarity index 89% rename from wiki/Linux/Xorg/Терминал Rxvt-Unicode.md rename to wiki/Linux/Xorg/Терминал Rxvt-Unicode.adoc index b2589d4..3b95907 100644 --- a/wiki/Linux/Xorg/Терминал Rxvt-Unicode.md +++ b/wiki/Linux/Xorg/Терминал Rxvt-Unicode.adoc @@ -1,20 +1,19 @@ ---- -title: "Терминал rxvt-unicode" -category: Linux -tags: Linux, Xorg, rxvt, терминал, -summary: -... += Терминал rxvt-unicode +:category: Linux +:tags: Linux, Xorg, rxvt, терминал, Скачать скрипт для динамического изменения размера шрифта -```sh +[source,sh] +---- curl -fLo $HOME/.urxvt/ext/font-size --create-dirs \ https://raw.githubusercontent.com/majutsushi/urxvt-font-size/master/font-size -``` +---- Добавить в файл `$HOME/.Xresources`: -``` +[source,text] +---- URxvt.background: White URxvt.foreground: Black URxvt.saveLines: 8192 @@ -40,5 +39,5 @@ URxvt.keysym.C-S-KP_Subtract: perl:font-size:decglobal ! Запрет печати URxvt.print-pipe: "cat > /dev/null" -``` +---- diff --git a/wiki/Linux/Ссылки.adoc b/wiki/Linux/Ссылки.adoc new file mode 100644 index 0000000..98b8b3f --- /dev/null +++ b/wiki/Linux/Ссылки.adoc @@ -0,0 +1,9 @@ += Linux: полезные ссылки +:title-separator: {sp}| +:category: Linux +:tags: Linux, ссылки, + +* https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html[Параметры +загрузки ядра] +* http://cheat.sh/[Примеры команд] +* https://m.opennet.ru/[Новости] diff --git a/wiki/Linux/Ссылки.md b/wiki/Linux/Ссылки.md deleted file mode 100644 index 8d31290..0000000 --- a/wiki/Linux/Ссылки.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "Linux: полезные ссылки" -category: Linux -tags: Linux, ссылки, -... - -* [Параметры загрузки ядра](https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html) -* [Примеры команд](http://cheat.sh/) -* [Новости](https://m.opennet.ru/) - diff --git a/wiki/Misc/Libgen.adoc b/wiki/Misc/Libgen.adoc new file mode 100644 index 0000000..f9bf3ed --- /dev/null +++ b/wiki/Misc/Libgen.adoc @@ -0,0 +1,31 @@ += Libgen: локальная база данных для Windows +:title-separator: {sp}| +:category: Windows +:tags: windows, libgen, библиотеки, книги, + +Программа http://libruslib.ucoz.com/index/libgen_bibliotekar/0-5[LibGen +- Библиотекарь] позволяет просматривать локальную копию базы данных +сервера http://libgen.io/[Libgen]. Архив базы данных можно скачать +http://gen.lib.rus.ec/dbdumps/[здесь]. В архиве базы с именем вида +`libgen_YYYY-MM-DD.rar` содержится полная информация для полнотекстового +поиска по описаниям книг, а в архиве с именем вида +`libgen-compact_YYYY-MM-DD.rar` описания удалены. + +Для обработки полного архива потребуется около 30 ГБ свободного +пространства. Последовательность действий: + +* https://yadi.sk/d/j_ToPE7D3SHGN6[Скачать] и распаковать программу +Libgen. +* Скачать архив базы данных, распаковать его в каталог `upload` и +переименовать SQL-скрипт в `backup_ba.sql`. +* https://yadi.sk/d/psnuXFJM3SHGR8[Скачать] архив со скриптами для +преобразования базы данных и распаковать его в каталог `upload`. +* Запустить программу `libgen.exe`. +* Выбрать в меню menu:Databases[Update book database]. +* Перечень настроек должен быть таким: +** [ ] Download from the Internet +** [ ] Unpack +** [x] Prepare for import to the database +* Нажать кнопку btn:[Start]. +* После завершения работы нажать кнопку btn:[Done]. +* Удалить из каталога `upload` файл `backup_ba1.sql`. diff --git a/wiki/Misc/Libgen.md b/wiki/Misc/Libgen.md deleted file mode 100644 index 65402b2..0000000 --- a/wiki/Misc/Libgen.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -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/Misc/Windows/OOShutUp.adoc b/wiki/Misc/Windows/OOShutUp.adoc new file mode 100644 index 0000000..944717f --- /dev/null +++ b/wiki/Misc/Windows/OOShutUp.adoc @@ -0,0 +1,22 @@ += Настройка Windows в O&O ShutUp10 +:category: Misc +:tags: Windows, настройка, программы, + +Программа https://www.oo-software.com/en/shutup10[O&O ShutUp10] +используется для быстрой настроки большого количества параметров +Windows{nbsp}10. Пример приведён ниже: + +.Экран 1 +image::oo-shutup/1.jpg[1] + +.Экран 2 +image::oo-shutup/2.jpg[2] + +.Экран 3 +image::oo-shutup/3.jpg[3] + +.Экран 4 +image::oo-shutup/4.jpg[4] + +.Экран 5 +image::oo-shutup/5.jpg[5] diff --git a/wiki/Misc/Windows/OOShutUp.md b/wiki/Misc/Windows/OOShutUp.md deleted file mode 100644 index a83690f..0000000 --- a/wiki/Misc/Windows/OOShutUp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "Настройка Windows в O&O ShutUp10" -category: Misc -tags: Windows, настройка, программы, -summary: -... - -Программа [O&O ShutUp10](https://www.oo-software.com/en/shutup10) -используется для быстрой настроки большого количества параметров Windows 10. -Пример приведён ниже: - -![1](images/oo-shutup/1.jpg) - -![2](images/oo-shutup/2.jpg) - -![3](images/oo-shutup/3.jpg) - -![4](images/oo-shutup/4.jpg) - -![5](images/oo-shutup/5.jpg) - - diff --git a/wiki/Prog/Development/CMake управление проектом.md b/wiki/Prog/Development/CMake управление проектом.adoc similarity index 61% rename from wiki/Prog/Development/CMake управление проектом.md rename to wiki/Prog/Development/CMake управление проектом.adoc index 8913ac5..ab78a71 100644 --- a/wiki/Prog/Development/CMake управление проектом.md +++ b/wiki/Prog/Development/CMake управление проектом.adoc @@ -1,38 +1,20 @@ ---- -title: "CMake: управление проектом" -category: Программирование -tags: программирование, cmake, -summary: -toc: yes -monofontoptions: -- Scale=0.6 -... += CMake: управление проектом +:title-separator: {sp}| +:category: Программирование +:tags: программирование, cmake, +:toc: - +== Полезные ссылки -[TOC] +* https://github.com/onqtam/awesome-cmake[Каталог ссылок] +* https://cgold.readthedocs.io/en/latest/index.html[CGold: The +Hitchhiker’s Guide to the CMake] - -### Полезные ссылки - -* [Каталог ссылок](https://github.com/onqtam/awesome-cmake) -* [CGold: The Hitchhiker’s Guide to the CMake](https://cgold.readthedocs.io/en/latest/index.html) - - -### Структура каталогов проекта +== Структура каталогов проекта Файлы проекта и результаты компиляции размещаются в каталогах: -``` +.... └── cmex ├── _build │ ├── Debug @@ -54,68 +36,85 @@ thead th:nth-child(2) { │ └── lib ├── thirdparty └── tools -``` +.... Назначение каталогов приведено в таблице. -Каталог | Назначение --------------------------|---------------------------------------------- -`cmex/_build` | Результаты компиляции -`cmex/_build/Debug` | Результаты компиляции в режиме отладки -`cmex/_build/Release` | Результаты компиляции в режиме выпуска -`cmex/.git` | Репозиторий git -`cmex/cmake` | Файлы с дополнительными функциями для CMake -`cmex/cmake/cmlib` | Библиотека функций для CMake -`cmex/cmake/find` | Модули CMake для поиска внешних программ и библиотек -`cmex/cmake/etc` | Файлы настроек, используемые в CMake -`cmex/cmake/generators` | Генераторы проектов -`cmex/doc` | Документация для проекта -`cmake/files` | Каталог для дополнительных файлов -`cmake/files/etc` | Каталог для файлов настроек проекта -`cmake/files/share` | Каталог для неизменяемых файлов -`cmake/files/var` | Каталог для изменяемых файлов -`cmex/l10n` | Файлы переводов -`cmex/src` | Исходные тексты -`cmex/src/app` | Исходные тексты программ -`cmex/src/lib` | Исходные тексты библиотек -`cmex/thirdparty` | Исходные тексты сторонних проектов -`cmex/tools` | Дополнительные утилиты - +[cols="1,3",options="header",] +|=== +|Каталог |Назначение +|`cmex/_build` |Результаты компиляции +|`cmex/_build/Debug` |Результаты компиляции в режиме отладки +|`cmex/_build/Release` |Результаты компиляции в режиме выпуска +|`cmex/.git` |Репозиторий git +|`cmex/cmake` |Файлы с дополнительными функциями для CMake +|`cmex/cmake/cmlib` |Библиотека функций для CMake +|`cmex/cmake/find` |Модули CMake для поиска внешних программ и библиотек +|`cmex/cmake/etc` |Файлы настроек, используемые в CMake +|`cmex/cmake/generators` |Генераторы проектов +|`cmex/doc` |Документация для проекта +|`cmake/files` |Каталог для дополнительных файлов +|`cmake/files/etc` |Каталог для файлов настроек проекта +|`cmake/files/share` |Каталог для неизменяемых файлов +|`cmake/files/var` |Каталог для изменяемых файлов +|`cmex/l10n` |Файлы переводов +|`cmex/src` |Исходные тексты +|`cmex/src/app` |Исходные тексты программ +|`cmex/src/lib` |Исходные тексты библиотек +|`cmex/thirdparty` |Исходные тексты сторонних проектов +|`cmex/tools` |Дополнительные утилиты +|=== Каталог `_build` создаётся, чтобы избежать попадания получаемых во время -сборки файлов в иерархию основного проекта. -Запись результатов сборки проекта внутрь иерархии каталогов с исходными текстами -приводит к засорению формируемыми на этапе сборки файлами, которые затрудняют -разработку, поиск в оригинальных файлах и мешают ориентироваться в проекте. -При работе с несколькими типами сборки, например, отладка и выпуск, появляется -необходимость корректного полного удаления результатов предыдущего тип сборки. +сборки файлов в иерархию основного проекта. Запись результатов сборки +проекта внутрь иерархии каталогов с исходными текстами приводит к +засорению формируемыми на этапе сборки файлами, которые затрудняют +разработку, поиск в оригинальных файлах и мешают ориентироваться в +проекте. При работе с несколькими типами сборки, например, отладка и +выпуск, появляется необходимость корректного полного удаления +результатов предыдущего тип сборки. +== Начало проекта -### Начало проекта +Проект, в котором выполнены приведённые ниже действия, можно посмотреть +https://git.246060.ru/f1x1t/cmex[здесь] или сделать его копию командой: + +[source,sh] +---- +git clone --recursive https://git.246060.ru/f1x1t/cmex +---- В каталоге `cmex` нужно создать файл `CMakeLists.txt`: -```cmake +[source,cmake] +---- # Минимальная версия Cmake cmake_minimum_required(VERSION 3.3) cmake_policy(VERSION 3.0.2..3.7) # Название и версия проекта и используемые языки программирования project(cmex VERSION 0.2.0 LANGUAGES C CXX) -``` +---- Значение версии следует формировать согласно правилам -[семантического версионирования](https://semver.org/lang/ru/). +https://semver.org/lang/ru/[семантического версионирования]. -В каталог `cmake/cmlib` установить субмодуль CMLib, содержащий функции для CMake: +В каталоге `cmex` нужно инициализировать репозиторий и установить +подмодули, содержащие функции для CMake: -``` -git submodule add ssh://git@gitlab-server/root/cmlib cmake/cmlib -``` +[source,sh] +---- +git init . +git submodule add https://git.246060.ru/f1x1t/cmlib cmake/cmlib +git submodule add https://git.246060.ru/f1x1t/cmake-find cmake/find +git submodule add https://git.246060.ru/f1x1t/cmake-generators cmake/generators +git submodule update --remote --init +---- и подключить в файле `CMakeLists.txt`: -```cmake +[source,cmake] +---- # В каталоге cmake/cmlib находятся файлы с библиотечными функциями if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/cmlib) list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/cmlib) @@ -125,19 +124,19 @@ endif() list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/find) include(CMLibCommon) -``` +---- -В файле `cmake/etc/organization.txt` записать название -организации, которой принадлежит проект: +В файле `cmake/etc/organization.txt` записать название организации, +которой принадлежит проект: -``` +.... ORG, Inc. -``` +.... -В файле `cmake/etc/cpack_ignore.txt` перечислить шаблоны -для исключения из архива, создаваемого целью `dist`. Например: +В файле `cmake/etc/cpack_ignore.txt` перечислить шаблоны для исключения +из архива, создаваемого целью `dist`. Например: -``` +.... cmake/lib/.git$ .git$ files/var @@ -146,82 +145,86 @@ CMakeLists.txt.user \\\\..*\\\\.bak$ \\\\..*\\\\.tmp$ \\\\..*\\\\.swp$ -``` +.... +Чтобы проверить корректность файла `CMakeLists.txt`, нужно создать +каталог `_build` в каталоге `cmex`, перейти в него и выполнить команды: -Чтобы проверить корректность файла `CMakeLists.txt`, нужно создать каталог -`_build` в каталоге `cmex`, перейти в него и выполнить команды: - -```sh +[source,sh] +---- cmake .. make -``` +---- - -### Поиск системных библиотек +== Поиск системных библиотек Системные библиотеки можно искать с помощью программы `pkgconfig`, которая хранит базу данных параметров, включающую пути к заголовочным -файлами и перечни библиотек, необходимых для компоновки. -Сначала производится наличие модуля `PkgConfig`, в котором определена -функция `pkg_check_modules`, которая и осуществляет поиск. Например, -для поиска библиотек `gsl`, `fftw3` и `udev` можно написать: +файлами и перечни библиотек, необходимых для компоновки. Сначала +производится наличие модуля `PkgConfig`, в котором определена функция +`pkg_check_modules`, которая и осуществляет поиск. Например, для поиска +библиотек `gsl`, `fftw3` и `udev` можно написать: -```cmake +[source,cmake] +---- # Поиск библиотек с помощью pkgconfig find_package(PkgConfig) pkg_check_modules(GSL REQUIRED gsl) pkg_check_modules(FFTW3 REQUIRED fftw3) pkg_check_modules(UDEV udev) -``` +---- -Если системная библиотека поставляется без файла описания для `pkgconfig`, -то для её поиска может быть написан специальный модуль для `CMake`, -который вызывается функцией `find_package`. Кроме того функция `find_package` -может возвращать дополнительные значения, например, пути к исполняемым файлам. +Если системная библиотека поставляется без файла описания для +`pkgconfig`, то для её поиска может быть написан специальный модуль для +`CMake`, который вызывается функцией `find_package`. Кроме того функция +`find_package` может возвращать дополнительные значения, например, пути +к исполняемым файлам. -```cmake +[source,cmake] +---- # Поиск с помощью функции find_package find_package(LibXml2) find_package(CURL) -``` +---- Если для библиотеки нет модуля, выполняющего её поиск, то можно произвести поиск с помощью функции `find_library`. Например, -```cmake +[source,cmake] +---- # Поиск библиотеки с помощью функции find_library find_library(MATHGL mgl PATHS /usr/lib /usr/lib/x86_64-linux-gnu) find_library(MATHGLQT5 mgl-qt5 PATHS /usr/lib /usr/lib/x86_64-linux-gnu) -``` +---- - -### Автоматически генерируемый заголовочный файл +== Автоматически генерируемый заголовочный файл На этапе конфигурирования проекта можно создать файл, в который будут записаны параметры, полученные на данной стадии. В библиотеке CMLib присутствует функция `cmlib_config_hpp_generate()`, создающая файл `${CMAKE_BUILD_DIR}/include/config.hpp`, в который записывается -информация о имени и версии проекта, дате и типе сборки. +информация о имени и версии проекта, дате и типе сборки. -```cmake +[source,cmake] +---- # Автоматически генерируемый заголовочный файл cmlib_config_hpp_generate() -``` +---- +== Базовая библиотека -### Базовая библиотека +В файле `cmex/CMakeLists.txt` должна быть строка, включающая поиск файла +`CMakeLists.txt` в подкаталоге `src/lib`: -В файле `cmex/CMakeLists.txt` должна быть строка, включающая -поиск файла `CMakeLists.txt` в подкаталоге `src/lib`: - -```cmake +[source,cmake] +---- add_subdirectory(src/libcmex) -``` +---- В каталоге `cmex/src/libcmex` нужно создать файл `cmex.hpp`: -```cpp +[source,cpp] +---- #ifndef LIBCMEX_CMEX_HPP_ #define LIBCMEX_CMEX_HPP_ @@ -230,21 +233,23 @@ add_subdirectory(src/libcmex) int32_t cmex_init(int32_t i); #endif // LIBCMEX_CMEX_HPP_ -``` +---- файл `cmex.cpp`: -```cpp +[source,cpp] +---- #include "cmex.hpp" int32_t cmex_init(int32_t i = 0) { - return i; + return i; } -``` +---- и файл `CMakeLists.txt`: -```cmake +[source,cmake] +---- # Название основной цели и имя библиотеки в текущем каталоге set(current_target cmex) @@ -274,21 +279,22 @@ if(BUILD_SHARED_LIBS) endif() install(FILES ${CMAKE_BINARY_DIR}/include/config.hpp ${current_target_headers} COMPONENT headers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${current_target}) -``` +---- +== Базовое приложение -### Базовое приложение +В файле `cmex/CMakeLists.txt` должна быть строка, включающая поиск файла +`CMakeLists.txt` в подкаталоге `src/cmex`: -В файле `cmex/CMakeLists.txt` должна быть строка, включающая поиск файла `CMakeLists.txt` -в подкаталоге `src/cmex`: - -```cmake +[source,cmake] +---- add_subdirectory(src/cmex) -``` +---- В каталоге `cmex/src/cmex` нужно создать файл `main.cpp`: -```cpp +[source,cpp] +---- #include "compiler_features.hpp" #include "config.hpp" @@ -297,18 +303,18 @@ add_subdirectory(src/cmex) #include "cmex.hpp" int main(int argc, char **argv) { - std::cout << CMEX_COMPILER_VERSION_MAJOR << std::endl; // Значение из compiler_features.hpp - std::cout << BUILD_TYPE << std::endl; // Значение из config.hpp - std::cout << CMEX_VERSION_STR << std::endl; // Значение из config.hpp - std::cout << cmex_init(4) << std::endl; // Функция из внутренней библиотеки - return 0; + std::cout << CMEX_COMPILER_VERSION_MAJOR << std::endl; // Значение из compiler_features.hpp + std::cout << BUILD_TYPE << std::endl; // Значение из config.hpp + std::cout << CMEX_VERSION_STR << std::endl; // Значение из config.hpp + std::cout << cmex_init(4) << std::endl; // Функция из внутренней библиотеки + return 0; } - -``` +---- и файл `CMakeLists.txt`: -```cmake +[source,cmake] +---- # Название основной цели в текущем каталоге set(current_target cmex_app) @@ -343,15 +349,15 @@ target_link_libraries(${current_target} cmex_static) # Правила для установки install(TARGETS ${current_target} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) -``` +---- - -### Подключение внешнего проекта +== Подключение внешнего проекта В каталоге `cmex/thirdparty` нужно создать каталог `cmext` с проектом, состоящим из файлов `cmext.hpp`: -```c +[source,c] +---- #ifndef CMEXT_CMEXT_HPP_ #define CMEXT_CMEXT_HPP_ @@ -360,21 +366,23 @@ install(TARGETS ${current_target} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) int32_t cmext_init(int32_t i); #endif -``` +---- `cmext.cpp`: -```c +[source,c] +---- #include "cmext.hpp" int32_t cmext_init(int32_t i = 0) { - return i; + return i; } -``` +---- и `CMakeLists.txt`: -```cmake +[source,cmake] +---- cmake_minimum_required(VERSION 3.3) project(cmext) @@ -382,54 +390,60 @@ include(GNUInstallDirs) add_library(cmext cmext.cpp) install(TARGETS cmext ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(FILES cmext.hpp COMPONENT headers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${CMAKE_PROJECT_NAME}) -``` +---- В файле `cmex/CMakeLists.txt` нужно подключить стандартный модуль `ExternalProject` и описать правила для его загрузки, настройки, компиляции и установки для сопряжения с текущим проектом: -```cmake +[source,cmake] +---- # Подключение внешних проектов include(ExternalProject) ExternalProject_Add(cmext EXCLUDE_FROM_ALL TRUE - SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/libcmext + SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/cmext INSTALL_DIR ${CMAKE_BINARY_DIR} DOWNLOAD_COMMAND "" BUILD_BYPRODUCTS /lib/libcmext.a CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_BUILD_TYPE=Release ) -``` +---- -Вызовы этих функций нужно сделать до функций `add_subdirectories`, -чтобы в подключенных подкаталогах можно было использовать цель `cmext` -для определения зависимостей. +Вызовы этих функций нужно сделать до функций `add_subdirectories`, чтобы +в подключенных подкаталогах можно было использовать цель `cmext` для +определения зависимостей. -В файле `cmex/src/cmex/CMakeLists.txt` нужно подключить внешний проект `cmext`: +В файле `cmex/src/cmex/CMakeLists.txt` нужно подключить внешний проект +`cmext`: -```cmake +[source,cmake] +---- # Зависимость от библиотеки из внешнего проекта проекта add_dependencies(${current_target} cmext) -``` +---- -```cmake +[source,cmake] +---- # Добавление каталога, в который устанавливаются заголовочные файлы от внешнего # проекта cmext, к списку путей для поиска заголовочных файлов target_include_directories(${current_target} PUBLIC $) -``` +---- -```cmake +[source,cmake] +---- # Библиотека из внешнего проекта cmext target_link_libraries(${current_target} ${CMAKE_BINARY_DIR}/lib/libcmext.a) -``` +---- -Для проверки работоспособности в файле `cmex/src/cmex/main.cpp` нужно вызвать -функцию `cmext_init` из библиотеки, предоставляемой внешним проектом. -Например: +Для проверки работоспособности в файле `cmex/src/cmex/main.cpp` нужно +вызвать функцию `cmext_init` из библиотеки, предоставляемой внешним +проектом. Например: -```cpp +[source,cpp] +---- #include "compiler_features.hpp" #include "config.hpp" @@ -456,43 +470,44 @@ int main(int argc, char **argv) { // Функция из внешней библиотеки qStdOut() << QObject::tr("libcmext function call: ") << cmext_init(9) << endl; - return 0; + return 0; } -``` +---- +== Qt5 -### Qt5 +Для поиска необходимых компонентов Qt5 нужно в файл +`cmex/CMakeLists.txt` добавить строки: -Для поиска необходимых компонентов Qt5 нужно в файл `cmex/CMakeLists.txt` -добавить строки: - -```cmake +[source,cmake] +---- find_package(Qt5 COMPONENTS Core Network Gui Widgets DBus Concurrent Sql REQUIRED) -``` +---- -Библиотека CMLib автоматически подключает вызов препроцессора `moc` -и компилятора ресурсов `rcc`, если цель использует модуль `Core`, и +Библиотека CMLib автоматически подключает вызов препроцессора `moc` и +компилятора ресурсов `rcc`, если цель использует модуль `Core`, и вызывает компилятор файлов описания интерфейса, если цель использует модуль `Widgets`. - -### Консольное приложение +== Консольное приложение В файл `cmex/src/cmex/CMakeLists.txt` добавить строки: -```cmake +[source,cmake] +---- # Qt5 qt_translation(TARGET ${current_target} TS_DIR ${CMAKE_SOURCE_DIR}/l10n LANGUAGES ru_RU) target_include_directories(${current_target} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) target_compile_options(${current_target} PUBLIC "${Qt5Core_EXECUTABLE_COMPILE_FLAGS}") target_link_libraries(${current_target} Qt5::Core) -``` +---- -Для проверки работоспособности подключения Qt5 файл `cmex/src/cmex/main.cpp` -нужно заменить на: +Для проверки работоспособности подключения Qt5 файл +`cmex/src/cmex/main.cpp` нужно заменить на: -```cpp +[source,cpp] +---- #include "compiler_features.hpp" #include "config.hpp" @@ -509,13 +524,13 @@ QTextStream& qStdOut() } int main(int argc, char **argv) { - QCoreApplication app(argc, argv); - QTranslator translator; + QCoreApplication app(argc, argv); + QTranslator translator; - if (translator.load(QLocale(), "cmex_app", QLatin1String("_"), QLatin1String(":/qm"))) - { - app.installTranslator(&translator); - } + if (translator.load(QLocale(), "cmex_app", QLatin1String("_"), QLatin1String(":/qm"))) + { + app.installTranslator(&translator); + } // Значение из compiler_features.hpp qStdOut() << QObject::tr("Compiler version: ") << CMEX_COMPILER_VERSION_MAJOR << endl; // Значение из config.hpp @@ -527,30 +542,32 @@ int main(int argc, char **argv) { // Функция из внешней библиотеки qStdOut() << QObject::tr("libcmext function call: ") << cmext_init(9) << endl; - return 0; + return 0; } -``` +---- -После сборки проекта в каталоге `cmex/l10n` появится файл `cmex_app_ru_RU.ts`, -в котором нужно отредактировать переводы с помощью программы `linguist`. -После сохранения переводов проект нужно пересобрать, файл переводов в -скопилированном виде будет встроен в исполняемый файл `cmex`, а доступ -к нему будет осуществляться с помощью кода: +После сборки проекта в каталоге `cmex/l10n` появится файл +`cmex_app_ru_RU.ts`, в котором нужно отредактировать переводы с помощью +программы `linguist`. После сохранения переводов проект нужно +пересобрать, файл переводов в скомпилированном виде будет встроен в +исполняемый файл `cmex`, а доступ к нему будет осуществляться с помощью +кода: -```cpp - if (translator.load(QLocale(), "cmex_app", QLatin1String("_"), QLatin1String(":/qm"))) - { - app.installTranslator(&translator); - } -``` +[source,cpp] +---- + if (translator.load(QLocale(), "cmex_app", QLatin1String("_"), QLatin1String(":/qm"))) + { + app.installTranslator(&translator); + } +---- +== Графическое приложение -### Графическое приложение +Для создания минимального графического приложения нужно создать файл +описания интерфейса `cmex/src/cmex/my_main_window.ui`: -Для создания минимального графического приложения нужно создать -файл описания интерфейса `cmex/src/cmex/my_main_window.ui`: - -```xml +[source,xml] +---- MyMainWindow @@ -571,11 +588,12 @@ int main(int argc, char **argv) { -``` +---- заголовочный файл `cmex/src/cmex/my_main_window.hpp`: -```cpp +[source,cpp] +---- #ifndef CMEX_MY_MAIN_WINDOW_HPP_ #define CMEX_MY_MAIN_WINDOW_HPP_ @@ -583,18 +601,20 @@ int main(int argc, char **argv) { #include "ui_my_main_window.h" class MyMainWindow : public QWidget, private Ui::MyMainWindow { - Q_OBJECT - public: - MyMainWindow(QWidget* parent = 0); - virtual ~MyMainWindow(); + Q_OBJECT + public: + MyMainWindow(QWidget* parent = 0); + virtual ~MyMainWindow(); }; #endif /* CMEX_MY_MAIN_WINDOW_HPP_ */ -``` +---- -и файл с реализацией конструктора и деструктора `cmex/src/cmex/my_main_window.cpp`: +и файл с реализацией конструктора и деструктора +`cmex/src/cmex/my_main_window.cpp`: -```cpp +[source,cpp] +---- #include "my_main_window.hpp" MyMainWindow::MyMainWindow(QWidget* parent) { @@ -604,12 +624,13 @@ MyMainWindow::MyMainWindow(QWidget* parent) { MyMainWindow::~MyMainWindow() { } -``` +---- Для отображения графического окна нужно заменить файл `cmex/src/cmex/main.cpp` на: -```cpp +[source,cpp] +---- #include "compiler_features.hpp" #include "config.hpp" @@ -628,13 +649,13 @@ QTextStream& qStdOut() } int main(int argc, char **argv) { - QApplication app(argc, argv); - QTranslator translator; + QApplication app(argc, argv); + QTranslator translator; - if (translator.load(QLocale(), "cmex_app", QLatin1String("_"), QLatin1String(":/qm"))) - { - app.installTranslator(&translator); - } + if (translator.load(QLocale(), "cmex_app", QLatin1String("_"), QLatin1String(":/qm"))) + { + app.installTranslator(&translator); + } // Значение из compiler_features.hpp qStdOut() << QObject::tr("Compiler version: ") << CMEX_COMPILER_VERSION_MAJOR << endl; @@ -647,16 +668,17 @@ int main(int argc, char **argv) { // Функция из внешней библиотеки qStdOut() << QObject::tr("libcmext function call: ") << cmext_init(9) << endl; - MyMainWindow* mmw = new MyMainWindow(); - mmw->show(); - return app.exec(); + MyMainWindow* mmw = new MyMainWindow(); + mmw->show(); + return app.exec(); } -``` +---- -В файле `cmex/src/cmex/CMakeLists.txt` добавить новые файлы -к списку файлов, используемых для компиляции: +В файле `cmex/src/cmex/CMakeLists.txt` добавить новые файлы к списку +файлов, используемых для компиляции: -```cmake +[source,cmake] +---- set(current_target_sources main.cpp my_main_window.cpp @@ -665,51 +687,51 @@ set(current_target_sources set(current_target_uis my_main_window.ui ) -``` +---- -```cmake +[source,cmake] +---- # Цель для создания исполняемого файла add_executable(${current_target} ${current_target_sources} ${current_target_uis}) -``` +---- -и добавить строки для подключения графических библиотек Qt5 -и соответствующих им заголовочных файлов: +и добавить строки для подключения графических библиотек Qt5 и +соответствующих им заголовочных файлов: -```cmake +[source,cmake] +---- target_include_directories(${current_target} SYSTEM PUBLIC ${Qt5Gui_INCLUDE_DIRS}) target_include_directories(${current_target} SYSTEM PUBLIC ${Qt5Widgets_INCLUDE_DIRS}) target_link_libraries(${current_target} Qt5::Gui) target_link_libraries(${current_target} Qt5::Widgets) -``` +---- Во время сборки проекта в файл переводов `cmex/l10n/cmex_app_ru_RU.ts` -будут добавлены повые строки, их нужно перевести с помощью `linguist` -и снова скомпилировать проект. +будут добавлены новые строки, их нужно перевести с помощью `linguist` и +снова скомпилировать проект. - - -### Удаление установленных файлов +== Удаление установленных файлов В библиотеку CMLib добавлена цель `uninstall`, позволяющая удалить файлы, перечисленные в файле `${CMAKE_BUILD_DIR}/install_manifest.txt`. +== Архивирование проекта -### Архивирование проекта +Стандартный модуль `CPack` осуществляет архивирование проекта. В файле +`cproj/cmake/etc/cpack_ignore.txt` определён список типовых масок файлов +для исключения из архива: -Стандарный модуль `CPack` осуществляет архивирование проекта. В файле -`cproj/cmake/etc/cpack_ignore.txt` определён список типовых масок файлов для -исключения из архива: - -``` +.... .git$ files/var CMakeLists.txt.user ~$ -\\\\..*\\\\.bak$ \\\\..*\\\\.tmp$ +\\\\..*\\\\.bak$ \\\\..*\\\\.swp$ -``` +\\\\..*\\\\.o$ +.... -По умолчанию цель для упаковки проекта называется `package_source`. -В библиотеке CMLib определены значения основных параметров, а также +По умолчанию цель для упаковки проекта называется `package_source`. В +библиотеке CMLib определены значения основных параметров, а также дополнительная цель `dist`. diff --git a/wiki/Prog/Development/Intel Parallel Studio.adoc b/wiki/Prog/Development/Intel Parallel Studio.adoc new file mode 100644 index 0000000..f89d557 --- /dev/null +++ b/wiki/Prog/Development/Intel Parallel Studio.adoc @@ -0,0 +1,39 @@ += Intel Parallel Studio: установка в образ для чтения +:title-separator: {sp}| +:category: Linux/Программы +:tags: Linux, Intel, компилятор, C++, + +Для установки и использования Intel Parallel Studio в сжатом образе +доступном только для чтения необходимо: + +[arabic] +. Скачать +https://software.intel.com/en-us/parallel-studio-xe[дистрибутив] и +распаковать его. +. Скачать файл link:files/parallel-studio/silent.cfg[`silent.cfg`] и +скопировать его в полученный каталог. +. Если есть файл лицензии `parallel_studio.lic`, скопировать его в +каталог `/opt/intel/licenses`. +. Добавить полномочия для сбора статистики: + +[source,sh] +---- +sudo setcap cap_sys_ptrace=eip /opt/intel/vtune_amplifier/bin64/amplxe-cl +sudo setcap cap_sys_ptrace=eip /opt/intel/vtune_amplifier/bin64/amplxe-perf +---- + +[arabic, start=5] +. От суперпользователя установить в каталог `/opt/intel` командой +`sudo ./install.sh -s silent.cfg`. +. Создать образ +`mksquashfs /opt/intel/* /home/user/intel.sfs -comp xz -Xbcj x86 -all-root -b 512K` +. Удалить содержимое каталога `/opt/intel`. +. Примонтировать образ: +`mount -t squashfs /home/user/intel.sfs /opt/intel` +. Добавить в файл `/home/user/.bashrc` строки: + +[source,sh] +---- +source /opt/intel/bin/compilervars.sh intel64 +source /opt/intel/vtune_amplifier/amplxe-vars.sh +---- diff --git a/wiki/Prog/Development/Intel Parallel Studio.md b/wiki/Prog/Development/Intel Parallel Studio.md deleted file mode 100644 index 3e7452a..0000000 --- a/wiki/Prog/Development/Intel Parallel Studio.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "Intel Parallel Studio: установка в образ для чтения" -category: Linux/Программы -tags: Linux, Intel, компилятор, C++ -summary: -... - -Для установки и использования Intel Parallel Studio -в сжатом образе доступном только для чтения необходимо: - -1. Скачать [дистрибутив](https://software.intel.com/en-us/parallel-studio-xe) и распаковать его. -2. Скачать файл [`silent.cfg`](files/parallel-studio/silent.cfg) и скопировать его в полученный каталог. -3. Если есть файл лицензии `parallel_studio.lic`, скопировать его в каталог `/opt/intel/licenses`. -4. От суперпользователя установить в каталог `/opt/intel` командой `sudo ./install.sh -s silent.cfg`. -5. Создать образ `mksquashfs /opt/intel/* /home/user/intel.sfs -comp xz -Xbcj x86 -all-root -b 512K` -6. Удалить содержимое каталога `/opt/intel`. -7. Подмонтировать образ: `mount -t squashfs /home/user/intel.sfs /opt/intel` -8. Добавить в файл `/home/user/.bashrc` строки: -```sh -source /opt/intel/bin/compilervars.sh intel64 -source /opt/intel/vtune_amplifier/amplxe-vars.sh -``` diff --git a/wiki/Prog/Development/PVS-Studio.md b/wiki/Prog/Development/PVS-Studio.adoc similarity index 61% rename from wiki/Prog/Development/PVS-Studio.md rename to wiki/Prog/Development/PVS-Studio.adoc index 03b5a55..7cd789d 100644 --- a/wiki/Prog/Development/PVS-Studio.md +++ b/wiki/Prog/Development/PVS-Studio.adoc @@ -1,59 +1,62 @@ ---- -title: "PVS-Studio" -category: Программирование -tags: программирование, C, C++, отладка, -summary: -toc: yes -... += PVS-Studio +:category: Программирование +:tags: программирование, C, C++, отладка, -[TOC] +:toc: -### Информация и лицензия +== Информация и лицензия -[PVS-Studio](https://www.viva64.com/ru/pvs-studio/) — это инструмент для -статического анализа исходного кода программ, написанных на языках С, C++. +https://www.viva64.com/ru/pvs-studio/[PVS-Studio] — это инструмент для +статического анализа исходного кода программ, написанных на языках С, +C++. Для использования в Linux нужно чтобы в каталоге `~/.config/PVS-Studio` находился лицензионный ключ или в начале исходных файлов с расширениями -`*.c`, `*.cpp`, `*.cxx` и т.п. [присутствовали строки](https://www.viva64.com/ru/b/0457/) +`*.c`, `*.cpp`, `*.cxx` и т.п. +https://www.viva64.com/ru/b/0457/[присутствовали строки] -``` +.... // This is an independent project of an individual developer. Dear PVS-Studio, please check it. // PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com -``` +.... -### Настройка и компиляция проекта +== Настройка и компиляция проекта Полное руководство для работы в Linux находится -[здесь](https://www.viva64.com/ru/m/0036/), а ниже приведён список типовых команд. +https://www.viva64.com/ru/m/0036/[здесь], а ниже приведён список типовых +команд. Настройка проекта для CMake: -```sh +[source,sh] +---- cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=On -``` +---- Сборка проекта с помощью `make`: -```sh +[source,sh] +---- pvs-studio-analyzer trace -- make -j$(nproc) -``` +---- Настройка и сборка проекта с использованием Ninja: -```sh +[source,sh] +---- cmake -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=On ninja -t compdb -``` +---- -### Анализ проекта +== Анализ проекта -Для анализа проектов используется утилита `pvs-studio-analyzer`. По умолчанию -включены только диагностики общего назначения (General Analysis, GA). -Включить дополнительные правила можно с помощью опции `-a`: +Для анализа проектов используется утилита `pvs-studio-analyzer`. По +умолчанию включены только диагностики общего назначения (General +Analysis, GA). Включить дополнительные правила можно с помощью опции +`-a`: -``` +.... -a [MODE], --analysis-mode [MODE] MODE defines the type of warnings: 1 - 64-bit errors; @@ -64,45 +67,50 @@ ninja -t compdb 32 - MISRA. Modes can be combined by adding the values Default: 4 -``` +.... Выбор типов предупреждений осуществляется на основе побитовой маски из -приведенных выше типов. Чтобы выполнить анализ, исключив проверки MISRA, +приведённых выше типов. Чтобы выполнить анализ, исключив проверки MISRA, нужно выполнить -```sh +[source,sh] +---- pvs-studio-analyzer analyze -a 29 -j$(nproc) -o pvs.log -``` +---- Составление отчёта для просмотра в Qt Creator: -```sh +[source,sh] +---- plog-converter -t tasklist -o pvs.tasks pvs.log -``` +---- -При составлении отчёта уровень детализации можно изменять с помощью ключа -`-a` (`--analyzer`), который производит фильтрацию предупреждений согласно -маске, которая имеет вид `MessageType:MessageLevels`, где `MessageType` -может принимать один из следующих типов: `GA`, `OP`, `64`, `CS`, `MISRA`, -а `MessageLevels` может принимать значения от `1` до `3`. +При составлении отчёта уровень детализации можно изменять с помощью +ключа `-a` (`--analyzer`), который производит фильтрацию предупреждений +согласно маске, которая имеет вид `MessageType:MessageLevels`, где +`MessageType` может принимать один из следующих типов: `GA`, `OP`, `64`, +`CS`, `MISRA`, а `MessageLevels` может принимать значения от `1` до `3`. Возможна комбинация разных масок через `;`. Например, при составлении отчёта для просмотра в формате HTML можно повысить уровень детализации: -```sh +[source,sh] +---- plog-converter -t fullhtml -a "GA:1,2,3;64:1;OP:1,2;CS:1,2" -o html pvs.log -``` +---- Составление отчёта для редактора Vim: -```sh +[source,sh] +---- plog-converter -a "GA:1,2" -t errorfile -o pvs.err pvs.log -``` +---- -Для просмотра отчёта в редакторе Vim нужно открыть файл `pvs.err` и выполнить команды: +Для просмотра отчёта в редакторе Vim нужно открыть файл `pvs.err` и +выполнить команды: -```vim +[source,vim] +---- :set makeprg=cat\ % " выбор программы для компиляции в текущей сессии :silent make " имитация сборки :cw " открытие результатов в нижнем окне -``` - +---- diff --git a/wiki/Prog/Development/Подбор ключей компиляции GCC.adoc b/wiki/Prog/Development/Подбор ключей компиляции GCC.adoc new file mode 100644 index 0000000..cbc4d77 --- /dev/null +++ b/wiki/Prog/Development/Подбор ключей компиляции GCC.adoc @@ -0,0 +1,36 @@ += Подбор ключей компиляции GCC +:category: Программирование +:tags: программирование, C, C++, отладка, оптимизация, + +Подбор ключей компиляции основан на измерениях характеристик во время +выполнения программы. На первом этапе создаётся исполняемый файл +`program`, в который включается информация для профилировки. Ключ +`-fprofile-generate=data/pgo` указывает, что нужно собирать информацию и +сохранять в каталог `data/pgo`. Компиляцию следует выполнять в +последовательном режиме. + +[source,sh] +---- +env CXXFLAGS='-fprofile-generate=data/pgo' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" +make -j1 +---- + +После компиляцию программу следует выполнить, придерживаясь типичного +сценария использования. + +[source,sh] +---- +./program +---- + +Скомпилировать программу с использованием полученной статистики. Для +многопоточной программы следует указать флаг `-fprofile-correction`, +чтобы скорректировать данные, которые могут неустойчивыми из-за +пропусков обновлений счётчиков. Компиляцию следует выполнять в +последовательном режиме. + +[source,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/Подбор ключей компиляции GCC.md b/wiki/Prog/Development/Подбор ключей компиляции GCC.md deleted file mode 100644 index fbdb4c1..0000000 --- a/wiki/Prog/Development/Подбор ключей компиляции GCC.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -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/Профилирование кода.adoc b/wiki/Prog/Development/Профилирование кода.adoc new file mode 100644 index 0000000..50cd66e --- /dev/null +++ b/wiki/Prog/Development/Профилирование кода.adoc @@ -0,0 +1,77 @@ += Профилирование кода +:category: Программирование +:tags: программирование, отладка, производительность, профилирование, gprof, + +== Общее описание + +Чтобы профилировать приложения, компилируемые http://gcc.gnu.org[GCC], +необходимо добавлять флаг `-fno-omit-frame-pointer` и, желательно, `-g`. + +== quickstack + +Утилита для отслеживания стеков вызовов функций +https://github.com/yoshinorim/quickstack[quicktrack]. Пример +использования: + +[source,sh] +---- +quickstack -f -p $(pidof application) +---- + +== perf + +Утилита профилирования для ядра Linux (находится в дереве его исходных +текстов в каталоге `tools/perf`). + +[source,sh] +---- +perf record --call-graph dwarf -- ./application +perf report -g graph --no-children +---- + +Полезные ссылки: + +* 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[Примеры] + +== oprofile + +[source,sh] +---- +opcontrol --setup --vmlinux=/boot/vmlinux-`uname -r` +---- + +== Systemtap + +https://eax.me/systemtap/[Установка и простые примеры использования +SystemTap] + +== Valgrind + +https://eax.me/valgrind/[Хорошая статья] об использовании Valgrind для +поиска утечек, а также о взаимодействии с GDB. + +В версии 3.15 добавление инструмент профилирования кучи DHAT (Dynamic +Heap Analysis Tool), позволяющий отследить все запросы на распределения +памяти в куче и выявить утечки ресурсов, места излишне большой +активности при работе с кучей, неиспользованные выделения памяти, +краткосрочные выделения и неэффективное размещение данных в куче. + +[source,sh] +---- +valgrind --tool=dhat ./application +---- + +== gperftools + +== Разное + +* https://eax.me/c-cpp-profiling/[Профилирование кода на C/C++ в Linux и +FreeBSD] +* http://gernotklingler.com/blog/gprof-valgrind-gperftools-evaluation-tools-application-level-cpu-profiling-linux/[Примеры] + +== Графическое отображение + +* http://www.brendangregg.com/flamegraphs.html[Flame Graphs] +* https://github.com/jrfonseca/gprof2dot[gprof2dot] diff --git a/wiki/Prog/Development/Профилирование кода.md b/wiki/Prog/Development/Профилирование кода.md deleted file mode 100644 index 4a6b2b3..0000000 --- a/wiki/Prog/Development/Профилирование кода.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -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`). - -```sh -perf record --call-graph dwarf -- ./application -perf report -g graph --no-children -``` - -Полезные ссылки: - -* [Официальная страница](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) - -## oprofile - -```sh -opcontrol --setup --vmlinux=/boot/vmlinux-`uname -r` -``` - -## Systemtap - -[Установка и простые примеры использования SystemTap](https://eax.me/systemtap/) - - -## Valgrind - - -[Хорошая статья](https://eax.me/valgrind/) об использовании Valgrind для поиска -утечек, а также о взаимодействии с GDB. - -В версии 3.15 добавление инструмент профилирования кучи DHAT (Dynamic -Heap Analysis Tool), позволяющий отследить все запросы на распределения -памяти в куче и выявить утечки ресурсов, места излишне большой активности -при работе с кучей, неиспользованные выделения памяти, краткосрочные -выделения и неэффективное размещение данных в куче. - -```sh -valgrind --tool=dhat ./application -``` - - -## 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/Development/Статический анализ кода.md b/wiki/Prog/Development/Статический анализ кода.adoc similarity index 56% rename from wiki/Prog/Development/Статический анализ кода.md rename to wiki/Prog/Development/Статический анализ кода.adoc index a4a00fa..ef5b8e3 100644 --- a/wiki/Prog/Development/Статический анализ кода.md +++ b/wiki/Prog/Development/Статический анализ кода.adoc @@ -1,33 +1,33 @@ ---- -title: "Статический анализ кода" -category: Программирование -tags: программирование, отладка, cppcheck, iwyu, clang-tidy, cpplint, clazy, -summary: -... += Статический анализ кода +:category: Программирование +:tags: программирование, отладка, cppcheck, iwyu, clang-tidy, cpplint, clazy, -## Общее описание +== Общее описание -Ниже приведены утилиты для проверки кода на C++ и примеры их настройки и использования -совместно с [CMake](https://cmake.org/). +Ниже приведены утилиты для проверки кода на C++ и примеры их настройки и +использования совместно с https://cmake.org/[CMake]. -### [clang-tidy](http://clang.llvm.org/extra/clang-tidy/) +=== http://clang.llvm.org/extra/clang-tidy/[clang-tidy] Установка: -```sh +[source,sh] +---- sudo apt-get install clang-tidy-6.0 -``` +---- Использование: -```sh +[source,sh] +---- cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-6.0" path/to/source -``` +---- -В каталоге проекта нужно создать файл `.clang-tidy` в формате YAML со списком -выполняемых проверок. Например: +В каталоге проекта нужно создать файл `.clang-tidy` в формате YAML со +списком выполняемых проверок. Например: -```yaml +[source,yaml] +---- --- Checks: '-*, clang-diagnostic-*, @@ -42,91 +42,97 @@ CheckOptions: - key: readability-identifier-naming.ClassMemberCase value: camelBack ... -``` +---- -Пример файла `.clang-tidy`, в котором перечислены все правила для проверки -именования идентификаторов приведён [здесь](https://git.246060.ru/f1x1t/clang-tidy-readability-identifier-naming). +Пример файла `.clang-tidy`, в котором перечислены все правила для +проверки именования идентификаторов приведён +https://git.246060.ru/f1x1t/clang-tidy-readability-identifier-naming[здесь]. - -### CppCheck +=== CppCheck Установка: -```sh +[source,sh] +---- sudo apt-get install cppcheck -``` +---- Использование: -```sh +[source,sh] +---- cmake "-DCMAKE_CXX_CPPCHECK=/usr/bin/cppcheck;--std=c++11" path/to/source -``` +---- -This will run /usr/bin/cppcheck;–std=c++11″ –source=/path/to/source/file.cxx on each c++ file in the project being built. +This will run /usr/bin/cppcheck;–std=c++11″ +–source=/path/to/source/file.cxx on each c++ file in the project being +built. - -### CppLint +=== CppLint Установка: -```sh +[source,sh] +---- sudo apt-get install python3-cpplint -``` +---- Использование: -```sh +[source,sh] +---- cmake "-DCMAKE_CXX_CPPLINT=/usr/bin/cpplint;--linelength=79" path/to/source -``` +---- -```sh +[source,sh] +---- make -j24 2>&1 1>/dev/null | ../cpplint2tasks.pl > 222.tasks -``` +---- -This will run /usr/local/bin/cpplint –linelength=79 on each c++ file in the project being built. +This will run /usr/local/bin/cpplint –linelength=79 on each c++ file in +the project being built. - -### IWYU +=== IWYU Установка: -```sh +[source,sh] +---- sudo apt-get install iwyu -``` +---- Использование: - -```sh +[source,sh] +---- cmake "-DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=/usr/bin/iwyu;--transitive_includes_only" .. -``` +---- +This will run /usr/bin/iwyu –transitive_includes_only on each c++ file +in the project being built. -This will run /usr/bin/iwyu –transitive_includes_only on each c++ file in the project being built. +=== LWYU - -### LWYU - -```sh +[source,sh] +---- cmake -DCMAKE_LINK_WHAT_YOU_USE=TRUE .. -``` - -### Clazy +---- +=== Clazy Установка: -```sh +[source,sh] +---- sudo apt-get install clazy clang-6.0 -``` +---- Использование: -```sh +[source,sh] +---- CLAZY_CHECKS=level2 cmake -DCMAKE_CXX_COMPILER=clazy .. CLANGXX=clang++-6.0 make -``` - - -### PVS-Studio +---- +=== PVS-Studio diff --git a/wiki/Prog/GIS/Построение профиля местности в QGis.adoc b/wiki/Prog/GIS/Построение профиля местности в QGis.adoc new file mode 100644 index 0000000..bddeb67 --- /dev/null +++ b/wiki/Prog/GIS/Построение профиля местности в QGis.adoc @@ -0,0 +1,49 @@ += Построение профиля местности в Gis +:category: Картография +:tags: картография, qgis, sxf, shp, gdal, + +[arabic] +. В главном меню QGis *Слой* — *Добавить слой* — *Добавить векторный +слой* выбрать и открыть файл с векторным слоем, например, `map.sxf`. +. Среди слоёв выбрать слой с рельефом местности и типом геометрии +`LineString`. + +image:qgis-heights/1.png[Слои карты] + +[arabic, start=3] +. На панели *Панель слоёв* правой кнопкой мыши щёлкнуть на слое, +содержащем данные о высотах, и выбрать *Фильтр…*. +. Построить выражение выбирающие только данные с высотами, например, +`"CLNAME" ILIKE '%ГОРИЗОНТАЛИ ОСНОВ%'` и нажить *OK*. +. На панели *Панель слоёв* правой кнопкой мыши щёлкнуть на слое, +содержащем данные о высотах, и выбрать *Сохранить как…*. Появившийся +новый слой *heights* следует удалить. +. В появившемся диалоговом окне выбрать имя выходного файла, например, +`heights`. + +image:qgis-heights/2.png[Имя выходного файла] + +[arabic, start=7] +. В каталоге `/home/a/work/map` выполнить команду, которая в файле +`heights.shp` из слоя `heights` берёт данные о высотах из поля `SC_4` и +генерирует матрицу высот размером 2000 на 2000 в формате BMP. Настойки +алгоритма построения матрицы можно изменять с помощью параметра `-a`: + +[source,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 +---- + +[arabic, start=8] +. После построения матрицы её можно импортировать в QGis как растровый +слой, для этого в главном меню QGis *Слой* — *Добавить слой* — *Добавить +растровый слой* нужно выбрать и открыть файл `heights.bmp`. В результате +на панели *Панель слоёв* появится растровый слой *heights*. +. С помощью модуля Profile Tool можно построить профиль местности. В +главном меню нужно выбрать *Модуль* — *Profile Tool* — *Terrain +profile*. +. На панели *Панель слоёв* нужно перенести растровый слой *heights* в +конец списка, выделить его и на панели *Profile Tool* нажать *Add +Layer*. После этого на карте можно строить профили местности. + +image:qgis-heights/3.png[Матрица высот] diff --git a/wiki/Prog/GIS/Построение профиля местности в QGis.md b/wiki/Prog/GIS/Построение профиля местности в QGis.md deleted file mode 100644 index af8c0c4..0000000 --- a/wiki/Prog/GIS/Построение профиля местности в QGis.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Построение профиля местности в QGis" -category: Картография -tags: картография, qgis, sxf, shp, gdal, -summary: -... - - -1) В главном меню QGis **Слой** — **Добавить слой** — **Добавить векторный слой** -выбрать и открыть файл с векторным слоем, например, `map.sxf`. - -2) Среди слоёв выбрать слой с рельефом местности и типом геометрии `LineString`. - -![Слои карты](images/qgis-heights/1.png) - -3) На панели **Панель слоёв** правой кнопкой мыши щелкнуть на слое, -содержащем данные о высотах, и выбрать **Фильтр...**. - -4) Построить выражение выбирающие только данные с высотами, например, -`"CLNAME" ILIKE '%ГОРИЗОНТАЛИ ОСНОВ%'` и нажить **OK**. - -5) На панели **Панель слоёв** правой кнопкой мыши щелкнуть на слое, -содержащем данные о высотах, и выбрать **Сохранить как...**. Появившийся -новый слой **heights** следует удалить. - -6) В появившемся диалоговом окне выбрать имя выходного файла, например, `heights`. - -![Имя выходного файла](images/qgis-heights/2.png) - -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**. - -9) С помощью модуля Profile Tool можно построить профиль местности. В главном -меню нужно выбрать **Модуль** — **Profile Tool** — **Terrain profile**. - -10) На панели **Панель слоёв** нужно перенести растровый слой **heights** -в конец списка, выделить его и на панели **Profile Tool** нажать **Add Layer**. -После этого на карте можно строить профили местности. - -![Матрица высот](images/qgis-heights/3.png) diff --git a/wiki/Prog/Git/.asciidoctor/diagram/diag-81886ef1b8d31cdb2b865473bbeb2cf9.png.cache b/wiki/Prog/Git/.asciidoctor/diagram/diag-81886ef1b8d31cdb2b865473bbeb2cf9.png.cache new file mode 100644 index 0000000..1c6e257 --- /dev/null +++ b/wiki/Prog/Git/.asciidoctor/diagram/diag-81886ef1b8d31cdb2b865473bbeb2cf9.png.cache @@ -0,0 +1 @@ +{"checksum":"81886ef1b8d31cdb2b865473bbeb2cf9","width":671,"height":550} \ No newline at end of file diff --git a/wiki/Prog/Git/.asciidoctor/diagram/diag-e76d88ee3db613b3f806d8c773281fdc.png.cache b/wiki/Prog/Git/.asciidoctor/diagram/diag-e76d88ee3db613b3f806d8c773281fdc.png.cache new file mode 100644 index 0000000..66ea5d8 --- /dev/null +++ b/wiki/Prog/Git/.asciidoctor/diagram/diag-e76d88ee3db613b3f806d8c773281fdc.png.cache @@ -0,0 +1 @@ +{"checksum":"e76d88ee3db613b3f806d8c773281fdc","width":685,"height":363} \ No newline at end of file diff --git a/wiki/Prog/Git/Git автоматическое сохранение в репозиторий.adoc b/wiki/Prog/Git/Git автоматическое сохранение в репозиторий.adoc new file mode 100644 index 0000000..524f924 --- /dev/null +++ b/wiki/Prog/Git/Git автоматическое сохранение в репозиторий.adoc @@ -0,0 +1,30 @@ += Git: автоматическое сохранение в репозиторий +:title-separator: {sp}| +:category: Программирование +:tags: программирование, git, + +Скрипт https://github.com/elnull/gitwatch[gitwatch] позволяет +отслеживать изменения в каталоге с помощью программы `inotifywait` и +фиксировать их в репозиторий. Для работы скрипта необходимо установить +пакет `inotify-tools`. Если нужно следить за каталогом `/home/user/dir` +и записывать историю изменений в `/home/user/repo/dir`, то нужно +инициализировать репозиторий: + +[source,sh] +---- +git init --bare /home/user/repo/dir +---- + +добавить шаблоны исключаемых файлов: + +[source,sh] +---- +printf '*.[oa]\n*.swp\n*~\n/.git' >> /home/user/repo/dir/info/exclude +---- + +и запустить скрипт: + +[source,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 deleted file mode 100644 index 2a9bdba..0000000 --- a/wiki/Prog/Git/Git автоматическое сохранение в репозиторий.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Git: автоматическое сохранение в репозиторий" -category: Программирование -tags: программирование, git, -... - -Скрипт [gitwatch](https://github.com/elnull/gitwatch) позволяет отслеживать -изменения в каталоге с помощью программы `inotifywait` и фиксировать их в -репозиторий. Для работы скрипта необходимо установить пакет `inotify-tools`. -Если нужно следить за каталогом `/home/user/dir` и записывать историю -изменений в `/home/user/repo/dir`, то нужно инициализировать репозиторий: - -```sh -git init --bare /home/user/repo/dir -``` - -добавить шаблоны исключаемых файлов: - -```sh -printf '*.[oa]\n*.swp\n*~\n/.git' >> /home/user/repo/dir/info/exclude -``` - -и запустить скрипт: - -```sh -./gitwatch.sh -g /home/user/repo/dir /home/user/dir -``` diff --git a/wiki/Prog/Git/Git замена адреса подмодуля.md b/wiki/Prog/Git/Git замена адреса подмодуля.adoc similarity index 55% rename from wiki/Prog/Git/Git замена адреса подмодуля.md rename to wiki/Prog/Git/Git замена адреса подмодуля.adoc index 4a1ee68..cb4706b 100644 --- a/wiki/Prog/Git/Git замена адреса подмодуля.md +++ b/wiki/Prog/Git/Git замена адреса подмодуля.adoc @@ -1,20 +1,17 @@ ---- -title: "Git: замена адреса подмодуля" -category: Программирование -tags: программирование, git, -monofontoptions: -- Scale=0.7 -... += Git: замена адреса подмодуля +:title-separator: {sp}| +:category: Программирование +:tags: программирование, git, Если у подмодуля, находящегося в каталоге `thirdparty/example` нужно -заменить адрес синхронизации и имя используемой ветки, то в каталоге -с файлом `.gitmodules`, в котором содержится информация об этом подмодуле, +заменить адрес синхронизации и имя используемой ветки, то в каталоге с +файлом `.gitmodules`, в котором содержится информация об этом подмодуле, нужно выполнить команды: -```sh +[source,sh] +---- git config --file=.gitmodules submodule.thirdparty/example.url https://github.com/username/ABC.git git config --file=.gitmodules submodule.thirdparty/example.branch new-branch-name git submodule sync --recursive git submodule update --init --recursive --remote -``` - +---- diff --git a/wiki/Prog/Git/Git основные команды.adoc b/wiki/Prog/Git/Git основные команды.adoc new file mode 100644 index 0000000..e0d5b34 --- /dev/null +++ b/wiki/Prog/Git/Git основные команды.adoc @@ -0,0 +1,301 @@ += Git: основные команды +:title-separator: {sp}| +:category: Программирование +:tags: программирование, git +:toc: + +== Ссылки + +* https://githowto.com/ru/changes_not_files[GitHowTo] +* https://git-scm.com/book/ru/v2[ProGit] +* https://github.com/maxliscia/git-pocket[Git Pocket Guide] + +== Установка + +В Debian/Ubuntu: + +[source,sh] +---- +sudo apt-get install git +---- + +== Термины + +[width="100%",cols="18%,20%,62%",options="header",] +|=== +|Термин |Англ |Определение +|Рабочий каталог |working tree, working directory |Набор файлов в +текущем каталоге + +|Репозиторий |repository, repo |Контейнер, хранящий историю изменений +файлов проекта + +|Индекс |index, staging area |Область между рабочим каталогом и +репозиторием, в котором осуществляется подготовка к фиксации + +|SHA-1 |SHA-1 |Уникальный идентификатор, отражающий информацию об +истории + +|Ветка |branch |Именованная последовательность в истории изменений + +|Фиксация (коммит) |commit |Набор файлов, записанных в историю +одновременно + +|`HEAD` |`HEAD` |Имя ссылки на последнюю фиксацию в текущей ветке + +|Метка |tag |Именованная ссылка на некоторую фиксацию в истории +|=== + +== Состояния + +Файлы в рабочем каталоге могут отслеживаться системой контроля версий +(tracked) или нет (untracked). Отслеживаемые файлы, которые на диаграмме +обозначены зелёным фоном, могут быть неизменёнными (unmodified), +изменёнными (modified) или подготовленными к фиксации (indexed). + + +[.text-center] +.Состояния +[plantuml] +---- +@startuml +participant untracked as "Неотслеживамые\n(untracked)" +box "Отслеживаемые" +participant staged as "Подготовленные к фиксации\n(indexed)" #55FF55 +participant unmodified as "Неизменённые\n(unmodified)" #99FF99 +participant modified as "Изменённые\n(modified)" #77FF77 +end box + +untracked -> staged : git add +staged -> unmodified : git commit +unmodified -> modified : редактирование +modified -> staged : git add +modified -> untracked: git rm --cached +unmodified -> untracked: git rm --cached +staged -> untracked: git rm --cached +@enduml +---- + +Основные команды, осуществляющие взаимодействие между рабочим каталогом, +индексом, локальным и удалённым репозиторием, приведены на диаграмме +ниже. + + +[.text-center] +.Команды +[plantuml] +---- +@startuml +participant workspace as "Рабочий каталог\n(working dir)" +participant index as "Индекс\n(index)" #77FF77 +participant local as "Локальный репозиторий\n(local repository)" #FF7777 +participant remote as "Удалённый репозиторий\n(remote repository)" #7777FF + +workspace -> local : git commit -a +workspace -> index : git add (-u) +index -> local : git commit +local -> remote : git push + +== Обновление с сервера == + +remote -> workspace : git pull (rebase) +remote -> local : fetch + +== Откат изменений == +local -[#red]> workspace : git checkout HEAD +index -[#red]> workspace : git checkout + +== Сравнение == +local -[#blue]> workspace : git diff HEAD +index -[#blue]> workspace : git diff + +@enduml +---- + +== Настройка + +[width="100%",cols="15%,35%,50%",options="header",] +|=== +|Команда |Ключи |Описание +|`git config` |`--global user.name "John Doe"` |Имя текущего +пользователя + +|`git config` |`--global user.email "mail@example.com"` |Почта текущего +пользователя + +|`git config` |`--list` |Вывод текущей конфигурации + +|`git config` |`--global --list` |Вывод глобальной конфигурации +|=== + +== Инициализация + +[width="100%",cols="15%,35%,50%",options="header",] +|=== +|Команда |Ключи |Описание +|`git init` |`` |Создать пустой репозиторий в каталоге `` + +|`git clone` |`` `` |Создать в каталоге `` копию +репозитория, находящегося по адресу `` + +|`git clone` |`--recursive ` `` |Создать в каталоге `` +копию репозитория, находящегося по адресу ``, с учётом +подмодулей +|=== + +== Подмодули + +[width="100%",cols="15%,25%,60%",options="header",] +|=== +|Команда |Ключи |Описание +|`git submodule` |`add ` |Добавить в каталог `` +текущего репозитория подмодуль, находящийся по адресу `` + +|`git submodule` |`update --recursive --remote` |Обновить подмодули + +|`git submodule` |`sync --recursive` |Заменить адреса подмодулей на +указанные в файле `.gitmodules` +|=== + +Удаление подмодуля: + +[source,sh] +---- +git submodule deinit +git rm +---- + +== Фиксация + +[width="100%",cols="15%,25%,60%",options="header",] +|=== +|Команда |Ключи |Описание +|`git add` |`` |Подготовить файл `` к фиксации + +|`git commit` | |Зафиксировать подготовленные файлы + +|`git commit` |`-a` |Зафиксировать все отслеживаемые файлы, которые были +изменены +|=== + +== Удаление + +[width="100%",cols="20%,20%,60%",options="header",] +|=== +|Команда |Ключи |Описание +|`git rm` |`` |Удалить файл из индекса и рабочего каталога + +|`git rm` |`-f ` |Принудительное удаление файла + +|`git rm` |`--cached ` |Удаление файла из проекта, но не из +рабочего каталога +|=== + +== Информация + +[cols=",,",options="header",] +|=== +|Команда |Ключи |Описание +|`git status` |`-s` |Вывод информации о рабочем каталоге в краткой форме +|`git log` |`--oneline` |Вывод журнала изменений в краткой форме +|`git ls-files` | |Вывод списка отслеживаемых и подготовленных файлов +|=== + +== Удалённый репозиторий + +[width="100%",cols="20%,20%,60%",options="header",] +|=== +|Команда |Ключи |Описание +|`git remote` |`-v` |Список адресов удалённых репозиториев + +|`git branch` |`-r` |Список веток в удалённых репозиториях + +|`git remote` |`add ` |Создать ссылку `` на удалённый +репозиторий, находящийся по адресу `` + +|`git remote` |`rename ` |Переименовать ссылку `` на +`` + +|`git remote` |`rm ` |Удалить ссылку `` +|=== + +* Обращение к удалённому репозиторию осуществляется по ссылке, +создаваемой командой `git remote` +* Команда `git clone` автоматически создаёт ссылку `origin` + +== Отправка изменений + +[width="100%",cols="20%,20%,60%",options="header",] +|=== +|Команда |Ключи |Описание +|`git push` |` ` |Отправить ветку `` в удалённый +репозиторий `` + +|`git push` |` --all` |Отправить все ветки в удалённый +репозиторий `` + +|`git push` |`--d ` |Удалить ветку `` из +удалённого репозитория `` +|=== + +== Получение изменений + +[width="100%",cols="20%,20%,60%",options="header",] +|=== +|Команда |Ключи |Описание +|`git fetch` |`` |Получить изменения из всех веток репозитория +``, но не выполнять слияние + +|`git fetch` |` ` |Получить изменения из ветки +`` репозитория ``, но не выполнять слияние + +|`git merge` |`/` |Выполнить слияние с веткой `` +репозитория `` + +|`git pull` |`` |Получение и слияние +|=== + +== Ветки + +[cols=",,",options="header",] +|=== +|Команда |Ключи |Описание +|`git branch` |`-a` |Список локальных и удалённых веток + +|`git branch` | |Список локальных веток + +|`git branch` |`` |Создать ветку `` + +|`git checkout` |`` |Перейти к фиксации с идентификатором +`` + +|`git branch` |`-m ` |Переименовать ветку `` в `` + +|`git merge` |`` |Слить изменения из ветки `` в текущую +ветку + +|`git branch` |`-d ` |Удалить ветку `` +|=== + +== Сравнение + +[width="100%",cols="20%,20%,60%",options="header",] +|=== +|Команда |Ключи |Описание +|`git diff` | |Сравнить рабочий каталог и индекс + +|`git diff` |`–-cached` |Сравнить индекс и последнюю фиксацию + +|`git diff` |`HEAD` |Сравнить последнюю фиксацию и рабочий каталог + +|`git diff` |`--stat` |Краткий вывод результатов + +|`git diff` |` ` |Сравнить две точки с указанными +идентификаторами + +|`git diff` |`` `` |Сравнивать только указанный каталог +`` или файл `` + +|`git difftool` | |Отобразить результаты сравнения в программе, +определяемой переменной `diff.tool` +|=== diff --git a/wiki/Prog/Git/Git основные команды.md b/wiki/Prog/Git/Git основные команды.md deleted file mode 100644 index ff23c96..0000000 --- a/wiki/Prog/Git/Git основные команды.md +++ /dev/null @@ -1,221 +0,0 @@ ---- -title: "Git: основные команды" -category: Программирование -tags: программирование, git -monofontoptions: -- Scale=0.8 -... - - - - -## Ссылки - -* [GitHowTo](https://githowto.com/ru/changes_not_files) -* [ProGit](https://git-scm.com/book/ru/v2) -* [Git Pocket Guide](https://github.com/maxliscia/git-pocket) - -## Установка - -В Debian/Ubuntu: - -```sh -sudo apt-get install git -``` - -## Термины - - -| Термин | Англ | Определение | -| ------ | ------ | ----------------------- | -| Рабочий каталог | working tree, working directory | Набор файлов в текущем каталоге | -| Репозиторий | repository, repo | Контейнер, хранящий историю изменений файлов проекта | -| Индекс | index, staging area | Область между рабочим каталогом и репозиторием, в которой осуществляется подготовка к фиксации | -| SHA-1 | SHA-1 | Уникальный идентификатор, отражающий информацию об истории | -| Ветка | branch | Именованная последовательность в истории изменений | -| Фиксация (коммит) | commit | Набор файлов, записанных в историю одновременно | -| `HEAD` | `HEAD` | Имя ссылки на последнюю фиксацию в текущей ветке | -| Метка | tag | Именованная ссылка на некоторую фиксацию в истории | - - -## Состояния - -Файлы в рабочем каталоге могут отслеживаться системой контроля версий -(tracked) или нет (untracked). Отслеживаемые файлы, которые на диаграмме -обозначены зелёным фоном, могут быть неизменёнными (unmodified), -изменёнными (modified) или подготовленными к фиксации (indexed). - -```plantuml -@startuml -participant untracked as "Неотслеживамые\n(untracked)" -box "Отслеживаемые" -participant staged as "Подготовленные к фиксации\n(indexed)" #55FF55 -participant unmodified as "Неизменённые\n(unmodified)" #99FF99 -participant modified as "Изменённые\n(modified)" #77FF77 -end box - -untracked -> staged : git add -staged -> unmodified : git commit -unmodified -> modified : редактирование -modified -> staged : git add -modified -> untracked: git rm --cached -unmodified -> untracked: git rm --cached -staged -> untracked: git rm --cached -@enduml -``` - -Основные команды, осуществляющие взаимодействие между рабочим каталогом, -индексом, локальным и удалённым репозиторием, приведены на диаграмме ниже. - -```plantuml -@startuml -participant workspace as "Рабочий каталог\n(working dir)" -participant index as "Индекс\n(index)" #77FF77 -participant local as "Локальный репозиторий\n(local repository)" #FF7777 -participant remote as "Удалённый репозиторий\n(remote repository)" #7777FF - -workspace -> local : git commit -a -workspace -> index : git add (-u) -index -> local : git commit -local -> remote : git push - -== Обновление с сервера == - -remote -> workspace : git pull (rebase) -remote -> local : fetch - -== Откат изменений == -local -[#red]> workspace : git checkout HEAD -index -[#red]> workspace : git checkout - -== Сравнение == -local -[#blue]> workspace : git diff HEAD -index -[#blue]> workspace : git diff - -@enduml -``` - - - -## Настройка - -| Команда | Ключи | Описание | -| ---- | ---------- | ------------ | -| `git config` | `--global user.name "John Doe"` | Имя текущего пользователя | -| `git config` | `--global user.email "mail@example.com"` | Почта текущего пользователя | -| `git config` | `--list` | Вывод текущей конфигурации | -| `git config` | `--global --list` | Вывод глобальной конфигурации | - - -## Инициализация - -| Команда | Ключи | Описание | -| ---- | ------ | ------------ | -| `git init` | `` | Создать пустой репозиторий в каталоге `` | -| `git clone` | `` `` | Создать в каталоге `` копию репозитория, находящегося по адресу `` | -| `git clone` | `--recursive ` `` | Создать в каталоге `` копию репозитория, находящегося по адресу ``, с учётом подмодулей | - - -## Подмодули - -| Команда | Ключи | Описание | -| ---- | ------ | ------------ | -| `git submodule` | `add ` | Добавить в каталог `` текущего рапозитория подмодуль, находящийся по адресу `` | -| `git submodule` | `update --recursive --remote` | Обновить подмодули | -| `git submodule` | `sync --recursive` | Заменить адреса подмодулей на указанные в файле `.gitmodules` | - - -Удаление подмодуля: - -```sh -git submodule deinit -git rm -``` - -## Фиксация - -| Команда | Ключи | Описание | -| ---- | ---- | ------------ | -| `git add` | `` | Подготовить файл `` к фиксации | -| `git commit` | | Зафиксировать подготовленные файлы | -| `git commit` | `-a` | Зафиксировать все отслеживаемые файлы, которые были изменены | - - -## Удаление - -| Команда | Ключи | Описание | -| ---- | ---- | ------------ | -| `git rm` | `` | Удалить файл из индекса и рабочего каталога | -| `git rm` | `-f ` | Принудительное удаление файла | -| `git rm` | `--cached ` | Удаление файла из проекта, но не из рабочего каталога | - - -## Информация - -| Команда | Ключи | Описание | -| ---- | ---- | ------------ | -| `git status` | `-s` | Вывод информации о рабочем каталоге в краткой форме | -| `git log` | `--oneline` | Вывод журнала изменений в краткой форме | -| `git ls-files` | | Вывод списка отслеживаемых и подготовленных файлов | - - -## Удалённый репозиторий - -| Команда | Ключи | Описание | -| ---- | ---- | ------------ | -| `git remote` | `-v` | Список адресов удалённых репозиториев | -| `git branch` | `-r` | Список веток в удалённых репозиториях | -| `git remote` | `add ` | Создать ссылку `` на удалённый репозиторий, находящийся по адресу `` | -| `git remote` | `rename ` | Переименовать ссылку `` на `` | -| `git remote` | `rm ` | Удалить ссылку `` | - -* Обращение к удалённому репозиторию осуществляется по ссылке, создаваемой командой `git remote` -* Команда `git clone` автоматически создаёт ссылку `origin` - - -## Отправка изменений - -| Команда | Ключи | Описание | -| ---- | ---- | ------------ | -| `git push` | ` ` | Отправить ветку `` в удалённый репозиторий `` | -| `git push` | ` --all` | Отправить все ветки в удалённый репозиторий `` | -| `git push` | `--d ` | Удалить ветку `` из удалённого репозитория `` | - - -## Получение изменений - -| Команда | Ключи | Описание | -| ---- | ---- | ------------ | -| `git fetch` | `` | Получить изменения из всех веток репозитория ``, но не выполнять слияние | -| `git fetch` | ` ` | Получить изменения из ветки `` репозитория ``, но не выполнять слияние | -| `git merge` | `/` | Выполнить слияние с веткой `` репозитория `` | -| `git pull` | `` | Получение и слияние | - - -## Ветки - -| Команда | Ключи | Описание | -| ---- | ---- | ------------ | -| `git branch` | `-a` | Список локальных и удалённых веток | -| `git branch` | | Список локальных веток | -| `git branch` | `` | Создать ветку `` | -| `git checkout` | `` | Перейти к фиксации с идентификатором `` | -| `git branch` | `-m ` | Переименовать ветку `` в `` | -| `git merge` | `` | Слить изменения из ветки `` в текущую ветку | -| `git branch` | `-d ` | Удалить ветку `` | - - -## Сравнение - -| Команда | Ключи | Описание | -| ---- | ---- | ------------ | -| `git diff` | | Сравнить рабочий каталог и индекс | -| `git diff` | `–-cached` | Сравнить индекс и последнюю фиксацию | -| `git diff` | `HEAD` | Сравнить последнюю фиксацию и рабочий каталог | -| `git diff` | `--stat` | Краткий вывод результатов | -| `git diff` | ` ` | Сравнить две точки с указанными индетификаторами | -| `git diff` | ` | ` | Сравнивать только укзанный каталог `` или файл `` | -| `git difftool` | | Отобразить результаты сравнения в программе, определяемой переменной `diff.tool` | - diff --git a/wiki/Prog/Git/Git распаковка объекта.adoc b/wiki/Prog/Git/Git распаковка объекта.adoc new file mode 100644 index 0000000..a4aba97 --- /dev/null +++ b/wiki/Prog/Git/Git распаковка объекта.adoc @@ -0,0 +1,12 @@ += Git: распаковка объекта +:title-separator: {sp}| +:category: Программирование +:tags: программирование, git, +:toc: + +В случае повреждения репозитория можно восстановить отдельные объекты, +которые сохраняются в формате zlib. Пример команды: + +.... +perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' < 1234567890abcdef1234567890abcdef012345 > file +.... diff --git a/wiki/Prog/Git/Git распаковка объекта.md b/wiki/Prog/Git/Git распаковка объекта.md deleted file mode 100644 index 0bf9568..0000000 --- a/wiki/Prog/Git/Git распаковка объекта.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "Git: распаковка объекта" -category: Программирование -tags: программирование, git, -monofontoptions: -- Scale=0.7 -... - -В случае повреждения репозитория можно восстановить отдельные -объекты, которые сохраняются в формате zlib. Пример команды: - -``` -perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' < 1234567890abcdef1234567890abcdef012345 > file -``` diff --git a/wiki/Prog/Git/Git репозиторий на переносном устройстве.md b/wiki/Prog/Git/Git репозиторий на переносном устройстве.adoc similarity index 75% rename from wiki/Prog/Git/Git репозиторий на переносном устройстве.md rename to wiki/Prog/Git/Git репозиторий на переносном устройстве.adoc index 0a06677..1a9ef02 100644 --- a/wiki/Prog/Git/Git репозиторий на переносном устройстве.md +++ b/wiki/Prog/Git/Git репозиторий на переносном устройстве.adoc @@ -1,26 +1,27 @@ ---- -title: "Git: репозиторий на переносном устройстве" -category: Программирование -tags: программирование, git, -... += Git: репозиторий на переносном устройстве +:title-separator: {sp}| +:category: Программирование +:tags: программирование, git, Создание репозитория для нового проекта: -```sh +[source,sh] +---- ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git 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 usb file:///home/user/work/usbdisk/git/project.git/ -``` +---- Добавление нового удалённого репозитория к существующему проекту: -```sh +[source,sh] +---- ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git git --bare init /home/user/work/usbdisk/git/project.git cd /home/user/work/projects/project git remote add usb file:///home/user/work/usbdisk/git/project.git git push --set-upstream usb master -``` +---- diff --git a/wiki/Prog/Git/Git частичная копия репозитория.adoc b/wiki/Prog/Git/Git частичная копия репозитория.adoc new file mode 100644 index 0000000..1de6838 --- /dev/null +++ b/wiki/Prog/Git/Git частичная копия репозитория.adoc @@ -0,0 +1,30 @@ += Git: частичная копия репозитория +:title-separator: {sp}| +:category: Программирование +:tags: программирование, git, + +Если проект очень большой, а следить нужно только за малой его частью, +можно создать частичную копию репозитория. Допустим, по адресу +`git://localhost/project.git` находится большой проект, в котором +интересует только последнее состояние каталогов `src/driver` и +`include/driver`. Сначала нужно создать пустой репозиторий и подготовить +его для получения только необходимых файлов: + +[source,sh] +---- +git init project +cd project +git remote add origin git://localhost/project.git +git config core.sparsecheckout true +echo "src/driver/*" >> .git/info/sparse-checkout +echo "include/driver/*" >> .git/info/sparse-checkout +---- + +После этого можно получать частичную копию проекта, а, добавив ключ +`--depth=1`, указать, что синхронизироваться должно только текущее +состояние файлов без учёта истории. + +[source,sh] +---- +git pull --depth=1 origin master +---- diff --git a/wiki/Prog/Git/Git частичная копия репозитория.md b/wiki/Prog/Git/Git частичная копия репозитория.md deleted file mode 100644 index 1775e19..0000000 --- a/wiki/Prog/Git/Git частичная копия репозитория.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: "Git: частичная копия репозитория" -category: Программирование -tags: программирование, git, -summary: -... - -Если проект очень большой, а следить нужно только за малой -его частью, можно создать частичную копию репозитория. -Допустим, по адресу `git://localhost/project.git` находится -большой проект, в котором интересует только последнее -состояние каталогов `src/driver` и `include/driver`. -Сначала нужно создать пустой репозиторий и подготовить его -для получения только необходимых файлов: - -```sh -git init project -cd project -git remote add origin git://localhost/project.git -git config core.sparsecheckout true -echo "src/driver/*" >> .git/info/sparse-checkout -echo "include/driver/*" >> .git/info/sparse-checkout -``` - -После этого можно получать частичную копию проекта, -а, добавив ключ `--depth=1`, указать, что синхронизироваться -должно только текущее состояние файлов без учёта истории. - -```sh -git pull --depth=1 origin master -``` diff --git a/wiki/Prog/Git/Gitlab выполнение по расписанию.adoc b/wiki/Prog/Git/Gitlab выполнение по расписанию.adoc new file mode 100644 index 0000000..1da41bb --- /dev/null +++ b/wiki/Prog/Git/Gitlab выполнение по расписанию.adoc @@ -0,0 +1,39 @@ += GitLab: выполнение по расписанию +:title-separator: {sp}| +:category: Программирование +:tags: программирование, gitlab, git, + +После помещения изменений (push) на сервер следует выполнять только +задачи, не требующие много ресурсов. Ресурсоёмкие задачи можно отложить +на время минимальной нагрузки сервера. Для этого нужно: + +* в секциях файла `.gitlab-ci.yml`, запускающих задачи с высокой +нагрузкой, добавить + +[source,yaml] +---- +only: + - schedules +---- + +подробнее это описано +https://docs.gitlab.com/ee/ci/yaml/#only-and-except-simplified[здесь] + +* в веб-интерфейсе в меню *CI/CD* / *Расписания* добавить *Новое +расписание* и назначить исполнение задачи на время, когда нагрузка на +сервер минимальна. + +Для пропуска запланированной задачи в исполняемый скрипт нужно добавить +проверку условия запуска. Например, чтобы отменить запуск компиляции, +если за последний день (86400 секунд) не было изменений, можно оформить +`.gitlab-ci.yml` примерно так: + +[source,yaml] +---- +nightly-job: + only: + - schedules + script: + - "[ $(($(date +%s)-$(git log -1 --date=format:%s --format=%cd))) -gt 86400 ] && exit 0" + - make +---- diff --git a/wiki/Prog/Git/Gitlab выполнение по расписанию.md b/wiki/Prog/Git/Gitlab выполнение по расписанию.md deleted file mode 100644 index 72206e1..0000000 --- a/wiki/Prog/Git/Gitlab выполнение по расписанию.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "GitLab: выполнение по расписанию" -category: Программирование -tags: программирование, gitlab, git, -... - -После помещения изменений (push) на сервер следует выполнять только задачи, -не требующие много ресурсов. Ресурсоёмкие задачи можно отложить на время -минимальной нагрузки сервера. Для этого нужно: - -* в секциях файла `.gitlab-ci.yml`, запускающих задачи с высокой нагрузкой, -добавить - -```yaml -only: - - schedules -``` - - подробнее это описано [здесь](https://docs.gitlab.com/ee/ci/yaml/#only-and-except-simplified) - -* в веб-интерфейсе в меню **CI/CD** / **Расписания** добавить **Новое расписание** -и назначить исполнение задачи на время, когда нагрузка на сервер минимальна. - -Для пропуска запланированной задачи в исполняемый скрипт нужно добавить -проверку условия запуска. Например, чтобы отменить запуск компиляции, -если за последний день (86400 секунд) не было изменений, можно оформить -`.gitlab-ci.yml` примерно так: - -```yaml -nightly-job: - only: - - schedules - script: - - "[ $(($(date +%s)-$(git log -1 --date=format:%s --format=%cd))) -gt 86400 ] && exit 0" - - make -``` diff --git a/wiki/Prog/Git/Установка и настройка GitLab в LXC.md b/wiki/Prog/Git/Установка и настройка GitLab в LXC.adoc similarity index 79% rename from wiki/Prog/Git/Установка и настройка GitLab в LXC.md rename to wiki/Prog/Git/Установка и настройка GitLab в LXC.adoc index ea47599..0b3a2b4 100644 --- a/wiki/Prog/Git/Установка и настройка GitLab в LXC.md +++ b/wiki/Prog/Git/Установка и настройка GitLab в LXC.adoc @@ -1,33 +1,31 @@ ---- -title: "Установка и настройка GitLab в LXC" -category: Программирование -tags: программирование, gitlab, git, lxc, контейнеры, ubuntu, -summary: -toc: yes -... += Установка и настройка GitLab в LXC +:category: Программирование +:tags: программирование, gitlab, git, lxc, контейнеры, ubuntu, -[TOC] +:toc: Установка выполняется в операционной системе Ubuntu Bionic. -### LXC +== LXC Создание базового контейнера: -```sh +[source,sh] +---- lxc-create -t download -n bionic-base -- --dist ubuntu --release bionic --arch amd64 -``` +---- Создание контейнеров для GitLab и GitLab Runner: -```sh +[source,sh] +---- lxc-copy -n bionic-base -N gitlab-bionic -s lxc-copy -n bionic-base -N gitlab-runner-bionic -s -``` +---- Файл `/var/lib/lxc/gitlab-bionic/config`: -``` +.... # Distribution configuration lxc.include = /usr/share/lxc/config/common.conf @@ -50,11 +48,11 @@ lxc.autodev = 1 lxc.pty.max = 16384 lxc.cgroup.devices.allow = c 10:200 rwm lxc.mount.entry = /dev/net dev/net none bind,create=dir -``` +.... Файл `/var/lib/lxc/gitlab-runner-bionic/config`: -``` +.... # Distribution configuration lxc.include = /usr/share/lxc/config/common.conf @@ -82,65 +80,67 @@ lxc.autodev = 1 lxc.pty.max = 16384 lxc.cgroup.devices.allow = c 10:200 rwm lxc.mount.entry = /dev/net dev/net none bind,create=dir -``` +.... -### GitLab +== GitLab Установить GitLab: -```sh +[source,sh] +---- sudo lxc-start -n gitlab-bionic sudo lxc-attach -n gitlab-bionic sudo apt install curl curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash sudo apt install gitlab-ce -``` +---- -Отредактировать файл `/etc/locale.gen` и сгенерировать локали для системы: +Отредактировать файл `/etc/locale.gen` и сгенерировать локали для +системы: -```sh +[source,sh] +---- sudo locale-gen -``` +---- Отредактировать файл `/etc/gitlab/gitlab.rb` и выполнить: -```sh +[source,sh] +---- sudo gitlab-ctl reconfigure sudo gitlab-ctl restart -``` +---- - -### GitLab Runner и Docker +== GitLab Runner и Docker Установить GitLab Runner: -```sh +[source,sh] +---- sudo lxc-start -n runner-bionic sudo lxc-attach -n runner-bionic curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash sudo apt install gitlab-runner docker.io sudo gitlab-runner register -``` +---- Во время установки ввести токен приведённый на странице `admin/runners`, а в качестве исполнителя задач `docker`. Для работы Docker внутри контейнера нужно удалить AppArmor: -```sh +[source,sh] +---- sudo apt purge apparmor -``` +---- -Внутри контейнера для Docker желательно использовать драйвер `btrfs` -cat /etc/docker/daemon.json +Внутри контейнера для Docker желательно использовать драйвер `btrfs` cat +/etc/docker/daemon.json -{ - "storage-driver": "btrfs" -} +\{ ``storage-driver'': ``btrfs'' } +== Ссылки -### Ссылки - -* [GitLab Runner](https://docs.gitlab.com/runner/register/index.html) -* [Runners](https://docs.gitlab.com/ee/ci/runners/) -* [Gitlab-CI](https://habr.com/ru/company/southbridge/blog/306596/) +* https://docs.gitlab.com/runner/register/index.html[GitLab Runner] +* https://docs.gitlab.com/ee/ci/runners/[Runners] +* https://habr.com/ru/company/southbridge/blog/306596/[Gitlab-CI] diff --git a/wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.adoc b/wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.adoc new file mode 100644 index 0000000..0f36f8b --- /dev/null +++ b/wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.adoc @@ -0,0 +1,1364 @@ += Проверка именования в clang-tidy +:category: Программирование +:tags: C++, программирование, clang, clang-tidy, форматирование, + +:toc: + +Программа https://clang.llvm.org/extra/clang-tidy/[clang-tidy] может +проверить стилистику регистра идентификаторов, а также их префиксы и +суффиксы. Возможные варианты стилей: + +.... +lower_case +UPPER_CASE +camelBack +CamelCase +camel_Snake_Back +Camel_Snake_Case +aNy_CasE +.... + +Перечень вариантов идентификаторов приведён +https://clang.llvm.org/extra/clang-tidy/checks/readability-identifier-naming.html[здесь]. + +Для включения проверки именования идентификаторов нужно в находящемся в +корне проекта файле `.clang-tidy` включить данный тип диагностики (опция +`clang-diagnostic-*,readability-identifier-naming`), а затем указать +список выполняемых проверок и их параметры в формате YAML, например: + +[source,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: '' +... +---- + +https://git.246060.ru/f1x1t/clang-tidy-readability-identifier-naming[Проект] +с файлом `.clang-tidy`, в соответствии с которым проводятся проверки +именования идентификаторов. + +Перечень возможных параметров конфигурационного файла, их типовые +значения и примеры соответствующего кода приведены ниже. + +== Синтаксис + +=== AbstractClass (Абстрактный класс) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|AbstractClassCase |`CamelCase` +|AbstractClassPrefix |`''` +|AbstractClassSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ABSTRACT_CLASS { + public: + ABSTRACT_CLASS(); +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class AbstractClass { + public: + AbstractClass(); +}; +---- + +=== Class (Класс) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ClassCase |`CamelCase` +|ClassPrefix |`''` +|ClassSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class TEST_CLASS { + public: + TEST_CLASS(); + ~TEST_CLASS(); +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class TestClass { + public: + TestClass(); + ~TestClass(); +}; +---- + +=== Struct (Структура) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|StructCase |`CamelCase` +|StructPrefix |`''` +|StructSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +struct TEST_struct { + int a; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +struct TestStruct { + int a; +}; +---- + +=== Union (Объединение) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|UnionCase |`CamelCase` +|UnionPrefix |`''` +|UnionSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +union TEST_union { + int a; + char b; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +union TestUnion { + int a; + char b; +}; +---- + +=== Enum (Перечисление) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|EnumCase |`CamelCase` +|EnumPrefix |`''` +|EnumSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +enum TEST_enum { ONE, TWO }; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +enum TestEnum { ONE, TWO }; +---- + +=== EnumConstant (Значение в перечислении) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|EnumConstantCase |`UPPER_CASE` +|EnumConstantPrefix |`''` +|EnumConstantSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +enum TestEnum { one, TWO }; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +enum TestEnum { ONE, TWO }; +---- + +=== Namespace (Пространство имён) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|NamespaceCase |`lower_case` +|NamespacePrefix |`''` +|NamespaceSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +namespace TEST_ns { + +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +namespace test_ns { + +} +---- + +=== InlineNamespace (Вложенное пространство имён) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|InlineNamespaceCase |`lower_case` +|InlineNamespacePrefix |`''` +|InlineNamespaceSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +namespace test_ns { +inline namespace InlineNamespace { + +} +} // namespace test_ns +---- + +Пример кода после форматирования: + +[source,cpp] +---- +namespace test_ns { +inline namespace inline_namespace { + +} +} // namespace test_ns +---- + +=== TypeAlias (Псевдоним типа) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|TypeAliasCase |`lower_case` +|TypeAliasPrefix |`''` +|TypeAliasSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +struct MyStructure { + int a; +}; +using MY_STRUCT_TYPE = MyStructure; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +struct MyStructure { + int a; +}; +using MyStructType = MyStructure; +---- + +=== Typedef (Объявление типа) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|TypedefCase |`lower_case` +|TypedefPrefix |`''` +|TypedefSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +typedef int MY_INT; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +typedef int my_int; +---- + +== Переменные + +=== Variable (Переменная) ??? + +=== GlobalVariable (Глобальная переменная) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|GlobalVariableCase |`lower_case` +|GlobalVariablePrefix |`''` +|GlobalVariableSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +unsigned GlobalVariable; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +unsigned global_variable; +---- + +=== LocalVariable (Локальная переменная) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|LocalVariableCase |`camelBack` +|LocalVariablePrefix |`''` +|LocalVariableSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +int function() { + int LocalVariable = 0; + return LocalVariable; +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +int function() { + int localVariable = 0; + return localVariable; +} +---- + +=== StaticVariable (Статическая переменная) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|StaticVariableCase |`camelBack` +|StaticVariablePrefix |`''` +|StatucVariableSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +int functionWithStaticVariable() { + static int StaticVariable = 0; + return StaticVariable; +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +int functionWithStaticVariable() { + static int staticVariable = 0; + return staticVariable; +} +---- + +=== ConstexptVariable (Переменная constexpr) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ConstexprVariableCase |`lower_case` +|ConstexprVariablePrefix |`''` +|ConstexprVariableSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +constexpr int CONST_FIVE = 5; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +constexpr int const_five = 5; +---- + +=== GlobalPointer (Глобальный указатель) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|GlobalPointerCase |`lower_case` +|GlobalPointerPrefix |`''` +|GlobalPointerSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +void* globalPointer; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +void* global_pointer; +---- + +=== LocalPointer (Локальный указатель) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|LocalPointerCase |`camelBack` +|LocalPointerPrefix |`''` +|LocalPointerSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +void* function() { + void* LocalPointer = nullptr; + return LocalPointer; +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +void* function() { + void* localPointer = nullptr; + return localPointer; +} +---- + +=== Member (Член) ??? + +=== ClassMember (Член класса) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ClassMemberCase |`camelBack` +|ClassMemberPrefix |`''` +|ClassMemberSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithClassMember { + public: + static int CLASS_MEMBER; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithClassMember { + public: + static int classMember; +}; +---- + +=== ConstantMember (Константный член) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ConstantMemberCase |`lower_case` +|ConstantMemberPrefix |`''` +|ConstantMemberSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithConstantMember { + char const ConstMember[4] = "123"; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithConstantMember { + char const const_member[4] = "123"; +}; +---- + +=== PrivateMember (Приватный член) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|PrivateMemberCase |`camelBack` +|PrivateMemberPrefix |`'m_'` +|PrivateMemberSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithPrivateMember { + private: + int PrivateMember; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithPrivateMember { + private: + int m_privateMember; +}; +---- + +=== ProtectedMember (Защищённый член) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ProtectedMemberCase |`camelBack` +|ProtectedMemberPrefix |`''` +|ProtectedMemberSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithProtectedMember { + protected: + int ProtectedMember; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithProtectedMember { + protected: + int protectedMember; +}; +---- + +=== PublicMember (Публичный член) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|PublicMemberCase |`camelBack` +|PublicMemberPrefix |`''` +|PublicMemberSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithPublicMember { + public: + int PublicMember; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithPublicMember { + public: + int publicMember; +}; +---- + +== Константы + +=== Constant (Константа) ??? + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ConstantCase |`UPPER_CASE` +|ConstantPrefix |`''` +|ConstantSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +const int theOne = 1; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +const int THE_ONE = 1; +---- + +=== GlobalConstant (Глобальная константа) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|GlobalConstantCase |`UPPER_CASE` +|GlobalConstantPrefix |`''` +|GlobalConstantSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +const int theOne = 1; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +const int THE_ONE = 1; +---- + +=== LocalConstant (Локальная константа) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|LocalConstantCase |`camelBack` +|LocalConstantPrefix |`''` +|LocalConstantSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +int functionWithLocalConstant() { + const int LocalConstant = 0; + return LocalConstant; +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +int functionWithLocalConstant() { + const int localConstant = 0; + return localConstant; +} +---- + +=== StaticConstant (Статическая контстанта) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|StaticConstantCase |`camelBack` +|StaticConstantPrefix |`''` +|StaticConstantSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +int functionWithStaticConstant() { + const int StaticConstant = 0; + return StaticConstant; +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +int functionWithStaticConstant() { + const int staticConstant = 0; + return staticConstant; +} +---- + +=== ClassConstant (Константа класса) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ClassConstantCase |`UPPER_CASE` +|ClassConstantPrefix |`''` +|ClassConstantSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithClassConstant { + public: + static int const Class_Constant = 0; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithClassConstant { + public: + static int const CLASS_CONSTANT = 0; +}; +---- + +=== GlobalConstantPointer (Глобальный константный указатель) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|GlobalConstantPointerCase |`lower_case` +|GlobalConstantPointerPrefix |`''` +|GlobalConstantPointerSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +void* global_pointer; +void* const GlobalConstPointer = global_pointer; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +void* global_pointer; +void* const global_const_pointer = global_pointer; +---- + +=== LocalConstantPointer (Локальный константный указатель) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|LocalConstantPointerCase |`camelBack` +|LocalConstantPointerPrefix |`''` +|LocalConstantPointerSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +void* functionWithLocalConstPointer() { + void* pointer = nullptr; + void* const LocalConstPointer = pointer; + return LocalConstPointer; +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +void* functionWithLocalConstPointer() { + void* pointer = nullptr; + void* const localConstPointer = pointer; + return localConstPointer; +} +---- + +== Функции + +=== Function (Функция) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|FunctionCase |`camelBack` +|FunctionPrefix |`''` +|FunctionSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +static int static_function() { + return 0; +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +static int staticFunction() { + return 0; +} +---- + +=== GlobalFunction (Глобальная функция) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|GlobalFunctionCase |`camelBack` +|GlobalFunctionPrefix |`''` +|GlobalFunctionSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +int global_function() { + return 0; +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +int globalFunction() { + return 0; +} +---- + +=== ConstexprFunction (Функция constexpr) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ConstexprFunctionCase |`camelBack` +|ConstexprFunctionPrefix |`''` +|ConstexprFunctionSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +constexpr int get_five() { + return ( 5 ); +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +constexpr int getFive() { + return ( 5 ); +} +---- + +=== Method (Метод) ??? + +=== ClassMethod (Метод класса) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ClassMethodCase |`camelBack` +|ClassMethodPrefix |`''` +|ClassMethodSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithMethod { + public: + static int get_int() { return 0; }; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithMethod { + public: + static int getInt() { return 0; }; +}; +---- + +=== ConstexprMethod (Метод constexpr) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ConstexprMethodCase |`camelBack` +|ConstexprMethodPrefix |`''` +|ConstexprMethodSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithConstexprMethod { + private: + constexpr int get_int() { return 0; }; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithConstexprMethod { + private: + constexpr int getInt() { return 0; }; +}; +---- + +=== VirtualMethod (Виртуальный метод) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|VirtualMethodCase |`camelBack` +|VirtualMethodPrefix |`''` +|VirtualMethodSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithVirtualMethod { + private: + virtual int get_int() { return 0; }; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithVirtualMethod { + private: + virtual int getInt() { return 0; }; +}; +---- + +=== PrivateMethod (Приватный метод) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|PrivateMethodCase |`camelBack` +|PrivateMethodPrefix |`''` +|PrivateMethodSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithPrivateMethod { + private: + int get_int() { return 0; }; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithPrivateMethod { + private: + int getInt() { return 0; }; +}; +---- + +=== ProtectedMethod (Защищённый метод) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ProtectedMethodCase |`camelBack` +|ProtectedMethodPrefix |`''` +|ProtectedMethodSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithProtectedMethod { + protected: + int get_int() { return 0; }; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithProtectedMethod { + protected: + int getInt() { return 0; }; +}; +---- + +=== PublicMethod (Публичный метод) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|PublicMethodCase |`camelBack` +|PublicMethodPrefix |`''` +|PublicMethodSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +class ClassWithPublicMethod { + public: + int get_int() { return 0; }; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +class ClassWithPublicMethod { + public: + int getInt() { return 0; }; +}; +---- + +== Параметры + +=== Parameter (Параметр) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ParameterCase |`camelBack` +|ParameterPrefix |`''` +|ParameterSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +int returnInt(int return_Value) { + return return_Value; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +int returnInt(int returnValue) { + return returnValue; +}; +---- + +=== ConstantParameter (Константный параметр) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ConstantParameterCase |`camelBack` +|ConstantParameterPrefix |`''` +|ConstantParameterSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +char returnChar(const char return_Value) { + return return_Value; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +char returnChar(const char returnValue) { + return returnValue; +}; +---- + +=== ConstantPointerParameter (Константный указатель на параметр) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ConstantPointerParameterCase |`camelBack` +|ConstantPointerParameterPrefix |`''` +|ConstantPointerParameterSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +void* returnVoid(void* const return_Value) { + return return_Value; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +void* returnVoid(void* const returnValue) { + return returnValue; +}; +---- + +=== PointerParameter (Параметр типа указатель) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|PointerParameterCase |`camelBack` +|PointerParameterPrefix |`''` +|PointerParameterSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +void* returnPtr(void* return_Value) { + return return_Value; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +void* returnPtr(void* returnValue) { + return returnValue; +}; +---- + +== Шаблоны + +=== TemplateParameter (Параметр шаблона) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|TemplateParameterCase |`camelBack` +|TemplateParameterPrefix |`''` +|TemplateParameterSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +template int tFunction(TType t_value) { + return 0; +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +template int tFunction(TType tValue) { + return 0; +} +---- + +=== ParameterPack (Список параметров шаблона) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ParameterPackCase |`camelBack` +|ParameterPackPrefix |`''` +|ParameterPackSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +template void f(Types ... Parameters_Pack); +---- + +Пример кода после форматирования: + +[source,cpp] +---- +template void f(Types ... parametersPack); +---- + +=== TemplateTemplateParameter (Параметр шаблона шаблона) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|TemplateTemplateParameterCase |`camelBack` +|TemplateTemplateParameterPrefix |`''` +|TemplateTemplateParameterSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +template class TPL_TPL_Parameter> +class AllmightyClass { }; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +template class tplTplParameter> +class AllmightyClass { }; +---- + +=== TypeTemplateParameter (Типа параметра шаблона) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|TypeTemplateParameterCase |`CamelCase` +|TypeTemplateParameterPrefix |`''` +|TypeTemplateParameterSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +templateint tFunction(t_type value) { + return 0; +}; +---- + +Пример кода после форматирования: + +[source,cpp] +---- +templateint tFunction(TType value) { + return 0; +}; +---- + +=== ValueTemplateParameter (Значение параметра шаблона) + +[cols=",",options="header",] +|=== +|Параметр |Значение +|ValueTemplateParameterCase |`camelBack` +|ValueTemplateParameterPrefix |`''` +|ValueTemplateParameterSuffix |`''` +|=== + +Пример кода до форматирования: + +[source,cpp] +---- +template int tFunction(TType tValue) { + return 0; +} +---- + +Пример кода после форматирования: + +[source,cpp] +---- +template int tFunction(TType tValue) { + return 0; +} +---- diff --git a/wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.md b/wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.md deleted file mode 100644 index 28ff5f0..0000000 --- a/wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.md +++ /dev/null @@ -1,1227 +0,0 @@ ---- -title: "Проверка именования в clang-tidy" -category: Программирование -tags: C++, программирование, clang, clang-tidy, форматирование, -summary: -toc: yes -... - -[TOC] - -Программа [clang-tidy](https://clang.llvm.org/extra/clang-tidy/) может -проверить стилистику регистра идентификаторов, а также их префиксы и суффиксы. -Возможные варианты стилей: - -``` -lower_case -UPPER_CASE -camelBack -CamelCase -camel_Snake_Back -Camel_Snake_Case -aNy_CasE -``` - -Перечень вариантов идентификаторов приведён -[здесь](https://clang.llvm.org/extra/clang-tidy/checks/readability-identifier-naming.html). - -Для включения проверки именования идентификаторов нужно в находящемся -в корне проекта файле `.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: '' -... -``` - -[Проект](https://git.246060.ru/f1x1t/clang-tidy-readability-identifier-naming) -с файлом `.clang-tidy`, в соответствии с которым проводятся проверки именования -идентификаторов. - -Перечень возможных параметров конфигурационного файла, их типовые значения -и примеры соответствующего кода приведены ниже. - - -## Синтаксис - -### 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 | `UPPER_CASE` -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 -struct MyStructure { - int a; -}; -using MY_STRUCT_TYPE = MyStructure; -``` - -Пример кода после форматирования: - -```cpp -struct MyStructure { - int a; -}; -using MyStructType = MyStructure; -``` - -### Typedef (Объявление типа) - -Параметр | Значение --------------------------------|---------------- -TypedefCase | `lower_case` -TypedefPrefix | `''` -TypedefSuffix | `''` - -Пример кода до форматирования: - -```cpp -typedef int MY_INT; -``` - -Пример кода после форматирования: - -```cpp -typedef int my_int; -``` - - -## Переменные - - -### Variable (Переменная) ??? - -### GlobalVariable (Глобальная переменная) - -Параметр | Значение --------------------------------|---------------- -GlobalVariableCase | `lower_case` -GlobalVariablePrefix | `''` -GlobalVariableSuffix | `''` - -Пример кода до форматирования: - -```cpp -unsigned GlobalVariable; -``` - -Пример кода после форматирования: - -```cpp -unsigned global_variable; -``` - - -### LocalVariable (Локальная переменная) - -Параметр | Значение --------------------------------|---------------- -LocalVariableCase | `camelBack` -LocalVariablePrefix | `''` -LocalVariableSuffix | `''` - -Пример кода до форматирования: - -```cpp -int function() { - int LocalVariable = 0; - return LocalVariable; -} -``` - -Пример кода после форматирования: - -```cpp -int function() { - int localVariable = 0; - return localVariable; -} -``` - -### StaticVariable (Статическая переменная) - -Параметр | Значение --------------------------------|---------------- -StaticVariableCase | `camelBack` -StaticVariablePrefix | `''` -StatucVariableSuffix | `''` - -Пример кода до форматирования: - -```cpp -int functionWithStaticVariable() { - static int StaticVariable = 0; - return StaticVariable; -} -``` - -Пример кода после форматирования: - -```cpp -int functionWithStaticVariable() { - static int staticVariable = 0; - return staticVariable; -} -``` - - -### ConstexptVariable (Переменная constexpr) - -Параметр | Значение --------------------------------|---------------- -ConstexprVariableCase | `lower_case` -ConstexprVariablePrefix | `''` -ConstexprVariableSuffix | `''` - -Пример кода до форматирования: - -```cpp -constexpr int CONST_FIVE = 5; -``` - -Пример кода после форматирования: - -```cpp -constexpr int const_five = 5; -``` - - -### GlobalPointer (Глобальный указатель) - -Параметр | Значение --------------------------------|---------------- -GlobalPointerCase | `lower_case` -GlobalPointerPrefix | `''` -GlobalPointerSuffix | `''` - -Пример кода до форматирования: - -```cpp -void* globalPointer; -``` - -Пример кода после форматирования: - -```cpp -void* global_pointer; -``` - -### LocalPointer (Локальный указатель) - -Параметр | Значение --------------------------------|---------------- -LocalPointerCase | `camelBack` -LocalPointerPrefix | `''` -LocalPointerSuffix | `''` - -Пример кода до форматирования: - -```cpp -void* function() { - void* LocalPointer = nullptr; - return LocalPointer; -} -``` - -Пример кода после форматирования: - -```cpp -void* function() { - void* localPointer = nullptr; - return localPointer; -} -``` - -### Member (Член) ??? - - -### ClassMember (Член класса) - -Параметр | Значение --------------------------------|---------------- -ClassMemberCase | `camelBack` -ClassMemberPrefix | `''` -ClassMemberSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithClassMember { - public: - static int CLASS_MEMBER; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithClassMember { - public: - static int classMember; -}; -``` - - -### ConstantMember (Константный член) - -Параметр | Значение --------------------------------|---------------- -ConstantMemberCase | `lower_case` -ConstantMemberPrefix | `''` -ConstantMemberSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithConstantMember { - char const ConstMember[4] = "123"; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithConstantMember { - char const const_member[4] = "123"; -}; -``` - -### PrivateMember (Приватный член) - -Параметр | Значение --------------------------------|---------------- -PrivateMemberCase | `camelBack` -PrivateMemberPrefix | `'m_'` -PrivateMemberSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithPrivateMember { - private: - int PrivateMember; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithPrivateMember { - private: - int m_privateMember; -}; -``` - - -### ProtectedMember (Защищённый член) - -Параметр | Значение --------------------------------|---------------- -ProtectedMemberCase | `camelBack` -ProtectedMemberPrefix | `''` -ProtectedMemberSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithProtectedMember { - protected: - int ProtectedMember; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithProtectedMember { - protected: - int protectedMember; -}; -``` - - -### PublicMember (Публичный член) - -Параметр | Значение --------------------------------|---------------- -PublicMemberCase | `camelBack` -PublicMemberPrefix | `''` -PublicMemberSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithPublicMember { - public: - int PublicMember; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithPublicMember { - public: - int publicMember; -}; -``` - - -## Константы - - -### Constant (Константа) ??? - -Параметр | Значение --------------------------------|---------------- -ConstantCase | `UPPER_CASE` -ConstantPrefix | `''` -ConstantSuffix | `''` - -Пример кода до форматирования: - -```cpp -const int theOne = 1; -``` - -Пример кода после форматирования: - -```cpp -const int THE_ONE = 1; -``` - - - -### GlobalConstant (Глобальная константа) - -Параметр | Значение --------------------------------|---------------- -GlobalConstantCase | `UPPER_CASE` -GlobalConstantPrefix | `''` -GlobalConstantSuffix | `''` - -Пример кода до форматирования: - -```cpp -const int theOne = 1; -``` - -Пример кода после форматирования: - -```cpp -const int THE_ONE = 1; -``` - - -### LocalConstant (Локальная константа) - -Параметр | Значение --------------------------------|---------------- -LocalConstantCase | `camelBack` -LocalConstantPrefix | `''` -LocalConstantSuffix | `''` - -Пример кода до форматирования: - -```cpp -int functionWithLocalConstant() { - const int LocalConstant = 0; - return LocalConstant; -} -``` - -Пример кода после форматирования: - -```cpp -int functionWithLocalConstant() { - const int localConstant = 0; - return localConstant; -} -``` - - -### StaticConstant (Статическая контстанта) - -Параметр | Значение --------------------------------|---------------- -StaticConstantCase | `camelBack` -StaticConstantPrefix | `''` -StaticConstantSuffix | `''` - -Пример кода до форматирования: - -```cpp -int functionWithStaticConstant() { - const int StaticConstant = 0; - return StaticConstant; -} -``` - -Пример кода после форматирования: - -```cpp -int functionWithStaticConstant() { - const int staticConstant = 0; - return staticConstant; -} -``` - -### ClassConstant (Константа класса) - -Параметр | Значение --------------------------------|---------------- -ClassConstantCase | `UPPER_CASE` -ClassConstantPrefix | `''` -ClassConstantSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithClassConstant { - public: - static int const Class_Constant = 0; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithClassConstant { - public: - static int const CLASS_CONSTANT = 0; -}; -``` - -### GlobalConstantPointer (Глобальный константный указатель) - -Параметр | Значение --------------------------------|---------------- -GlobalConstantPointerCase | `lower_case` -GlobalConstantPointerPrefix | `''` -GlobalConstantPointerSuffix | `''` - -Пример кода до форматирования: - -```cpp -void* global_pointer; -void* const GlobalConstPointer = global_pointer; -``` - -Пример кода после форматирования: - -```cpp -void* global_pointer; -void* const global_const_pointer = global_pointer; -``` - - -### LocalConstantPointer (Локальный константный указатель) - -Параметр | Значение --------------------------------|---------------- -LocalConstantPointerCase | `camelBack` -LocalConstantPointerPrefix | `''` -LocalConstantPointerSuffix | `''` - -Пример кода до форматирования: - -```cpp -void* functionWithLocalConstPointer() { - void* pointer = nullptr; - void* const LocalConstPointer = pointer; - return LocalConstPointer; -} -``` - -Пример кода после форматирования: - -```cpp -void* functionWithLocalConstPointer() { - void* pointer = nullptr; - void* const localConstPointer = pointer; - return localConstPointer; -} -``` - - - -## Функции - - -### Function (Функция) - -Параметр | Значение --------------------------------|---------------- -FunctionCase | `camelBack` -FunctionPrefix | `''` -FunctionSuffix | `''` - -Пример кода до форматирования: - -```cpp -static int static_function() { - return 0; -} -``` - -Пример кода после форматирования: - -```cpp -static int staticFunction() { - return 0; -} -``` - - -### GlobalFunction (Глобальная функция) - -Параметр | Значение --------------------------------|---------------- -GlobalFunctionCase | `camelBack` -GlobalFunctionPrefix | `''` -GlobalFunctionSuffix | `''` - -Пример кода до форматирования: - -```cpp -int global_function() { - return 0; -} -``` - -Пример кода после форматирования: - -```cpp -int globalFunction() { - return 0; -} -``` - - -### ConstexprFunction (Функция constexpr) - - -Параметр | Значение --------------------------------|---------------- -ConstexprFunctionCase | `camelBack` -ConstexprFunctionPrefix | `''` -ConstexprFunctionSuffix | `''` - -Пример кода до форматирования: - -```cpp -constexpr int get_five() { - return ( 5 ); -} -``` - -Пример кода после форматирования: - -```cpp -constexpr int getFive() { - return ( 5 ); -} -``` - - -### Method (Метод) ??? - - -### ClassMethod (Метод класса) - -Параметр | Значение --------------------------------|---------------- -ClassMethodCase | `camelBack` -ClassMethodPrefix | `''` -ClassMethodSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithMethod { - public: - static int get_int() { return 0; }; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithMethod { - public: - static int getInt() { return 0; }; -}; -``` - - -### ConstexprMethod (Метод constexpr) - -Параметр | Значение --------------------------------|---------------- -ConstexprMethodCase | `camelBack` -ConstexprMethodPrefix | `''` -ConstexprMethodSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithConstexprMethod { - private: - constexpr int get_int() { return 0; }; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithConstexprMethod { - private: - constexpr int getInt() { return 0; }; -}; -``` - -### VirtualMethod (Виртуальный метод) - -Параметр | Значение --------------------------------|---------------- -VirtualMethodCase | `camelBack` -VirtualMethodPrefix | `''` -VirtualMethodSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithVirtualMethod { - private: - virtual int get_int() { return 0; }; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithVirtualMethod { - private: - virtual int getInt() { return 0; }; -}; -``` - - -### PrivateMethod (Приватный метод) - -Параметр | Значение --------------------------------|---------------- -PrivateMethodCase | `camelBack` -PrivateMethodPrefix | `''` -PrivateMethodSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithPrivateMethod { - private: - int get_int() { return 0; }; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithPrivateMethod { - private: - int getInt() { return 0; }; -}; -``` - -### ProtectedMethod (Защищённый метод) - -Параметр | Значение --------------------------------|---------------- -ProtectedMethodCase | `camelBack` -ProtectedMethodPrefix | `''` -ProtectedMethodSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithProtectedMethod { - protected: - int get_int() { return 0; }; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithProtectedMethod { - protected: - int getInt() { return 0; }; -}; -``` - -### PublicMethod (Публичный метод) - -Параметр | Значение -----------------------------|---------------- -PublicMethodCase | `camelBack` -PublicMethodPrefix | `''` -PublicMethodSuffix | `''` - -Пример кода до форматирования: - -```cpp -class ClassWithPublicMethod { - public: - int get_int() { return 0; }; -}; -``` - -Пример кода после форматирования: - -```cpp -class ClassWithPublicMethod { - public: - int getInt() { return 0; }; -}; -``` - - -## Параметры - - -### Parameter (Параметр) - -Параметр | Значение --------------------------------|---------------- -ParameterCase | `camelBack` -ParameterPrefix | `''` -ParameterSuffix | `''` - -Пример кода до форматирования: - -```cpp -int returnInt(int return_Value) { - return return_Value; -}; -``` - -Пример кода после форматирования: - -```cpp -int returnInt(int returnValue) { - return returnValue; -}; -``` - - -### ConstantParameter (Константный параметр) - -Параметр | Значение --------------------------------|---------------- -ConstantParameterCase | `camelBack` -ConstantParameterPrefix | `''` -ConstantParameterSuffix | `''` - -Пример кода до форматирования: - -```cpp -char returnChar(const char return_Value) { - return return_Value; -}; -``` - -Пример кода после форматирования: - -```cpp -char returnChar(const char returnValue) { - return returnValue; -}; -``` - - -### ConstantPointerParameter (Константный указатель на параметр) - -Параметр | Значение --------------------------------|---------------- -ConstantPointerParameterCase | `camelBack` -ConstantPointerParameterPrefix | `''` -ConstantPointerParameterSuffix | `''` - -Пример кода до форматирования: - -```cpp -void* returnVoid(void* const return_Value) { - return return_Value; -}; -``` - -Пример кода после форматирования: - -```cpp -void* returnVoid(void* const returnValue) { - return returnValue; -}; -``` - -### PointerParameter (Параметр типа указатель) - -Параметр | Значение --------------------------------|---------------- -PointerParameterCase | `camelBack` -PointerParameterPrefix | `''` -PointerParameterSuffix | `''` - -Пример кода до форматирования: - -```cpp -void* returnPtr(void* return_Value) { - return return_Value; -}; -``` - -Пример кода после форматирования: - -```cpp -void* returnPtr(void* returnValue) { - return returnValue; -}; -``` - - -## Шаблоны - - -### TemplateParameter (Параметр шаблона) - -Параметр | Значение --------------------------------|---------------- -TemplateParameterCase | `camelBack` -TemplateParameterPrefix | `''` -TemplateParameterSuffix | `''` - -Пример кода до форматирования: - -```cpp -template int tFunction(TType t_value) { - return 0; -} -``` - -Пример кода после форматирования: - -```cpp -template int tFunction(TType tValue) { - return 0; -} -``` - - -### ParameterPack (Список параметров шаблона) - -Параметр | Значение --------------------------------|---------------- -ParameterPackCase | `camelBack` -ParameterPackPrefix | `''` -ParameterPackSuffix | `''` - -Пример кода до форматирования: - -```cpp -template void f(Types ... Parameters_Pack); -``` - -Пример кода после форматирования: - -```cpp -template void f(Types ... parametersPack); -``` - - -### TemplateTemplateParameter (Параметр шаблона шаблона) - -Параметр | Значение --------------------------------|---------------- -TemplateTemplateParameterCase | `camelBack` -TemplateTemplateParameterPrefix| `''` -TemplateTemplateParameterSuffix| `''` - -Пример кода до форматирования: - -```cpp -template class TPL_TPL_Parameter> -class AllmightyClass { }; -``` - -Пример кода после форматирования: - -```cpp -template class tplTplParameter> -class AllmightyClass { }; -``` - - -### TypeTemplateParameter (Типа параметра шаблона) - -Параметр | Значение --------------------------------|---------------- -TypeTemplateParameterCase | `CamelCase` -TypeTemplateParameterPrefix | `''` -TypeTemplateParameterSuffix | `''` - -Пример кода до форматирования: - -```cpp -templateint tFunction(t_type value) { - return 0; -}; -``` - -Пример кода после форматирования: - -```cpp -templateint tFunction(TType value) { - return 0; -}; -``` - - -### ValueTemplateParameter (Значение параметра шаблона) - -Параметр | Значение --------------------------------|---------------- -ValueTemplateParameterCase | `camelBack` -ValueTemplateParameterPrefix | `''` -ValueTemplateParameterSuffix | `''` - -Пример кода до форматирования: - -```cpp -template int tFunction(TType tValue) { - return 0; -} -``` - -Пример кода после форматирования: - -```cpp -template int tFunction(TType tValue) { - return 0; -} -``` - diff --git a/wiki/Prog/Links/Библиотеки C CPP.adoc b/wiki/Prog/Links/Библиотеки C CPP.adoc new file mode 100644 index 0000000..4170672 --- /dev/null +++ b/wiki/Prog/Links/Библиотеки C CPP.adoc @@ -0,0 +1,29 @@ += Библиотеки для C, C++ +:category: Программирование +:tags: программирование, C, C++, Qt, + +:toc: + +== C + +* http://nanomsg.org[nanomsg]: сетевое взаимодействие +* https://noping.cc[oping]: работа с ICMP-пакетами +* https://github.com/xianyi/OpenBLAS[openblas]: оптимизированная версия +https://ru.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms[BLAS] + +== C++ + +* https://github.com/nlohmann/json[JSON] +* https://github.com/fmtlib/fmt[fmtlib]: форматирование строк +* https://github.com/gabime/spdlog[spdlog]: журналирование +* https://github.com/skystrife/cpptoml[cpptoml]: чтение +https://github.com/toml-lang/toml[TOML] +* https://github.com/martinmoene/gsl-lite/[gsl-lite]: реализация +рекомендаций https://github.com/isocpp/CppCoreGuidelines[C++ Core +Guidelines] +* http://www.holoborodko.com/pavel/mpfr[mpfrc++]: C++ интерфейс для +https://www.mpfr.org/[MPFR] + +== Qt + +* https://github.com/sjinks/qt_signalwatcher[Обработка сигналов UNIX] diff --git a/wiki/Prog/Links/Библиотеки C CPP.md b/wiki/Prog/Links/Библиотеки C CPP.md deleted file mode 100644 index 0887b77..0000000 --- a/wiki/Prog/Links/Библиотеки C CPP.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: "Библиотеки для C, C++" -category: Программирование -tags: программирование, C, C++, Qt, -summary: -toc: yes -... - -[TOC] - -### C - -* [nanomsg](http://nanomsg.org): сетевое взаимодействие -* [oping](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) -* [gsl-lite](https://github.com/martinmoene/gsl-lite/): реализация рекомедаций [C++ Core Guidelines](https://github.com/isocpp/CppCoreGuidelines) -* [mpfrc++](http://www.holoborodko.com/pavel/mpfr): C++ интерфейс для [MPFR](https://www.mpfr.org/) - -### Qt - -* [Обработка сигналов UNIX](https://github.com/sjinks/qt_signalwatcher) - diff --git a/wiki/Prog/Time/Работа с датами и временем.adoc b/wiki/Prog/Time/Работа с датами и временем.adoc new file mode 100644 index 0000000..d223002 --- /dev/null +++ b/wiki/Prog/Time/Работа с датами и временем.adoc @@ -0,0 +1,151 @@ += Работа с датами и временем +:category: Программирование +:tags: программирование, время, часы, дата +:toc: auto + +== Временные шкалы + +В идеале системы учёта времени должны обладать тремя характеристиками: + +. _точность_ (время базируется на атомном стандарте, каждая секунда +отсчитывается как секунда в системе СИ, нет високосных секунд, переводов +на зимнее или летнее время и т.п.); +. _простота_ (каждый '`день`' состоит из 86400 "`секунд`"); +. _календарные дни_ (дни календаря точно соответствуют вращению Земли). + +На практике есть возможность выбрать шкалу только с двумя +характеристиками из трёх. + +. точность и календарные дни. Примером такой шкалы является UTC, в +которой отсчёт дней и секунд ведётся разными методами (секунды +исчисляются по атомному стандарту, а дни по суточному вращению Земли), а +соответствие достигается вводом _секунды координации_; +. календарные дни и простота. Примером такой шкалы является POSIX (IEEE +Std 1003.1-1988), в которой день всегда равен 86400 секундам; +. точность и простота. Этими характеристиками обладают технические шкалы +(атомные часы, GPS), в которых не важен учёт дней. + +== Классы времени + +Время можно условно поделить на два класса: физическое и гражданское. + +. _Физическое_ время представляет собой точки на непрерывной шкале, +такую концепцию достаточно точно отражает UTC, если можно пренебречь +_секундой координации_ (дополнительная секунда, добавляемая к UTC 30 +июня или 31 декабря для согласования со средним солнечным временем UT1. +В этот момент время условно обозначается как 23:59:60, а на шкале UTC +две секунды отображаются как одна). +. _Гражданское_ время представляется полями (год, месяц, число, час, +минута, секунда, доли секунды, а также временная зона и календарь, +который по умолчанию считается Григорианским). + +Почти всегда существует возможность однозначно перевести физическое +время в гражданское и наоборот, но при этом следует различать их +свойства и применение (ближайшая аналогия — массивы байтов и символьные +строки). + +Основная проблема состоит в том, что в обычном употреблении не всегда +можно сделать вывод о том, какой класс времени подразумевается, и +гражданское время меняется на основании юридических актов (указов, +постановлений и т.п.), что приводит к неоднозначности при планировании +событий. + +== Обработка на компьютере + +=== Хранение и отображение + +Для ссылки на момент во времени необходимо использовать единую шкалу, на +которой нет разрывов, связанных с летним временем. Примером стандарта +времени с такой шкалой является UTC. Локальное или местное время для +таких целей не подходит, так как на его шкале имеются разрывы и +неоднозначности, связанные с переходами на летнее время и обратно. + +Если нужно сохранить значение локального времени, то необходимо +сохранить также смещение относительно UTC, чтобы временную отметку можно +было интерпретировать однозначно. Необходимо помнить, что местное время +может отличаться от UTC на интервал не кратный часу (например, в +Нидерландах с 1909-05-01 по 1937-06-30 смещение времени от UTC +составляло 19 минут и 32.13 секунд). + +Правила хранения и отображения времени: + +. Время всегда хранится в UTC. При необходимости дополнительно +сохраняется информация о временной зоне (смещение и/или название). +. Для вывода на экран время переводится в местное. +. При выводе на экран отличного от местного времени необходимо указывать +название часового пояса или типа исчисления (например, Юлианский +календарь). + +=== Системное время для администратора + +Системный администратор должен следить за тем, чтобы файлы базы данных +описания временных зон *tzdata* имели одну версию в рамках комплекса и +обновлялись регулярно, чтобы минимизировать расхождения с внешними +системами. Особенно это важно делать при издании новых правил учёта +зимнего или летнего времени. + +На серверах аппаратные часы всегда должны использовать UTC. Операционные +системы тоже должны использовать UTC, чтобы при возникновении проблем в +файлах журналов было указано время в едином формате. + +В рамках комплекса следует использовать синхронизацию времени, даже если +нет доверенного источника более высокого уровня. + +=== Клиентские приложения + +В общем случае нельзя доверять временным отметкам внешних клиентов, так +как невозможно гарантировать их корректность. Программа должна +самостоятельно ставить временные отметки для происходящих событий. +Исключением являются программные комплексы, в которых предусмотрено +наличие доверенных приложений, ответственных за установку временных +отметок. + +=== Postgresql + +Сервер базы данных должен использовать только временную зону UTC. Для +этого в файле настройки сервера `postgresql.conf` должна быть строка + +.... +timezone = 'UTC' +.... + +При создании таблиц необходимо использовать типы данных +`timestamp without time zone` и `time without time zone`. Если данные о +времени должны содержать информацию о временной зоне или смещении +относительно UTC, то нужно создать дополнительные столбцы, информацию из +которых должно обрабатывать клиентское приложение. Например, временные +отметки можно хранить в таком виде + +[source,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`, +например + +[source,sql] +---- +SELECT TIMESTAMP '2001-02-16 20:38:40Z' AT TIME ZONE 'MSK'; +---- + +В результате время будет преобразовано из временной зоны UTC в MSK. +Модификатор `Z` в записи времени указывает на принадлежность зоне UTC. + +=== Qt + +Класс `QTimeZone` предназначен для получения информации о временной зоне +и перевода времени из одной временной зоны в другую. diff --git a/wiki/Prog/Time/Работа с датами и временем.md b/wiki/Prog/Time/Работа с датами и временем.md deleted file mode 100644 index e28b121..0000000 --- a/wiki/Prog/Time/Работа с датами и временем.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -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.adoc b/wiki/Vim/Vimdiff.adoc new file mode 100644 index 0000000..b2523b1 --- /dev/null +++ b/wiki/Vim/Vimdiff.adoc @@ -0,0 +1,19 @@ += Vim: сравнение файлов +:title-separator: {sp}| +:category: Vim +:tags: Vim, команды Vim, + +Команды режима `diff` для сравнения и слияния файлов: + +[cols="1,2",options="header",] +|=== +|Команда |Назначение +|`do` |Получить изменения из второго окна в текущее окно +|`dp` |Вставить изменения из текущего окна во второе окно +|`]c` |Перейти к следующему отличию +|`[c` |Перейти к предыдущему отличию +|`C-W` `C-W` |Переход между окнами +|=== + +http://vimcasts.org/episodes/fugitive-vim-resolving-merge-conflicts-with-vimdiff/[Видеоурок] +по трехпутевому слиянию. diff --git a/wiki/Vim/Vimdiff.md b/wiki/Vim/Vimdiff.md deleted file mode 100644 index 7534503..0000000 --- a/wiki/Vim/Vimdiff.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Vim: сравнение файлов" -category: Vim -tags: Vim, команды Vim, -summary: -... - -Команды режима `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/Замена выделенного блока.adoc b/wiki/Vim/Замена выделенного блока.adoc new file mode 100644 index 0000000..a12cfcf --- /dev/null +++ b/wiki/Vim/Замена выделенного блока.adoc @@ -0,0 +1,22 @@ += Vim: замена выделенного блока +:title-separator: {sp}| +:category: Vim +:tags: Vim, команды Vim, + +Замену блока, выделенного в режиме VISUAL, можно выполнить +последовательностью команд `y:%s/"/заменитель/g`. + +[cols="1,3",options="header",] +|=== +|Команда |Назначение +|`y` |Копирование в регистр " +|`:` |Перейти в командный режим +|`%` |Применить ко всему буферу +|`s` |Замена +|`Сtrl-r` |Вставка из регистра +|`"` |Имя регистра (будет предложено по умолчанию) +|`/` |Разделитель +|`заменитель` |Новый текст +|`/` |Разделитель +|`g` |Для всех вхождений в строке +|=== diff --git a/wiki/Vim/Замена выделенного блока.md b/wiki/Vim/Замена выделенного блока.md deleted file mode 100644 index 37af540..0000000 --- a/wiki/Vim/Замена выделенного блока.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Vim: замена выделенного блока" -category: Vim -tags: Vim, команды Vim, -summary: -... - -Замену блока, выделенного в режиме VISUAL, можно выполнить -последовательностью команд `y:%s/"/заменитель/g`. - -Команда | Назначение ----------------|------------- -`y` | Копирование в регистр " -`:` | Перейти в командный режим -`%` | Применить ко всему буферу -`s` | Замена -`Сtrl-r` | Вставка из регистра -`"` | Имя регистра (будет предложено по умолчанию) -`/` | Разделитель -`заменитель` | Новый текст -`/` | Разделитель -`g` | Для всех вхождений в строке - diff --git a/wiki/Vim/Клавиши Leader и LocalLeader.md b/wiki/Vim/Клавиши Leader и LocalLeader.adoc similarity index 84% rename from wiki/Vim/Клавиши Leader и LocalLeader.md rename to wiki/Vim/Клавиши Leader и LocalLeader.adoc index cab91b5..0768c15 100644 --- a/wiki/Vim/Клавиши Leader и LocalLeader.md +++ b/wiki/Vim/Клавиши Leader и LocalLeader.adoc @@ -1,39 +1,40 @@ ---- -title: "Vim: клавиши Leader и LocalLeader" -category: Vim -tags: Vim, команды Vim, -summary: -... += Vim: клавиши Leader и LocalLeader +:title-separator: {sp}| +:category: Vim +:tags: Vim, команды Vim, Клавиши `Leader` и `LocalLeader` представляют собой префиксы для команд. Их текущие значения можно посмотреть командами -```vim +[source,vim] +---- :echo mapleader :echo maplocalleader -``` +---- -Часто их значения переназначают в файле `$HOME/.vimrc`, например так +Часто их значения переназначают в файле `$HOME/.vim/vimrc`, например так -```vim +[source,vim] +---- let mapleader = "\" let maplocalleader = "," -``` +---- Новое значение команды генерируется с помощью текущих значений этих переменных, таким образом последовательность команд -```vim +[source,vim] +---- let mapleader = "," nnoremap a :echo "Hey there ," let mapleader = "\" nnoremap a :echo "Hey there space" -``` +---- приведёт к тому, что будут созданы две команды `,a` и `a`, следовательно для получения единообразных команд следует помещать -переназначения в начало файла `$HOME/.vimrc`. +переназначения в начало файла `$HOME/.vim/vimrc`. `LocalLeader` отличается от `Leader` тем, что действует только для текущего буфера, поэтому обычно используется в плагинах, загружаемых @@ -42,7 +43,7 @@ nnoremap a :echo "Hey there space" Таймауты для ввода команд, использующих клавиши `Leader` и `LocalLeader`, настраиваются командой -```vim +[source,vim] +---- set timeout timeoutlen=5000 ttimeoutlen=100 -``` - +---- diff --git a/wiki/Vim/Клавиши PageUp и PageDown.md b/wiki/Vim/Клавиши PageUp и PageDown.adoc similarity index 76% rename from wiki/Vim/Клавиши PageUp и PageDown.md rename to wiki/Vim/Клавиши PageUp и PageDown.adoc index 9996cd6..dd93106 100644 --- a/wiki/Vim/Клавиши PageUp и PageDown.md +++ b/wiki/Vim/Клавиши PageUp и PageDown.adoc @@ -1,14 +1,13 @@ ---- -title: "Vim: клавиши PageUp и PageDown" -category: Vim -tags: Vim, команды Vim, -summary: -... += Vim: клавиши PageUp и PageDown +:title-separator: {sp}| +:category: Vim +:tags: Vim, команды Vim, Чтобы поведение клавиш `PageUp` и `PageDown` совпадало с более -привычным, можно добавить в `$HOME/.vimrc` следующий код: +привычным, можно добавить в `$HOME/.vim/vimrc` следующий код: -```vim +[source,vim] +---- " Более привычные PgUp / PgDown, когда курсор остаётся в той же строке, " " а не переносится вверх / вниз экрана, как при стандартном PgUp / PgDown. " " Поскольку по умолчанию прокрутка по C-U / C-D, при которой курсор остаётся @@ -18,5 +17,4 @@ nmap nmap imap imap -``` - +---- diff --git a/wiki/Vim/Кодировка файла.md b/wiki/Vim/Кодировка файла.adoc similarity index 91% rename from wiki/Vim/Кодировка файла.md rename to wiki/Vim/Кодировка файла.adoc index 265e3c5..6dc4c48 100644 --- a/wiki/Vim/Кодировка файла.md +++ b/wiki/Vim/Кодировка файла.adoc @@ -1,15 +1,14 @@ ---- -title: "Vim: кодировка файла" -category: Vim -tags: Vim, -summary: -... += Vim: кодировка файла +:title-separator: {sp}| +:category: Vim +:tags: Vim, Для управления кодировкой файлов можно создать дополнительное меню, позволяющее открыть файл в выбранной кодировке, проверить её корректность и сохранить в нужном виде. Пример кода: -```vim +[source,vim] +---- " кодировка для чтения файла set encoding=utf-8 " кодировка терминала @@ -29,5 +28,4 @@ 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/Комментирование кода.adoc b/wiki/Vim/Комментирование кода.adoc new file mode 100644 index 0000000..5e9e068 --- /dev/null +++ b/wiki/Vim/Комментирование кода.adoc @@ -0,0 +1,26 @@ += Vim: комментирование кода +:title-separator: {sp}| +:category: Vim +:tags: Vim, команды Vim, + +Отмена автоматического комментирования кода при вставке из буфера: + +[source,vim] +---- +autocmd FileType * setlocal formatoptions-=cro +---- + +Для управления комментированием можно использовать плагин +https://github.com/scrooloose/nerdcommenter[NerdCommenter]. Основные +команды: + +[cols="1,2",options="header",] +|=== +|Команда |Назначение +|`[n]cc` |комментировать блок +|`[n]cn` |комментировать с учётом вложенности +|`[n]cl` |символ комментария помещать в начало строки +|`[n]ci` |инвертирование комментариев +|`cA` |добавить комментарий в конец строки +|`[n]cu` |раскомментировать блок +|=== diff --git a/wiki/Vim/Комментирование кода.md b/wiki/Vim/Комментирование кода.md deleted file mode 100644 index ee765f0..0000000 --- a/wiki/Vim/Комментирование кода.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "Vim: комментирование кода" -category: Vim -tags: Vim, команды Vim, -summary: -... - -Отмена автоматического комментирования кода при вставке из буфера: - -```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.adoc similarity index 60% rename from wiki/Vim/Менеджер плагинов Plug.md rename to wiki/Vim/Менеджер плагинов Plug.adoc index 3423668..c6bb8a6 100644 --- a/wiki/Vim/Менеджер плагинов Plug.md +++ b/wiki/Vim/Менеджер плагинов Plug.adoc @@ -1,28 +1,28 @@ ---- -title: "Vim: менеджер плагинов Plug" -category: Vim -tags: Vim, плагины Vim, -summary: -... += Vim: менеджер плагинов Plug +:title-separator: {sp}| +:category: Vim +:tags: Vim, плагины Vim, -Автоматическое управление плагинами в Vim можно организовать -с помощью менеджера [Plug](https://github.com/junegunn/vim-plug), -установить который можно командой +Автоматическое управление плагинами в Vim можно организовать с помощью +менеджера https://github.com/junegunn/vim-plug[Plug], установить который +можно командой -```sh +[source,sh] +---- curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim -``` +---- -Чтобы использовать Plug, нужно добавить в `$HOME/.vimrc`: +Чтобы использовать Plug, нужно добавить в `$HOME/.vim/vimrc`: -1. Строку `call plug#begin('~/.vim/plugged')` -2. Список строк, начинающихся с команды `Plug`, для загрузки плагинов -3. Закончить список командой `call plug#end()` +* Строку `call plug#begin('~/.vim/plugged')` +* Список строк, начинающихся с команды `Plug`, для загрузки плагинов +* Закончить список командой `call plug#end()` Пример: -```vim +[source,vim] +---- " Обязательно использовать одиночные кавычки call plug#begin('~/.vim/plugged') @@ -40,5 +40,4 @@ Plug 'tpope/vim-fireplace', { 'for': 'clojure' } " Окончание списка плагинов call plug#end() -``` - +---- diff --git a/wiki/Vim/Навигация easymotion.md b/wiki/Vim/Навигация easymotion.adoc similarity index 81% rename from wiki/Vim/Навигация easymotion.md rename to wiki/Vim/Навигация easymotion.adoc index edde106..25c123c 100644 --- a/wiki/Vim/Навигация easymotion.md +++ b/wiki/Vim/Навигация easymotion.adoc @@ -1,15 +1,14 @@ ---- -title: "Vim: навигация по тексту с помощью easymotion" -category: Vim -tags: Vim, команды Vim, -summary: -... += Vim: навигация по тексту с помощью easymotion +:title-separator: {sp}| +:category: Vim +:tags: Vim, команды Vim, -Плагин [easymotion](https://github.com/easymotion/vim-easymotion) -предоставляет функции для удобного перемещения по тексту. -Пример настройки: +Плагин https://github.com/easymotion/vim-easymotion[easymotion] +предоставляет функции для удобного перемещения по тексту. Пример +настройки: -```vim +[source,vim] +---- " Не включать команды по умолчанию let g:EasyMotion_do_mapping = 0 @@ -49,5 +48,4 @@ omap / (easymotion-tn) " different highlight method and have some other features ) map n (easymotion-next) map N (easymotion-prev) -``` - +---- diff --git a/wiki/Vim/Навигация по буферам.adoc b/wiki/Vim/Навигация по буферам.adoc new file mode 100644 index 0000000..4a49ae4 --- /dev/null +++ b/wiki/Vim/Навигация по буферам.adoc @@ -0,0 +1,15 @@ += Vim: навигация по буферам +:title-separator: {sp}| +:category: Vim +:tags: Vim, команды Vim, + +[cols="1,2",options="header",] +|=== +|Команда |Назначение +|`:bn` |следующий буфер +|`:bp` |предыдущий буфер +|`:ls` |список открытых буферов +|`:bd` |закрыть текущий буфер +|`:b имя_буфера` |переключиться на буфер +|`:bdа имя_буфера` |удалить буфер по имени +|=== diff --git a/wiki/Vim/Навигация по буферам.md b/wiki/Vim/Навигация по буферам.md deleted file mode 100644 index a80c5e6..0000000 --- a/wiki/Vim/Навигация по буферам.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Vim: навигация по буферам" -category: Vim -tags: Vim, команды Vim, -summary: -... - -Команда | Назначение -------------------|----------------- -`:bn` | следующий буфер -`:bp` | предыдущий буфер -`:ls` | список открытых буферов -`:bd` | закрыть текущий буфер -`:b имя_буфера` | переключиться на буфер -`:bdа имя_буфера` | удалить буфер по имени - diff --git a/wiki/Vim/Нумерация строк.md b/wiki/Vim/Нумерация строк.adoc similarity index 72% rename from wiki/Vim/Нумерация строк.md rename to wiki/Vim/Нумерация строк.adoc index ae15507..d9377d0 100644 --- a/wiki/Vim/Нумерация строк.md +++ b/wiki/Vim/Нумерация строк.adoc @@ -1,14 +1,13 @@ ---- -title: "Vim: нумерация строк" -category: Vim -tags: Vim, команды Vim, -summary: -... += Vim: нумерация строк +:title-separator: {sp}| +:category: Vim +:tags: Vim, команды Vim, -Для переключения режимов отображения слева столбца нумерации -строк можно добавить в `$HOME/.vimrc` следующий код: +Для переключения режимов отображения слева столбца нумерации строк можно +добавить в `$HOME/.vimrc` следующий код: -```vim +[source,vim] +---- " Нумерация строк включена set number " Нумерация строк абсолютная @@ -28,7 +27,7 @@ function! ChangeNumbering() endfunc map # :call ChangeNumbering() -``` +---- В результате по команде `#` будет осуществляться циклическое переключение между абсолютной, относительной нумерацией diff --git a/wiki/Vim/Проверка орфографии.md b/wiki/Vim/Проверка орфографии.adoc similarity index 73% rename from wiki/Vim/Проверка орфографии.md rename to wiki/Vim/Проверка орфографии.adoc index e5c3c2c..d793879 100644 --- a/wiki/Vim/Проверка орфографии.md +++ b/wiki/Vim/Проверка орфографии.adoc @@ -1,14 +1,13 @@ ---- -title: "Vim: проверка орфографии" -category: Vim -tags: Vim, команды Vim, словарь, орфография, -summary: -... += Vim: проверка орфографии +:title-separator: {sp}| +:category: Vim +:tags: Vim, команды Vim, словарь, орфография, -Код в `$HOME/.vimrc` для циклического переключения режимов проверки +Код в `$HOME/.vim/vimrc` для циклического переключения режимов проверки орфографии: два языка, английский, русский и без проверки: -```Vim +[source,vim] +---- " По умолчанию проверка орфографии для русского и английского. setlocal spell spelllang=ru,en set spellsuggest=9 @@ -35,5 +34,4 @@ map :call ChangeSpellLang() " выбор альтернатив imap z=i map z= -``` - +---- diff --git a/wiki/Vim/Ссылки.adoc b/wiki/Vim/Ссылки.adoc new file mode 100644 index 0000000..84b92fe --- /dev/null +++ b/wiki/Vim/Ссылки.adoc @@ -0,0 +1,11 @@ += Vim: полезные ссылки +:title-separator: {sp}| +:category: Vim +:tags: Vim, + +* http://vim.org[Vim] +* http://usevim.com/[Usevim] +* http://nvie.com/posts/how-i-boosted-my-vim/[How I boosted my Vim] +* https://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/[How +to boost your Vim productivity] +* https://vimawesome.com/[Vim Awesome] diff --git a/wiki/Vim/Ссылки.md b/wiki/Vim/Ссылки.md deleted file mode 100644 index 631007b..0000000 --- a/wiki/Vim/Ссылки.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -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/Управление окнами.adoc b/wiki/Vim/Управление окнами.adoc new file mode 100644 index 0000000..339160a --- /dev/null +++ b/wiki/Vim/Управление окнами.adoc @@ -0,0 +1,20 @@ += Vim: управление окнами +:title-separator: {sp}| +:category: Vim +:tags: Vim, команды Vim, + +[cols="1,2",options="header",] +|=== +|Команда |Назначение +|`:split filename` |открыть в новом окне (горизонтальное разделение) +|`:vsplit filename` |открыть в новом окне (вертикальное разделение) +|`` `` |перейти к следующему окну +|`` `q` |закрыть текущее окно +|`` `o` |развернуть окно полностью +|`` `pass:c[_]` |развернуть окно по высоте +|`` `\|` |развернуть окно по ширине +|`` `=` |выровнять размер окон +|`` `+` |увеличить окно на 1 строку +|`` `-` |уменьшить окно на 1 строку +|`` `стрелки` |перемещение между окнами +|=== diff --git a/wiki/Vim/Управление окнами.md b/wiki/Vim/Управление окнами.md deleted file mode 100644 index e9a2b19..0000000 --- a/wiki/Vim/Управление окнами.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "Vim: управление окнами" -category: Vim -tags: Vim, команды Vim, -summary: -... - -Команда | Назначение ---------------------|------------------------- -`:split filename` | открыть в новом окне (горизонтальное разделение) -`:vsplit filename` | открыть в новом окне (вертикальное разделение) -`` `` | перейти к следующему окну -`` `q` | закрыть текущее окно -`` `o` | развернуть окно полностью -`` `_` | развернуть окно по высоте -`` `|` | развернуть окно по ширине -`` `=` | выровнять размер окон -`` `+` | увеличить окно на 1 строку -`` `-` | уменьшить окно на 1 строку -`` `стрелки` | перемещение между окнами - diff --git a/wiki/images/diag-81886ef1b8d31cdb2b865473bbeb2cf9.png b/wiki/images/diag-81886ef1b8d31cdb2b865473bbeb2cf9.png new file mode 100644 index 0000000..35078e9 Binary files /dev/null and b/wiki/images/diag-81886ef1b8d31cdb2b865473bbeb2cf9.png differ diff --git a/wiki/images/diag-e76d88ee3db613b3f806d8c773281fdc.png b/wiki/images/diag-e76d88ee3db613b3f806d8c773281fdc.png new file mode 100644 index 0000000..24b6424 Binary files /dev/null and b/wiki/images/diag-e76d88ee3db613b3f806d8c773281fdc.png differ