Compare commits

..

167 Commits
adoc ... master

Author SHA1 Message Date
9206a9ff3a Все подмодули на собственном сервере 2022-01-15 16:44:37 +03:00
25b194750e Обновление 2022-01-15 15:36:41 +03:00
25491b80c4 Обновление 2021-12-24 16:51:35 +03:00
8c3a99eff9 Обновление 2021-12-24 16:02:12 +03:00
a2cca2dd8c Обновление 2021-12-13 23:10:12 +03:00
8e3f80d82c Обновление 2021-10-20 10:11:49 +03:00
763ec72402 Обновление 2021-08-27 12:15:49 +03:00
7505316c2c Обновление 2021-06-08 11:22:28 +03:00
8639788c93 update 2020-11-02 09:43:29 +03:00
0e27e5e68d update 2020-11-02 08:14:58 +03:00
578274e444 Обновление подмодулей 2020-10-11 21:01:41 +03:00
2de1503574 Обновление 2020-10-11 20:49:26 +03:00
64e5aa161f Обновление 2020-10-11 20:48:22 +03:00
2b629c9dc9 Правка 2020-06-30 16:30:57 +03:00
6579472659 update 2020-05-01 17:17:34 +03:00
61fa5230ae update 2020-04-29 14:08:15 +03:00
dd840cdbc9 update 2020-04-24 22:25:49 +03:00
8fa46a57be update 2020-04-24 22:23:00 +03:00
e1bfd02131 update 2020-04-24 22:19:20 +03:00
0afb335879 update 2020-04-24 22:18:54 +03:00
daf7136008 update 2020-04-24 22:09:59 +03:00
d14d71910c update 2020-04-24 22:07:03 +03:00
1c6f6c4945 update 2020-04-24 21:56:56 +03:00
bf875c1842 update 2020-04-24 21:52:36 +03:00
373fe00cb3 update 2020-04-24 21:48:16 +03:00
b2cfbfafca update 2020-04-24 21:43:15 +03:00
c3930f59f9 update 2020-04-24 21:41:09 +03:00
1a7e8c5a56 update 2020-04-24 21:38:35 +03:00
2af87bc633 update 2020-04-24 21:35:56 +03:00
5b2ac484f8 update 2020-04-24 21:17:29 +03:00
cc81e6ac8c update 2020-04-24 21:14:17 +03:00
79193d4152 update 2020-04-22 23:07:53 +03:00
71cbd8a230 update 2020-04-22 14:14:07 +03:00
11d1c31ce7 update 2020-04-21 09:03:22 +03:00
6353b7839e update 2020-04-21 08:54:54 +03:00
4fdc1e4951 update 2020-04-21 06:43:14 +03:00
562d2ecddf update 2020-04-21 06:42:52 +03:00
101ea1880d update 2020-04-21 06:13:09 +03:00
72e6b66a52 qa 2020-04-21 06:02:52 +03:00
3617a09b2e update 2020-04-20 23:41:13 +03:00
3d3aac6206 update 2020-04-20 23:33:51 +03:00
12c6f6396f update 2020-04-20 23:27:44 +03:00
6897baf6c6 update 2020-04-20 23:27:17 +03:00
8b92ccf57a update 2020-04-20 23:26:37 +03:00
057a213a80 update 2020-04-20 23:17:35 +03:00
af643e1e35 update 2020-04-20 22:57:17 +03:00
363822b166 update 2020-04-20 22:48:38 +03:00
c723a9d7b5 update 2020-04-20 22:38:06 +03:00
33ead8f7e6 update 2020-04-20 22:32:29 +03:00
3cfc262a3d update 2020-04-20 22:19:11 +03:00
bc250dd0bf update 2020-04-20 22:12:56 +03:00
0d83b3637c update 2020-04-20 22:10:35 +03:00
6bd1d03d3b update 2020-04-20 22:04:39 +03:00
32853cc8f4 update 2020-04-20 22:00:59 +03:00
311c812181 update 2020-04-19 12:19:24 +03:00
d4bc574a94 update 2020-04-19 12:16:43 +03:00
876ff1ade5 update 2020-04-19 12:10:42 +03:00
afa58987da update 2020-04-19 12:05:06 +03:00
0643cb5f73 Обновление 2020-04-19 11:59:02 +03:00
4717bd0336 update 2020-04-19 11:36:02 +03:00
36d088e75c clazy 2020-04-19 11:31:30 +03:00
ac859dc4ec update 2020-04-16 15:50:41 +03:00
e0a18fc66d update 2020-04-16 12:47:23 +03:00
b0a8898f1f update 2020-04-16 10:12:02 +03:00
9857fa778d update 2020-04-16 10:01:56 +03:00
7da59f9b83 update 2020-04-16 09:50:22 +03:00
e208752f44 update 2020-04-16 09:40:45 +03:00
78ecf3b655 update 2020-04-16 09:30:46 +03:00
12dbf54505 update 2020-04-16 09:27:26 +03:00
3858c49164 Пример подключения переводов 2020-04-16 01:05:11 +03:00
dfd884e36b Правильная локализация 2020-04-16 01:03:34 +03:00
31c6c022bc Варианты сборки в одном файле настройки 2020-04-15 19:12:49 +03:00
e243b899b3 update 2020-04-15 18:56:04 +03:00
84990e2821 update 2020-04-15 10:32:44 +03:00
16e8ef3bdb update 2020-04-15 10:00:09 +03:00
9a9bea6b1b update 2020-04-14 23:10:26 +03:00
fc6b02c833 update 2020-04-14 22:59:24 +03:00
329145eb50 update 2020-04-14 21:52:10 +03:00
7cab7eab1b update 2020-04-14 19:43:31 +03:00
fa7da4ab1b update 2020-04-14 17:23:07 +03:00
303837da8e update 2020-04-14 17:04:45 +03:00
0f27298764 update 2020-04-14 16:57:28 +03:00
2a6147b3db update 2020-04-14 16:55:21 +03:00
de13ec6e73 update 2020-04-14 16:54:05 +03:00
dc59d8785d update 2020-04-14 16:37:35 +03:00
12b1019cab update 2020-04-14 16:27:02 +03:00
4b640a0a34 update 2020-04-14 14:20:29 +03:00
8750675e43 update 2020-04-14 13:45:26 +03:00
5761bcb0fc update 2020-04-14 13:35:51 +03:00
9530058f05 update 2020-04-14 13:25:21 +03:00
ee4f156901 update 2020-04-14 13:19:33 +03:00
019eea73cf update 2020-04-14 13:10:34 +03:00
16f6a40456 update 2020-04-14 12:37:56 +03:00
3a2222cde3 update 2020-04-14 12:31:39 +03:00
8a4866ce9f update 2020-04-14 12:17:22 +03:00
2d0baaf290 update 2020-04-14 11:56:35 +03:00
3ca7530a29 update 2020-04-14 10:01:33 +03:00
6d71ca630a update 2020-04-14 09:43:55 +03:00
cf7d33f8b2 update 2020-04-14 09:37:33 +03:00
5f85ae0f8f update 2020-04-14 01:26:01 +03:00
9b4fe8fdb1 update 2020-04-14 01:11:23 +03:00
c89fed2c07 update 2020-04-14 00:57:48 +03:00
c22fcdfdd8 update 2020-04-13 13:22:56 +03:00
65a80b8d80 update 2020-04-13 13:18:15 +03:00
634cce1c8d update 2020-04-13 12:45:11 +03:00
ec06dd2a01 update 2020-04-13 12:31:59 +03:00
6d0d152039 update 2020-04-13 12:23:07 +03:00
2d8a272d2d update 2020-04-13 12:17:34 +03:00
59492ba5c6 update 2020-04-13 12:09:20 +03:00
e9970d2b2b update 2020-04-13 12:06:11 +03:00
bdda710617 update 2020-04-13 11:52:00 +03:00
e4d5715a06 update 2020-04-13 11:47:19 +03:00
3fe8173a31 update 2020-04-13 11:35:56 +03:00
ed3f6faa1b update 2020-04-13 11:31:26 +03:00
65007b699d update 2020-04-13 11:25:28 +03:00
0160aab51f update 2020-04-13 11:19:37 +03:00
4bdb12c95e update 2020-04-13 11:06:07 +03:00
305da06de1 update 2020-04-13 11:05:48 +03:00
e1873d9579 update 2020-04-13 10:54:15 +03:00
5facc2edd6 update 2020-04-13 10:33:11 +03:00
37e74cdbaf update 2020-04-13 10:02:30 +03:00
8f38d1d96c update 2020-04-13 10:00:26 +03:00
964fb48b9a update 2020-04-13 09:11:58 +03:00
78505cfa75 update 2020-04-13 09:08:14 +03:00
5602fbc30e update 2020-04-12 20:04:35 +03:00
0f1804e3fb gitignore 2020-04-12 19:59:32 +03:00
c6648d7ae8 update 2020-04-12 19:46:33 +03:00
b9ef4fb756 update 2020-04-12 17:13:09 +03:00
002213aa87 Важное изменение в настройках для переводов 2020-04-12 17:08:45 +03:00
ac5e2dd88e update 2020-04-11 23:58:43 +03:00
b7d2c2e280 update 2020-04-11 23:09:16 +03:00
40fac363ce update 2020-04-11 22:54:03 +03:00
b8d878287c update 2020-04-11 22:43:14 +03:00
a6d0505adb update 2020-04-11 22:00:06 +03:00
c99b5f0559 update 2020-04-11 21:53:54 +03:00
5fa1f983b8 update 2020-04-11 21:48:55 +03:00
5eb808d587 update 2020-04-11 21:20:55 +03:00
ee24a0d933 update 2020-04-11 21:06:02 +03:00
7430389f3c update 2020-04-11 20:59:22 +03:00
d84e23e0ad update 2020-04-11 20:49:41 +03:00
221a63a827 update 2020-04-11 20:44:28 +03:00
07bafa380d update 2020-04-11 20:36:44 +03:00
83f97f482e images 2020-04-11 20:20:31 +03:00
321e48c500 update 2020-04-11 20:16:51 +03:00
22067a2a3d update 2020-04-11 20:09:43 +03:00
494c9f31d6 update 2020-04-11 19:44:15 +03:00
2bcf387ba4 update 2020-04-11 18:07:10 +03:00
5bf5a20624 update 2020-04-11 16:19:35 +03:00
fff4e996d2 update 2020-04-11 15:13:41 +03:00
218f22c8d2 Merge branch 'master' of git.246060.ru:/f1x1t/dsp-site 2020-04-11 15:10:08 +03:00
d931b5aaea update 2020-04-11 14:57:13 +03:00
ec16a3a380 update 2020-04-10 18:13:06 +03:00
c41683d9e2 update 2020-04-10 18:10:40 +03:00
2abd41f429 update 2020-04-10 10:59:43 +03:00
f0cba8e7f6 update 2020-04-09 20:59:56 +03:00
8e1b48e868 update 2020-04-09 20:43:02 +03:00
d3fe32a96b update 2020-04-09 20:41:13 +03:00
62ab8db450 update 2020-04-09 20:39:10 +03:00
2af67616c8 update 2020-04-09 20:35:09 +03:00
d07e6a66f8 update 2020-04-09 20:10:52 +03:00
51adf6eb5a update 2020-04-09 19:23:16 +03:00
007afda3d1 update 2020-04-08 20:09:58 +03:00
3355f9185e update 2020-04-06 08:49:00 +03:00
1e5b6aa485 update 2020-04-04 11:51:36 +03:00
679bf869e8 Merge branch 'adoc' 2019-08-30 09:31:00 +03:00
1aaacb1df7 cmake 2019-08-29 17:34:57 +03:00
1068f502bb update 2019-07-15 21:47:09 +03:00
52 changed files with 4023 additions and 1014 deletions

8
.gitignore vendored
View File

@ -1,3 +1,5 @@
/.asciidoctor
cache/* cache/*
cache-ascii/* cache-ascii/*
cache-full/* cache-full/*
@ -7,6 +9,10 @@ __pycache__
wiki/trash wiki/trash
wiki/notes.sqlite wiki/notes.sqlite
upload.sh upload.sh
wiki/**/*.png wiki/**/diag*.png
wiki/**/*.png.cache wiki/**/*.png.cache
*.pyc
*.txt
upload-*.sh

29
.gitmodules vendored
View File

@ -1,28 +1,27 @@
[submodule "plugins/thirdparty/md-metayaml"] [submodule "plugins/thirdparty/md-metayaml"]
path = plugins/thirdparty/md-metayaml path = plugins/thirdparty/md-metayaml
url = git@git.246060.ru:/f1x1t/pelican-md-metayaml.git url = git@git.246060.ru:f1x1t/pelican-md-metayaml.git
[submodule "plugins/thirdparty/pelican-css"]
path = plugins/thirdparty/pelican-css
url = https://notabug.org/jorgesumle/pelican-css
[submodule "plugins/official"]
path = plugins/official
url = git@github.com:/getpelican/pelican-plugins.git
[submodule "themes/bootstrap4"] [submodule "themes/bootstrap4"]
path = themes/bootstrap4 path = themes/bootstrap4
url = git@git.246060.ru:/f1x1t/pelican-theme-bootstrap4.git url = git@git.246060.ru:f1x1t/pelican-theme-bootstrap4.git
[submodule "plugins/thirdparty/yuicompressor-opt"] [submodule "plugins/thirdparty/yuicompressor-opt"]
path = plugins/thirdparty/yuicompressor-opt path = plugins/thirdparty/yuicompressor-opt
url = git@git.246060.ru:/f1x1t/pelican-yuicompressor-opt.git url = git@git.246060.ru:f1x1t/pelican-yuicompressor-opt.git
[submodule "plugins/thirdparty/pelidoc"] [submodule "plugins/thirdparty/pelidoc"]
path = plugins/thirdparty/pelidoc path = plugins/thirdparty/pelidoc
url = git@git.246060.ru:/f1x1t/pelican-pelidoc.git url = git@git.246060.ru:f1x1t/pelican-pelidoc.git
[submodule "plugins/thirdparty/pandoc_reader"] [submodule "plugins/thirdparty/pandoc_reader"]
path = plugins/thirdparty/pandoc_reader path = plugins/thirdparty/pandoc_reader
url = git@git.246060.ru:/f1x1t/pelican-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"] [submodule "plugins/thirdparty/asciidoctor"]
path = plugins/thirdparty/asciidoctor path = plugins/thirdparty/asciidoctor
url = git@git.246060.ru:f1x1t/pelican-asciidoctor url = git@git.246060.ru:f1x1t/pelican-asciidoctor
[submodule "plugins/thirdparty/replacer"]
path = plugins/thirdparty/replacer
url = git@git.246060.ru:f1x1t/pelican-replacer
[submodule "plugins/thirdparty/pelican-css"]
path = plugins/thirdparty/pelican-css
url = git@git.246060.ru:f1x1t/pelican-css
[submodule "plugins/official"]
path = plugins/official
url = git@git.246060.ru:f1x1t/pelican-plugins-official

View File

@ -2,7 +2,7 @@ build:
pelican -s pelicanconf.py pelican -s pelicanconf.py
web: web:
pelican -s pelicanconf-web.py COMPRESS=1 pelican -s pelicanconf.py
clean: clean:
rm -rf cache __pycache__ rm -rf cache __pycache__

View File

@ -2,8 +2,8 @@
======== ========
```sh ```sh
sudo apt-get install pelican asciidoctor ruby-asciidoctor-pdf plantuml yui-compressor sudo apt-get install pelican plantuml yui-compressor
sudo gem install asciidoctor-diagram sudo gem install asciidoctor asciidoctor-pdf asciidoctor-diagram
``` ```
Установка: Установка:
@ -18,6 +18,7 @@ git submodule update --init plugins/thirdparty/pelidoc
git submodule update --init plugins/thirdparty/yuicompressor-opt git submodule update --init plugins/thirdparty/yuicompressor-opt
git submodule update --init plugins/thirdparty/pandoc_reader git submodule update --init plugins/thirdparty/pandoc_reader
git submodule update --init plugins/thirdparty/replacer git submodule update --init plugins/thirdparty/replacer
git submodule update --init plugins/thirdparty/asciidoctor
git submodule update --init themes/bootstrap4 git submodule update --init themes/bootstrap4
``` ```

View File

@ -1,122 +0,0 @@
#!/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

View File

@ -1,35 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # # -*- coding: utf-8 -*- #
from __future__ import unicode_literals
import os 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 = ' ' # ABOUT_ME = ' '
AUTHOR = 'Андрей Астафьев' AUTHOR = 'Андрей Астафьев'
SITENAME = 'ДСП' SITENAME = 'ДСП'
@ -68,27 +40,31 @@ DISPLAY_TAGS_ON_SIDEBAR = True
THEME = 'themes/bootstrap4' THEME = 'themes/bootstrap4'
BOOTSTRAP_THEME = 'litera' BOOTSTRAP_THEME = 'litera'
I18N_TEMPLATES_LANG = 'ru' # I18N_GETTEXT_LOCALEDIR = 'translations'
# I18N_GETTEXT_DOMAIN = 'messages'
# Обязательно в виде массива
I18N_TEMPLATES_LANG = ['ru']
I18N_GETTEXT_NEWSTYLE = True I18N_GETTEXT_NEWSTYLE = True
I18N_GETTEXT_LOCALEDIR = 'themes/bootstrap4/translations'
I18N_GETTEXT_DOMAIN = 'messages'
JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']} JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']}
PLUGIN_PATHS = ["plugins/official", "plugins/thirdparty"] PLUGIN_PATHS = ["plugins/official", "plugins/thirdparty"]
PLUGINS = [i18n(), "pelican-css", "series", "subcategory", "tag_cloud", "tipue_search", "replacer", "asciidoctor"] PLUGINS = ["i18n_subsites", "pelican-css", "series", "subcategory", "tag_cloud", "tipue_search", "replacer", "asciidoctor"]
ASCIIDOCTOR_CMD = "asciidoctor" ASCIIDOCTOR_CMD = "asciidoctor"
ASCIIDOCTOR_EXTRA_OPTIONS = [ ASCIIDOCTOR_EXTRA_OPTIONS = [
'--require', 'asciidoctor-diagram', '--require', 'asciidoctor-diagram',
'--require', '{}/themes/pdf/qa.rb'.format(os.getcwd()),
'--attribute=imagesdir={}/wiki/images'.format(os.getcwd()), '--attribute=imagesdir={}/wiki/images'.format(os.getcwd()),
'--attribute=source-highlighter=pygments', '--attribute=source-highlighter=pygments',
'--attribute=pygments-style=manni', '--attribute=pygments-style=manni',
'--attribute=pygments-css=class', '--attribute=pygments-css=class',
'--attribute=lang=ru', '--attribute=lang=ru',
'--attribute=figure-caption=Рис.', '--attribute=l10ndir={}/themes/l10n'.format(os.getcwd()),
'--attribute=toc-title=Содержание',
'--attribute=experimental', '--attribute=experimental',
'--attribute=pdf-themesdir={}/themes/pdf'.format(os.getcwd()),
'--attribute=pdf-theme=wiki',
] ]
REPLACES = ( REPLACES = (
@ -97,7 +73,10 @@ REPLACES = (
YUICOMPRESSOR_EXECUTABLE = "yui-compressor" YUICOMPRESSOR_EXECUTABLE = "yui-compressor"
YUICOMPRESSOR_EXTRA_OPTIONS = ["--nomunge"] YUICOMPRESSOR_EXTRA_OPTIONS = ["--nomunge"]
#PLUGINS += ["yuicompressor-opt"]
if 'COMPRESS' in os.environ:
PLUGINS += ["yuicompressor-opt"]
PDF_PROCESSOR = True PDF_PROCESSOR = True

@ -1 +1 @@
Subproject commit 8cea2c6492f98e11341c48556978da7f6756f8a0 Subproject commit 7e8c591b519581dce80912abeb5070c4a299b547

@ -1 +1 @@
Subproject commit 288c5aeba001bc605d20c573c37d1fb9384262e8 Subproject commit b597cccb6b894bca614414706af0249078d3283c

@ -1 +1 @@
Subproject commit ce6b18660a933855dbe996fc5b5d3d0ac1c25223 Subproject commit 4168da84689e24c9d96ad3f8b979ea79a5b78771

23
themes/l10n/ru.adoc Normal file
View File

@ -0,0 +1,23 @@
// Russian translation, courtesy of Alexander Zobkov <alexander.zobkov@gmail.com>
:appendix-caption: Приложение
:appendix-refsig: {appendix-caption}
:caution-caption: Внимание
:chapter-label: Глава
:chapter-refsig: {chapter-label}
:example-caption: Пример
:figure-caption: Рисунок
:important-caption: Важно
:last-update-label: Последнее обновление
ifdef::listing-caption[:listing-caption: Листинг]
ifdef::manname-title[:manname-title: Название]
:note-caption: Примечание
:part-label: Часть
:part-refsig: {part-label}
ifdef::preface-title[:preface-title: Предисловие]
:section-refsig: Раздел
:table-caption: Таблица
:tip-caption: Подсказка
:toc-title: Содержание
:untitled-label: Без названия
:version-label: Версия
:warning-caption: Предупреждение

60
themes/pdf/qa.rb Normal file
View File

@ -0,0 +1,60 @@
require 'asciidoctor/extensions'
class QuestionBlock < Asciidoctor::Extensions::BlockProcessor
use_dsl
named :QUESTION
on_context :example
def process parent, reader, attrs
attrs['name'] = 'question'
attrs['caption'] = 'Question'
admon = create_block parent, :admonition, nil, attrs, content_model: :compound
parse_content admon, reader
admon
end
end
class QuestionBlockCss < Asciidoctor::Extensions::DocinfoProcessor
use_dsl
def process doc
'<style>
.admonitionblock td.icon .icon-question:before{content:"\f128";color:#000}
</style>'
end
end
Asciidoctor::Extensions.register do
block QuestionBlock
docinfo_processor QuestionBlockCss
end
class AnswerBlock < Asciidoctor::Extensions::BlockProcessor
use_dsl
named :ANSWER
on_context :example
def process parent, reader, attrs
attrs['name'] = 'answer'
attrs['caption'] = 'Answer'
admon = create_block parent, :admonition, nil, attrs, content_model: :compound
parse_content admon, reader
admon
end
end
class AnswerBlockCss < Asciidoctor::Extensions::DocinfoProcessor
use_dsl
def process doc
'<style>
.admonitionblock td.icon .icon-answer:before{content:"\f0eb";color:#000}
</style>'
end
end
Asciidoctor::Extensions.register do
block AnswerBlock
docinfo_processor AnswerBlockCss
end

22
themes/pdf/wiki-theme.yml Normal file
View File

@ -0,0 +1,22 @@
extends: default
page:
size: A4
layout: portrait
# margin: [15mm, 20mm, 15mm, 10mm]
image:
caption:
align: inherit
font-style: normal
caption:
font-style: normal
admonition:
icon:
question:
name: fa-question
stroke_color: 000000
size: 24
answer:
name: fa-lightbulb
stroke_color: 000000
size: 24

View File

@ -0,0 +1,44 @@
= Настройка Redis
:category: Linux
:tags: Linux, Redis,
Создать файл `/etc/sysctl.d/98-redis.conf`:
[source,text]
----
net.core.somaxconn=65535
vm.overcommit_memory=1
----
Перезагрузить систему или выполнить команду:
[source,sh]
----
sudo sysctl -p
----
Создать файл `/etc/systemd/system/disable-transparent-huge-pages.service`:
[source,text]
----
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service redis.service redis-server.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
[Install]
WantedBy=basic.target
----
Разрешить автоматический запуск при загрузке системы:
[source,sh]
----
sudo systemctl enable disable-transparent-huge-pages.service
----

View File

@ -0,0 +1,29 @@
= Настройка параметров локальной сети
:category: Linux
:tags: Linux, сеть, ethernet
Создать файл `/etc/sysctl.d/98-network.conf`:
[source,text]
----
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=33554432
net.core.wmem_max=33554432
net.ipv4.tcp_rmem = 4096 262144 33554432
net.ipv4.tcp_wmem = 4096 262144 33554432
net.ipv4.tcp_mem = 4096 262144 33554432
net.core.netdev_max_backlog = 16384
net.ipv4.ipfrag_high_threshold = 8388608
----
Перезагрузить систему или выполнить команду:
[source,sh]
----
sudo sysctl -p
----

View File

@ -7,16 +7,16 @@
Windows{nbsp}10. Пример приведён ниже: Windows{nbsp}10. Пример приведён ниже:
.Экран 1 .Экран 1
image::oo-shutup/1.jpg[1] image::oo-shutup/1.jpg[1,align="center"]
.Экран 2 .Экран 2
image::oo-shutup/2.jpg[2] image::oo-shutup/2.jpg[2,align="center"]
.Экран 3 .Экран 3
image::oo-shutup/3.jpg[3] image::oo-shutup/3.jpg[3,align="center"]
.Экран 4 .Экран 4
image::oo-shutup/4.jpg[4] image::oo-shutup/4.jpg[4,align="center"]
.Экран 5 .Экран 5
image::oo-shutup/5.jpg[5] image::oo-shutup/5.jpg[5,align="center"]

File diff suppressed because it is too large Load Diff

View File

@ -14,18 +14,18 @@ https://software.intel.com/en-us/parallel-studio-xe[дистрибутив] и
скопировать его в полученный каталог. скопировать его в полученный каталог.
. Если есть файл лицензии `parallel_studio.lic`, скопировать его в . Если есть файл лицензии `parallel_studio.lic`, скопировать его в
каталог `/opt/intel/licenses`. каталог `/opt/intel/licenses`.
. От суперпользователя установить в каталог `/opt/intel` командой
`sudo ./install.sh -s silent.cfg`.
. Добавить полномочия для сбора статистики: . Добавить полномочия для сбора статистики:
[source,sh] [source,sh]
---- ----
sudo setcap cap_sys_ptrace=eip /opt/intel/vtune_amplifier/bin64/amplxe-cl sudo setcap cap_sys_ptrace=eip /opt/intel/vtune_profiler/bin64/vtune
sudo setcap cap_sys_ptrace=eip /opt/intel/vtune_amplifier/bin64/amplxe-perf sudo setcap cap_sys_ptrace=eip /opt/intel/vtune_profiler/bin64/amplxe-perf
---- ----
[arabic, start=5] [arabic, start=6]
. От суперпользователя установить в каталог `/opt/intel` командой . Создать образ:
`sudo ./install.sh -s silent.cfg`.
. Создать образ
`mksquashfs /opt/intel/* /home/user/intel.sfs -comp xz -Xbcj x86 -all-root -b 512K` `mksquashfs /opt/intel/* /home/user/intel.sfs -comp xz -Xbcj x86 -all-root -b 512K`
. Удалить содержимое каталога `/opt/intel`. . Удалить содержимое каталога `/opt/intel`.
. Примонтировать образ: . Примонтировать образ:
@ -35,5 +35,35 @@ sudo setcap cap_sys_ptrace=eip /opt/intel/vtune_amplifier/bin64/amplxe-perf
[source,sh] [source,sh]
---- ----
source /opt/intel/bin/compilervars.sh intel64 source /opt/intel/bin/compilervars.sh intel64
source /opt/intel/vtune_amplifier/amplxe-vars.sh source /opt/intel/vtune_profiler/amplxe-vars.sh
---- ----
[arabic, start=10]
. Создать файл `/etc/sysctl.d/97-vtune.conf`:
[source,text]
----
kernel.kptr_restrict=0
kernel.perf_event_paranoid=0
kernel.yama.ptrace_scope=0
----
[arabic, start=11]
. Прочитать его: `sysctl -p /etc/sysctl.d/97-vtune.conf`
. Создать группу `vtune` и добавить в неё пользователя:
[source,sh]
----
groupadd vtune
usermod -a -G vtune user
----
[arabic, start=13]
. Установить модули ядра для упрощения доступа к отладочной информации:
[source,sh]
----
sudo apt-get install dkms build-essential linux-headers-generic
sudo dpkg -i /opt/intel/vtune-dkms*deb
----

View File

@ -0,0 +1,129 @@
= Настройка Qt Creator
:title-separator: {sp}|
:category: Linux/Программы
:tags: Linux, Qt, Qt Creator, C++,
:toc:
:icons: font
include::{l10ndir}/{lang}.adoc[]
Перед настройкой Qt Creator желательно установить пакеты для разработки
и выполнить дополнительные настройки:
[source,sh]
----
sudo apt-get install git ninja-build cmake uncrustify dos2unix doxygen
sudo apt-get install clazy clang-tidy build-essential qt5-default
git clone https://git.246060.ru/f1x1t/uncrustify-config ~/.config/uncrustify
----
<<<
== Плагины
[.text-center]
.menu:Справка[О модулях] (часть 1)
image::qtcreator-setup/qtcreator21.png[qtcreator21,pdfwidth=70%,scaledwidth=90%,align="center"]
{empty} +
[.text-center]
.menu:Справка[О модулях] (часть 2)
image::qtcreator-setup/qtcreator22.png[qtcreator22,pdfwidth=70%,scaledwidth=90%,align="center"]
{empty} +
[.text-center]
.menu:Справка[О модулях] (часть 3)
image::qtcreator-setup/qtcreator23.png[qtcreator23,pdfwidth=70%,scaledwidth=90%,align="center"]
{empty} +
[.text-center]
.menu:Справка[О модулях] (часть 4)
image::qtcreator-setup/qtcreator24.png[qtcreator24,pdfwidth=70%,scaledwidth=90%,align="center"]
{empty} +
== Комплекты
[.text-center]
.menu:Инструменты[Параметры > Комплекты > Комплекты]
image::qtcreator-setup/qtcreator34.png[qtcreator34,pdfwidth=80%,scaledwidth=80%,align="center"]
{empty} +
[.text-center]
.menu:Инструменты[Параметры > Комплекты > Комплекты > Генератор CMake > Изменить]
image::qtcreator-setup/qtcreator35.png[qtcreator35,align="center"]
{empty} +
<<<
== Среда
[.text-center]
.menu:Инструменты[Параметры > Среда > Система]
image::qtcreator-setup/qtcreator41.png[qtcreator41,pdfwidth=80%,scaledwidth=80%,align="center"]
{empty} +
== Редактор
[.text-center]
.menu:Инструменты[Параметры > Текстовый редактор > Поведение]
image::qtcreator-setup/qtcreator42.png[qtcreator42,pdfwidth=80%,scaledwidth=80%,align="center"]
{empty} +
== C++
[.text-center]
.menu:Инструменты[Параметры > С++ > Именование файлов]
image::qtcreator-setup/qtcreator51.png[qtcreator51,pdfwidth=78%,scaledwidth=78%,align="center"]
{empty} +
== Стилизатор
[.text-center]
.menu:Инструменты[Параметры > Стилизатор > Uncrustify]
image::qtcreator-setup/qtcreator55.png[qtcreator55,pdfwidth=78%,scaledwidth=78%,align="center"]
{empty} +
== Сборка и запуск
[.text-center]
.menu:Инструменты[Параметры > Сборка и запуск > Основное]
image::qtcreator-setup/qtcreator61.png[qtcreator61,pdfwidth=78%,scaledwidth=80%,align="center"]
{empty} +
<<<
== To-Do
[.text-center]
.menu:Инструменты[Параметры > To-Do]
image::qtcreator-setup/qtcreator67.png[qtcreator67,pdfwidth=78%,scaledwidth=80%,align="center"]
{empty} +
== Импорт проекта на CMake
[.text-center]
.menu:Импорт проекта[Настроить проект]
image::qtcreator-setup/qtcreator74.png[qtcreator74,pdfwidth=80%,scaledwidth=80%,align="center"]
{empty} +
== Сборка
[.text-center]
.menu:Проект[Настройки сборки]
image::qtcreator-setup/qtcreator81.png[qtcreator81,pdfwidth=80%,scaledwidth=80%,align="center"]

View File

@ -0,0 +1,269 @@
= Программный проект и иерархия каталогов
:title-separator: {sp}|
:category: Программирование
:tags: Linux, файлы, каталоги, программирование, cmake
:toc:
include::{l10ndir}/{lang}.adoc[]
Для операционных систем типа Linux принят стандарт
https://ru.wikipedia.org/wiki/FHS[FHS] («стандарт иерархии файловой
системы»), унифицирующий местонахождение файлов и каталогов с общим
назначением в файловой системе. Полная текущая версия стандарта
находится http://refspecs.linuxfoundation.org/fhs.shtml[здесь].
== Типы расположения проекта
В соответствии с данным стандартом, а также принятыми в ведущих
дистрибутивах правилами размещения исполняемых файлов в каталогах
пользователей, можно выделить следующие типы расположения:
* системная иерархия в каталоге `/usr` используется для установки
бинарных пакетов для данного дистрибутива;
* системная иерархия в каталоге `/usr/local` используется для установки
программного обеспечения системным администратором без использования
пакетов (не рекомендуется для использования из-за проблем поддержки
в актуальном состоянии);
* системная иерархия в каталоге `/opt` используется для установки
стороннего программного обеспечения. В рамках данной иерархии
предполагается, что каждый программный продукт располагается в
собственном каталоге. При таком типе сборки обычно используются
дополнительные методы (статическая компоновка, включение в состав
пакета своего набора динамических библиотек) для обеспечения работы
пакета в операционных системам с отличающимся составом библиотек
и другим циклом обновления;
* системная иерархия в домашнем каталоге пользователя не имеет
определённого стандарта, обычно производители дистрибутивов
предлагают использовать для исполняемых файлов каталоги
`$HOME/bin` или `$HOME/.local/bin`.
Система автоматизации сборки программного обеспечения https://cmake.org[CMake]
позволяет организовать окружение подобное перечисленным выше.
На этапе сборки проекта можно создать структуру каталогов,
которая будет отвечать требованиям по логическому разделению
файлов на исполняемые, заголовочные, библиотеки, файлы настроек и т.д.
== Автоматическая адаптация к текущему окружению
Для обеспечения единообразной работы вне зависимости от варианта
иерархии каталогов, в которой находится исполняемый файл, можно
выполнять автоматическую настройку на работу в текущем окружении.
В библиотеке https://git.246060.ru/f1x1t/myxlib[myxlib] реализован
класс, который анализирует расположение и окружение исполняемого
файла и предоставляет методы для получения имён каталогов,
соответствующих текущему окружению. Названия методов и описания
возвращаемых значений приведены в таблице.
.Имена методов и описания
[cols="2m,4",options="header"]
|===
| Метод | Описание
| homeDirectory() | Полный путь к домашнему каталогу текущего пользователя
| tempDirectory() | Полный путь к каталогу с временными файлами
| userConfigDirectory() | Полный путь к пользовательскому каталогу с файлами настройки
| userConstDataDirectory() | Полный путь к пользовательскому каталогу с неизменяемыми файлами
| userVarDataDirectory() | Полный путь к пользовательскому каталогу с изменяемыми файлами
| userLogDirectory() | Полный путь к пользовательскому каталогу с журналами работы
| executableFilePath() | Полный путь к исполняемому файлу
| systemConfigDirectory() | Полный путь к системному каталогу с файлами настройки
| systemConstDataDirectory() | Полный путь к системному каталогу с неизменяемыми файлами
| systemVarDataDirectory() | Полный путь к системному каталогу с изменяемыми файлами
| systemLogDirectory() | Полный путь к системному каталогу с журналами работы
| executableFileDirectory() | Полный путь к каталогу с исполняемым файлом
| executableFileName() | Имя исполняемого файла
| projectName() | Имя подкаталога для проекта
|===
Пример использования:
[source,cpp]
----
#include <myx/filesystem/paths.hpp>
namespace MF = myx::filesystem;
MF::Paths& paths = MF::Paths::instance();
paths.init();
qDebug() << paths.systemConstDataDirectory().path();
----
== Правила выбора типа окружения
Класс `myx::filesystem::Paths` реализован в виде синглтона,
чтобы повторно не выполнять проверку окружения в разных частях программы.
Сначала определяются имена пользовательского и временного каталогов с
помощью вызовов функций https://doc.qt.io/qt-5/qdir.html#homePath[`QDir::homePath`]
и https://doc.qt.io/qt-5/qdir.html#tempPath[`QDir::tempPath`], затем
имена пользовательских каталогов для настроек, постоянных и изменяемых
данных и журналов. Эти значения не зависят от расположения исполняемого файла,
а определяются в соответствии со значениям переменных окружения `HOME`,
`TMPDIR`, `XDG_CONFIG_HOME` и `XDG_DATA_HOME`, либо устанавливаются значения,
принятые в стандартах. Пример имён каталогов для пользователя `user`,
названия организации `org`, названия выполняемой работы `theme` и проекта
`project` приведён в таблице.
.Стандартные каталоги для текущего пользователя
[cols="4,4m,6m",options="header"]
|===
| Назначение каталога | Метод | Значение
| Домашний каталог | homeDirectory() | /home/user
| Временные файлы | tempDirectory() | /tmp
| Файлы настройки | userConfigDirectory() | /home/user/.config/org-theme/project
| Неизменяемые файлы | userConstDataDirectory() | /home/user/.local/share/org-theme/project/share
| Изменяемые файлы | userVarDataDirectory() | /home/user/.local/share/org-theme/project/var
| Журналы работы | userLogDirectory() | /home/user/.local/share/org-theme/project/log
|===
=== Общая проверка
Для определения типа текущего окружения используется полный путь
к исполняемому файлу, если он находится в каталоге `bin`, то выполняются
проверки работы в одной из возможных вариантов иерархий,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и дальнейшие проверки не выполняются.
IMPORTANT: При проверке типов иерархии всегда проверяется наличие
всех необходимых каталогов, при отсутствии хотя бы одного будет
принято решение, что файлы всех типов находятся в одном каталоге
с исполняемым.
=== Проверка на работу в иерархии `/opt`
Если полный путь к исполняемому файлу начинается с `/opt` и
содержит в себе название текущего проекта, например
`/opt/org-theme/project/bin/application`, то выполняется проверка
на наличие сопутствующих системных каталогов. Если они присутствуют,
то принимается решение, что окружение в иерархии `/opt` сформировано правильно,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и дальнейшие проверки не выполняются.
Пример правильной структуры каталогов для данной иерархии приведён в таблице.
.Каталоги в иерархии `/opt`
[cols="4,4m,5m",options="header"]
|===
| Назначение файла / каталога | Метод | Значение
| Исполняемый файл | executableFilePath() | /opt/org-theme/project/bin/application
| Файлы настройки | systemConfigDirectory() | /opt/org-theme/project/etc
| Неизменяемые файлы | systemConstDataDirectory() | /opt/org-theme/project/share
| Изменяемые файлы | systemVarDataDirectory() | /opt/org-theme/project/var
| Журналы работы | systemLogDirectory() | /opt/org-theme/project/log
|===
=== Проверка на работу в иерархии `/usr/local`
Если полный путь к исполняемому файлу начинается с `/usr/local`,
например `/usr/local/bin/application`, то выполняется проверка
на наличие сопутствующих системных каталогов. Если они присутствуют,
то принимается решение, что окружение в иерархии `/usr/local` сформировано правильно,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и дальнейшие проверки не выполняются.
Пример правильной структуры каталогов для данной иерархии приведён в таблице.
.Каталоги в иерархии `/usr/local`
[cols="4,4m,5m",options="header"]
|===
| Назначение файла / каталога | Метод | Значение
| Исполняемый файл | executableFilePath() | /usr/local/bin/application
| Файлы настройки | systemConfigDirectory() | /usr/local/etc/project
| Неизменяемые файлы | systemConstDataDirectory() | /usr/local/share/project
| Изменяемые файлы | systemVarDataDirectory() | /var/lib/project
| Журналы работы | systemLogDirectory() | /var/log/project
|===
=== Проверка на работу в иерархии `/usr`
Если полный путь к исполняемому файлу начинается с `/usr`,
например `/usr/bin/application`, то выполняется проверка
на наличие сопутствующих системных каталогов. Если они присутствуют,
то принимается решение, что окружение в иерархии `/usr` сформировано правильно,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и дальнейшие проверки не выполняются.
Пример правильной структуры каталогов для данной иерархии приведён в таблице.
.Каталоги в иерархии `/usr`
[cols="4,4m,5m",options="header"]
|===
| Назначение файла / каталога | Метод | Значение
| Исполняемый файл | executableFilePath() | /usr/bin/application
| Файлы настройки | systemConfigDirectory() | /etc/project
| Неизменяемые файлы | systemConstDataDirectory() | /usr/share/project
| Изменяемые файлы | systemVarDataDirectory() | /var/lib/project
| Журналы работы | systemLogDirectory() | /var/log/project
|===
=== Проверка на работу в домашнем каталоге
Если полный путь к исполняемому файлу начинается с `/home/user/bin` или
`/home/user/.local/bin`, например `/home/user/bin/application`, то выполняется
проверка на наличие сопутствующих системных каталогов. Если они присутствуют,
то принимается решение, что окружение в домашнем каталоге сформировано правильно,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и дальнейшие проверки не выполняются.
Пример правильной структуры каталогов для данной иерархии приведён в таблице.
.Каталоги при работе в домашнем каталоге
[cols="4,4m,6m",options="header"]
|===
| Назначение файла / каталога | Метод | Значение
| Исполняемый файл | executableFilePath() | /home/user/bin/application
| Файлы настройки | systemConfigDirectory() | /home/user/.config/org-theme/project
| Неизменяемые файлы | systemConstDataDirectory() | /home/user/.local/share/org-theme/project/share
| Изменяемые файлы | systemVarDataDirectory() | /home/user/.local/share/org-theme/project/var
| Журналы работы | systemLogDirectory() | /home/user/.local/share/org-theme/project/log
|===
=== Проверка на работу в окружении для разработки
Если исполняемый файл находится в каталоге `bin` и при этом окружение не совпадает
ни с одним из перечисленных выше, то делается предположение, что исполняемый файл
запускается из окружения, сформированного системой управления проектом, и в данный
момент идёт разработка (отладка) приложения. В этом случае целесообразно считать
системными каталогами те, которые находятся внутри иерархии каталогов программного
проекта. Если присутствуют каталоги, созданные системой управления проекта,
то принимается решение, что окружение сформировано правильно,
иначе делается заключение о том, что файлы всех типов находятся
в одном каталоге с исполняемым и на этом проверки заканчиваются.
Пример правильной структуры каталогов для данной иерархии приведён в таблице.
.Каталоги при работе в окружении для разработки
[cols="4,4m,6m",options="header"]
|===
| Назначение файла / каталога | Метод | Значение
| Исполняемый файл | executableFilePath() | /home/user/work/project/_build/debug/bin/application
| Файлы настройки | systemConfigDirectory() | /home/user/work/project/_build/debug/etc
| Неизменяемые файлы | systemConstDataDirectory() | /home/user/work/project/_build/debug/share
| Изменяемые файлы | systemVarDataDirectory() | /home/user/work/project/_build/debug/var
| Журналы работы | systemLogDirectory() | /home/user/work/project/_build/debug/log
|===
=== Расположение в одном каталоге
Если в ходе перечисленных выше проверок не удалось найти правильно
сформированное окружение, то применяется настройка по умолчанию,
которая соответствует ситуации, когда все типы файлов расположены
в одном каталоге с исполняемым файлом. Пример для такого случая приведён в таблице.
.Каталоги в неопределённой иерархии
[cols="4,4m,6m",options="header"]
|===
| Назначение файла / каталога | Метод | Значение
| Исполняемый файл | executableFilePath() | /home/user/work/project/application
| Файлы настройки | systemConfigDirectory() | /home/user/work/project
| Неизменяемые файлы | systemConstDataDirectory() | /home/user/work/project
| Изменяемые файлы | systemVarDataDirectory() | /home/user/work/project
| Журналы работы | systemLogDirectory() | /home/user/work/project
|===

View File

@ -13,14 +13,14 @@
[source,sh] [source,sh]
---- ----
sudo apt-get install clang-tidy-6.0 sudo apt-get install clang-tidy-10
---- ----
Использование: Использование:
[source,sh] [source,sh]
---- ----
cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-6.0" path/to/source cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-10" path/to/source
---- ----
В каталоге проекта нужно создать файл `.clang-tidy` в формате YAML со В каталоге проекта нужно создать файл `.clang-tidy` в формате YAML со
@ -30,12 +30,25 @@ cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-6.0" path/to/source
---- ----
--- ---
Checks: '-*, Checks: '-*,
clang-diagnostic-*, bugprone-*,
readability-*, clang-analyzer-*,
modernize-*,
cppcoreguidelines-*, cppcoreguidelines-*,
google-*, google-*,
bugprone-*' llvm-*,
misc-*,
modernize-*,
readability-*,
performance-*,
portability-*,
-cppcoreguidelines-owning-memory,
-cppcoreguidelines-avoid-magic-numbers,
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
-readability-magic-numbers,
-readability-else-after-return,
-modernize-use-trailing-return-type,
-modernize-avoid-c-arrays,
-performance-no-automatic-move,
'
CheckOptions: CheckOptions:
- key: readability-identifier-naming.ClassCase - key: readability-identifier-naming.ClassCase
value: CamelCase value: CamelCase
@ -124,7 +137,7 @@ cmake -DCMAKE_LINK_WHAT_YOU_USE=TRUE ..
[source,sh] [source,sh]
---- ----
sudo apt-get install clazy clang-6.0 sudo apt-get install clazy clang-9
---- ----
Использование: Использование:
@ -132,7 +145,6 @@ sudo apt-get install clazy clang-6.0
[source,sh] [source,sh]
---- ----
CLAZY_CHECKS=level2 cmake -DCMAKE_CXX_COMPILER=clazy .. CLAZY_CHECKS=level2 cmake -DCMAKE_CXX_COMPILER=clazy ..
CLANGXX=clang++-6.0 make CLANGXX=clang++-9 make
---- ----
=== PVS-Studio

View File

@ -0,0 +1,44 @@
= Разные вопросы и ответы
:title-separator: {sp}|
:category: Linux/Программы
:tags: Linux, Qt, Qt Creator, C++,
:toc:
:icons: font
include::{l10ndir}/{lang}.adoc[]
[QUESTION]
====
[float]
==== Проект на CMake перестал настраиваться.
Сообщения вида:
----
Не удалось разобрать проект CMake: потеряно соединение с сервером CMake.
----
====
[ANSWER]
====
. Закрыть проект в Qt Creator
. Удалить файл `CMakeLists.txt.user` и целевой каталог сборки, например `_build`
. Открыть проект в Qt Creator
====
[QUESTION]
====
[float]
==== Отсутствует необходимый для сборки пакет.
Пример:
image::qtcreator-setup/errors01.png[errors01,align="center"]
====
[ANSWER]
====
. Установить недостающий пакет
. Выполнить menu:Сборка[Запустить CMake]
====

View File

@ -3,15 +3,35 @@
:category: Программирование :category: Программирование
:tags: программирование, git, :tags: программирование, git,
Если у подмодуля, находящегося в каталоге `thirdparty/example` нужно Если у подмодулей необходимо заменить адрес синхронизации и/или
заменить адрес синхронизации и имя используемой ветки, то в каталоге с имя используемой ветки, то можно отредактировать в корневом
файлом `.gitmodules`, в котором содержится информация об этом подмодуле, каталоге проекта файл `.gitmodules` и выполнить данный скрипт:
нужно выполнить команды:
[source,sh] [source,sh]
---- ----
git config --file=.gitmodules submodule.thirdparty/example.url https://github.com/username/ABC.git #!/bin/bash
git config --file=.gitmodules submodule.thirdparty/example.branch new-branch-name
git submodule sync --recursive # Замена адресов для подмодулей:
git submodule update --init --recursive --remote # 1. Отредактировать файл .gitmodules
# 2. Запустить этот скрипт
#
# Параметры:
# - имя подмодуля (если присутствует, то замена
# адреса производится только для данного подмодуля)
M="#"
[ ! -z $1 ] && M="$1"
cat .gitmodules | while read s; do
s=${s/\*/}
s=${s/path = /}
if [ "$M" = "#" -o "x$M" = "x$s" ]; then
rm -rf .git/modules/$s
rm -rf $s
fi
done
git submodule sync
git submodule update
---- ----

View File

@ -24,25 +24,13 @@ sudo apt-get install git
[width="100%",cols="18%,20%,62%",options="header",] [width="100%",cols="18%,20%,62%",options="header",]
|=== |===
| Термин | Англ | Определение | Термин | Англ | Определение
|Рабочий каталог |working tree, working directory |Набор файлов в | Рабочий каталог | working tree, working directory | Набор файлов в текущем каталоге
текущем каталоге | Репозиторий | repository, repo | Контейнер, хранящий историю изменений файлов проекта
| Индекс | index, staging area | Область между рабочим каталогом и репозиторием, в котором осуществляется подготовка к фиксации
|Репозиторий |repository, repo |Контейнер, хранящий историю изменений | SHA-1 | SHA-1 | Уникальный идентификатор, отражающий информацию об истории
файлов проекта
|Индекс |index, staging area |Область между рабочим каталогом и
репозиторием, в котором осуществляется подготовка к фиксации
|SHA-1 |SHA-1 |Уникальный идентификатор, отражающий информацию об
истории
| Ветка | branch | Именованная последовательность в истории изменений | Ветка | branch | Именованная последовательность в истории изменений
| Фиксация (коммит) | commit | Набор файлов, записанных в историю одновременно
|Фиксация (коммит) |commit |Набор файлов, записанных в историю
одновременно
| `HEAD` | `HEAD` | Имя ссылки на последнюю фиксацию в текущей ветке | `HEAD` | `HEAD` | Имя ссылки на последнюю фиксацию в текущей ветке
| Метка | tag | Именованная ссылка на некоторую фиксацию в истории | Метка | tag | Именованная ссылка на некоторую фиксацию в истории
|=== |===
@ -74,9 +62,9 @@ untracked -> staged : git add
staged -> unmodified: git commit staged -> unmodified: git commit
unmodified -> modified: редактирование unmodified -> modified: редактирование
modified -> staged: git add modified -> staged: git add
modified -> untracked: git rm --cached modified -> untracked: git rm ~--cached
unmodified -> untracked: git rm --cached unmodified -> untracked: git rm ~--cached
staged -> untracked: git rm --cached staged -> untracked: git rm ~--cached
@enduml @enduml
---- ----
@ -137,7 +125,7 @@ participant remote as "Удалённый репозиторий\n(remote reposi
[-> workspace : <font color=red>Начало работы</font> [-> workspace : <font color=red>Начало работы</font>
activate workspace activate workspace
remote -> local : <font color=red>Получение изменений с сервера</font>\n<b>git fetch</b> remote -> local : <font color=red>Получение изменений с сервера</font>\n<b>git fetch</b>
remote -> local : <font color=red>Обновление подмодулей</font>\n<b>git submodule update --remote</b> remote -> local : <font color=red>Обновление подмодулей</font>\n<b>git submodule update ~--recursive ~--init</b>
workspace <-> local : <font color=red>Просмотр информации</font>\n<b>git status</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> 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 merge origin/master</b>
@ -147,11 +135,45 @@ workspace ->o workspace : <font color=red>Редактирование</font>
workspace <-> local : <font color=red>Просмотр изменений</font>\n<b>git diff</b> workspace <-> local : <font color=red>Просмотр изменений</font>\n<b>git diff</b>
workspace -> index : <font color=red>Занесение файлов в индекс</font>\n<b>git add</b> workspace -> index : <font color=red>Занесение файлов в индекс</font>\n<b>git add</b>
index -> local : <font color=red>Фиксация изменений</font>\n<b>git commit</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 branch -m temp new_task</b>
local ->o local : <font color=red>Переход на ветку</font>\n<b>git checkout branch_name</b> local ->o local : <font color=red>Переход на ветку</font>\n<b>git checkout new_task</b>
remote -> local : <font color=red>Получение изменений с сервера</font>\n<b>git fetch</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 ->o local : <font color=red>Слияние изменений с сервера в текущую ветку (new_task)</font>\n<b>git merge origin/master</b>
local -> remote : <font color=red>Отправка ветки на сервер</font>\n<b>git push origin branch_name</b> local -> remote : <font color=red>Отправка ветки на сервер</font>\n<b>git push origin new_task</b>
remote ->] : <font color=red>Создание запроса на слияние</font>
deactivate workspace
@enduml
----
Альтернативный пример действий, выполняемых пользователем в совместном
проекте, приведён на <<workflow-alt,диаграмме>>.
[[workflow-alt]]
[.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
workspace <-> local : <font color=red>Переход на локальную ветку master</font>\n<b>git checkout master</b>
remote -> workspace : <font color=red>Слияние с удалённой веткой и обновление рабочего каталога</font>\n<b>git pull</b>
workspace <-> local : <font color=red>Создание новой ветки</font>\n<b>git checkout -b new_task</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>
remote -> local : <font color=red>Получение изменений с сервера</font>\n<b>git fetch</b>
local ->o local : <font color=red>Слияние изменений с сервера в текущую ветку (new_task)</font>\n<b>git merge origin/master</b>
local -> remote : <font color=red>Отправка ветки на сервер</font>\n<b>git push origin new_task</b>
remote ->] : <font color=red>Создание запроса на слияние</font> remote ->] : <font color=red>Создание запроса на слияние</font>
deactivate workspace deactivate workspace
@enduml @enduml
@ -162,14 +184,9 @@ deactivate workspace
[width="100%",cols="15%,35%,50%",options="header",] [width="100%",cols="15%,35%,50%",options="header",]
|=== |===
| Команда | Ключи | Описание | Команда | Ключи | Описание
|`git config` |`--global user.name "John Doe"` |Имя текущего | `git config` | `--global user.name "John Doe"` | Имя текущего пользователя
пользователя | `git config` | `--global user.email "mail@example.com"` | Почта текущего пользователя
|`git config` |`--global user.email "mail@example.com"` |Почта текущего
пользователя
| `git config` | `--list` | Вывод текущей конфигурации | `git config` | `--list` | Вывод текущей конфигурации
| `git config` | `--global --list` | Вывод глобальной конфигурации | `git config` | `--global --list` | Вывод глобальной конфигурации
|=== |===
@ -179,13 +196,8 @@ deactivate workspace
|=== |===
| Команда | Ключи | Описание | Команда | Ключи | Описание
| `git init` | `<dir>` | Создать пустой репозиторий в каталоге `<dir>` | `git init` | `<dir>` | Создать пустой репозиторий в каталоге `<dir>`
| `git clone` | `<giturl>` `<dir>` | Создать в каталоге `<dir>` копию репозитория, находящегося по адресу `<giturl>`
|`git clone` |`<giturl>` `<dir>` |Создать в каталоге `<dir>` копию | `git clone` | `--recursive <giturl>` `<dir>` | Создать в каталоге `<dir>` копию репозитория, находящегося по адресу `<giturl>`, с учётом подмодулей
репозитория, находящегося по адресу `<giturl>`
|`git clone` |`--recursive <giturl>` `<dir>` |Создать в каталоге `<dir>`
копию репозитория, находящегося по адресу `<giturl>`, с учётом
подмодулей
|=== |===
== Подмодули == Подмодули
@ -193,13 +205,9 @@ deactivate workspace
[width="100%",cols="15%,25%,60%",options="header",] [width="100%",cols="15%,25%,60%",options="header",]
|=== |===
| Команда | Ключи | Описание | Команда | Ключи | Описание
|`git submodule` |`add <giturl> <dir>` |Добавить в каталог `<dir>` | `git submodule` | `add <giturl> <dir>` | Добавить в каталог `<dir>` текущего репозитория подмодуль, находящийся по адресу `<giturl>`
текущего репозитория подмодуль, находящийся по адресу `<giturl>`
| `git submodule` | `update --recursive --remote` | Обновить подмодули | `git submodule` | `update --recursive --remote` | Обновить подмодули
| `git submodule` | `sync --recursive` | Заменить адреса подмодулей на указанные в файле `.gitmodules`
|`git submodule` |`sync --recursive` |Заменить адреса подмодулей на
указанные в файле `.gitmodules`
|=== |===
Удаление подмодуля: Удаление подмодуля:
@ -216,11 +224,8 @@ git rm <path/to/submodule>
|=== |===
| Команда | Ключи | Описание | Команда | Ключи | Описание
| `git add` | `<filename>` | Подготовить файл `<filename>` к фиксации | `git add` | `<filename>` | Подготовить файл `<filename>` к фиксации
| `git commit` | | Зафиксировать подготовленные файлы | `git commit` | | Зафиксировать подготовленные файлы
| `git commit` | `-a` | Зафиксировать все отслеживаемые файлы, которые были изменены
|`git commit` |`-a` |Зафиксировать все отслеживаемые файлы, которые были
изменены
|=== |===
== Удаление == Удаление
@ -229,11 +234,8 @@ git rm <path/to/submodule>
|=== |===
| Команда | Ключи | Описание | Команда | Ключи | Описание
| `git rm` | `<filename>` | Удалить файл из индекса и рабочего каталога | `git rm` | `<filename>` | Удалить файл из индекса и рабочего каталога
| `git rm` | `-f <filename>` | Принудительное удаление файла | `git rm` | `-f <filename>` | Принудительное удаление файла
| `git rm` | `--cached <filename>` | Удаление файла из проекта, но не из рабочего каталога
|`git rm` |`--cached <filename>` |Удаление файла из проекта, но не из
рабочего каталога
|=== |===
== Информация == Информация
@ -252,15 +254,9 @@ git rm <path/to/submodule>
|=== |===
| Команда | Ключи | Описание | Команда | Ключи | Описание
| `git remote` | `-v` | Список адресов удалённых репозиториев | `git remote` | `-v` | Список адресов удалённых репозиториев
| `git branch` | `-r` | Список веток в удалённых репозиториях | `git branch` | `-r` | Список веток в удалённых репозиториях
| `git remote` | `add <name> <url>` | Создать ссылку `<name>` на удалённый репозиторий, находящийся по адресу `<url>`
|`git remote` |`add <name> <url>` |Создать ссылку `<name>` на удалённый | `git remote` | `rename <old> <new>` | Переименовать ссылку `<old>` на `<new>`
репозиторий, находящийся по адресу `<url>`
|`git remote` |`rename <old> <new>` |Переименовать ссылку `<old>` на
`<new>`
| `git remote` | `rm <name>` | Удалить ссылку `<name>` | `git remote` | `rm <name>` | Удалить ссылку `<name>`
|=== |===
@ -273,14 +269,9 @@ git rm <path/to/submodule>
[width="100%",cols="15%,20%,65%",options="header",] [width="100%",cols="15%,20%,65%",options="header",]
|=== |===
| Команда | Ключи | Описание | Команда | Ключи | Описание
|`git push` |`<remote> <branch>` |Отправить ветку `<branch>` в удалённый | `git push` | `<remote> <branch>` | Отправить ветку `<branch>` в удалённый репозиторий `<remote>`
репозиторий `<remote>` | `git push` | `<remote> --all` | Отправить все ветки в удалённый репозиторий `<remote>`
| `git push` | `--d <remote> <branch>` | Удалить ветку `<branch>` из удалённого репозитория `<remote>`
|`git push` |`<remote> --all` |Отправить все ветки в удалённый
репозиторий `<remote>`
|`git push` |`--d <remote> <branch>` |Удалить ветку `<branch>` из
удалённого репозитория `<remote>`
|=== |===
== Получение изменений == Получение изменений
@ -288,15 +279,9 @@ git rm <path/to/submodule>
[width="100%",cols="15%,20%,65%",options="header",] [width="100%",cols="15%,20%,65%",options="header",]
|=== |===
| Команда | Ключи | Описание | Команда | Ключи | Описание
|`git fetch` |`<remote>` |Получить изменения из всех веток репозитория | `git fetch` | `<remote>` | Получить изменения из всех веток репозитория `<remote>`, но не выполнять слияние
`<remote>`, но не выполнять слияние | `git fetch` | `<remote> <branch>` | Получить изменения из ветки `<branch>` репозитория `<remote>`, но не выполнять слияние
| `git merge` | `<remote>/<branch>` | Выполнить слияние с веткой `<branch>` репозитория `<remote>`
|`git fetch` |`<remote> <branch>` |Получить изменения из ветки
`<branch>` репозитория `<remote>`, но не выполнять слияние
|`git merge` |`<remote>/<branch>` |Выполнить слияние с веткой `<branch>`
репозитория `<remote>`
| `git pull` | `<remote>` | Получение и слияние | `git pull` | `<remote>` | Получение и слияние
|=== |===
@ -306,19 +291,11 @@ git rm <path/to/submodule>
|=== |===
|Команда |Ключи |Описание |Команда |Ключи |Описание
| `git branch` | `-a` | Список локальных и удалённых веток | `git branch` | `-a` | Список локальных и удалённых веток
| `git branch` | | Список локальных веток | `git branch` | | Список локальных веток
| `git branch` | `<branch>` | Создать ветку `<branch>` | `git branch` | `<branch>` | Создать ветку `<branch>`
| `git checkout` | `<sha-1>` | Перейти к фиксации с идентификатором `<sha-1>`
|`git checkout` |`<sha-1>` |Перейти к фиксации с идентификатором
`<sha-1>`
| `git branch` | `-m <old> <new>` | Переименовать ветку `<old>` в `<new>` | `git branch` | `-m <old> <new>` | Переименовать ветку `<old>` в `<new>`
| `git merge` | `<branch>` | Слить изменения из ветки `<branch>` в текущую ветку
|`git merge` |`<branch>` |Слить изменения из ветки `<branch>` в текущую
ветку
| `git branch` | `-d <branch>` | Удалить ветку `<branch>` | `git branch` | `-d <branch>` | Удалить ветку `<branch>`
|=== |===
@ -328,19 +305,10 @@ git rm <path/to/submodule>
|=== |===
| Команда | Ключи | Описание | Команда | Ключи | Описание
| `git diff` | | Сравнить рабочий каталог и индекс | `git diff` | | Сравнить рабочий каталог и индекс
| `git diff` | `-cached` | Сравнить индекс и последнюю фиксацию | `git diff` | `-cached` | Сравнить индекс и последнюю фиксацию
| `git diff` | `HEAD` | Сравнить последнюю фиксацию и рабочий каталог | `git diff` | `HEAD` | Сравнить последнюю фиксацию и рабочий каталог
| `git diff` | `--stat` | Краткий вывод результатов | `git diff` | `--stat` | Краткий вывод результатов
| `git diff` | `<sha-1> <sha-1>` | Сравнить две точки с указанными идентификаторами
|`git diff` |`<sha-1> <sha-1>` |Сравнить две точки с указанными | `git diff` | `<dir>` `<file>` | Сравнивать только указанный каталог `<dir>` или файл `<file>`
идентификаторами | `git difftool` | | Отобразить результаты сравнения в программе, определяемой переменной `diff.tool`
|`git diff` |`<dir>` `<file>` |Сравнивать только указанный каталог
`<dir>` или файл `<file>`
|`git difftool` | |Отобразить результаты сравнения в программе,
определяемой переменной `diff.tool`
|=== |===

View File

@ -19,11 +19,16 @@ CREATE TABLE example (
---- ----
const char cart[] = {0x04, 0x43, 0x00, 0x9A}; const char cart[] = {0x04, 0x43, 0x00, 0x9A};
QByteArray binDataArray(QByteArray::fromRawData(cart, 4)); QByteArray binDataArray(QByteArray::fromRawData(cart, 4));
QSqlQuery query; QSqlQuery query1;
query.prepare(QString("INSERT INTO example (id, bin_data) VALUES(:id, :bin_data)"); query1.prepare(QString("INSERT INTO example (id, bin_data) VALUES(:id, :bin_data)");
query.bindValue(":id", 10, QSql::In); query1.bindValue(":id", 10, QSql::In);
query.bindValue(":bin_data", binDataArray, QSql::In | QSql::Binary); query1.bindValue(":bin_data", binDataArray, QSql::In | QSql::Binary);
query.exec(); query1.exec();
QSqlQuery query2;
query2.exec(QString("INSERT INTO files VALUES(%1, %2);")
.arg(18)
.arg(db.driver()->formatValue(dataField)));
---- ----
Чтение данных: Чтение данных:

View File

@ -19,10 +19,9 @@ https://ru.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms[BLAS]
* https://github.com/skystrife/cpptoml[cpptoml]: чтение * https://github.com/skystrife/cpptoml[cpptoml]: чтение
https://github.com/toml-lang/toml[TOML] https://github.com/toml-lang/toml[TOML]
* https://github.com/martinmoene/gsl-lite/[gsl-lite]: реализация * https://github.com/martinmoene/gsl-lite/[gsl-lite]: реализация
рекомендаций https://github.com/isocpp/CppCoreGuidelines[C++ Core рекомендаций https://github.com/isocpp/CppCoreGuidelines/[C{plus}{plus} Core Guidelines]
Guidelines] * http://www.holoborodko.com/pavel/mpfr/[mpfrc{plus}{plus}]: C++ интерфейс
* http://www.holoborodko.com/pavel/mpfr[mpfrc++]: C++ интерфейс для для https://www.mpfr.org/[MPFR]
https://www.mpfr.org/[MPFR]
== Qt == Qt

View File

@ -0,0 +1,18 @@
= Сайты и статьи по программированию
:category: Программирование
:tags: программирование, C, C++, Qt,
:toc:
== С++
* https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines[C++ Core Guidelines]
== Qt
* https://woboq.com/blog/how-qt-signals-slots-work.html[How Qt Signals and Slots Work]
== Оптимизация
* https://www.agner.org/optimize[Agner's software optimization resources]
* https://jjj.de[jj's pages (FXT library and Matters Computational)]

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB