Compare commits
60 Commits
a228b612fe
...
adoc
Author | SHA1 | Date | |
---|---|---|---|
c36bbc9678 | |||
5661034292 | |||
322cd0643e | |||
bf0c4a6c26 | |||
3b34f960b5 | |||
02568f482b | |||
e312541ae7 | |||
f3206726a0 | |||
adb7098d1c | |||
f56fff2bd3 | |||
d02e8b7e76 | |||
82ae133e81 | |||
f8a740a624 | |||
0003a98c30 | |||
0bc4923a7b | |||
71dd5de667 | |||
25d7d9850c | |||
1554d6aca1 | |||
ac17c51a6e | |||
b1f569977e | |||
f48a608249 | |||
02dddfeb08 | |||
11e041c59a | |||
e250b413fc | |||
53373f0be9 | |||
c25940b9ca | |||
b0daad8429 | |||
0679f82298 | |||
2d1ac5eaf9 | |||
9644c34ed2 | |||
4318bc1677 | |||
c36634d58b | |||
6c5c15bc3e | |||
8425adae8e | |||
680be26063 | |||
09fb3f3d13 | |||
7c828b9ba2 | |||
0fb346107f | |||
83024d70bc | |||
27e60f978e | |||
e472ec35f1 | |||
e1f52e7b0a | |||
66832b7fbe | |||
7c64668e7f | |||
324f564aeb | |||
43c149b481 | |||
d8e0ffcd66 | |||
8c9e7d3f4a | |||
fd8f3bbc38 | |||
7c89ebf159 | |||
52f327706e | |||
7d2c994664 | |||
80287870a3 | |||
0125f9cbee | |||
6119463eb3 | |||
83bad0fb75 | |||
307ef2588e | |||
5d3e955fd6 | |||
ce481c7e30 | |||
3300089396 |
6
.gitignore
vendored
@ -1,6 +1,12 @@
|
||||
cache/*
|
||||
cache-ascii/*
|
||||
cache-full/*
|
||||
cache-html/*
|
||||
output/*
|
||||
__pycache__
|
||||
wiki/trash
|
||||
wiki/notes.sqlite
|
||||
upload.sh
|
||||
wiki/**/*.png
|
||||
wiki/**/*.png.cache
|
||||
|
||||
|
16
.gitmodules
vendored
@ -10,3 +10,19 @@
|
||||
[submodule "themes/bootstrap4"]
|
||||
path = themes/bootstrap4
|
||||
url = git@git.246060.ru:/f1x1t/pelican-theme-bootstrap4.git
|
||||
[submodule "plugins/thirdparty/yuicompressor-opt"]
|
||||
path = plugins/thirdparty/yuicompressor-opt
|
||||
url = git@git.246060.ru:/f1x1t/pelican-yuicompressor-opt.git
|
||||
[submodule "plugins/thirdparty/pelidoc"]
|
||||
path = plugins/thirdparty/pelidoc
|
||||
url = git@git.246060.ru:/f1x1t/pelican-pelidoc.git
|
||||
[submodule "plugins/thirdparty/pandoc_reader"]
|
||||
path = plugins/thirdparty/pandoc_reader
|
||||
url = git@git.246060.ru:/f1x1t/pelican-pandoc-reader
|
||||
branch = master
|
||||
[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
|
||||
|
9
Makefile
Normal file
@ -0,0 +1,9 @@
|
||||
build:
|
||||
pelican -s pelicanconf.py
|
||||
|
||||
web:
|
||||
pelican -s pelicanconf-web.py
|
||||
|
||||
clean:
|
||||
rm -rf cache __pycache__
|
||||
|
@ -1,6 +1,11 @@
|
||||
Сайт ДСП
|
||||
========
|
||||
|
||||
```sh
|
||||
sudo apt-get install pelican asciidoctor ruby-asciidoctor-pdf plantuml yui-compressor
|
||||
sudo gem install asciidoctor-diagram
|
||||
```
|
||||
|
||||
Установка:
|
||||
|
||||
```sh
|
||||
@ -9,6 +14,10 @@ cd dsp-site
|
||||
git submodule update --init --recursive plugins/thirdparty/md-metayaml
|
||||
git submodule update --init plugins/official
|
||||
git submodule update --init plugins/thirdparty/pelican-css
|
||||
git submodule update --init plugins/thirdparty/pelidoc
|
||||
git submodule update --init plugins/thirdparty/yuicompressor-opt
|
||||
git submodule update --init plugins/thirdparty/pandoc_reader
|
||||
git submodule update --init plugins/thirdparty/replacer
|
||||
git submodule update --init themes/bootstrap4
|
||||
```
|
||||
|
||||
|
122
pelicanconf-web.py
Normal file
@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*- #
|
||||
from __future__ import unicode_literals
|
||||
import os
|
||||
|
||||
class i18n(object):
|
||||
# looks for translations in
|
||||
# {LOCALE_DIR}/{LANGUAGE}/LC_MESSAGES/{DOMAIN}.mo
|
||||
# if not present, falls back to default
|
||||
|
||||
DOMAIN = 'messages'
|
||||
LOCALE_DIR = '{THEME}/translations'
|
||||
LANGUAGES = ['ru']
|
||||
NEWSTYLE = True
|
||||
|
||||
__name__ = 'i18n'
|
||||
|
||||
def register(self):
|
||||
from pelican.signals import generator_init
|
||||
generator_init.connect(self.install_translator)
|
||||
|
||||
def install_translator(self, generator):
|
||||
import gettext
|
||||
try:
|
||||
translator = gettext.translation(
|
||||
self.DOMAIN,
|
||||
self.LOCALE_DIR.format(THEME=THEME),
|
||||
self.LANGUAGES)
|
||||
except (OSError, IOError):
|
||||
translator = gettext.NullTranslations()
|
||||
generator.env.install_gettext_translations(translator, self.NEWSTYLE)
|
||||
|
||||
# ABOUT_ME = ' '
|
||||
AUTHOR = 'Андрей Астафьев'
|
||||
SITENAME = 'ДСП'
|
||||
SITEURL = 'https://dsp.246060.ru'
|
||||
|
||||
PATH = 'wiki'
|
||||
CACHE_PATH = 'cache'
|
||||
|
||||
TIMEZONE = 'Europe/Moscow'
|
||||
|
||||
DEFAULT_LANG = 'ru'
|
||||
|
||||
# Generation time
|
||||
CACHE_CONTENT = True
|
||||
LOAD_CONTENT_CACHE = True
|
||||
|
||||
# Feed generation is usually not desired when developing
|
||||
FEED_ALL_ATOM = None
|
||||
CATEGORY_FEED_ATOM = None
|
||||
TRANSLATION_FEED_ATOM = None
|
||||
AUTHOR_FEED_ATOM = None
|
||||
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'},
|
||||
}
|
||||
|
||||
DISPLAY_CATEGORIES_ON_MENU = False
|
||||
DISPLAY_CATEGORIES_ON_SIDEBAR = True
|
||||
DISPLAY_TAGS_ON_SIDEBAR = True
|
||||
|
||||
THEME = 'themes/bootstrap4'
|
||||
BOOTSTRAP_THEME = 'litera'
|
||||
|
||||
I18N_TEMPLATES_LANG = 'ru'
|
||||
I18N_GETTEXT_NEWSTYLE = True
|
||||
I18N_GETTEXT_LOCALEDIR = 'themes/bootstrap4/translations'
|
||||
I18N_GETTEXT_DOMAIN = 'messages'
|
||||
JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']}
|
||||
|
||||
PLUGIN_PATHS = ["plugins/official", "plugins/thirdparty"]
|
||||
PLUGINS = [i18n(), "pelican-css", "series", "subcategory", "tag_cloud", "tipue_search", "replacer", "asciidoctor"]
|
||||
|
||||
|
||||
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',
|
||||
]
|
||||
|
||||
REPLACES = (
|
||||
('{}/wiki/'.format(os.getcwd()), u''),
|
||||
)
|
||||
|
||||
YUICOMPRESSOR_EXECUTABLE = "yui-compressor"
|
||||
YUICOMPRESSOR_EXTRA_OPTIONS = ["--nomunge"]
|
||||
PLUGINS += ["yuicompressor-opt"]
|
||||
|
||||
PDF_PROCESSOR = True
|
||||
|
||||
# Blogroll
|
||||
LINKS = ()
|
||||
# LINKS = (('Pelican', 'http://getpelican.com/'),
|
||||
# ('Python.org', 'http://python.org/'),
|
||||
# ('Jinja2', 'http://jinja.pocoo.org/'),
|
||||
# ('You can modify those links in your config file', '#'),)
|
||||
|
||||
# Social widget
|
||||
SOCIAL = ()
|
||||
# SOCIAL = (('You can add links in your config file', '#'),
|
||||
# ('Another social link', '#'),)
|
||||
|
||||
PYGMENTS_STYLE='asciidoctor-pastie'
|
||||
|
||||
DEFAULT_PAGINATION = 20
|
||||
|
||||
# Uncomment following line if you want document-relative URLs when developing
|
||||
RELATIVE_URLS = True
|
||||
|
@ -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,6 +36,7 @@ SITENAME = 'ДСП'
|
||||
SITEURL = 'https://dsp.246060.ru'
|
||||
|
||||
PATH = 'wiki'
|
||||
CACHE_PATH = 'cache'
|
||||
|
||||
TIMEZONE = 'Europe/Moscow'
|
||||
|
||||
@ -52,18 +54,11 @@ AUTHOR_FEED_ATOM = None
|
||||
AUTHOR_FEED_RSS = None
|
||||
USE_FOLDER_AS_CATEGORY = True
|
||||
DEFAULT_DATE = 'fs'
|
||||
STATIC_PATHS = [ 'images', 'files' ]
|
||||
STATIC_PATHS = [ 'images', 'files', 'extras' ]
|
||||
DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search')
|
||||
|
||||
MARKDOWN = {
|
||||
'extension_configs': {
|
||||
'markdown.extensions.codehilite': {'css_class': 'highlight'},
|
||||
'markdown.extensions.extra': {},
|
||||
'markdown.extensions.meta': {},
|
||||
'markdown.extensions.toc': {
|
||||
'title': 'Содержание'
|
||||
},
|
||||
} ,
|
||||
'output_format': 'html5',
|
||||
EXTRA_PATH_METADATA = {
|
||||
'extras/favicon.ico': {'path': 'favicon.ico'},
|
||||
}
|
||||
|
||||
DISPLAY_CATEGORIES_ON_MENU = False
|
||||
@ -80,31 +75,31 @@ I18N_GETTEXT_DOMAIN = 'messages'
|
||||
JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']}
|
||||
|
||||
PLUGIN_PATHS = ["plugins/official", "plugins/thirdparty"]
|
||||
PLUGINS = [i18n(), "pelidoc", "md-metayaml", "render_math", "series", "subcategory", "tag_cloud", "tipue_search", "pelican-css"]
|
||||
#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_EXTRA_OPTIONS = [
|
||||
"--toc",
|
||||
"-V", "toc-title:Содержание",
|
||||
"-F", "skip-toc-tag",
|
||||
"--template=wiki",
|
||||
"--pdf-engine=xelatex"
|
||||
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_MARKDOWN_EXTENSIONS = [
|
||||
"+smart"
|
||||
]
|
||||
REPLACES = (
|
||||
('{}/wiki/'.format(os.getcwd()), u''),
|
||||
)
|
||||
|
||||
#YUICOMPRESSOR_EXECUTABLE = "yui-compressor"
|
||||
#PLUGINS += ["yuicompressor"]
|
||||
YUICOMPRESSOR_EXECUTABLE = "yui-compressor"
|
||||
YUICOMPRESSOR_EXTRA_OPTIONS = ["--nomunge"]
|
||||
#PLUGINS += ["yuicompressor-opt"]
|
||||
|
||||
DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search')
|
||||
PDF_PROCESSOR = True
|
||||
|
||||
# Blogroll
|
||||
LINKS = ()
|
||||
@ -118,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
|
||||
|
||||
|
1
plugins/thirdparty/asciidoctor
vendored
Submodule
1
plugins/thirdparty/pandoc_reader
vendored
Submodule
1
plugins/thirdparty/pelidoc
vendored
Submodule
1
plugins/thirdparty/replacer
vendored
Submodule
1
plugins/thirdparty/yuicompressor-opt
vendored
Submodule
12
wiki/Latex/Висячие строки.adoc
Normal file
@ -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}
|
||||
----
|
105
wiki/Latex/ЕСПД в LyX.adoc
Normal file
@ -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]
|
||||
|
13
wiki/Latex/Защита команд.adoc
Normal file
@ -0,0 +1,13 @@
|
||||
= LaTeX: защита команд
|
||||
:title-separator: {sp}|
|
||||
:category: LaTeX
|
||||
:tags: LaTeX, текст,
|
||||
|
||||
Команда `\protect` используется для защиты инструкций внутри хрупких
|
||||
команд. Например, для защиты команды переноса строки внутри команды
|
||||
`section` нужно написать:
|
||||
|
||||
[source,latex]
|
||||
----
|
||||
\section{Первая строка\protect\\Вторая строка}
|
||||
----
|
12
wiki/Latex/Лигатуры.adoc
Normal file
@ -0,0 +1,12 @@
|
||||
= LaTeX: лигатуры
|
||||
:title-separator: {sp}|
|
||||
:category: LaTeX
|
||||
:tags: LaTeX, шрифты,
|
||||
|
||||
Команды для запрета использования лигатур:
|
||||
|
||||
[source,latex]
|
||||
----
|
||||
\usepackage{microtype}
|
||||
\DisableLigatures[f]{encoding = *, family = *}
|
||||
----
|
29
wiki/Latex/Многостраничные таблицы в LyX.adoc
Normal file
@ -0,0 +1,29 @@
|
||||
= LyX: многостраничные таблицы
|
||||
:title-separator: {sp}|
|
||||
:category: LaTeX
|
||||
:tags: LaTeX, текст, LyX, таблицы,
|
||||
|
||||
* Создать таблицу как минимум с четырьмя строками.
|
||||
* Щёлкнуть правой кнопкой мыши на таблице, выбрать во всплывающем меню
|
||||
*Длинная таблица*.
|
||||
* Щёлкнуть правой кнопкой мыши на таблице, выбрать во всплывающем меню
|
||||
*Настройки*.
|
||||
* Установить курсор на первой строке таблицы, в окне настроек перейти на
|
||||
вкладку *Длинная таблица*.
|
||||
* Выбрать *Подпись* и *Первый заголовок*.
|
||||
* Нажать *Применить*.
|
||||
* Установить курсор на второй строке таблицы, в окне настроек перейти на
|
||||
вкладку *Длинная таблица*.
|
||||
* Выбрать *Подпись* и *Заголовок*.
|
||||
* Нажать *Применить*.
|
||||
* Установить курсор на третьей строке таблицы, в окне настроек перейти
|
||||
на вкладку *Длинная таблица*.
|
||||
* Выбрать *Заголовок* и *Первый заголовок*.
|
||||
* Нажать *Применить*.
|
||||
* Щёлкнуть правой кнопкой мыши на второй строке таблицы, выбрать в меню
|
||||
*Подпись (Ненумерованный)*.
|
||||
* На первой строке таблицы установить метку и ввести текст подписи к
|
||||
таблице на начальной странице.
|
||||
* На второй строке таблицы сформировать текст подписи к таблице, который
|
||||
будет использоваться на последующих страницах.
|
||||
* На третьей строке нужно сформировать заголовок таблицы.
|
8
wiki/Latex/Переносы.adoc
Normal file
@ -0,0 +1,8 @@
|
||||
= LaTeX: переносы строк
|
||||
:title-separator: {sp}|
|
||||
:category: LaTeX
|
||||
:tags: LaTeX, текст,
|
||||
|
||||
Текст между командами `\sloppy` и `\fussy` или внутри блока
|
||||
`\begin{sloppypar} ... \end{sloppypar}` будет переноситься сразу при
|
||||
достижении края бокса.
|
20
wiki/Latex/Русский в PDF.adoc
Normal file
@ -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.
|
26
wiki/Linux/Astra/Авторизация в PostgreSQL.adoc
Normal file
@ -0,0 +1,26 @@
|
||||
= Astra: авторизация в PostgreSQL через PAM
|
||||
:title-separator: {sp}|
|
||||
:category: Linux
|
||||
:tags: Linux, Astra, postgresql, базы данных,
|
||||
|
||||
|
||||
Для обеспечения авторизации пользователей через PAM системному
|
||||
пользователю `postgres`, с правами которого выполняется сервер базы
|
||||
данных, необходимо выдать права на чтение информации из базы данных
|
||||
пользователей и сведений о мандатных метках и привилегиях:
|
||||
|
||||
[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, нужно выполнить команду
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
usermac -c 0:0 -l 0:0 user
|
||||
----
|
46
wiki/Linux/CUPS.adoc
Normal file
@ -0,0 +1,46 @@
|
||||
= CUPS: команды
|
||||
:title-separator: {sp}|
|
||||
:category: Linux
|
||||
:tags: Linux, печать, CUPS,
|
||||
|
||||
Текущее состояние принтера (см. также http://cheat.sh/lpstat[lpstat]):
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
lpstat -h hostname -p printer_name
|
||||
----
|
||||
|
||||
Возобновить работу принтера:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
lpadmin -h hostname -p printer_name -E
|
||||
----
|
||||
|
||||
Печать (см. также http://cheat.sh/lp[lp]):
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
lp -h hostname -d printer_name file.pdf
|
||||
----
|
||||
|
||||
Просмотр очереди:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
lpq -h hostname -p printer_name
|
||||
----
|
||||
|
||||
Удаление задания job-id из очереди:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
lprm -h hostname -p printer_name job-id
|
||||
----
|
||||
|
||||
Удаление всех заданий из очереди:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
lprm -h hostname -p printer_name -
|
||||
----
|
10
wiki/Linux/DPKG/APT.adoc
Normal file
@ -0,0 +1,10 @@
|
||||
= APT
|
||||
:category: Linux
|
||||
:tags: linux, ubuntu, debian, apt,
|
||||
|
||||
Запрет загрузки переводов описаний пакетов:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/99translations
|
||||
----
|
36
wiki/Linux/GnuPG/Шифрование файлов с помощью GnuPG.adoc
Normal file
@ -0,0 +1,36 @@
|
||||
= GnuPG: шифрование файлов
|
||||
:title-separator: {sp}|
|
||||
:category: Linux
|
||||
:tags: Linux, GnuPG, безопасность
|
||||
|
||||
Для шифрования файлов с использованием публичного ключа адресата можно
|
||||
выполнить команду:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
tar cp files_list | pv | gpg -e --recipient user@domain.tld > archive.tar.gpg
|
||||
----
|
||||
|
||||
По умолчанию во время шифрования данные сжимаются компрессорами `zip`
|
||||
или `gzip`, поэтому сжимать данные до `gpg` не нужно. Можно отключить
|
||||
стандартный алгоритм сжатия и использовать собственный компрессор,
|
||||
например `xz`:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
tar cp files_list | pv | xz -9 | gpg -e --compress-algo none --recipient user@domain.tld > archive.tar.xz.gpg
|
||||
----
|
||||
|
||||
Для шифрования с использованием пароля:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
tar cf files_list | pv | gpg -c > archive.tar.gpg
|
||||
----
|
||||
|
||||
Для расшифровки нужно выполнить команду:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
gpg -d archive.tar.gpg --output archive.tar
|
||||
----
|
28
wiki/Linux/Hardware/GPE.adoc
Normal file
@ -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[См.
|
||||
также]
|
15
wiki/Linux/LXC/DNS в контейнере LXC.adoc
Normal file
@ -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
|
||||
----
|
92
wiki/Linux/Runit/runit.adoc
Normal file
@ -0,0 +1,92 @@
|
||||
= runit: система инициализации
|
||||
:title-separator: {sp}|
|
||||
:category: Linux
|
||||
:tags: Debian, Ubuntu, Linux, инициализация, runit,
|
||||
|
||||
== Установка
|
||||
|
||||
http://smarden.org/runit/[runit] — это система инициализации со
|
||||
встроенными средствами контроля за процессами.
|
||||
|
||||
Установка в Ubuntu:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
sudo apt-get install runit runit-systemd
|
||||
----
|
||||
|
||||
== Запуск сервисов от непривилегированного пользователя
|
||||
|
||||
Чтобы разрешить непривилегированному пользователю `user` управлять
|
||||
собственной конфигурацией для runit, нужно с правами суперпользователя
|
||||
выполнить:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
mkdir -p /etc/service/run-user/supervise
|
||||
cat > /etc/service/run-user/run << EOF
|
||||
#!/bin/sh
|
||||
|
||||
exec 2>&1
|
||||
exec chpst -u user runsvdir /home/user/sv
|
||||
EOF
|
||||
chmod +x /etc/service/run-user/run
|
||||
----
|
||||
|
||||
В результате в каталоге `/home/user/sv` пользователь `user` сможет
|
||||
создавать собственные правила управления сервисами.
|
||||
|
||||
== Пример сервиса
|
||||
|
||||
Для запуска сервера Redis пользователем `user` нужно создать файл
|
||||
конфигурации `/home/user/redis/etc/redis.conf`:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
daemonize no
|
||||
port 5079
|
||||
tcp-backlog 128
|
||||
timeout 0
|
||||
tcp-keepalive 60
|
||||
loglevel warning
|
||||
databases 1
|
||||
save 300 10
|
||||
dir /home/user/redis/var
|
||||
dbfilename surok.rdb
|
||||
client-output-buffer-limit normal 0 0 0
|
||||
client-output-buffer-limit slave 4mb 1mb 60
|
||||
client-output-buffer-limit pubsub 4mb 1mb 60
|
||||
maxclients 50
|
||||
----
|
||||
|
||||
Запускаемый сервер должен запускаться не в фоновом режиме, чтобы `runit`
|
||||
мог контролировать его состояние.
|
||||
|
||||
Скрипт `/home/user/sv/redis/run`, который `runit` использует для запуска
|
||||
процесса:
|
||||
|
||||
[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`):
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
#!/bin/sh -e
|
||||
|
||||
LOGDIR=/home/user/redis/log
|
||||
|
||||
mkdir -p "${LOGDIR}"
|
||||
exec svlogd -tt "${LOGDIR}""
|
||||
----
|
||||
|
34
wiki/Linux/System/Сервер NTP в локальной сети.adoc
Normal file
@ -0,0 +1,34 @@
|
||||
= Сервер времени NTP в локальной сети
|
||||
:category: Linux
|
||||
:tags: Linux, NTP, время,
|
||||
|
||||
Если в локальной сети необходимо синхронизировать время, не имея
|
||||
авторитетного источника времени, то можно использовать локальные часы
|
||||
сервера в качестве базовых. В этом случае файл настройки `/etc/ntp.conf`
|
||||
на сервере `192.168.0.1` будет выглядеть так:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
driftfile /var/lib/ntp/ntp.drift
|
||||
logfile /var/log/ntp.log
|
||||
tinker panic 0
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
----
|
43
wiki/Linux/Xorg/Терминал Rxvt-Unicode.adoc
Normal file
@ -0,0 +1,43 @@
|
||||
= Терминал rxvt-unicode
|
||||
:category: Linux
|
||||
:tags: Linux, Xorg, rxvt, терминал,
|
||||
|
||||
Скачать скрипт для динамического изменения размера шрифта
|
||||
|
||||
[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
|
||||
URxvt.scrollstyle: rxvt
|
||||
URxvt.scrollBar_right: True
|
||||
URxvt.scrollWithBuffer: False
|
||||
URxvt.reverseVideo: True
|
||||
URxvt.perl-ext-common: default,matcher,font-size
|
||||
URxvt.searchable-scrollback: M-S
|
||||
URxvt.scrollTtyOutput: False
|
||||
URxvt.maximized: True
|
||||
|
||||
! Подcветка URL
|
||||
URxvt.url-launcher: /usr/bin/firefox
|
||||
URxvt.matcher.button: 1
|
||||
URxvt.colorUL: #80FFFF
|
||||
|
||||
! Изменение размера шрифта
|
||||
URxvt.keysym.C-KP_Add: perl:font-size:increase
|
||||
URxvt.keysym.C-KP_Subtract: perl:font-size:decrease
|
||||
URxvt.keysym.C-S-KP_Add: perl:font-size:incglobal
|
||||
URxvt.keysym.C-S-KP_Subtract: perl:font-size:decglobal
|
||||
|
||||
! Запрет печати
|
||||
URxvt.print-pipe: "cat > /dev/null"
|
||||
----
|
||||
|
9
wiki/Linux/Ссылки.adoc
Normal file
@ -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/[Новости]
|
31
wiki/Misc/Libgen.adoc
Normal file
@ -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`.
|
22
wiki/Misc/Windows/OOShutUp.adoc
Normal file
@ -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]
|
@ -1,30 +1,20 @@
|
||||
---
|
||||
title: "CMake: управление проектом"
|
||||
category: Программирование
|
||||
tags: программирование, cmake
|
||||
summary: ""
|
||||
CSS: table-100.css
|
||||
documentclass: extarticle
|
||||
monofont: Pragmata Pro
|
||||
monofontoptions:
|
||||
- Scale=0.7
|
||||
...
|
||||
= 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
|
||||
@ -46,68 +36,85 @@ monofontoptions:
|
||||
│ └── 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)
|
||||
@ -117,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
|
||||
@ -138,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`:
|
||||
|
||||
```c
|
||||
[source,cpp]
|
||||
----
|
||||
#ifndef LIBCMEX_CMEX_HPP_
|
||||
#define LIBCMEX_CMEX_HPP_
|
||||
|
||||
@ -222,21 +233,23 @@ add_subdirectory(src/libcmex)
|
||||
int32_t cmex_init(int32_t i);
|
||||
|
||||
#endif // LIBCMEX_CMEX_HPP_
|
||||
```
|
||||
----
|
||||
|
||||
файл `cmex.cpp`:
|
||||
|
||||
```c
|
||||
[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)
|
||||
|
||||
@ -266,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"
|
||||
|
||||
@ -289,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)
|
||||
|
||||
@ -335,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_
|
||||
|
||||
@ -352,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)
|
||||
|
||||
@ -374,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 <INSTALL_DIR>/lib/libcmext.a
|
||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -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
|
||||
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include/cmext>)
|
||||
```
|
||||
----
|
||||
|
||||
```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"
|
||||
|
||||
@ -430,49 +452,62 @@ target_link_libraries(${current_target} ${CMAKE_BINARY_DIR}/lib/libcmext.a)
|
||||
|
||||
#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; // Функция из внутренней библиотеки
|
||||
std::cout << cmext_init(9) << std::endl; // Функция из внешней библиотеки
|
||||
return 0;
|
||||
QTextStream& qStdOut()
|
||||
{
|
||||
static QTextStream ts(stdout);
|
||||
return ts;
|
||||
}
|
||||
```
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
// Значение из compiler_features.hpp
|
||||
qStdOut() << QObject::tr("Compiler version: ") << CMEX_COMPILER_VERSION_MAJOR << endl;
|
||||
// Значение из config.hpp
|
||||
qStdOut() << QObject::tr("Project version: ") << CMEX_VERSION_STR << endl;
|
||||
// Значение из config.hpp
|
||||
qStdOut() << QObject::tr("Build type: ") << BUILD_TYPE << endl;
|
||||
// Функция из внутренней библиотеки
|
||||
qStdOut() << QObject::tr("libcmex function call: ") << cmex_init(4) << endl;
|
||||
// Функция из внешней библиотеки
|
||||
qStdOut() << QObject::tr("libcmext function call: ") << cmext_init(9) << endl;
|
||||
|
||||
### Qt5
|
||||
return 0;
|
||||
}
|
||||
----
|
||||
|
||||
Для поиска необходимых компонентов Qt5 нужно в файл `cmex/CMakeLists.txt`
|
||||
добавить строки:
|
||||
== Qt5
|
||||
|
||||
```cmake
|
||||
Для поиска необходимых компонентов Qt5 нужно в файл
|
||||
`cmex/CMakeLists.txt` добавить строки:
|
||||
|
||||
[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"
|
||||
|
||||
@ -482,43 +517,57 @@ target_link_libraries(${current_target} Qt5::Core)
|
||||
|
||||
#include "cmex.hpp"
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
QCoreApplication app(argc, argv);
|
||||
QTranslator translator;
|
||||
|
||||
if (translator.load(QLocale(), "cmex_app", QLatin1String("_"), QLatin1String(":/qm")))
|
||||
{
|
||||
app.installTranslator(&translator);
|
||||
}
|
||||
std::cout << QObject::tr("Compiler version: ").toStdString() << CMEX_COMPILER_VERSION_MAJOR << std::endl; // Значение из compiler_features.hpp
|
||||
std::cout << QObject::tr("Project version: ").toStdString() << CMEX_VERSION_STR << std::endl; // Значение из config.hpp
|
||||
std::cout << QObject::tr("Build type: ").toStdString() << BUILD_TYPE << std::endl; // Значение из config.hpp
|
||||
std::cout << QObject::tr("libcmex function call: ").toStdString() << cmex_init(4) << std::endl; // Функция из внутренней библиотеки
|
||||
std::cout << QObject::tr("libcmext function call: ").toStdString() << cmext_init(9) << std::endl; // Функция из внешней библиотеки
|
||||
return 0;
|
||||
QTextStream& qStdOut()
|
||||
{
|
||||
static QTextStream ts(stdout);
|
||||
return ts;
|
||||
}
|
||||
```
|
||||
|
||||
После сборки проекта в каталоге `cmex/l10n` появится файл `cmex_app_ru_RU.ts`,
|
||||
в котором нужно отредактировать переводы с помощью программы `linguist`.
|
||||
После сохранения переводов проект нужно пересобрать, файл переводов в
|
||||
скопилированном виде будет встроен в исполняемый файл `cmex`, а доступ
|
||||
к нему будет осуществляться с помощью кода:
|
||||
int main(int argc, char **argv) {
|
||||
QCoreApplication app(argc, argv);
|
||||
QTranslator translator;
|
||||
|
||||
```cpp
|
||||
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
|
||||
qStdOut() << QObject::tr("Project version: ") << CMEX_VERSION_STR << endl;
|
||||
// Значение из config.hpp
|
||||
qStdOut() << QObject::tr("Build type: ") << BUILD_TYPE << endl;
|
||||
// Функция из внутренней библиотеки
|
||||
qStdOut() << QObject::tr("libcmex function call: ") << cmex_init(4) << endl;
|
||||
// Функция из внешней библиотеки
|
||||
qStdOut() << QObject::tr("libcmext function call: ") << cmext_init(9) << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
----
|
||||
|
||||
### Графическое приложение
|
||||
После сборки проекта в каталоге `cmex/l10n` появится файл
|
||||
`cmex_app_ru_RU.ts`, в котором нужно отредактировать переводы с помощью
|
||||
программы `linguist`. После сохранения переводов проект нужно
|
||||
пересобрать, файл переводов в скомпилированном виде будет встроен в
|
||||
исполняемый файл `cmex`, а доступ к нему будет осуществляться с помощью
|
||||
кода:
|
||||
|
||||
Для создания минимального графического приложения нужно создать
|
||||
файл описания интерфейса `cmex/src/cmex/my_main_window.ui`:
|
||||
[source,cpp]
|
||||
----
|
||||
if (translator.load(QLocale(), "cmex_app", QLatin1String("_"), QLatin1String(":/qm")))
|
||||
{
|
||||
app.installTranslator(&translator);
|
||||
}
|
||||
----
|
||||
|
||||
```xml
|
||||
== Графическое приложение
|
||||
|
||||
Для создания минимального графического приложения нужно создать файл
|
||||
описания интерфейса `cmex/src/cmex/my_main_window.ui`:
|
||||
|
||||
[source,xml]
|
||||
----
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MyMainWindow</class>
|
||||
@ -539,11 +588,12 @@ int main(int argc, char **argv) {
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
```
|
||||
----
|
||||
|
||||
заголовочный файл `cmex/src/cmex/my_main_window.hpp`:
|
||||
|
||||
```cpp
|
||||
[source,cpp]
|
||||
----
|
||||
#ifndef CMEX_MY_MAIN_WINDOW_HPP_
|
||||
#define CMEX_MY_MAIN_WINDOW_HPP_
|
||||
|
||||
@ -551,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) {
|
||||
@ -572,12 +624,13 @@ MyMainWindow::MyMainWindow(QWidget* parent) {
|
||||
MyMainWindow::~MyMainWindow() {
|
||||
|
||||
}
|
||||
```
|
||||
----
|
||||
|
||||
Для отображения графического окна нужно заменить файл
|
||||
`cmex/src/cmex/main.cpp` на:
|
||||
|
||||
```cpp
|
||||
[source,cpp]
|
||||
----
|
||||
#include "compiler_features.hpp"
|
||||
#include "config.hpp"
|
||||
|
||||
@ -589,30 +642,43 @@ MyMainWindow::~MyMainWindow() {
|
||||
#include "cmex.hpp"
|
||||
#include "my_main_window.hpp"
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
QApplication app(argc, argv);
|
||||
QTranslator translator;
|
||||
|
||||
if (translator.load(QLocale(), "cmex_app", QLatin1String("_"), QLatin1String(":/qm")))
|
||||
{
|
||||
app.installTranslator(&translator);
|
||||
}
|
||||
std::cout << QObject::tr("Compiler version: ").toStdString() << CMEX_COMPILER_VERSION_MAJOR << std::endl; // Значение из compiler_features.hpp
|
||||
std::cout << QObject::tr("Project version: ").toStdString() << CMEX_VERSION_STR << std::endl; // Значение из config.hpp
|
||||
std::cout << QObject::tr("Build type: ").toStdString() << BUILD_TYPE << std::endl; // Значение из config.hpp
|
||||
std::cout << QObject::tr("libcmex function call: ").toStdString() << cmex_init(4) << std::endl; // Функция из внутренней библиотеки
|
||||
std::cout << QObject::tr("libcmext function call: ").toStdString() << cmext_init(9) << std::endl; // Функция из внешней библиотеки
|
||||
|
||||
MyMainWindow* mmw = new MyMainWindow();
|
||||
mmw->show();
|
||||
return app.exec();
|
||||
QTextStream& qStdOut()
|
||||
{
|
||||
static QTextStream ts(stdout);
|
||||
return ts;
|
||||
}
|
||||
```
|
||||
|
||||
В файле `cmex/src/cmex/CMakeLists.txt` добавить новые файлы
|
||||
к списку файлов, используемых для компиляции:
|
||||
int main(int argc, char **argv) {
|
||||
QApplication app(argc, argv);
|
||||
QTranslator translator;
|
||||
|
||||
```cmake
|
||||
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
|
||||
qStdOut() << QObject::tr("Project version: ") << CMEX_VERSION_STR << endl;
|
||||
// Значение из config.hpp
|
||||
qStdOut() << QObject::tr("Build type: ") << BUILD_TYPE << endl;
|
||||
// Функция из внутренней библиотеки
|
||||
qStdOut() << QObject::tr("libcmex function call: ") << cmex_init(4) << endl;
|
||||
// Функция из внешней библиотеки
|
||||
qStdOut() << QObject::tr("libcmext function call: ") << cmext_init(9) << endl;
|
||||
|
||||
MyMainWindow* mmw = new MyMainWindow();
|
||||
mmw->show();
|
||||
return app.exec();
|
||||
}
|
||||
----
|
||||
|
||||
В файле `cmex/src/cmex/CMakeLists.txt` добавить новые файлы к списку
|
||||
файлов, используемых для компиляции:
|
||||
|
||||
[source,cmake]
|
||||
----
|
||||
set(current_target_sources
|
||||
main.cpp
|
||||
my_main_window.cpp
|
||||
@ -621,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`.
|
39
wiki/Prog/Development/Intel Parallel Studio.adoc
Normal file
@ -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
|
||||
----
|
116
wiki/Prog/Development/PVS-Studio.adoc
Normal file
@ -0,0 +1,116 @@
|
||||
= PVS-Studio
|
||||
:category: Программирование
|
||||
:tags: программирование, C, C++, отладка,
|
||||
|
||||
:toc:
|
||||
|
||||
== Информация и лицензия
|
||||
|
||||
https://www.viva64.com/ru/pvs-studio/[PVS-Studio] — это инструмент для
|
||||
статического анализа исходного кода программ, написанных на языках С,
|
||||
C++.
|
||||
|
||||
Для использования в Linux нужно чтобы в каталоге `~/.config/PVS-Studio`
|
||||
находился лицензионный ключ или в начале исходных файлов с расширениями
|
||||
`*.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/[здесь], а ниже приведён список типовых
|
||||
команд.
|
||||
|
||||
Настройка проекта для CMake:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=On <src-tree-root>
|
||||
----
|
||||
|
||||
Сборка проекта с помощью `make`:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
pvs-studio-analyzer trace -- make -j$(nproc)
|
||||
----
|
||||
|
||||
Настройка и сборка проекта с использованием Ninja:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
cmake -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=On <src-tree-root>
|
||||
ninja -t compdb
|
||||
----
|
||||
|
||||
== Анализ проекта
|
||||
|
||||
Для анализа проектов используется утилита `pvs-studio-analyzer`. По
|
||||
умолчанию включены только диагностики общего назначения (General
|
||||
Analysis, GA). Включить дополнительные правила можно с помощью опции
|
||||
`-a`:
|
||||
|
||||
....
|
||||
-a [MODE], --analysis-mode [MODE]
|
||||
MODE defines the type of warnings:
|
||||
1 - 64-bit errors;
|
||||
2 - reserved;
|
||||
4 - General Analysis;
|
||||
8 - Micro-optimizations;
|
||||
16 - Customers Specific Requests;
|
||||
32 - MISRA.
|
||||
Modes can be combined by adding the values
|
||||
Default: 4
|
||||
....
|
||||
|
||||
Выбор типов предупреждений осуществляется на основе побитовой маски из
|
||||
приведённых выше типов. Чтобы выполнить анализ, исключив проверки MISRA,
|
||||
нужно выполнить
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
pvs-studio-analyzer analyze -a 29 -j$(nproc) -o pvs.log
|
||||
----
|
||||
|
||||
Составление отчёта для просмотра в Qt Creator:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
plog-converter -t tasklist -o pvs.tasks pvs.log
|
||||
----
|
||||
|
||||
При составлении отчёта уровень детализации можно изменять с помощью
|
||||
ключа `-a` (`--analyzer`), который производит фильтрацию предупреждений
|
||||
согласно маске, которая имеет вид `MessageType:MessageLevels`, где
|
||||
`MessageType` может принимать один из следующих типов: `GA`, `OP`, `64`,
|
||||
`CS`, `MISRA`, а `MessageLevels` может принимать значения от `1` до `3`.
|
||||
Возможна комбинация разных масок через `;`. Например, при составлении
|
||||
отчёта для просмотра в формате HTML можно повысить уровень детализации:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
plog-converter -t fullhtml -a "GA:1,2,3;64:1;OP:1,2;CS:1,2" -o html pvs.log
|
||||
----
|
||||
|
||||
Составление отчёта для редактора Vim:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
plog-converter -a "GA:1,2" -t errorfile -o pvs.err pvs.log
|
||||
----
|
||||
|
||||
Для просмотра отчёта в редакторе Vim нужно открыть файл `pvs.err` и
|
||||
выполнить команды:
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
:set makeprg=cat\ % " выбор программы для компиляции в текущей сессии
|
||||
:silent make " имитация сборки
|
||||
:cw " открытие результатов в нижнем окне
|
||||
----
|
36
wiki/Prog/Development/Подбор ключей компиляции GCC.adoc
Normal file
@ -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
|
||||
----
|
77
wiki/Prog/Development/Профилирование кода.adoc
Normal file
@ -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]
|
138
wiki/Prog/Development/Статический анализ кода.adoc
Normal file
@ -0,0 +1,138 @@
|
||||
= Статический анализ кода
|
||||
:category: Программирование
|
||||
:tags: программирование, отладка, cppcheck, iwyu, clang-tidy, cpplint, clazy,
|
||||
|
||||
== Общее описание
|
||||
|
||||
Ниже приведены утилиты для проверки кода на C++ и примеры их настройки и
|
||||
использования совместно с https://cmake.org/[CMake].
|
||||
|
||||
=== http://clang.llvm.org/extra/clang-tidy/[clang-tidy]
|
||||
|
||||
Установка:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
sudo apt-get install clang-tidy-6.0
|
||||
----
|
||||
|
||||
Использование:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-6.0" path/to/source
|
||||
----
|
||||
|
||||
В каталоге проекта нужно создать файл `.clang-tidy` в формате YAML со
|
||||
списком выполняемых проверок. Например:
|
||||
|
||||
[source,yaml]
|
||||
----
|
||||
---
|
||||
Checks: '-*,
|
||||
clang-diagnostic-*,
|
||||
readability-*,
|
||||
modernize-*,
|
||||
cppcoreguidelines-*,
|
||||
google-*,
|
||||
bugprone-*'
|
||||
CheckOptions:
|
||||
- key: readability-identifier-naming.ClassCase
|
||||
value: CamelCase
|
||||
- key: readability-identifier-naming.ClassMemberCase
|
||||
value: camelBack
|
||||
...
|
||||
----
|
||||
|
||||
Пример файла `.clang-tidy`, в котором перечислены все правила для
|
||||
проверки именования идентификаторов приведён
|
||||
https://git.246060.ru/f1x1t/clang-tidy-readability-identifier-naming[здесь].
|
||||
|
||||
=== CppCheck
|
||||
|
||||
Установка:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
sudo apt-get install cppcheck
|
||||
----
|
||||
|
||||
Использование:
|
||||
|
||||
[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.
|
||||
|
||||
=== CppLint
|
||||
|
||||
Установка:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
sudo apt-get install python3-cpplint
|
||||
----
|
||||
|
||||
Использование:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
cmake "-DCMAKE_CXX_CPPLINT=/usr/bin/cpplint;--linelength=79" path/to/source
|
||||
----
|
||||
|
||||
[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.
|
||||
|
||||
=== IWYU
|
||||
|
||||
Установка:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
sudo apt-get install iwyu
|
||||
----
|
||||
|
||||
Использование:
|
||||
|
||||
[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.
|
||||
|
||||
=== LWYU
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
cmake -DCMAKE_LINK_WHAT_YOU_USE=TRUE ..
|
||||
----
|
||||
|
||||
=== Clazy
|
||||
|
||||
Установка:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
sudo apt-get install clazy clang-6.0
|
||||
----
|
||||
|
||||
Использование:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
CLAZY_CHECKS=level2 cmake -DCMAKE_CXX_COMPILER=clazy ..
|
||||
CLANGXX=clang++-6.0 make
|
||||
----
|
||||
|
||||
=== PVS-Studio
|
49
wiki/Prog/GIS/Построение профиля местности в QGis.adoc
Normal file
@ -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[Матрица высот]
|
@ -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
|
||||
----
|
17
wiki/Prog/Git/Git замена адреса подмодуля.adoc
Normal file
@ -0,0 +1,17 @@
|
||||
= Git: замена адреса подмодуля
|
||||
:title-separator: {sp}|
|
||||
:category: Программирование
|
||||
:tags: программирование, git,
|
||||
|
||||
Если у подмодуля, находящегося в каталоге `thirdparty/example` нужно
|
||||
заменить адрес синхронизации и имя используемой ветки, то в каталоге с
|
||||
файлом `.gitmodules`, в котором содержится информация об этом подмодуле,
|
||||
нужно выполнить команды:
|
||||
|
||||
[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
|
||||
----
|
@ -1,23 +0,0 @@
|
||||
---
|
||||
title: "Git: замена адреса подмодуля"
|
||||
category: Программирование
|
||||
tags: программирование, git
|
||||
summary:
|
||||
CSS: table-100.css
|
||||
documentclass: extarticle
|
||||
monofont: Pragmata Pro
|
||||
monofontoptions:
|
||||
- Scale=0.7
|
||||
...
|
||||
|
||||
Если у подмодуля `thirdparty/example` нужно заменить адрес синхронизации
|
||||
и имя используемой ветки, то в каталоге с файлом `.gitmodules`, в котором
|
||||
содержится информация об этом подмодуле, нужно выполнить команды:
|
||||
|
||||
```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
|
||||
git submodule update --init --recursive --remote
|
||||
```
|
||||
|
346
wiki/Prog/Git/Git основные команды.adoc
Normal file
@ -0,0 +1,346 @@
|
||||
= 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). Отслеживаемые файлы, которые на
|
||||
<<states,диаграмме>>
|
||||
обозначены зелёным фоном, могут быть неизменёнными (unmodified),
|
||||
изменёнными (modified) или подготовленными к фиксации (indexed).
|
||||
|
||||
|
||||
[[states]]
|
||||
[.text-center]
|
||||
.Состояния
|
||||
[plantuml]
|
||||
----
|
||||
@startuml
|
||||
skinparam padding 16
|
||||
|
||||
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
|
||||
----
|
||||
|
||||
Основные команды, осуществляющие взаимодействие между рабочим каталогом,
|
||||
индексом, локальным и удалённым репозиторием, приведены на <<commands,диаграмме>>.
|
||||
|
||||
[[commands]]
|
||||
[.text-center]
|
||||
.Команды
|
||||
[plantuml]
|
||||
----
|
||||
@startuml
|
||||
skinparam padding 16
|
||||
|
||||
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
|
||||
----
|
||||
|
||||
Пример последовательности действий, выполняемых пользователем в совместном
|
||||
проекте, приведён на <<workflow,диаграмме>>.
|
||||
|
||||
[[workflow]]
|
||||
[.text-center]
|
||||
.Последовательность действий
|
||||
[plantuml]
|
||||
----
|
||||
@startuml
|
||||
skinparam defaultFontSize 24
|
||||
skinparam padding 16
|
||||
|
||||
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 : <font color=red>Начало работы</font>
|
||||
activate workspace
|
||||
remote -> local : <font color=red>Получение изменений с сервера</font>\n<b>git fetch</b>
|
||||
remote -> local : <font color=red>Обновление подмодулей</font>\n<b>git submodule update --remote</b>
|
||||
workspace <-> local : <font color=red>Просмотр информации</font>\n<b>git status</b>
|
||||
workspace <-> local : <font color=red>Переход на ветку master</font>\n<b>git checkout master</b>
|
||||
local -> workspace : <font color=red>Слияние с удалённой веткой</font>\n<b>git merge origin/master</b>
|
||||
local <-> workspace : <font color=red>Создание новой ветки</font>\n<b>git branch temp</b>
|
||||
local <-> workspace : <font color=red>Переход на новую ветку</font>\n<b>git checkout temp</b>
|
||||
workspace ->o workspace : <font color=red>Редактирование</font>
|
||||
workspace <-> local : <font color=red>Просмотр изменений</font>\n<b>git diff</b>
|
||||
workspace -> index : <font color=red>Занесение файлов в индекс</font>\n<b>git add</b>
|
||||
index -> local : <font color=red>Фиксация изменений</font>\n<b>git commit</b>
|
||||
local ->o local : <font color=red>Присвоение ветки осмысленного названия</font>\n<b>git branch -m temp branch_name</b>
|
||||
local ->o local : <font color=red>Переход на ветку</font>\n<b>git checkout branch_name</b>
|
||||
remote -> local : <font color=red>Получение изменений с сервера</font>\n<b>git fetch</b>
|
||||
local ->o local : <font color=red>Слияние изменений с сервера в текущую ветку (branch_name)</font>\n<b>git merge origin/master</b>
|
||||
local -> remote : <font color=red>Отправка ветки на сервер</font>\n<b>git push origin branch_name</b>
|
||||
remote ->] : <font color=red>Создание запроса на слияние</font>
|
||||
deactivate workspace
|
||||
@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` |`<dir>` |Создать пустой репозиторий в каталоге `<dir>`
|
||||
|
||||
|`git clone` |`<giturl>` `<dir>` |Создать в каталоге `<dir>` копию
|
||||
репозитория, находящегося по адресу `<giturl>`
|
||||
|
||||
|`git clone` |`--recursive <giturl>` `<dir>` |Создать в каталоге `<dir>`
|
||||
копию репозитория, находящегося по адресу `<giturl>`, с учётом
|
||||
подмодулей
|
||||
|===
|
||||
|
||||
== Подмодули
|
||||
|
||||
[width="100%",cols="15%,25%,60%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git submodule` |`add <giturl> <dir>` |Добавить в каталог `<dir>`
|
||||
текущего репозитория подмодуль, находящийся по адресу `<giturl>`
|
||||
|
||||
|`git submodule` |`update --recursive --remote` |Обновить подмодули
|
||||
|
||||
|`git submodule` |`sync --recursive` |Заменить адреса подмодулей на
|
||||
указанные в файле `.gitmodules`
|
||||
|===
|
||||
|
||||
Удаление подмодуля:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git submodule deinit <path/to/submodule>
|
||||
git rm <path/to/submodule>
|
||||
----
|
||||
|
||||
== Фиксация
|
||||
|
||||
[width="100%",cols="15%,20%,65%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git add` |`<filename>` |Подготовить файл `<filename>` к фиксации
|
||||
|
||||
|`git commit` | |Зафиксировать подготовленные файлы
|
||||
|
||||
|`git commit` |`-a` |Зафиксировать все отслеживаемые файлы, которые были
|
||||
изменены
|
||||
|===
|
||||
|
||||
== Удаление
|
||||
|
||||
[width="100%",cols="15%,20%,65%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git rm` |`<filename>` |Удалить файл из индекса и рабочего каталога
|
||||
|
||||
|`git rm` |`-f <filename>` |Принудительное удаление файла
|
||||
|
||||
|`git rm` |`--cached <filename>` |Удаление файла из проекта, но не из
|
||||
рабочего каталога
|
||||
|===
|
||||
|
||||
== Информация
|
||||
|
||||
[width="100%",cols="15%,20%,65%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git status` |`-s` |Вывод информации о рабочем каталоге в краткой форме
|
||||
|`git log` |`--oneline` |Вывод журнала изменений в краткой форме
|
||||
|`git ls-files` | |Вывод списка отслеживаемых и подготовленных файлов
|
||||
|===
|
||||
|
||||
== Удалённый репозиторий
|
||||
|
||||
[width="100%",cols="15%,20%,65%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git remote` |`-v` |Список адресов удалённых репозиториев
|
||||
|
||||
|`git branch` |`-r` |Список веток в удалённых репозиториях
|
||||
|
||||
|`git remote` |`add <name> <url>` |Создать ссылку `<name>` на удалённый
|
||||
репозиторий, находящийся по адресу `<url>`
|
||||
|
||||
|`git remote` |`rename <old> <new>` |Переименовать ссылку `<old>` на
|
||||
`<new>`
|
||||
|
||||
|`git remote` |`rm <name>` |Удалить ссылку `<name>`
|
||||
|===
|
||||
|
||||
* Обращение к удалённому репозиторию осуществляется по ссылке,
|
||||
создаваемой командой `git remote`
|
||||
* Команда `git clone` автоматически создаёт ссылку `origin`
|
||||
|
||||
== Отправка изменений
|
||||
|
||||
[width="100%",cols="15%,20%,65%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git push` |`<remote> <branch>` |Отправить ветку `<branch>` в удалённый
|
||||
репозиторий `<remote>`
|
||||
|
||||
|`git push` |`<remote> --all` |Отправить все ветки в удалённый
|
||||
репозиторий `<remote>`
|
||||
|
||||
|`git push` |`--d <remote> <branch>` |Удалить ветку `<branch>` из
|
||||
удалённого репозитория `<remote>`
|
||||
|===
|
||||
|
||||
== Получение изменений
|
||||
|
||||
[width="100%",cols="15%,20%,65%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git fetch` |`<remote>` |Получить изменения из всех веток репозитория
|
||||
`<remote>`, но не выполнять слияние
|
||||
|
||||
|`git fetch` |`<remote> <branch>` |Получить изменения из ветки
|
||||
`<branch>` репозитория `<remote>`, но не выполнять слияние
|
||||
|
||||
|`git merge` |`<remote>/<branch>` |Выполнить слияние с веткой `<branch>`
|
||||
репозитория `<remote>`
|
||||
|
||||
|`git pull` |`<remote>` |Получение и слияние
|
||||
|===
|
||||
|
||||
== Ветки
|
||||
|
||||
[width="100%",cols="15%,20%,65%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git branch` |`-a` |Список локальных и удалённых веток
|
||||
|
||||
|`git branch` | |Список локальных веток
|
||||
|
||||
|`git branch` |`<branch>` |Создать ветку `<branch>`
|
||||
|
||||
|`git checkout` |`<sha-1>` |Перейти к фиксации с идентификатором
|
||||
`<sha-1>`
|
||||
|
||||
|`git branch` |`-m <old> <new>` |Переименовать ветку `<old>` в `<new>`
|
||||
|
||||
|`git merge` |`<branch>` |Слить изменения из ветки `<branch>` в текущую
|
||||
ветку
|
||||
|
||||
|`git branch` |`-d <branch>` |Удалить ветку `<branch>`
|
||||
|===
|
||||
|
||||
== Сравнение
|
||||
|
||||
[width="100%",cols="15%,20%,65%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git diff` | |Сравнить рабочий каталог и индекс
|
||||
|
||||
|`git diff` |`–-cached` |Сравнить индекс и последнюю фиксацию
|
||||
|
||||
|`git diff` |`HEAD` |Сравнить последнюю фиксацию и рабочий каталог
|
||||
|
||||
|`git diff` |`--stat` |Краткий вывод результатов
|
||||
|
||||
|`git diff` |`<sha-1> <sha-1>` |Сравнить две точки с указанными
|
||||
идентификаторами
|
||||
|
||||
|`git diff` |`<dir>` `<file>` |Сравнивать только указанный каталог
|
||||
`<dir>` или файл `<file>`
|
||||
|
||||
|`git difftool` | |Отобразить результаты сравнения в программе,
|
||||
определяемой переменной `diff.tool`
|
||||
|===
|
12
wiki/Prog/Git/Git распаковка объекта.adoc
Normal file
@ -0,0 +1,12 @@
|
||||
= Git: распаковка объекта
|
||||
:title-separator: {sp}|
|
||||
:category: Программирование
|
||||
:tags: программирование, git,
|
||||
:toc:
|
||||
|
||||
В случае повреждения репозитория можно восстановить отдельные объекты,
|
||||
которые сохраняются в формате zlib. Пример команды:
|
||||
|
||||
....
|
||||
perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' < 1234567890abcdef1234567890abcdef012345 > file
|
||||
....
|
@ -1,18 +0,0 @@
|
||||
---
|
||||
title: "Git: распаковка объекта"
|
||||
category: Программирование
|
||||
tags: программирование, git
|
||||
summary:
|
||||
CSS: table-100.css
|
||||
documentclass: extarticle
|
||||
monofont: Pragmata Pro
|
||||
monofontoptions:
|
||||
- Scale=0.7
|
||||
...
|
||||
|
||||
В случае повреждения репозитория можно восстановить отдельные
|
||||
объекты, которые сохраняются в формате zlib. Пример команды:
|
||||
|
||||
```
|
||||
perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' < 1234567890abcdef1234567890abcdef012345 > file
|
||||
```
|
27
wiki/Prog/Git/Git репозиторий на переносном устройстве.adoc
Normal file
@ -0,0 +1,27 @@
|
||||
= Git: репозиторий на переносном устройстве
|
||||
:title-separator: {sp}|
|
||||
:category: Программирование
|
||||
:tags: программирование, git,
|
||||
|
||||
Создание репозитория для нового проекта:
|
||||
|
||||
[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/
|
||||
----
|
||||
|
||||
Добавление нового удалённого репозитория к существующему проекту:
|
||||
|
||||
[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
|
||||
----
|
30
wiki/Prog/Git/Git частичная копия репозитория.adoc
Normal file
@ -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
|
||||
----
|
39
wiki/Prog/Git/Gitlab выполнение по расписанию.adoc
Normal file
@ -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
|
||||
----
|
146
wiki/Prog/Git/Установка и настройка GitLab в LXC.adoc
Normal file
@ -0,0 +1,146 @@
|
||||
= Установка и настройка GitLab в LXC
|
||||
:category: Программирование
|
||||
:tags: программирование, gitlab, git, lxc, контейнеры, ubuntu,
|
||||
|
||||
:toc:
|
||||
|
||||
Установка выполняется в операционной системе Ubuntu Bionic.
|
||||
|
||||
== LXC
|
||||
|
||||
Создание базового контейнера:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
lxc-create -t download -n bionic-base -- --dist ubuntu --release bionic --arch amd64
|
||||
----
|
||||
|
||||
Создание контейнеров для GitLab и GitLab Runner:
|
||||
|
||||
[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
|
||||
|
||||
lxc.arch = linux64
|
||||
lxc.start.auto = 1
|
||||
|
||||
# Network configuration
|
||||
lxc.net.0.type = veth
|
||||
lxc.net.0.link = br0
|
||||
lxc.net.0.flags = up
|
||||
lxc.net.0.ipv4.address = 192.168.0.216/24
|
||||
lxc.net.0.ipv4.gateway = 192.168.0.1
|
||||
lxc.net.0.hwaddr = 00:16:3e:00:02:16
|
||||
|
||||
# Container specific configuration
|
||||
lxc.rootfs.path = overlay:/var/lib/lxc/bionic-base/rootfs:/var/lib/lxc/gitlab-bionic/delta0
|
||||
lxc.uts.name = gitlab-bionic
|
||||
|
||||
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
|
||||
|
||||
lxc.arch = linux64
|
||||
lxc.start.auto = 1
|
||||
|
||||
# Network configuration
|
||||
lxc.net.0.type = veth
|
||||
lxc.net.0.link = br0
|
||||
lxc.net.0.flags = up
|
||||
lxc.net.0.ipv4.address = 192.168.0.217/24
|
||||
lxc.net.0.ipv4.gateway = 192.168.0.1
|
||||
lxc.net.0.hwaddr = 00:16:3e:00:02:17
|
||||
|
||||
# Container specific configuration
|
||||
lxc.rootfs.path = overlay:/var/lib/lxc/bionic-base/rootfs:/var/lib/lxc/gitlab-runner-bionic/delta0
|
||||
lxc.uts.name = gitlab-runner-bionic
|
||||
|
||||
# Required for Docker
|
||||
lxc.aa_profile = unconfined
|
||||
lxc.cgroup.devices.allow = a
|
||||
lxc.cap.drop =
|
||||
|
||||
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:
|
||||
|
||||
[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` и сгенерировать локали для
|
||||
системы:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
sudo locale-gen
|
||||
----
|
||||
|
||||
Отредактировать файл `/etc/gitlab/gitlab.rb` и выполнить:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
sudo gitlab-ctl reconfigure
|
||||
sudo gitlab-ctl restart
|
||||
----
|
||||
|
||||
== GitLab Runner и Docker
|
||||
|
||||
Установить GitLab Runner:
|
||||
|
||||
[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:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
sudo apt purge apparmor
|
||||
----
|
||||
|
||||
Внутри контейнера для Docker желательно использовать драйвер `btrfs` cat
|
||||
/etc/docker/daemon.json
|
||||
|
||||
\{ ``storage-driver'': ``btrfs'' }
|
||||
|
||||
== Ссылки
|
||||
|
||||
* 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]
|
38
wiki/Prog/Lang/CPP/Qt/Qt обмен бинарными данными с БД.adoc
Normal file
@ -0,0 +1,38 @@
|
||||
= Qt: обмен бинарными данными с БД
|
||||
:title-separator: {sp}|
|
||||
:category: Программирование
|
||||
:tags: программирование, qt, postgresql, бд
|
||||
|
||||
Таблица, с которой осуществляется обмен:
|
||||
|
||||
[source,sql]
|
||||
----
|
||||
CREATE TABLE example (
|
||||
id INTEGER,
|
||||
bin_data BYTEA
|
||||
);
|
||||
----
|
||||
|
||||
Запись данных:
|
||||
|
||||
[source,cpp]
|
||||
----
|
||||
const char cart[] = {0x04, 0x43, 0x00, 0x9A};
|
||||
QByteArray binDataArray(QByteArray::fromRawData(cart, 4));
|
||||
QSqlQuery query;
|
||||
query.prepare(QString("INSERT INTO example (id, bin_data) VALUES(:id, :bin_data)");
|
||||
query.bindValue(":id", 10, QSql::In);
|
||||
query.bindValue(":bin_data", binDataArray, QSql::In | QSql::Binary);
|
||||
query.exec();
|
||||
----
|
||||
|
||||
Чтение данных:
|
||||
|
||||
[source,cpp]
|
||||
----
|
||||
QSqlQuery query;
|
||||
query.exec("SELECT id, bin_data FROM example LIMIT 1");
|
||||
query.next();
|
||||
QByteArray binDataArray = query.value(query.record().indexOf("bin_data")).toByteArray();
|
||||
----
|
||||
|
1364
wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.adoc
Normal file
29
wiki/Prog/Links/Библиотеки C CPP.adoc
Normal file
@ -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]
|
151
wiki/Prog/Time/Работа с датами и временем.adoc
Normal file
@ -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` предназначен для получения информации о временной зоне
|
||||
и перевода времени из одной временной зоны в другую.
|
19
wiki/Vim/Vimdiff.adoc
Normal file
@ -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/[Видеоурок]
|
||||
по трехпутевому слиянию.
|
22
wiki/Vim/Замена выделенного блока.adoc
Normal file
@ -0,0 +1,22 @@
|
||||
= Vim: замена выделенного блока
|
||||
:title-separator: {sp}|
|
||||
:category: Vim
|
||||
:tags: Vim, команды Vim,
|
||||
|
||||
Замену блока, выделенного в режиме VISUAL, можно выполнить
|
||||
последовательностью команд `y:%s/<ctrl-r>"/заменитель/g`.
|
||||
|
||||
[cols="1,3",options="header",]
|
||||
|===
|
||||
|Команда |Назначение
|
||||
|`y` |Копирование в регистр "
|
||||
|`:` |Перейти в командный режим
|
||||
|`%` |Применить ко всему буферу
|
||||
|`s` |Замена
|
||||
|`Сtrl-r` |Вставка из регистра
|
||||
|`"` |Имя регистра (будет предложено по умолчанию)
|
||||
|`/` |Разделитель
|
||||
|`заменитель` |Новый текст
|
||||
|`/` |Разделитель
|
||||
|`g` |Для всех вхождений в строке
|
||||
|===
|
49
wiki/Vim/Клавиши Leader и LocalLeader.adoc
Normal file
@ -0,0 +1,49 @@
|
||||
= Vim: клавиши Leader и LocalLeader
|
||||
:title-separator: {sp}|
|
||||
:category: Vim
|
||||
:tags: Vim, команды Vim,
|
||||
|
||||
Клавиши `Leader` и `LocalLeader` представляют собой префиксы для команд.
|
||||
Их текущие значения можно посмотреть командами
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
:echo mapleader
|
||||
:echo maplocalleader
|
||||
----
|
||||
|
||||
Часто их значения переназначают в файле `$HOME/.vim/vimrc`, например так
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
let mapleader = "\<Space>"
|
||||
let maplocalleader = ","
|
||||
----
|
||||
|
||||
Новое значение команды генерируется с помощью текущих значений этих
|
||||
переменных, таким образом последовательность команд
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
let mapleader = ","
|
||||
nnoremap <Leader>a :echo "Hey there ,"<CR>
|
||||
|
||||
let mapleader = "\<Space>"
|
||||
nnoremap <Leader>a :echo "Hey there space"<CR>
|
||||
----
|
||||
|
||||
приведёт к тому, что будут созданы две команды `,a` и `<Space>a`,
|
||||
следовательно для получения единообразных команд следует помещать
|
||||
переназначения в начало файла `$HOME/.vim/vimrc`.
|
||||
|
||||
`LocalLeader` отличается от `Leader` тем, что действует только для
|
||||
текущего буфера, поэтому обычно используется в плагинах, загружаемых
|
||||
для определённых типов файлов.
|
||||
|
||||
Таймауты для ввода команд, использующих клавиши `Leader` и
|
||||
`LocalLeader`, настраиваются командой
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
set timeout timeoutlen=5000 ttimeoutlen=100
|
||||
----
|
20
wiki/Vim/Клавиши PageUp и PageDown.adoc
Normal file
@ -0,0 +1,20 @@
|
||||
= Vim: клавиши PageUp и PageDown
|
||||
:title-separator: {sp}|
|
||||
:category: Vim
|
||||
:tags: Vim, команды Vim,
|
||||
|
||||
Чтобы поведение клавиш `PageUp` и `PageDown` совпадало с более
|
||||
привычным, можно добавить в `$HOME/.vim/vimrc` следующий код:
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
" Более привычные PgUp / PgDown, когда курсор остаётся в той же строке, "
|
||||
" а не переносится вверх / вниз экрана, как при стандартном PgUp / PgDown. "
|
||||
" Поскольку по умолчанию прокрутка по C-U / C-D, при которой курсор остаётся
|
||||
" на месте, происходит на полэкрана, привязка делается к двойному нажатию
|
||||
" этих комбинаций. "
|
||||
nmap <PageUp> <C-U><C-U>
|
||||
nmap <PageDown> <C-D><C-D>
|
||||
imap <PageUp> <C-O><C-U><C-O><C-U>
|
||||
imap <PageDown> <C-O><C-D><C-O><C-D>
|
||||
----
|
31
wiki/Vim/Кодировка файла.adoc
Normal file
@ -0,0 +1,31 @@
|
||||
= Vim: кодировка файла
|
||||
:title-separator: {sp}|
|
||||
:category: Vim
|
||||
:tags: Vim,
|
||||
|
||||
Для управления кодировкой файлов можно создать дополнительное меню,
|
||||
позволяющее открыть файл в выбранной кодировке, проверить её
|
||||
корректность и сохранить в нужном виде. Пример кода:
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
" кодировка для чтения файла
|
||||
set encoding=utf-8
|
||||
" кодировка терминала
|
||||
set termencoding=utf-8
|
||||
" кодировка для записи файла
|
||||
set fileencoding=utf-8
|
||||
" список предполагаемых кодировок в порядке предпочтения
|
||||
set fileencodings=utf8,koi8r,cp1251,cp866,latin1,ucs-2le
|
||||
|
||||
set wildmenu
|
||||
set wcm=<Tab>
|
||||
menu Encoding.Open\ as\ KOI8-R :e ++enc=koi8-r<CR>
|
||||
menu Encoding.Open\ as\ CP1251 :e ++enc=cp1251<CR>
|
||||
menu Encoding.Open\ as\ CP866 :e ++enc=cp866<CR>
|
||||
menu Encoding.Open\ as\ LATIN1 :e ++enc=latin1<CR>
|
||||
menu Encoding.Open\ as\ UCS-2LE :e ++enc=ucs-2le<CR>
|
||||
menu Encoding.Open\ as\ UTF-8 :e ++enc=utf-8<CR>
|
||||
menu Encoding.Convert\ to\ UTF-8 :set fenc=utf-8<CR>
|
||||
map <F12> :emenu Encoding.<Tab>
|
||||
----
|
26
wiki/Vim/Комментирование кода.adoc
Normal file
@ -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]<leader>cc` |комментировать блок
|
||||
|`[n]<leader>cn` |комментировать с учётом вложенности
|
||||
|`[n]<leader>cl` |символ комментария помещать в начало строки
|
||||
|`[n]<leader>ci` |инвертирование комментариев
|
||||
|`<leader>cA` |добавить комментарий в конец строки
|
||||
|`[n]<leader>cu` |раскомментировать блок
|
||||
|===
|
43
wiki/Vim/Менеджер плагинов Plug.adoc
Normal file
@ -0,0 +1,43 @@
|
||||
= Vim: менеджер плагинов Plug
|
||||
:title-separator: {sp}|
|
||||
:category: Vim
|
||||
:tags: Vim, плагины Vim,
|
||||
|
||||
Автоматическое управление плагинами в Vim можно организовать с помощью
|
||||
менеджера https://github.com/junegunn/vim-plug[Plug], установить который
|
||||
можно командой
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
|
||||
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
|
||||
----
|
||||
|
||||
Чтобы использовать Plug, нужно добавить в `$HOME/.vim/vimrc`:
|
||||
|
||||
* Строку `call plug#begin('~/.vim/plugged')`
|
||||
* Список строк, начинающихся с команды `Plug`, для загрузки плагинов
|
||||
* Закончить список командой `call plug#end()`
|
||||
|
||||
Пример:
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
" Обязательно использовать одиночные кавычки
|
||||
call plug#begin('~/.vim/plugged')
|
||||
|
||||
" Краткая запись для работы с github: https://github.com/junegunn/vim-easy-align
|
||||
Plug 'junegunn/vim-easy-align'
|
||||
|
||||
" Вариант с полным адресом
|
||||
Plug 'https://github.com/junegunn/vim-github-dashboard.git'
|
||||
|
||||
" Загрузка при выполнении команды
|
||||
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
|
||||
|
||||
" Загрузка для определённого типа файлов
|
||||
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
|
||||
|
||||
" Окончание списка плагинов
|
||||
call plug#end()
|
||||
----
|
51
wiki/Vim/Навигация easymotion.adoc
Normal file
@ -0,0 +1,51 @@
|
||||
= Vim: навигация по тексту с помощью easymotion
|
||||
:title-separator: {sp}|
|
||||
:category: Vim
|
||||
:tags: Vim, команды Vim,
|
||||
|
||||
Плагин https://github.com/easymotion/vim-easymotion[easymotion]
|
||||
предоставляет функции для удобного перемещения по тексту. Пример
|
||||
настройки:
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
" Не включать команды по умолчанию
|
||||
let g:EasyMotion_do_mapping = 0
|
||||
|
||||
" Умный регистр
|
||||
let g:EasyMotion_smartcase = 1
|
||||
|
||||
" <Leader>ec{char} для перехода к {char}
|
||||
map <Leader>ec <Plug>(easymotion-bd-f)
|
||||
nmap <Leader>ec <Plug>(easymotion-overwin-f)
|
||||
|
||||
" s{char}{char} для перехода к {char}{char}
|
||||
nmap s <Plug>(easymotion-overwin-f2)
|
||||
|
||||
" Переход к строке
|
||||
map <Leader>eg <Plug>(easymotion-bd-jk)
|
||||
nmap <Leader>eg <Plug>(easymotion-overwin-line)
|
||||
|
||||
" Переход к слову
|
||||
map <Leader>ew <Plug>(easymotion-bd-w)
|
||||
nmap <Leader>ew <Plug>(easymotion-overwin-w)
|
||||
|
||||
" Навигация по строкам
|
||||
map <Leader>el <Plug>(easymotion-lineforward)
|
||||
map <Leader>ej <Plug>(easymotion-j)
|
||||
map <Leader>ek <Plug>(easymotion-k)
|
||||
map <Leader>eh <Plug>(easymotion-linebackward)
|
||||
|
||||
" Повторить последний переход
|
||||
map <Leader>er <Plug>(easymotion-repeat)
|
||||
|
||||
" Замена стандартного поиска по тексту
|
||||
map / <Plug>(easymotion-sn)
|
||||
omap / <Plug>(easymotion-tn)
|
||||
|
||||
" These `n` & `N` mappings are options. You do not have to map `n` & `N` to EasyMotion.
|
||||
" Without these mappings, `n` & `N` works fine. (These mappings just provide
|
||||
" different highlight method and have some other features )
|
||||
map n <Plug>(easymotion-next)
|
||||
map N <Plug>(easymotion-prev)
|
||||
----
|
15
wiki/Vim/Навигация по буферам.adoc
Normal file
@ -0,0 +1,15 @@
|
||||
= Vim: навигация по буферам
|
||||
:title-separator: {sp}|
|
||||
:category: Vim
|
||||
:tags: Vim, команды Vim,
|
||||
|
||||
[cols="1,2",options="header",]
|
||||
|===
|
||||
|Команда |Назначение
|
||||
|`:bn` |следующий буфер
|
||||
|`:bp` |предыдущий буфер
|
||||
|`:ls` |список открытых буферов
|
||||
|`:bd` |закрыть текущий буфер
|
||||
|`:b имя_буфера` |переключиться на буфер
|
||||
|`:bdа имя_буфера` |удалить буфер по имени
|
||||
|===
|
34
wiki/Vim/Нумерация строк.adoc
Normal file
@ -0,0 +1,34 @@
|
||||
= Vim: нумерация строк
|
||||
:title-separator: {sp}|
|
||||
:category: Vim
|
||||
:tags: Vim, команды Vim,
|
||||
|
||||
Для переключения режимов отображения слева столбца нумерации строк можно
|
||||
добавить в `$HOME/.vimrc` следующий код:
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
" Нумерация строк включена
|
||||
set number
|
||||
" Нумерация строк абсолютная
|
||||
set nornu
|
||||
|
||||
function! ChangeNumbering()
|
||||
if &number
|
||||
if &rnu
|
||||
set nornu
|
||||
else
|
||||
set nonumber
|
||||
endif
|
||||
else
|
||||
set number
|
||||
set rnu
|
||||
endif
|
||||
endfunc
|
||||
|
||||
map <LocalLeader># <Esc>:call ChangeNumbering()<CR>
|
||||
----
|
||||
|
||||
В результате по команде `<LocalLeader>#` будет осуществляться
|
||||
циклическое переключение между абсолютной, относительной нумерацией
|
||||
строк и отключением нумерации.
|
37
wiki/Vim/Проверка орфографии.adoc
Normal file
@ -0,0 +1,37 @@
|
||||
= Vim: проверка орфографии
|
||||
:title-separator: {sp}|
|
||||
:category: Vim
|
||||
:tags: Vim, команды Vim, словарь, орфография,
|
||||
|
||||
Код в `$HOME/.vim/vimrc` для циклического переключения режимов проверки
|
||||
орфографии: два языка, английский, русский и без проверки:
|
||||
|
||||
[source,vim]
|
||||
----
|
||||
" По умолчанию проверка орфографии для русского и английского.
|
||||
setlocal spell spelllang=ru,en
|
||||
set spellsuggest=9
|
||||
|
||||
function! ChangeSpellLang()
|
||||
if &spelllang == "ru,en"
|
||||
setlocal spell spelllang=en
|
||||
echo "spelllang: en"
|
||||
elseif &spelllang == "en"
|
||||
setlocal spell spelllang=ru
|
||||
echo "spelllang: ru"
|
||||
elseif &spelllang == "ru"
|
||||
setlocal nospell spelllang=
|
||||
echo "spelllang: off"
|
||||
else
|
||||
setlocal spell spelllang=ru,en
|
||||
echo "spelllang: ru,en"
|
||||
endif
|
||||
endfunc
|
||||
|
||||
" map spell on/off for English/Russian
|
||||
map <C-F7> <Esc>:call ChangeSpellLang()<CR>
|
||||
|
||||
" выбор альтернатив
|
||||
imap <F7> <Esc> z=<CR>i
|
||||
map <F7> z=<CR>
|
||||
----
|
11
wiki/Vim/Ссылки.adoc
Normal file
@ -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]
|
20
wiki/Vim/Управление окнами.adoc
Normal file
@ -0,0 +1,20 @@
|
||||
= Vim: управление окнами
|
||||
:title-separator: {sp}|
|
||||
:category: Vim
|
||||
:tags: Vim, команды Vim,
|
||||
|
||||
[cols="1,2",options="header",]
|
||||
|===
|
||||
|Команда |Назначение
|
||||
|`:split filename` |открыть в новом окне (горизонтальное разделение)
|
||||
|`:vsplit filename` |открыть в новом окне (вертикальное разделение)
|
||||
|`<C-W>` `<C-W>` |перейти к следующему окну
|
||||
|`<C-W>` `q` |закрыть текущее окно
|
||||
|`<C-W>` `o` |развернуть окно полностью
|
||||
|`<C-W>` `pass:c[_]` |развернуть окно по высоте
|
||||
|`<C-W>` `\|` |развернуть окно по ширине
|
||||
|`<C-W>` `=` |выровнять размер окон
|
||||
|`<C-W>` `+` |увеличить окно на 1 строку
|
||||
|`<C-W>` `-` |уменьшить окно на 1 строку
|
||||
|`<C-W>` `стрелки` |перемещение между окнами
|
||||
|===
|
BIN
wiki/extras/favicon.ico
Normal file
After Width: | Height: | Size: 17 KiB |
128
wiki/files/espdx-template.lyx
Normal file
@ -0,0 +1,128 @@
|
||||
#LyX 2.3 created this file. For more info see http://www.lyx.org/
|
||||
\lyxformat 544
|
||||
\begin_document
|
||||
\begin_header
|
||||
\save_transient_properties true
|
||||
\origin unavailable
|
||||
\textclass espdtext
|
||||
\begin_preamble
|
||||
\input{preamble}
|
||||
|
||||
\ESPDdocName{}
|
||||
\ESPDfileName{}
|
||||
\ESPDsignature{}
|
||||
\ESPDtitleApprovingSheet{}
|
||||
\ESPDauthor{}
|
||||
\ESPDdate{2019/01/01}
|
||||
|
||||
%\ESPDdepartment{Ведомство}
|
||||
%\ESPDcompany{Предприятие}
|
||||
%\ESPDclassCode{Код по классификатору}
|
||||
%\ESPDtitleApprovedBy{Должность утверждающего}{Фам. утвер.}
|
||||
%\ESPDtitleAgreedBy{Должность первого согласовавшего}{Фам. первого согл.}
|
||||
%\ESPDtitleAgreedBy{Должность второго согласовавшего}{Фам. второго согл.}
|
||||
%\ESPDtitleAgreedBy{Должность третьего согласовавшего}{Фам. третьего согл.}
|
||||
%\ESPDtitleDesignedBy{Должность первого автора}{Фам. первого автора}
|
||||
%\ESPDtitleDesignedBy{Должность второго автора}{Фам. второго автора}
|
||||
|
||||
\usepackage{espdchngsheet}
|
||||
\usepackage{espdlist}
|
||||
\usepackage{espdrtis}
|
||||
\usepackage[numbertop,numbercenter]{espdframe} % Закомментировать для ТЗ
|
||||
%\usepackage[numbertop,numbercenter]{espdplain} % Раскомметировать для ТЗ
|
||||
\usepackage[acronym,toc]{glossaries}
|
||||
|
||||
\end_preamble
|
||||
\options 14pt
|
||||
\use_default_options true
|
||||
\begin_modules
|
||||
espdmarkup
|
||||
\end_modules
|
||||
\maintain_unincluded_children false
|
||||
\language russian
|
||||
\language_package default
|
||||
\inputencoding utf8
|
||||
\fontencoding global
|
||||
\font_roman "default" "default"
|
||||
\font_sans "default" "default"
|
||||
\font_typewriter "default" "default"
|
||||
\font_math "auto" "auto"
|
||||
\font_default_family default
|
||||
\use_non_tex_fonts true
|
||||
\font_sc false
|
||||
\font_osf false
|
||||
\font_sf_scale 100 100
|
||||
\font_tt_scale 100 100
|
||||
\use_microtype false
|
||||
\use_dash_ligatures false
|
||||
\graphics default
|
||||
\default_output_format default
|
||||
\output_sync 0
|
||||
\bibtex_command default
|
||||
\index_command default
|
||||
\paperfontsize default
|
||||
\spacing onehalf
|
||||
\use_hyperref true
|
||||
\pdf_bookmarks true
|
||||
\pdf_bookmarksnumbered false
|
||||
\pdf_bookmarksopen false
|
||||
\pdf_bookmarksopenlevel 1
|
||||
\pdf_breaklinks false
|
||||
\pdf_pdfborder false
|
||||
\pdf_colorlinks false
|
||||
\pdf_backref false
|
||||
\pdf_pdfusetitle true
|
||||
\papersize a4paper
|
||||
\use_geometry false
|
||||
\use_package amsmath 1
|
||||
\use_package amssymb 1
|
||||
\use_package cancel 1
|
||||
\use_package esint 1
|
||||
\use_package mathdots 1
|
||||
\use_package mathtools 1
|
||||
\use_package mhchem 1
|
||||
\use_package stackrel 1
|
||||
\use_package stmaryrd 1
|
||||
\use_package undertilde 1
|
||||
\cite_engine basic
|
||||
\cite_engine_type default
|
||||
\biblio_style plain
|
||||
\use_bibtopic false
|
||||
\use_indices false
|
||||
\paperorientation portrait
|
||||
\suppress_date false
|
||||
\justification true
|
||||
\use_refstyle 1
|
||||
\use_minted 0
|
||||
\index Index
|
||||
\shortcut idx
|
||||
\color #008000
|
||||
\end_index
|
||||
\secnumdepth 3
|
||||
\tocdepth 3
|
||||
\paragraph_separation indent
|
||||
\paragraph_indentation default
|
||||
\is_math_indent 0
|
||||
\math_numbering_side default
|
||||
\quotes_style swiss
|
||||
\dynamic_quotes 0
|
||||
\papercolumns 1
|
||||
\papersides 1
|
||||
\paperpagestyle default
|
||||
\bulletLaTeX 0 "\textendash"
|
||||
\bullet 1 0 8 -1
|
||||
\tracking_changes false
|
||||
\output_changes false
|
||||
\html_math_output 0
|
||||
\html_css_as_file 0
|
||||
\html_be_strict false
|
||||
\end_header
|
||||
|
||||
\begin_body
|
||||
|
||||
\begin_layout Standard
|
||||
|
||||
\end_layout
|
||||
|
||||
\end_body
|
||||
\end_document
|
100
wiki/files/parallel-studio/silent.cfg
Normal file
@ -0,0 +1,100 @@
|
||||
# Patterns used to check silent configuration file
|
||||
#
|
||||
# anythingpat - any string
|
||||
# filepat - the file location pattern (/file/location/to/license.lic)
|
||||
# lspat - the license server address pattern (0123@hostname)
|
||||
# snpat - the serial number pattern (ABCD-01234567)
|
||||
# comppat - the component abbreviation (intel-component-0123.4-567__arch), use installer command line option to get it
|
||||
|
||||
# Accept EULA, valid values are: {accept, decline}
|
||||
ACCEPT_EULA=accept
|
||||
|
||||
# Optional error behavior, valid values are: {yes, no}
|
||||
CONTINUE_WITH_OPTIONAL_ERROR=yes
|
||||
|
||||
# Install location, valid values are: {/opt/intel, filepat}
|
||||
PSET_INSTALL_DIR=/opt/intel
|
||||
|
||||
# Continue with overwrite of existing installation directory, valid values are: {yes, no}
|
||||
CONTINUE_WITH_INSTALLDIR_OVERWRITE=yes
|
||||
|
||||
# List of components to install (use semicolon to separate the components), valid values are: {ALL, DEFAULTS, comppat}
|
||||
COMPONENTS=ALL
|
||||
|
||||
# Installation mode, valid values are: {install, repair, uninstall}
|
||||
PSET_MODE=install
|
||||
|
||||
# Serial number, valid values are: {snpat}
|
||||
#ACTIVATION_SERIAL_NUMBER=snpat
|
||||
|
||||
# License file or license server, valid values are: {lspat, filepat}
|
||||
ACTIVATION_LICENSE_FILE=/opt/intel/licenses/parallel_studio.lic
|
||||
|
||||
# Activation type, valid values are: {exist_lic, license_server, license_file, serial_number}
|
||||
ACTIVATION_TYPE=license_file
|
||||
|
||||
# Sampling driver installation type, valid values are: {build, kit}
|
||||
AMPLIFIER_SAMPLING_DRIVER_INSTALL_TYPE=build
|
||||
|
||||
# Driver access group, valid values are: {anythingpat, vtune}
|
||||
AMPLIFIER_DRIVER_ACCESS_GROUP=vtune
|
||||
|
||||
# Driver access permissions, valid values are: {anythingpat, 666}
|
||||
AMPLIFIER_DRIVER_PERMISSIONS=666
|
||||
|
||||
# Load driver(s) into the kernel during installation, valid values are: {yes, no}
|
||||
AMPLIFIER_LOAD_DRIVER=no
|
||||
|
||||
# Path to C compiler, valid values are: {filepat, auto, none}
|
||||
AMPLIFIER_C_COMPILER=none
|
||||
|
||||
# Path to kernel source directory, valid values are: {filepat, auto, none}
|
||||
AMPLIFIER_KERNEL_SRC_DIR=none
|
||||
|
||||
# Path to make command, valid values are: {filepat, auto, none}
|
||||
AMPLIFIER_MAKE_COMMAND=none
|
||||
|
||||
# Install boot script to automatically reload the driver(s) on system restart, valid values are: {yes, no}
|
||||
AMPLIFIER_INSTALL_BOOT_SCRIPT=no
|
||||
|
||||
# Enable per-user collection mode for Sampling driver, valid values are: {yes, no}
|
||||
AMPLIFIER_DRIVER_PER_USER_MODE=no
|
||||
|
||||
# Path to the cluster description file, valid values are: {filepat}
|
||||
#CLUSTER_INSTALL_MACHINES_FILE=filepat
|
||||
|
||||
# Intel(R) Software Improvement Program
|
||||
#
|
||||
# To improve our software and customer experience, Intel would like to collect technical
|
||||
# information about your software installation and runtime status (such as installation metrics,
|
||||
# license/support types, software SKU/serial, counters, flags, and timestamps)
|
||||
# and development environment (such as operating system, CPU architecture,
|
||||
# last 4-digits of the MAC address and other Intel products installed). ("Information").
|
||||
#
|
||||
# Intel may collect this Information directly or optionally through the use of Google Analytics.
|
||||
# If Google Analytics is used to collect the Information, Google will aggregate the
|
||||
# Information with that of other users and present the aggregated results to Intel without any personal identifiers.
|
||||
# Information collected by Google will be retained by Google under its own data collection policies
|
||||
# (https://www.google.com/policies/privacy/partners/).
|
||||
#
|
||||
# The Information collected under this notice directly by Intel through its Intel® Software Improvement Program
|
||||
# may be retained indefinitely but it will not be shared outside of Intel or its wholly-owned subsidiaries.
|
||||
#
|
||||
# The aggregated Information provided to Intel by Google through its Software Improvement Program
|
||||
# may be retained by Intel indefinitely but it will not be shared outside of Intel or its wholly-owned subsidiaries
|
||||
#
|
||||
# You can revoke your consent at any time by removing the "~/intel/isip" file.
|
||||
# To remove the file, please open a macOS or Linux terminal, go to the folder "~/intel" and delete the "isip" file.
|
||||
# For more details, please refer to this article: (https://software.intel.com/en-us/articles/software-improvement-program)
|
||||
#
|
||||
# Yes - I consent to the collection of my Information
|
||||
# No - I do NOT consent to the collection of my Information
|
||||
#, valid values are: {yes, no}
|
||||
INTEL_SW_IMPROVEMENT_PROGRAM_CONSENT=no
|
||||
|
||||
# Perform validation of digital signatures of RPM files, valid values are: {yes, no}
|
||||
SIGNING_ENABLED=yes
|
||||
|
||||
# Select target architecture of your applications, valid values are: {IA32, INTEL64, ALL}
|
||||
ARCH_SELECTED=ALL
|
||||
|
BIN
wiki/images/lyx-espdx/01.png
Normal file
After Width: | Height: | Size: 95 KiB |
BIN
wiki/images/lyx-espdx/02.png
Normal file
After Width: | Height: | Size: 113 KiB |
BIN
wiki/images/lyx-espdx/03.png
Normal file
After Width: | Height: | Size: 115 KiB |
BIN
wiki/images/lyx-espdx/04.png
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
wiki/images/lyx-espdx/05.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
wiki/images/lyx-espdx/06.png
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
wiki/images/lyx-espdx/07.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
wiki/images/lyx-espdx/08.png
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
wiki/images/lyx-espdx/09.png
Normal file
After Width: | Height: | Size: 108 KiB |
BIN
wiki/images/lyx-espdx/10.png
Normal file
After Width: | Height: | Size: 83 KiB |
BIN
wiki/images/lyx-espdx/11.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
wiki/images/lyx-espdx/12.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
wiki/images/lyx-espdx/13.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
wiki/images/lyx-espdx/14.png
Normal file
After Width: | Height: | Size: 99 KiB |
BIN
wiki/images/lyx-espdx/15.png
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
wiki/images/lyx-espdx/16.png
Normal file
After Width: | Height: | Size: 97 KiB |
BIN
wiki/images/lyx-espdx/17.png
Normal file
After Width: | Height: | Size: 148 KiB |
BIN
wiki/images/oo-shutup/1.jpg
Normal file
After Width: | Height: | Size: 108 KiB |
BIN
wiki/images/oo-shutup/2.jpg
Normal file
After Width: | Height: | Size: 108 KiB |
BIN
wiki/images/oo-shutup/3.jpg
Normal file
After Width: | Height: | Size: 103 KiB |
BIN
wiki/images/oo-shutup/4.jpg
Normal file
After Width: | Height: | Size: 124 KiB |
BIN
wiki/images/oo-shutup/5.jpg
Normal file
After Width: | Height: | Size: 108 KiB |
BIN
wiki/images/qgis-heights/1.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
wiki/images/qgis-heights/2.png
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
wiki/images/qgis-heights/3.png
Normal file
After Width: | Height: | Size: 603 KiB |