Compare commits
No commits in common. "7d2c994664094a2c6050f66764395f9bab1961ce" and "6119463eb38c8d2849a0acae5ce7e124c5644c0f" have entirely different histories.
7d2c994664
...
6119463eb3
@ -108,7 +108,7 @@ PANDOC_MARKDOWN_EXTENSIONS = [
|
|||||||
|
|
||||||
#YUICOMPRESSOR_EXECUTABLE = "yui-compressor"
|
#YUICOMPRESSOR_EXECUTABLE = "yui-compressor"
|
||||||
#YUICOMPRESSOR_EXTRA_OPTIONS = ["--disable-optimizations"]
|
#YUICOMPRESSOR_EXTRA_OPTIONS = ["--disable-optimizations"]
|
||||||
#PLUGINS += ["yuicompressor-opt"]
|
#PLUGINS += ["yuicompressor"]
|
||||||
|
|
||||||
DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search')
|
DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search')
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 04a2dcca22dbce2d2a8112a318eaa5a321c4d9e0
|
Subproject commit 50959b2cfc53489b967316c74c3caf4f8c40a9c1
|
@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
title: "LaTeX: висячие строки"
|
|
||||||
category: LaTeX
|
|
||||||
tags: LaTeX, текст
|
|
||||||
summary:
|
|
||||||
...
|
|
||||||
|
|
||||||
Пакет [`nowidow`](https://www.ctan.org/pkg/nowidow) используется для
|
|
||||||
изменения алгоритма размещения висячих строк. Пример:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\usepackage[defaultlines=3,all]{nowidow}
|
|
||||||
```
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
|||||||
---
|
|
||||||
title: "LaTeX: защита команд"
|
|
||||||
category: LaTeX
|
|
||||||
tags: LaTeX, текст
|
|
||||||
summary:
|
|
||||||
...
|
|
||||||
|
|
||||||
Команда `\protect` используется для защиты инструкций внутри
|
|
||||||
хрупких команд. Например, для защиты команды переноса строки
|
|
||||||
внутри команды `section` нужно написать:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\section{Первая строка\protect\\Вторая строка}
|
|
||||||
```
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
title: "LaTeX: лигатуры"
|
|
||||||
category: LaTeX
|
|
||||||
tags: LaTeX, шрифты
|
|
||||||
summary:
|
|
||||||
...
|
|
||||||
|
|
||||||
Команды для запрета использования лигатур:
|
|
||||||
|
|
||||||
```latex
|
|
||||||
\usepackage{microtype}
|
|
||||||
\DisableLigatures[f]{encoding = *, family = *}
|
|
||||||
```
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
title: "LyX: многостраничные таблицы"
|
|
||||||
category: LaTeX
|
|
||||||
tags: LaTeX, текст, LyX, таблицы
|
|
||||||
summary:
|
|
||||||
...
|
|
||||||
|
|
||||||
- Создать таблицу как минимум с четырьмя строками.
|
|
||||||
- Щелкнуть правой кнопкой мыши на таблице, выбрать во всплывающем
|
|
||||||
меню **Длинная таблица**.
|
|
||||||
- Щелкнуть правой кнопкой мыши на таблице, выбрать во всплывающем
|
|
||||||
меню **Настройки**.
|
|
||||||
- Установить курсор на первой строке таблицы, в окне настроек перейти
|
|
||||||
на вкладку **Длинная таблица**.
|
|
||||||
- Выбрать **Подпись** и **Первый заголовок**.
|
|
||||||
- Нажать **Применить**.
|
|
||||||
- Установить курсор на второй строке таблицы, в окне настроек перейти
|
|
||||||
на вкладку **Длинная таблица**.
|
|
||||||
- Выбрать **Подпись** и **Заголовок**.
|
|
||||||
- Нажать **Применить**.
|
|
||||||
- Установить курсор на третьей строке таблицы, в окне настроек перейти
|
|
||||||
на вкладку **Длинная таблица**.
|
|
||||||
- Выбрать **Заголовок** и **Первый заколовок**.
|
|
||||||
- Нажать **Применить**.
|
|
||||||
- Щелкнуть правой кнопкой мыши на второй строке таблицы, выбрать в меню
|
|
||||||
**Подпись (Ненумерованный)**.
|
|
||||||
- На первой строке таблицы установить метку и ввести текст подписи к
|
|
||||||
таблице на начальной странице.
|
|
||||||
- На второй строке таблицы сформировать текст подписи к таблице,
|
|
||||||
который будет использоваться на последующих страницах.
|
|
||||||
- На третьей строке нужно сформировать заголовок таблицы.
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
title: "LaTeX: переносы строк"
|
|
||||||
category: LaTeX
|
|
||||||
tags: LaTeX, текст
|
|
||||||
summary:
|
|
||||||
...
|
|
||||||
|
|
||||||
Текст между командами `\sloppy` и `\fussy` или внутри блока
|
|
||||||
`\begin{sloppypar} ... \end{sloppypar}` будет переноситься
|
|
||||||
сразу при достижении края бокса.
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
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.
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
title: "APT"
|
|
||||||
category: Linux
|
|
||||||
tags: linux, ubuntu, debian, apt
|
|
||||||
summary: ""
|
|
||||||
...
|
|
||||||
|
|
||||||
Запрет загрузки переводов описаний пакетов:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/99translations
|
|
||||||
```
|
|
@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
title: "DNS в контейнере LXC"
|
|
||||||
category: Linux
|
|
||||||
tags: lxc, контейнеры, ubuntu, linux, dns
|
|
||||||
summary:
|
|
||||||
...
|
|
||||||
|
|
||||||
В системе Ubuntu 18.04 работающей внутри контейнера LXC по умолчанию
|
|
||||||
не работает разрешение имён. Чтобы использовать DNS-сервер `8.8.8.8`,
|
|
||||||
нужно внутри контейнера выполнить команды:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sed -i 's/#DNS=/DNS=8.8.8.8/' /etc/systemd/resolved.conf
|
|
||||||
systemctl restart systemd-resolved
|
|
||||||
rm /etc/resolv.conf
|
|
||||||
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
|
|
||||||
```
|
|
@ -1,88 +0,0 @@
|
|||||||
---
|
|
||||||
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}""
|
|
||||||
```
|
|
@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Libgen: локальная база данных для Windows"
|
|
||||||
category: Windows
|
|
||||||
tags: windows, libgen, библиотеки, книги
|
|
||||||
summary:
|
|
||||||
...
|
|
||||||
|
|
||||||
Программа [LibGen - Библиотекарь](http://libruslib.ucoz.com/index/libgen_bibliotekar/0-5)
|
|
||||||
позволяет просматривать локальную копию базы данных сервера [Libgen](http://libgen.io/).
|
|
||||||
Архив базы данных можно скачать [здесь](http://gen.lib.rus.ec/dbdumps/).
|
|
||||||
В архиве базы с именем вида `libgen_YYYY-MM-DD.rar` содержится полная информация
|
|
||||||
для полнотекстового поиска по описаниям книг, а в архиве с именем вида
|
|
||||||
`libgen-compact_YYYY-MM-DD.rar` описания удалены.
|
|
||||||
|
|
||||||
Для обработки полного архива потребуется около 25 Гб свободного пространства.
|
|
||||||
Последовательность действий:
|
|
||||||
|
|
||||||
1. [Скачать](https://yadi.sk/d/j_ToPE7D3SHGN6) и распаковать программу Libgen.
|
|
||||||
2. Скачать архив базы данных, распаковать его в каталог `upload`
|
|
||||||
и переименовать SQL-скрипт в `backup_ba.sql`.
|
|
||||||
3. [Скачать](https://yadi.sk/d/psnuXFJM3SHGR8) архив со скриптами для преобразования
|
|
||||||
базы данных и распаковать его в каталог `upload`.
|
|
||||||
4. Запустить программу `libgen.exe`.
|
|
||||||
5. Выбрать в меню **Databases | Update book database**.
|
|
||||||
6. Убрать галочки **Download from the Internet** и **Unpack** и поставить
|
|
||||||
**Prepare for import to the database**.
|
|
||||||
7. Нажать кнопку **Start**.
|
|
||||||
8. После завершения работы нажать кнопку **Done**.
|
|
||||||
9. Удалить из каталога `upload` файл `backup_ba1.sql`.
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
|||||||
---
|
|
||||||
title: Подбор ключей компиляции GCC
|
|
||||||
category: Программирование
|
|
||||||
tags: программирование, C, C++, отладка, оптимизация
|
|
||||||
summary:
|
|
||||||
...
|
|
||||||
|
|
||||||
Подбор ключей компиляции основан на измерениях характеристик во
|
|
||||||
время выполнения программы. На первом этапе создаётся исполняемый
|
|
||||||
файл `program`, в который включается информация для профилировки.
|
|
||||||
Ключ `-fprofile-generate=data/pgo` указывает, что нужно собирать
|
|
||||||
информацию и сохранять в каталог `data/pgo`. Компиляцию следует
|
|
||||||
выполнять в последовательном режиме.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
env CXXFLAGS='-fprofile-generate=data/pgo' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
|
|
||||||
make -j1
|
|
||||||
```
|
|
||||||
|
|
||||||
После компиляцию программу следует выполнить, придерживаясь
|
|
||||||
типичного сценария использования.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
./program
|
|
||||||
```
|
|
||||||
|
|
||||||
Скомпилировать программу с использованием полученной статистики.
|
|
||||||
Для многопоточной программы следует указать флаг `-fprofile-correction`,
|
|
||||||
чтобы скорректировать данные, которые могут неустойчивыми из-за пропусков
|
|
||||||
обновлений счётчиков. Компиляцию следует выполнять в последовательном режиме.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
env CXXFLAGS='-fprofile-use=data/pgo -fprofile-correction' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
|
|
||||||
make -j1
|
|
||||||
```
|
|
@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
title: Профилирование кода
|
|
||||||
category: Программирование
|
|
||||||
tags: программирование, отладка, производительность, профилирование, gprof
|
|
||||||
summary:
|
|
||||||
...
|
|
||||||
|
|
||||||
## Общее описание
|
|
||||||
|
|
||||||
Чтобы профилировать приложения, компилируемые [GCC](http://gcc.gnu.org),
|
|
||||||
необходимо добавлять флаг `-fno-omit-frame-pointer` и желательно `-g`.
|
|
||||||
|
|
||||||
## quickstack
|
|
||||||
|
|
||||||
Утилита для отслеживания стеков вызовов функций [quicktrack](https://github.com/yoshinorim/quickstack).
|
|
||||||
Пример использования:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
quickstack -f -p $(pidof application)
|
|
||||||
```
|
|
||||||
|
|
||||||
## perf
|
|
||||||
|
|
||||||
Утилита профилирования для ядра Linux (находится в дереве его исходных текстов
|
|
||||||
в каталоге `tools/perf`).
|
|
||||||
|
|
||||||
Полезные ссылки:
|
|
||||||
|
|
||||||
* [Официальная страница](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)
|
|
||||||
|
|
@ -6,8 +6,7 @@ summary: ""
|
|||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
1) В главном меню QGis **Слой** — **Добавить слой** — **Добавить векторный слой**
|
1) В главном меню QGis **Слой** - **Добавить слой** - **Добавить векторный слой** выбрать и открыть файл с векторным слоем, например, `map.sxf`.
|
||||||
выбрать и открыть файл с векторным слоем, например, `map.sxf`.
|
|
||||||
|
|
||||||
2) Среди слоёв выбрать слой с рельефом местности и типом геометрии `LineString`.
|
2) Среди слоёв выбрать слой с рельефом местности и типом геометрии `LineString`.
|
||||||
|
|
||||||
@ -20,29 +19,26 @@ summary: ""
|
|||||||
`"CLNAME" ILIKE '%ГОРИЗОНТАЛИ ОСНОВ%'` и нажить **OK**.
|
`"CLNAME" ILIKE '%ГОРИЗОНТАЛИ ОСНОВ%'` и нажить **OK**.
|
||||||
|
|
||||||
5) На панели **Панель слоёв** правой кнопкой мыши щелкнуть на слое,
|
5) На панели **Панель слоёв** правой кнопкой мыши щелкнуть на слое,
|
||||||
содержащем данные о высотах, и выбрать **Сохранить как...**. Появившийся
|
содержащем данные о высотах, и выбрать **Сохранить как...**. Появишийся новый
|
||||||
новый слой **heights** следует удалить.
|
слой **heights** следует удалить.
|
||||||
|
|
||||||
6) В появившемся диалоговом окне выбрать имя выходного файла, например, `heights`.
|
6) В появившемся диалоговом окне выбрать имя выходного файла, например, `heights`.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
7) В каталоге `/home/a/work/map` выполнить команду, которая в файле
|
7) В каталоге `/home/a/work/map` выполнить команду, которая в файле `heights.shp` из слоя `heights` берёт данные о высотах из
|
||||||
`heights.shp` из слоя `heights` берёт данные о высотах из поля `SC_4`
|
поля `SC_4` и генерирует матрицу высот размером 2000 на 2000 в формате BMP.
|
||||||
и генерирует матрицу высот размером 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 как растровый
|
8) После построения матрицы её можно импортировать в QGis как растровый слой, для этого в главном меню QGis **Слой** - **Добавить слой** - **Добавить растровый слой** нужно выбрать и открыть файл `heights.bmp`. В результате на
|
||||||
слой, для этого в главном меню QGis **Слой** — **Добавить слой** —
|
панели **Панель слоёв** появится растровый слой **heights**.
|
||||||
**Добавить растровый слой** нужно выбрать и открыть файл `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**.
|
||||||
|
@ -11,18 +11,13 @@ 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
|
|
||||||
```
|
|
||||||
|
|
||||||
и запустить скрипт:
|
и запустить скрипт
|
||||||
|
|
||||||
|
./gitwatch.sh -g /home/user/repo/dir /home/user/dir
|
||||||
|
|
||||||
```sh
|
|
||||||
./gitwatch.sh -g /home/user/repo/dir /home/user/dir
|
|
||||||
```
|
|
||||||
|
@ -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 usb file:///home/user/work/usbdisk/git/project.git/
|
git remote set-url origin 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
|
||||||
|
@ -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,6 +26,4 @@ echo "include/driver/*" >> .git/info/sparse-checkout
|
|||||||
а, добавив ключ `--depth=1`, указать, что синхронизироваться
|
а, добавив ключ `--depth=1`, указать, что синхронизироваться
|
||||||
должно только текущее состояние файлов без учёта истории.
|
должно только текущее состояние файлов без учёта истории.
|
||||||
|
|
||||||
```sh
|
git pull --depth=1 origin master
|
||||||
git pull --depth=1 origin master
|
|
||||||
```
|
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
---
|
|
||||||
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** / **Расписания** добавить **Новое расписание**
|
|
||||||
и назначить исполнение задачи на время, когда нагрузка на сервер минимальна.
|
|
||||||
|
|
@ -8,7 +8,7 @@ toc: yes
|
|||||||
|
|
||||||
[TOC]
|
[TOC]
|
||||||
|
|
||||||
Установка выполняется в операционной системе Ubuntu Bionic.
|
Установка вылолняется в операционной системе Ubuntu Bionic.
|
||||||
|
|
||||||
### LXC
|
### LXC
|
||||||
|
|
||||||
@ -139,6 +139,7 @@ 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
@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
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)
|
|
@ -1,159 +0,0 @@
|
|||||||
---
|
|
||||||
title: Работа с датами и временем
|
|
||||||
category: Программирование
|
|
||||||
tags: программирование, время, часы, дата
|
|
||||||
summary:
|
|
||||||
toc: yes
|
|
||||||
toc-depth: 4
|
|
||||||
...
|
|
||||||
|
|
||||||
[TOC]
|
|
||||||
|
|
||||||
### Временные шкалы
|
|
||||||
|
|
||||||
В идеале системы учёта времени должны обладать тремя характеристиками:
|
|
||||||
|
|
||||||
1. _точность_ (время базируется на атомном стандарте, каждая секунда
|
|
||||||
отсчитывается как секунда в системе СИ, нет високосных секунд, переводов
|
|
||||||
на зимнее или летнее время и т.п.);
|
|
||||||
2. _простота_ (каждый "день" состоит из 86400 "секунд");
|
|
||||||
3. _календарные дни_ (дни календаря точно соответствуют вращению Земли).
|
|
||||||
|
|
||||||
На практике есть возможность выбрать шкалу только с двумя характеристиками
|
|
||||||
из трёх.
|
|
||||||
|
|
||||||
1. точность и календарные дни. Примером такой шкалы является UTC,
|
|
||||||
в которой отсчёт дней и секунд ведётся разными методами (секунды
|
|
||||||
исчисляются по атомному стандарту, а дни по суточному вращению Земли),
|
|
||||||
а соответствие достигается вводом _секунды координации_;
|
|
||||||
|
|
||||||
2. календарные дни и простота. Примером такой шкалы является POSIX
|
|
||||||
(IEEE Std 1003.1-1988), в которой день всегда равен 86400 секундам;
|
|
||||||
|
|
||||||
3. точность и простота. Этими характеристиками обладают технические
|
|
||||||
шкалы (атомные часы, GPS), в которых не важен учёт дней.
|
|
||||||
|
|
||||||
|
|
||||||
### Классы времени
|
|
||||||
|
|
||||||
Время можно условно поделить на два класса: физическое и гражданское.
|
|
||||||
|
|
||||||
1. _Физическое_ время представляет собой точки на непрерывной шкале, такую
|
|
||||||
концепцию достаточно точно отражает UTC, если можно пренебречь _секундой
|
|
||||||
координации_ (дополнительная секунда, добавляемая к UTC 30 июня или 31 декабря
|
|
||||||
для согласования со средним солнечным временем UT1. В этот момент время
|
|
||||||
условно обозначается как 23:59:60, а на шкале UTC две секунды отображаются
|
|
||||||
как одна).
|
|
||||||
|
|
||||||
2. _Гражданское_ время представляется полями (год, месяц, число, час, минута,
|
|
||||||
секунда, доли секунды, а также временная зона и календарь, который по умолчанию
|
|
||||||
считается Григорианским).
|
|
||||||
|
|
||||||
Почти всегда существует возможность однозначно перевести физическое время
|
|
||||||
в гражданское и наоборот, но при этом следует различать их свойства и
|
|
||||||
применение (ближайшая аналогия — массивы байтов и символьные строки).
|
|
||||||
|
|
||||||
Основная проблема состоит в том, что в обычном употреблении не всегда можно
|
|
||||||
сделать вывод о том, какой класс времени подразумевается, и гражданское
|
|
||||||
время меняется на основании юридических актов (указов, постановлений и т.п.),
|
|
||||||
что приводит к неоднозначности при планировании событий.
|
|
||||||
|
|
||||||
### Обработка на компьютере
|
|
||||||
|
|
||||||
#### Хранение и отображение
|
|
||||||
|
|
||||||
Для ссылки на момент во времени необходимо использовать единую шкалу,
|
|
||||||
на которой нет разрывов, связанных с летним временем. Примером стандарта
|
|
||||||
времени с такой шкалой является UTC. Локальное или местное время для таких
|
|
||||||
целей не подходит, так как на его шкале имеются разрывы и неоднозначности,
|
|
||||||
связанные с переходами на летнее время и обратно.
|
|
||||||
|
|
||||||
Если нужно сохранить значение локального времени, то необходимо сохранить
|
|
||||||
также смещение относительно UTC, чтобы временную отметку можно было
|
|
||||||
интерпретировать однозначно. Необходимо помнить, что местное время может
|
|
||||||
отличаться от UTC на интервал не кратный часу (например, в Нидерландах
|
|
||||||
с 1909-05-01 по 1937-06-30 смещение времени от UTC составляло
|
|
||||||
19 минут и 32.13 секунд).
|
|
||||||
|
|
||||||
Правила хранения и отображения времени:
|
|
||||||
|
|
||||||
1. Время всегда хранится в UTC. При необходимости дополнительно сохраняется
|
|
||||||
информация о временной зоне (смещение и/или название).
|
|
||||||
|
|
||||||
2. Для вывода на экран время переводится в местное.
|
|
||||||
|
|
||||||
3. При выводе на экран отличного от местного времени необходимо указывать
|
|
||||||
название часового пояса или типа исчисления (например, Юлианский календарь).
|
|
||||||
|
|
||||||
|
|
||||||
#### Системное время для администратора
|
|
||||||
|
|
||||||
Системный администратор должен следить за тем, чтобы файлы базы данных
|
|
||||||
описания временных зон **tzdata** имели одну версию в рамках комплекса
|
|
||||||
и обновлялись регулярно, чтобы минимизировать расхождения с внешними
|
|
||||||
системами. Особенно это важно делать при издании новых правил учёта
|
|
||||||
зимнего или летнего времени.
|
|
||||||
|
|
||||||
На серверах аппаратные часы всегда должны использовать UTC. Операционные
|
|
||||||
системы тоже должны использовать UTC, чтобы при возникновении проблем
|
|
||||||
в файлах журналов было указано время в едином формате.
|
|
||||||
|
|
||||||
В рамках комплекса следует использовать синхронизацию времени, даже
|
|
||||||
если нет доверенного источника более высокого уровня.
|
|
||||||
|
|
||||||
|
|
||||||
#### Клиентские приложения
|
|
||||||
|
|
||||||
В общем случае нельзя доверять временным отметкам внешних клиентов,
|
|
||||||
так как невозможно гарантировать их корректность. Программа должна
|
|
||||||
самостоятельно ставить временные отметки для происходящих событий.
|
|
||||||
Исключением являются программные комплексы, в которых предусмотрено
|
|
||||||
наличие доверенных приложений, ответственных за установку временных отметок.
|
|
||||||
|
|
||||||
|
|
||||||
#### Postgresql
|
|
||||||
|
|
||||||
Сервер базы данных должен использовать только временную зону UTC. Для этого
|
|
||||||
в файле настройки сервера `postgresql.conf` должна быть строка
|
|
||||||
|
|
||||||
```
|
|
||||||
timezone = 'UTC'
|
|
||||||
```
|
|
||||||
|
|
||||||
При создании таблиц необходимо использовать типы данных `timestamp without time zone`
|
|
||||||
и `time without time zone`. Если данные о времени должны содержать информацию
|
|
||||||
о временной зоне или смещении относительно UTC, то нужно создать дополнительные
|
|
||||||
столбцы, информацию из которых должно обрабатывать клиентское приложение.
|
|
||||||
Например, временные отметки можно хранить в таком виде
|
|
||||||
|
|
||||||
```sql
|
|
||||||
CREATE TABLE time_stamps (
|
|
||||||
time_stamp time without time zone, -- временная отметка
|
|
||||||
time_zone character(12), -- текстовое название временной зоны
|
|
||||||
shift integer -- смещение локального времени относительно UTC в секундах
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
Смещение следует записывать в четырёхбайтное знаковое целое, так как оно
|
|
||||||
может быть как положительным, так и отрицательным, а его максимальное
|
|
||||||
значение может составлять 14 * 60 * 60 = 50400 секунд. Несмотря на приведённый
|
|
||||||
выше пример с временной зоной Нидерландов, микросекундами можно пренебречь,
|
|
||||||
так как современные временные зоны имеют смещения кратные минутам, а точность
|
|
||||||
до микросекунд в далёком прошлом обычно не требуется.
|
|
||||||
|
|
||||||
Чтобы клиентская программа могла получить выборку, привязанную к некоторой
|
|
||||||
временной зоне можно использовать оператор `AT TIME ZONE`, например
|
|
||||||
|
|
||||||
```sql
|
|
||||||
SELECT TIMESTAMP '2001-02-16 20:38:40Z' AT TIME ZONE 'MSK';
|
|
||||||
```
|
|
||||||
|
|
||||||
В результате время будет преобразовано из временной зоны UTC в MSK.
|
|
||||||
Модификатор `Z` в записи времени указывает на принадлежность зоне UTC.
|
|
||||||
|
|
||||||
|
|
||||||
#### Qt
|
|
||||||
|
|
||||||
Класс `QTimeZone` предназначен для получения информации о временной зоне
|
|
||||||
и перевода времени из одной временной зоны в другую.
|
|
||||||
|
|
@ -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
|
@ -1,21 +0,0 @@
|
|||||||
---
|
|
||||||
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/)
|
|
||||||
по трехпутевому слиянию.
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Vim: замена выделенного блока"
|
|
||||||
category: Vim
|
|
||||||
tags: Vim, команды Vim
|
|
||||||
summary:
|
|
||||||
CSS: table-100.css
|
|
||||||
...
|
|
||||||
|
|
||||||
Замену блока, выделенного в режиме VISUAL, можно выполнить
|
|
||||||
последовательностью команд `y:%s/<ctrl-r>"/заменитель/g`.
|
|
||||||
|
|
||||||
Команда | Назначение
|
|
||||||
---------------|-------------
|
|
||||||
`y` | Копирование в регистр "
|
|
||||||
`:` | Перейти в командный режим
|
|
||||||
`%` | Применить ко всему буферу
|
|
||||||
`s` | Замена
|
|
||||||
`Сtrl-r` | Вставка из регистра
|
|
||||||
`"` | Имя регистра (будет предложено по умолчанию)
|
|
||||||
`/` | Разделитель
|
|
||||||
`заменитель` | Новый текст
|
|
||||||
`/` | Разделитель
|
|
||||||
`g` | Для всех вхождений в строке
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
|||||||
---
|
|
||||||
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
|
|
||||||
```
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
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>
|
|
||||||
```
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
|||||||
---
|
|
||||||
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>
|
|
||||||
```
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
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` | раскомментировать блок
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
|||||||
---
|
|
||||||
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()
|
|
||||||
```
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
|||||||
---
|
|
||||||
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)
|
|
||||||
```
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Vim: навигация по буферам"
|
|
||||||
category: Vim
|
|
||||||
tags: Vim, команды Vim
|
|
||||||
summary:
|
|
||||||
CSS: table-100.css
|
|
||||||
...
|
|
||||||
|
|
||||||
Команда | Назначение
|
|
||||||
------------------|-----------------
|
|
||||||
`:bn` | следующий буфер
|
|
||||||
`:bp` | предыдущий буфер
|
|
||||||
`:ls` | список открытых буферов
|
|
||||||
`:bd` | закрыть текущий буфер
|
|
||||||
`:b имя_буфера` | переключиться на буфер
|
|
||||||
`:bdа имя_буфера` | удалить буфер по имени
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
|||||||
---
|
|
||||||
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>#` будет осуществляться
|
|
||||||
циклическое переключение между абсолютной, относительной нумерацией
|
|
||||||
строк и отключением нумерации.
|
|
@ -1,39 +0,0 @@
|
|||||||
---
|
|
||||||
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>
|
|
||||||
```
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Vim: полезные ссылки"
|
|
||||||
category: Vim
|
|
||||||
tags: Vim
|
|
||||||
summary:
|
|
||||||
...
|
|
||||||
|
|
||||||
* [Vim](http://vim.org)
|
|
||||||
* [Usevim](http://usevim.com/)
|
|
||||||
* [How I boosted my Vim](http://nvie.com/posts/how-i-boosted-my-vim/)
|
|
||||||
* [How to boost your Vim productivity](https://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/)
|
|
||||||
* [Vim Awesome](https://vimawesome.com/)
|
|
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
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>` `стрелки` | перемещение между окнами
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user