This commit is contained in:
Andrei Astafev 2019-04-20 23:24:14 +03:00
parent 0125f9cbee
commit 80287870a3
35 changed files with 2167 additions and 26 deletions

View File

@ -0,0 +1,14 @@
---
title: "LaTeX: висячие строки"
category: LaTeX
tags: LaTeX, текст
summary:
...
Пакет [`nowidow`](https://www.ctan.org/pkg/nowidow) используется для
изменения алгоритма размещения висячих строк. Пример:
```latex
\usepackage[defaultlines=3,all]{nowidow}
```

View File

@ -0,0 +1,15 @@
---
title: "LaTeX: защита команд"
category: LaTeX
tags: LaTeX, текст
summary:
...
Команда `\protect` используется для защиты инструкций внутри
хрупких команд. Например, для защиты команды переноса строки
внутри команды `section` нужно написать:
```latex
\section{Первая строка\protect\\Вторая строка}
```

View File

@ -0,0 +1,14 @@
---
title: "LaTeX: лигатуры"
category: LaTeX
tags: LaTeX, шрифты
summary:
...
Команды для запрета использования лигатур:
```latex
\usepackage{microtype}
\DisableLigatures[f]{encoding = *, family = *}
```

View File

@ -0,0 +1,32 @@
---
title: "LyX: многостраничные таблицы"
category: LaTeX
tags: LaTeX, текст, LyX, таблицы
summary:
...
- Создать таблицу как минимум с четырьмя строками.
- Щелкнуть правой кнопкой мыши на таблице, выбрать во всплывающем
меню **Длинная таблица**.
- Щелкнуть правой кнопкой мыши на таблице, выбрать во всплывающем
меню **Настройки**.
- Установить курсор на первой строке таблицы, в окне настроек перейти
на вкладку **Длинная таблица**.
- Выбрать **Подпись** и **Первый заголовок**.
- Нажать **Применить**.
- Установить курсор на второй строке таблицы, в окне настроек перейти
на вкладку **Длинная таблица**.
- Выбрать **Подпись** и **Заголовок**.
- Нажать **Применить**.
- Установить курсор на третьей строке таблицы, в окне настроек перейти
на вкладку **Длинная таблица**.
- Выбрать **Заголовок** и **Первый заколовок**.
- Нажать **Применить**.
- Щелкнуть правой кнопкой мыши на второй строке таблицы, выбрать в меню
**Подпись (Ненумерованный)**.
- На первой строке таблицы установить метку и ввести текст подписи к
таблице на начальной странице.
- На второй строке таблицы сформировать текст подписи к таблице,
который будет использоваться на последующих страницах.
- На третьей строке нужно сформировать заголовок таблицы.

View File

@ -0,0 +1,11 @@
---
title: "LaTeX: переносы строк"
category: LaTeX
tags: LaTeX, текст
summary:
...
Текст между командами `\sloppy` и `\fussy` или внутри блока
`\begin{sloppypar} ... \end{sloppypar}` будет переноситься
сразу при достижении края бокса.

View File

@ -0,0 +1,19 @@
---
title: "LaTeX: русский язык в выходном PDF"
category: LaTeX
tags: LaTeX, текст, PDF
summary:
...
Для поиска в файле PDF и копирования текста с правильной кодировкой
нужно использовать пакет [`cmap`](https://www.ctan.org/pkg/cmap).
Включать использование пакета нужно как можно раньше, чтобы правильно
формировалась служебная информация и титульные листы.
```latex
\usepackage{cmap}
```
Полезная [информация](http://s.arboreus.com/2007/07/pdf-latex.html)
о выводе из $\LaTeX$ в PDF.

12
wiki/Linux/DPKG/APT.md Normal file
View File

@ -0,0 +1,12 @@
---
title: "APT"
category: Linux
tags: linux, ubuntu, debian, apt
summary: ""
...
Запрет загрузки переводов описаний пакетов:
```sh
echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/99translations
```

View File

@ -0,0 +1,17 @@
---
title: "DNS в контейнере LXC"
category: Linux
tags: lxc, контейнеры, ubuntu, linux, dns
summary:
...
В системе Ubuntu 18.04 работающей внутри контейнера LXC по умолчанию
не работает разрешение имён. Чтобы использовать DNS-сервер `8.8.8.8`,
нужно внутри контейнера выполнить команды:
```sh
sed -i 's/#DNS=/DNS=8.8.8.8/' /etc/systemd/resolved.conf
systemctl restart systemd-resolved
rm /etc/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
```

88
wiki/Linux/Runit/runit.md Normal file
View File

@ -0,0 +1,88 @@
---
title: runit
category: Linux
tags: Debian, Ubuntu, Linux, инициализация, runit
summary: Система инициализации со встроенными средствами контроля за процессами
...
### Установка
[runit](http://smarden.org/runit/) — это система инициализации со
встроенными средствами контроля за процессами.
Установка в Ubuntu:
```sh
sudo apt-get install runit runit-systemd
```
### Запуск сервисов от непривилегированного пользователя
Чтобы разрешить непривилегированному пользователю `user` управлять
собственной конфигурацией для runit, нужно с правами суперпользователя
выполнить:
```sh
mkdir -p /etc/service/run-user/supervise
cat > /etc/service/run-user/run << EOF
#!/bin/sh
exec 2>&1
exec chpst -u user runsvdir /home/user/sv
EOF
chmod +x /etc/service/run-user/run
```
В результате в каталоге `/home/user/sv` пользователь `user` сможет
создавать собственные правила управления сервисами.
### Пример сервиса
Для запуска сервера Redis пользователем `user` нужно создать файл
конфигурации `/home/user/redis/etc/redis.conf`:
```
daemonize no
port 5079
tcp-backlog 128
timeout 0
tcp-keepalive 60
loglevel warning
databases 1
save 300 10
dir /home/user/redis/var
dbfilename surok.rdb
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 4mb 1mb 60
client-output-buffer-limit pubsub 4mb 1mb 60
maxclients 50
```
Запускаемый сервер должен запускаться не в фоновом режиме, чтобы
runit мог контролировать его состояние.
Скрипт `/home/user/sv/redis/run`, который `runit` использует для
запуска процесса:
```sh
#!/bin/sh
WORKDIR=/home/user/redis
cd "${WORKDIR}" || exit 1
exec 2>&1
exec redis-server etc/redis.conf
```
Журналирование выполняется с помощью входящей в состав пакета
runit программы `svlogd`. Скрипт для его запуска должен находиться
в подкаталоге `log` (`/home/user/sv/redis/log/run`):
```sh
#!/bin/sh -e
LOGDIR=/home/user/redis/log
mkdir -p "${LOGDIR}"
exec svlogd -tt "${LOGDIR}""
```

30
wiki/Misc/Libgen.md Normal file
View File

@ -0,0 +1,30 @@
---
title: "Libgen: локальная база данных для Windows"
category: Windows
tags: windows, libgen, библиотеки, книги
summary:
...
Программа [LibGen - Библиотекарь](http://libruslib.ucoz.com/index/libgen_bibliotekar/0-5)
позволяет просматривать локальную копию базы данных сервера [Libgen](http://libgen.io/).
Архив базы данных можно скачать [здесь](http://gen.lib.rus.ec/dbdumps/).
В архиве базы с именем вида `libgen_YYYY-MM-DD.rar` содержится полная информация
для полнотекстового поиска по описаниям книг, а в архиве с именем вида
`libgen-compact_YYYY-MM-DD.rar` описания удалены.
Для обработки полного архива потребуется около 25 Гб свободного пространства.
Последовательность действий:
1. [Скачать](https://yadi.sk/d/j_ToPE7D3SHGN6) и распаковать программу Libgen.
2. Скачать архив базы данных, распаковать его в каталог `upload`
и переименовать SQL-скрипт в `backup_ba.sql`.
3. [Скачать](https://yadi.sk/d/psnuXFJM3SHGR8) архив со скриптами для преобразования
базы данных и распаковать его в каталог `upload`.
4. Запустить программу `libgen.exe`.
5. Выбрать в меню **Databases | Update book database**.
6. Убрать галочки **Download from the Internet** и **Unpack** и поставить
**Prepare for import to the database**.
7. Нажать кнопку **Start**.
8. После завершения работы нажать кнопку **Done**.
9. Удалить из каталога `upload` файл `backup_ba1.sql`.

View File

@ -10,7 +10,7 @@ toc: yes
### Информация и лицензия ### Информация и лицензия
[PVS-Studio](https://www.viva64.com/ru/pvs-studio/) - это инструмент для [PVS-Studio](https://www.viva64.com/ru/pvs-studio/) это инструмент для
статического анализа исходного кода программ, написанных на языках С, C++. статического анализа исходного кода программ, написанных на языках С, C++.
Для использования в Linux нужно чтобы в каталоге `~/.config/PVS-Studio` Для использования в Linux нужно чтобы в каталоге `~/.config/PVS-Studio`
@ -23,7 +23,7 @@ toc: yes
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com // PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
``` ```
### Настройка и комплияция проекта ### Настройка и компиляция проекта
Полное руководство для работы в Linux находится Полное руководство для работы в Linux находится
[здесь](https://www.viva64.com/ru/m/0036/), а ниже приведён список типовых команд. [здесь](https://www.viva64.com/ru/m/0036/), а ниже приведён список типовых команд.
@ -68,7 +68,7 @@ ninja -t compdb
Выбор типов предупреждений осуществляется на основе побитовой маски из Выбор типов предупреждений осуществляется на основе побитовой маски из
приведенных выше типов. Чтобы выполнить анализ, исключив проверки MISRA, приведенных выше типов. Чтобы выполнить анализ, исключив проверки MISRA,
нужно выполнить: нужно выполнить
```sh ```sh
pvs-studio-analyzer analyze -a 29 -j$(nproc) -o pvs.log pvs-studio-analyzer analyze -a 29 -j$(nproc) -o pvs.log

View File

@ -0,0 +1,35 @@
---
title: Подбор ключей компиляции GCC
category: Программирование
tags: программирование, C, C++, отладка, оптимизация
summary:
...
Подбор ключей компиляции основан на измерениях характеристик во
время выполнения программы. На первом этапе создаётся исполняемый
файл `program`, в который включается информация для профилировки.
Ключ `-fprofile-generate=data/pgo` указывает, что нужно собирать
информацию и сохранять в каталог `data/pgo`. Компиляцию следует
выполнять в последовательном режиме.
```sh
env CXXFLAGS='-fprofile-generate=data/pgo' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
make -j1
```
После компиляцию программу следует выполнить, придерживаясь
типичного сценария использования.
```sh
./program
```
Скомпилировать программу с использованием полученной статистики.
Для многопоточной программы следует указать флаг `-fprofile-correction`,
чтобы скорректировать данные, которые могут неустойчивыми из-за пропусков
обновлений счётчиков. Компиляцию следует выполнять в последовательном режиме.
```sh
env CXXFLAGS='-fprofile-use=data/pgo -fprofile-correction' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
make -j1
```

View File

@ -0,0 +1,55 @@
---
title: Профилирование кода
category: Программирование
tags: программирование, отладка, производительность, профилирование, gprof
summary:
...
## Общее описание
Чтобы профилировать приложения, компилируемые [GCC](http://gcc.gnu.org),
необходимо добавлять флаг `-fno-omit-frame-pointer` и желательно `-g`.
## quickstack
Утилита для отслеживания стеков вызовов функций [quicktrack](https://github.com/yoshinorim/quickstack).
Пример использования:
```sh
quickstack -f -p $(pidof application)
```
## perf
Утилита профилирования для ядра Linux (находится в дереве его исходных текстов
в каталоге `tools/perf`).
Полезные ссылки:
* [Официальная страница](https://perf.wiki.kernel.org/index.php/Main_Page)
* [Примеры](https://stackoverflow.com/questions/1777556/alternatives-to-gprof/10958510#10958510)
* [Примеры](http://www.brendangregg.com/perf.html)
## Systemtap
[Установка и простые примеры использования SystemTap](https://eax.me/systemtap/)
## Valgrind
## gperftools
## Разное
* [Профилирование кода на C/C++ в Linux и FreeBSD](https://eax.me/c-cpp-profiling/)
* [Примеры](http://gernotklingler.com/blog/gprof-valgrind-gperftools-evaluation-tools-application-level-cpu-profiling-linux/)
## Графическое отображение
* [Flame Graphs](http://www.brendangregg.com/flamegraphs.html)
* [gprof2dot](https://github.com/jrfonseca/gprof2dot)

View File

@ -6,7 +6,8 @@ summary: ""
... ...
1) В главном меню QGis **Слой** - **Добавить слой** - **Добавить векторный слой** выбрать и открыть файл с векторным слоем, например, `map.sxf`. 1) В главном меню QGis **Слой****Добавить слой** — **Добавить векторный слой**
выбрать и открыть файл с векторным слоем, например, `map.sxf`.
2) Среди слоёв выбрать слой с рельефом местности и типом геометрии `LineString`. 2) Среди слоёв выбрать слой с рельефом местности и типом геометрии `LineString`.
@ -19,26 +20,29 @@ summary: ""
`"CLNAME" ILIKE '%ГОРИЗОНТАЛИ ОСНОВ%'` и нажить **OK**. `"CLNAME" ILIKE '%ГОРИЗОНТАЛИ ОСНОВ%'` и нажить **OK**.
5) На панели **Панель слоёв** правой кнопкой мыши щелкнуть на слое, 5) На панели **Панель слоёв** правой кнопкой мыши щелкнуть на слое,
содержащем данные о высотах, и выбрать **Сохранить как...**. Появишийся новый содержащем данные о высотах, и выбрать **Сохранить как...**. Появившийся
слой **heights** следует удалить. новый слой **heights** следует удалить.
6) В появившемся диалоговом окне выбрать имя выходного файла, например, `heights`. 6) В появившемся диалоговом окне выбрать имя выходного файла, например, `heights`.
![Имя выходного файла](files/qgis-heights2.png) ![Имя выходного файла](files/qgis-heights2.png)
7) В каталоге `/home/a/work/map` выполнить команду, которая в файле `heights.shp` из слоя `heights` берёт данные о высотах из 7) В каталоге `/home/a/work/map` выполнить команду, которая в файле
поля `SC_4` и генерирует матрицу высот размером 2000 на 2000 в формате BMP. `heights.shp` из слоя `heights` берёт данные о высотах из поля `SC_4`
и генерирует матрицу высот размером 2000 на 2000 в формате BMP.
Настойки алгоритма посторения матрицы можно изменять с помощью параметра `-a`: Настойки алгоритма посторения матрицы можно изменять с помощью параметра `-a`:
```sh ```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 gdal_grid -a invdist:power=3.0:smoothing=1.0 -outsize 2000 2000 -of BMP -ot Byte -zfield SC_4 -l heights heights.shp heights.bmp
``` ```
8) После построения матрицы её можно импортировать в QGis как растровый слой, для этого в главном меню QGis **Слой** - **Добавить слой** - **Добавить растровый слой** нужно выбрать и открыть файл `heights.bmp`. В результате на 8) После построения матрицы её можно импортировать в QGis как растровый
панели **Панель слоёв** появится растровый слой **heights**. слой, для этого в главном меню QGis **Слой****Добавить слой**
**Добавить растровый слой** нужно выбрать и открыть файл `heights.bmp`.
В результате на панели **Панель слоёв** появится растровый слой **heights**.
9) С помощью модуля Profile Tool можно построить провиль местности. В главном 9) С помощью модуля Profile Tool можно построить профиль местности. В главном
меню нужно выбрать **Модуль** - **Profile Tool** - **Terrain profile**. меню нужно выбрать **Модуль** **Profile Tool** **Terrain profile**.
10) На панели **Панель слоёв** нужно перенести растровый слой **heights** 10) На панели **Панель слоёв** нужно перенести растровый слой **heights**
в конец списка, выделить его и на панели **Profile Tool** нажать **Add Layer**. в конец списка, выделить его и на панели **Profile Tool** нажать **Add Layer**.

View File

@ -11,13 +11,18 @@ summary: ""
Если нужно следить за каталогом `/home/user/dir` и записывать историю Если нужно следить за каталогом `/home/user/dir` и записывать историю
изменений в `/home/user/repo/dir`, то нужно инициализировать репозиторий: изменений в `/home/user/repo/dir`, то нужно инициализировать репозиторий:
```sh
git init --bare /home/user/repo/dir git init --bare /home/user/repo/dir
```
добавить шаблоны исключаемых файлов добавить шаблоны исключаемых файлов:
```sh
printf '*.[oa]\n*.swp\n*~\n/.git' >> /home/user/repo/dir/info/exclude printf '*.[oa]\n*.swp\n*~\n/.git' >> /home/user/repo/dir/info/exclude
```
и запустить скрипт и запустить скрипт:
```sh
./gitwatch.sh -g /home/user/repo/dir /home/user/dir ./gitwatch.sh -g /home/user/repo/dir /home/user/dir
```

View File

@ -5,7 +5,7 @@ tags: программирование, git
summary: summary:
... ...
Создание репозитория для нового проекта Создание репозитория для нового проекта:
```sh ```sh
ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git
@ -13,10 +13,10 @@ git --bare init /home/user/work/usbdisk/git/project.git
cd /home/user/work/projects cd /home/user/work/projects
git clone /home/user/work/usbdisk/git/project.git git clone /home/user/work/usbdisk/git/project.git
cd project cd project
git remote set-url origin file:///home/user/work/usbdisk/git/project.git/ git remote set-url usb file:///home/user/work/usbdisk/git/project.git/
``` ```
Добавление нового удалённого репозитория к существующему проекту Добавление нового удалённого репозитория к существующему проекту:
```sh ```sh
ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git

View File

@ -10,8 +10,8 @@ summary: ""
Допустим, по адресу `git://localhost/project.git` находится Допустим, по адресу `git://localhost/project.git` находится
большой проект, в котором интересует только последнее большой проект, в котором интересует только последнее
состояние каталогов `src/driver` и `include/driver`. состояние каталогов `src/driver` и `include/driver`.
Сначала нужно создать репозиторий и подготовить его для Сначала нужно создать пустой репозиторий и подготовить его
получения только необходимых файлов: для получения только необходимых файлов:
```sh ```sh
git init project git init project
@ -26,4 +26,6 @@ echo "include/driver/*" >> .git/info/sparse-checkout
а, добавив ключ `--depth=1`, указать, что синхронизироваться а, добавив ключ `--depth=1`, указать, что синхронизироваться
должно только текущее состояние файлов без учёта истории. должно только текущее состояние файлов без учёта истории.
```sh
git pull --depth=1 origin master git pull --depth=1 origin master
```

View File

@ -0,0 +1,24 @@
---
title: "GitLab — выполнение по расписанию"
category: Программирование
tags: программирование, gitlab, git
summary:
...
После помещения изменений (push) на сервер следует выполнять только задачи,
не требующие много ресурсов. Ресурсоёмкие задачи можно отложить на время
минимальной нагрузки сервера. Для этого нужно:
* в секциях файла `.gitlab-ci.yml`, запускающих задачи с высокой нагрузкой,
добавить
```yaml
only:
- schedules
```
подробнее это описано [здесь](https://docs.gitlab.com/ee/ci/yaml/#only-and-except-simplified)
* в веб-интерфейсе в меню **CI/CD** / **Расписания** добавить **Новое расписание**
и назначить исполнение задачи на время, когда нагрузка на сервер минимальна.

View File

@ -8,7 +8,7 @@ toc: yes
[TOC] [TOC]
Установка вылолняется в операционной системе Ubuntu Bionic. Установка выполняется в операционной системе Ubuntu Bionic.
### LXC ### LXC
@ -139,7 +139,6 @@ cat /etc/docker/daemon.json
} }
### Ссылки ### Ссылки
* [GitLab Runner](https://docs.gitlab.com/runner/register/index.html) * [GitLab Runner](https://docs.gitlab.com/runner/register/index.html)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,28 @@
---
title: "Библиотеки для C, C++"
category: Программирование
tags: программирование, C, C++, Qt
summary:
toc: yes
...
[TOC]
### C
* [nanomsg](http://nanomsg.org): сетевое взаимодействие
* [noping](https://noping.cc): работа с ICMP-пакетами
* [openblas](https://github.com/xianyi/OpenBLAS): оптимизированная версия
[BLAS](https://ru.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms)
### C++
* [JSON](https://github.com/nlohmann/json)
* [fmtlib](https://github.com/fmtlib/fmt): форматирование строк
* [spdlog](https://github.com/gabime/spdlog): журналирование
* [cpptoml](https://github.com/skystrife/cpptoml): чтение [TOML](https://github.com/toml-lang/toml)
### Qt
* [Обработка сигналов UNIX](https://github.com/sjinks/qt_signalwatcher)

View File

@ -0,0 +1,159 @@
---
title: Работа с датами и временем
category: Программирование
tags: программирование, время, часы, дата
summary:
toc: yes
toc-depth: 4
...
[TOC]
### Временные шкалы
В идеале системы учёта времени должны обладать тремя характеристиками:
1. очность_ (время базируется на атомном стандарте, каждая секунда
отсчитывается как секунда в системе СИ, нет високосных секунд, переводов
на зимнее или летнее время и т.п.);
2. _простота_ (каждый "день" состоит из 86400 "секунд");
3. алендарные дни_ (дни календаря точно соответствуют вращению Земли).
На практике есть возможность выбрать шкалу только с двумя характеристиками
из трёх.
1. точность и календарные дни. Примером такой шкалы является UTC,
в которой отсчёт дней и секунд ведётся разными методами (секунды
исчисляются по атомному стандарту, а дни по суточному вращению Земли),
а соответствие достигается вводом _секунды координации_;
2. календарные дни и простота. Примером такой шкалы является POSIX
(IEEE Std 1003.1-1988), в которой день всегда равен 86400 секундам;
3. точность и простота. Этими характеристиками обладают технические
шкалы (атомные часы, GPS), в которых не важен учёт дней.
### Классы времени
Время можно условно поделить на два класса: физическое и гражданское.
1. _Физическое_ время представляет собой точки на непрерывной шкале, такую
концепцию достаточно точно отражает UTC, если можно пренебречь _секундой
координации_ (дополнительная секунда, добавляемая к UTC 30 июня или 31 декабря
для согласования со средним солнечным временем UT1. В этот момент время
условно обозначается как 23:59:60, а на шкале UTC две секунды отображаются
как одна).
2. ражданское_ время представляется полями (год, месяц, число, час, минута,
секунда, доли секунды, а также временная зона и календарь, который по умолчанию
считается Григорианским).
Почти всегда существует возможность однозначно перевести физическое время
в гражданское и наоборот, но при этом следует различать их свойства и
применение (ближайшая аналогия — массивы байтов и символьные строки).
Основная проблема состоит в том, что в обычном употреблении не всегда можно
сделать вывод о том, какой класс времени подразумевается, и гражданское
время меняется на основании юридических актов (указов, постановлений и т.п.),
что приводит к неоднозначности при планировании событий.
### Обработка на компьютере
#### Хранение и отображение
Для ссылки на момент во времени необходимо использовать единую шкалу,
на которой нет разрывов, связанных с летним временем. Примером стандарта
времени с такой шкалой является UTC. Локальное или местное время для таких
целей не подходит, так как на его шкале имеются разрывы и неоднозначности,
связанные с переходами на летнее время и обратно.
Если нужно сохранить значение локального времени, то необходимо сохранить
также смещение относительно UTC, чтобы временную отметку можно было
интерпретировать однозначно. Необходимо помнить, что местное время может
отличаться от UTC на интервал не кратный часу (например, в Нидерландах
с 1909-05-01 по 1937-06-30 смещение времени от UTC составляло
19 минут и 32.13 секунд).
Правила хранения и отображения времени:
1. Время всегда хранится в UTC. При необходимости дополнительно сохраняется
информация о временной зоне (смещение и/или название).
2. Для вывода на экран время переводится в местное.
3. При выводе на экран отличного от местного времени необходимо указывать
название часового пояса или типа исчисления (например, Юлианский календарь).
#### Системное время для администратора
Системный администратор должен следить за тем, чтобы файлы базы данных
описания временных зон **tzdata** имели одну версию в рамках комплекса
и обновлялись регулярно, чтобы минимизировать расхождения с внешними
системами. Особенно это важно делать при издании новых правил учёта
зимнего или летнего времени.
На серверах аппаратные часы всегда должны использовать UTC. Операционные
системы тоже должны использовать UTC, чтобы при возникновении проблем
в файлах журналов было указано время в едином формате.
В рамках комплекса следует использовать синхронизацию времени, даже
если нет доверенного источника более высокого уровня.
#### Клиентские приложения
В общем случае нельзя доверять временным отметкам внешних клиентов,
так как невозможно гарантировать их корректность. Программа должна
самостоятельно ставить временные отметки для происходящих событий.
Исключением являются программные комплексы, в которых предусмотрено
наличие доверенных приложений, ответственных за установку временных отметок.
#### Postgresql
Сервер базы данных должен использовать только временную зону UTC. Для этого
в файле настройки сервера `postgresql.conf` должна быть строка
```
timezone = 'UTC'
```
При создании таблиц необходимо использовать типы данных `timestamp without time zone`
и `time without time zone`. Если данные о времени должны содержать информацию
о временной зоне или смещении относительно UTC, то нужно создать дополнительные
столбцы, информацию из которых должно обрабатывать клиентское приложение.
Например, временные отметки можно хранить в таком виде
```sql
CREATE TABLE time_stamps (
time_stamp time without time zone, -- временная отметка
time_zone character(12), -- текстовое название временной зоны
shift integer -- смещение локального времени относительно UTC в секундах
);
```
Смещение следует записывать в четырёхбайтное знаковое целое, так как оно
может быть как положительным, так и отрицательным, а его максимальное
значение может составлять 14 * 60 * 60 = 50400 секунд. Несмотря на приведённый
выше пример с временной зоной Нидерландов, микросекундами можно пренебречь,
так как современные временные зоны имеют смещения кратные минутам, а точность
до микросекунд в далёком прошлом обычно не требуется.
Чтобы клиентская программа могла получить выборку, привязанную к некоторой
временной зоне можно использовать оператор `AT TIME ZONE`, например
```sql
SELECT TIMESTAMP '2001-02-16 20:38:40Z' AT TIME ZONE 'MSK';
```
В результате время будет преобразовано из временной зоны UTC в MSK.
Модификатор `Z` в записи времени указывает на принадлежность зоне UTC.
#### Qt
Класс `QTimeZone` предназначен для получения информации о временной зоне
и перевода времени из одной временной зоны в другую.

21
wiki/Vim/Vimdiff.md Normal file
View File

@ -0,0 +1,21 @@
---
title: Vimdiff
category: Vim
tags: Vim, команды Vim
summary:
CSS: table-100.css
...
Команды режима `diff` для сравнения и слияния файлов:
Команда | Назначение
-------------|------------
`do` | Получить изменения из второго окна в текущее окно
`dp` | Вставить изменения из текущего окна во второе окно
`]c` | Перейти к следующему отличию
`[c` | Перейти к предыдущему отличию
`C-W` `C-W` | Переход между окнами
[Видеоурок](http://vimcasts.org/episodes/fugitive-vim-resolving-merge-conflicts-with-vimdiff/)
по трехпутевому слиянию.

View File

@ -0,0 +1,24 @@
---
title: "Vim: замена выделенного блока"
category: Vim
tags: Vim, команды Vim
summary:
CSS: table-100.css
...
Замену блока, выделенного в режиме VISUAL, можно выполнить
последовательностью команд `y:%s/<ctrl-r>"/заменитель/g`.
Команда | Назначение
---------------|-------------
`y` | Копирование в регистр &quot;
`&#58;` | Перейти в командный режим
`%` | Применить ко всему буферу
`s` | Замена
`Сtrl-r` | Вставка из регистра
`&quot;` | Имя регистра (будет предложено по умолчанию)
`/` | Разделитель
`заменитель` | Новый текст
`/` | Разделитель
`g` | Для всех вхождений в строке

View File

@ -0,0 +1,48 @@
---
title: "Vim: клавиши Leader и LocalLeader"
category: Vim
tags: Vim, команды Vim
summary:
...
Клавиши `Leader` и `LocalLeader` представляют собой префиксы для команд.
Их текущие значения можно посмотреть командами
```vim
:echo mapleader
:echo maplocalleader
```
Часто их значения переназначают в файле `$HOME/.vimrc`, например так
```vim
let mapleader = "\<Space>"
let maplocalleader = ","
```
Новое значение команды генерируется с помощью текущих значений этих
переменных, таким образом последовательность команд
```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/.vimrc`.
`LocalLeader` отличается от `Leader` тем, что действует только для
текущего буфера, поэтому обычно используется в плагинах, загружаемых
для определённых типов файлов.
Таймауты для ввода команд, использующих клавиши `Leader` и
`LocalLeader`, настраиваются командой
```vim
set timeout timeoutlen=5000 ttimeoutlen=100
```

View File

@ -0,0 +1,22 @@
---
title: "Vim: клавиши PageUp и PageDown"
category: Vim
tags: Vim, команды Vim
summary:
...
Чтобы поведение клавиш `PageUp` и `PageDown` совпадало с более
привычным, можно добавить в `$HOME/.vimrc` следующий код:
```vim
" Более привычные PgUp / PgDown, когда курсор остаётся в той же строке, "
" а не переносится вверх / вниз экрана, как при стандартном PgUp / PgDown. "
" Поскольку по умолчанию прокрутка по C-U / C-D, при которой курсор остаётся
" на месте, происходит на полэкрана, привязка делается к двойному нажатию
" этих комбинаций. "
nmap <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>
```

View File

@ -0,0 +1,33 @@
---
title: "Vim: кодировка файла"
category: Vim
tags: Vim
summary:
...
Для управления кодировкой файлов можно создать дополнительное меню,
позволяющее открыть файл в выбранной кодировке, проверить её
корректность и сохранить в нужном виде. Пример кода:
```vim
" кодировка для чтения файла
set encoding=utf-8
" кодировка терминала
set termencoding=utf-8
" кодировка для записи файла
set fileencoding=utf-8
" список предполагаемых кодировок в порядке предпочтения
set fileencodings=utf8,koi8r,cp1251,cp866,latin1,ucs-2le
set wildmenu
set wcm=<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>
```

View File

@ -0,0 +1,27 @@
---
title: "Vim: комментирование кода"
category: Vim
tags: Vim, команды Vim
summary:
CSS: table-100.css
...
Отмена автоматического комментирования кода при вставке из буфера:
```Vim
autocmd FileType * setlocal formatoptions-=cro
```
Для управления комментированием можно использовать плагин
[NerdCommenter](https://github.com/scrooloose/nerdcommenter).
Основные команды:
Команда | Назначение
----------------------|----------------------------
`[n]<leader\>cc` | комментировать блок
`[n]<leader\>cn` | комментировать с учётом вложенности
`[n]<leader\>cl` | символ комментария помещать в начало строки
`[n]<leader\>ci` | инвертирование комментариев
`<leader\>cA` | добавить комментарий в конец строки
`[n]<leader\>cu` | раскомментировать блок

View File

@ -0,0 +1,44 @@
---
Title: "Vim: менеджер плагинов Plug"
Category: Vim
Tags: Vim, плагины Vim
Summary:
...
Автоматическое управление плагинами в Vim можно организовать
с помощью менеджера [Plug](https://github.com/junegunn/vim-plug),
установить который можно командой
```sh
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```
Чтобы использовать Plug, нужно добавить в `$HOME/.vimrc`:
1. Строку `call plug#begin('~/.vim/plugged')`
2. Список строк, начинающихся с команды `Plug`, для загрузки плагинов
3. Закончить список командой `call plug#end()`
Пример:
```vim
" Обязательно использовать одиночные кавычки
call plug#begin('~/.vim/plugged')
" Краткая запись для работы с github: https://github.com/junegunn/vim-easy-align
Plug 'junegunn/vim-easy-align'
" Вариант с полным адресом
Plug 'https://github.com/junegunn/vim-github-dashboard.git'
" Загрузка при выполнении команды
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
" Загрузка для определённого типа файлов
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
" Окончание списка плагинов
call plug#end()
```

View File

@ -0,0 +1,53 @@
---
title: "Vim: навигация по тексту с помощью easymotion"
category: Vim
tags: Vim, команды Vim
summary:
...
Плагин [easymotion](https://github.com/easymotion/vim-easymotion)
предоставляет функции для удобного перемещения по тексту.
Пример настройки:
```vim
" Не включать команды по умолчанию
let g:EasyMotion_do_mapping = 0
" Умный регистр
let g:EasyMotion_smartcase = 1
" <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)
```

View File

@ -0,0 +1,17 @@
---
title: "Vim: навигация по буферам"
category: Vim
tags: Vim, команды Vim
summary:
CSS: table-100.css
...
Команда | Назначение
------------------|-----------------
`:bn` | следующий буфер
`:bp` | предыдущий буфер
`:ls` | список открытых буферов
`:bd` | закрыть текущий буфер
`:b имя_буфера` | переключиться на буфер
`:bdа имя_буфера` | удалить буфер по имени

View File

@ -0,0 +1,35 @@
---
title: "Vim: нумерация строк"
category: Vim
tags: Vim, команды Vim
summary:
...
Для переключения режимов отображения слева столбца нумерации
строк можно добавить в `$HOME/.vimrc` следующий код:
```vim
" Нумерация строк включена
set number
" Нумерация строк абсолютная
set nornu
function! ChangeNumbering()
if &number
if &rnu
set nornu
else
set nonumber
endif
else
set number
set rnu
endif
endfunc
map <LocalLeader># <Esc>:call ChangeNumbering()<CR>
```
В результате по команде `<LocalLeader>#` будет осуществляться
циклическое переключение между абсолютной, относительной нумерацией
строк и отключением нумерации.

View File

@ -0,0 +1,39 @@
---
title: "Vim: проверка орфографии"
category: Vim
tags: Vim, команды Vim, словарь, орфография
summary:
...
Код в `$HOME/.vimrc` для циклического переключения режимов проверки
орфографии: два языка, английский, русский и без проверки:
```Vim
" По умолчанию проверка орфографии для русского и английского.
setlocal spell spelllang=ru,en
set spellsuggest=9
function! ChangeSpellLang()
if &spelllang == "ru,en"
setlocal spell spelllang=en
echo "spelllang: en"
elseif &spelllang == "en"
setlocal spell spelllang=ru
echo "spelllang: ru"
elseif &spelllang == "ru"
setlocal nospell spelllang=
echo "spelllang: off"
else
setlocal spell spelllang=ru,en
echo "spelllang: ru,en"
endif
endfunc
" map spell on/off for English/Russian
map <C-F7> <Esc>:call ChangeSpellLang()<CR>
" выбор альтернатив
imap <F7> <Esc> z=<CR>i
map <F7> z=<CR>
```

12
wiki/Vim/Ссылки.md Normal file
View File

@ -0,0 +1,12 @@
---
title: "Vim: полезные ссылки"
category: Vim
tags: Vim
summary:
...
* [Vim](http://vim.org)
* [Usevim](http://usevim.com/)
* [How I boosted my Vim](http://nvie.com/posts/how-i-boosted-my-vim/)
* [How to boost your Vim productivity](https://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/)
* [Vim Awesome](https://vimawesome.com/)

View File

@ -0,0 +1,22 @@
---
title: "Vim: управление окнами"
category: Vim
tags: Vim, команды Vim
summary:
CSS: table-100.css
...
Команда | Назначение
--------------------|-------------------------
`:split filename` | открыть в новом окне (горизонтальное разделение)
`:vsplit filename` | открыть в новом окне (вертикальное разделение)
`<C-W>` `<C-W>` | перейти к следующему окну
`<C-W>` `q` | закрыть текущее окно
`<C-W>` `o` | развернуть окно полностью
`<C-W>` `_` | развернуть окно по высоте
`<C-W>` `|` | развернуть окно по ширине
`<C-W>` `=` | выровнять размер окон
`<C-W>` `+` | увеличить окно на 1 строку
`<C-W>` `-` | уменьшить окно на 1 строку
`<C-W>` `стрелки` | перемещение между окнами