Здесь собраны общие полезные ссылки, команды и шаблоны в основном для работы в
экосистеме Linux-ов. При этом некоторые строки посвящены и иным платформам.
Подпроекты:
- Clonezilla - клонирование систем
- Нибелунги -
Gitlab CI Docker Runner - OpenSuse - Особенности работы в
OpenSuse - Oracle - полезная информация по
Oracle - Qt - Самостоятельная сборка
Qtи всего сопутствующего - QuantML - задел на небольшой
MLпроект - Scripts - скрипты автоматизации
- VimIDE - как кодить в
vimподC++
Переменные среды приводятся без знака $, к примеру: CV_REF.
- SysScripts
- Оглавление
- Философия
- Стиль кода
- Итернационализация
- Система
- Locate
- Сеть
- C++
- Make
- Python
- Ssl
- Java
- Gradle
- Docker
- PlantUML
- Meld
- Visual Code
- Cygwin
- TortoseGit
- BorlandXSD
- Некоторые заметки
- Полезные ссылки
Прочитайте стандарт POSIX.
Принцип следуя которому развёрстка данной экосистемы:
- Максимально формализована (приведена к модели, описана)
- Максимально автоматизирована
- Возможна, обладая лишь иформацией о структурах (1)
- Происходит из одной точки входа (2)
(1) без необходимости копировать бизнесс данные
(2) без необходимости совершать множество ручных действий
"Принцип зёрнышка" в ПО аналогичен тому, как из посажанного семени вырастает дерево.
Несмотря на вклад символа \t в дело вычислительной техники, его статность и
давность, всё же было решено отказаться от последнего в роли символа отступов
в пользу ряда пробелов. Несмотря на то же самое в отношении символа \r, было
решено использовать только \n. Его же оставлять последним в файле, о чём
подробнее можно прочитать тут.
Поставьте галочку в опции files.insertFinalNewline в VS Code.
Локаль системы устанавливается в следующих файлах:
/etc/sysconfig/i18n- глобальная локаль/home/<user>/.dmrc- локальX-ов пользовательской сессии
Конечно, ни кто не удивится узнав, что во многих компаниях до сих пор везде
используется кодировка CP1251. Это является большой проблемой, которую
следует решать, в свете того, что проект не может нормально существовать в наше
время с кодировочными страницами ANSI. Посему, я всегда перевожу все проекты
на UTF-8.
Нет способа сделать перекодировку большого количества файлов достаточно
сложного проекта автоматом за один раз. Требуется использовать ряд
инструментов. В нашем случае это утилита iconv со стороны Linux-а и
Notepad++ на Wind-е.
При всех преимуществах
Linux-ов над ОС семействаWindows, необходимо признать, что есть несколько инструментов доступных от туда, аналогов которым нет тут; среди них:Notepad++иTortoiseGit
Мы воспользуемся общей папкой примонтированной через /mnt/share, как описано
в OpenSuse.
При отсутствии Linux-а, думаю вы сможете воспользоваться Cygwin-ом для
решения данной задачи.
Сначала локализуем все файлы заражённые большевизмом:
$ cd /path/to/repo
$ file * | grep ISOСкорее всего выйдут почти все *.cpp файлы и некоторые *.h.
Для того, что бы наглядно проверить кодировку, воспользуемся командой:
od -cx <file> | less.
А вот команда для массовой перекодировки:
$ for f in $(file * | grep ISO-8859 | awk -F":" '{print $1}'); \
do iconv -f CP1251 -t UTF-8 $f -o $f; \
doneНекоторые файлы окажутся битыми, для решения этой проблемы открываем в
TortoiseGit утилиту Diff и проходимся по каждому файлу. На тех файлах, на
которых TortoiseGit выдаст ошибку при их открытии делаем следующее. Открываем
каждый в Notepad++ и используем опцию Encoding -> Convert to UTF-8.
Преимущество этого метода в том, что вы сразу видите результаты преобразования.
Если даже после преобразования в Notepadd++ файл оказывается битым, просто
скопируйте туда код с исходника. Учитывая что файл уже распознаётся как
UTF-8, текст автоматом преобразуется в нужную кодировку при копировании.
Важно! Возможно станут перекодированы так же некоторые строки, подлежащие записи в БД, а база данных возможно в
ANSIкодировке; если так, нужно будет точечно использовать функции перекодировки из кодаC++, или вызватьsetenv("NLS_LANG",".UTF8", 1)в начале программы
CP1251 не единственная кирилическая ANSI кодировка, с которой вам придётся
столкнуться. Иной пример, это печатные устройства, которые традиционно работают
с кодировкой CP866. В процессе работы вам часто придётся анализировать
шестнадцатиричное представление текста в той или иной кодировке. Помогут вам в
этом, замечательные и наглядные таблицы на сайте посвящённом Arduino.
В общем написан так же скрипт на Python-е для решения
данной задачи.
Общие заметки по OS.
Как известно старые системы Linux-а придерживались принципа runlevel.
У новых дела обстоян немного иначе, но принцип знать необходимо.
Что бы загрузить систему в нужном runlevel-е, отредактируйте файл: /etc/inittab.
Некоторые процессы в Linux-е оформлены в древнее понятие job.
Посмотреть список job-ов и остановить необходимый можно следующим образом:
$ jobs
$ kill %1Важные термины:
X11 Коммуникационный протокол X Window System
Xlib Библиотечная реализация клиентской части X Window System
Xorg Библиотечная реализация серверной части X Window System
Полезные ссылки:
Выполните следующие команды для выполнения следующих операций:
- Вывести информацию о процессе сервера
X:ps -fwwC Xorg - Вывести используемый экран:
echo $DISPLAY - Выключить
Xсервер:killall -9 Xorg
Важные конфигурационные уголочки:
/etc/X11/prefdm- настройка загрузчикаDM/etc/gdm/custom.conf- настройкаGDM/etc/kde/kdm/kdmrc- настройкаKDM
Немного теории.
После загрузки сервера Xorg, грузится первый попавшийся Display Manager.
Если установлен устаревший на сегодня prefdm, то последний уже грузит первый
попавшийся Display Manager. Display Manager-ы устанавливаются в виде сервисов,
и при установке могут отключить конкурентов. И отключают конкурентов
при переустановке - Кто последний встал, того и тапки.
Display Manager часто называют Login Manager.
Display Manager грузит Desktop Environment создавая XSession с конкретным
пользователем. Обычно есть прямая взамосвязь между Display Manager-ом и
Desktop Environment-ом, в том плане, что они идут связкой в рамках одного проекта.
Заметки из жизни:
- Сеанс пользователя по умолчанию и выбор языка находятся в файле ~/.dmrc
TODO: сделать ссылку на раздел о графике в
OpenSUSE, или объеденить разделы
Важная утилита для поиска динамических библиотек.
Команда называется: updatedb. Для работы утилиты, её нужно запустить с
правами root-а, но перед этим очень важно исключить некоторые пути поиска. В
нашем случае следует исклюсить: /var/lib/docker.
В файле /etc/updatedb.conf добавьте /var/lib/docker в PRUNEPATHS.
Теперь запустите sudo updatedb.
TODO: сделать ссылку на раздел о
LocateвOpenSUSE, или объеденить разделы
В OpenSuse используется утилита Schutzstaffel ss заместо netstat.
Иногда в скриптах будет необходимо получить PID процесса, который слушает
определённый порт:
PORT=8081
IP=0.0.0.0
ss -pln | \
grep $PORT | \
grep $IP | \
awk '{print $7}' | \
awk -F"," '{print $2}' | \
awk -F"=" '{print $2}'
# Всё это можно записать строкой в переменную, и тогда
PID=$($COMMAND)
# Теперь процесс можно автоматом завершить
kill -9 $PIDДля того, что бы автоматом подставить платформонезависимый идентификатор целого
числа в формате sprintf, исзользуйте следующий шаблон:
sprintf(buff, "%" PRId64, num);Вызов cmake с конкретным gcc\g++:
#!/bin/bash
export CC=/usr/bin/gcc-9
export CXX=/usr/bin/g++-9
rm -rf CMakeFiles/ CMakeCache.txt cmake_install.cmake *_autogen
cmake .Вот полезная таблица версий C++:
| Year | C++ Standard | Informal name |
|---|---|---|
| 1998 | ISO/IEC 14882:1998 | C++98 |
| 2003 | ISO/IEC 14882:2003 | C++03 |
| 2011 | ISO/IEC 14882:2011 | C++11, C++0x |
| 2014 | ISO/IEC 14882:2014 | C++14, C++1y |
| 2017 | ISO/IEC 14882:2017 | C++17, C++1z |
| 2020 | ISO/IEC 14882:2020 | C++20, C++2a |
Очень важно уметь писать скрипты Make самостоятельно.
Важно помнить, что отступы, предположительно, должны быть \t.
В Make есть одна особенность: .PHONY, выглядет примерно так:
.PHONY: clean
clean:
rm -rf *.o.PHONE: <цель> значит, что цель исключительно виртуальная и не привязанна к
файлу, даже еслии онный существует.
Make работает по принципу: запускаем, если зависимость обновилась.
Параметры времени обновления зависимосте Make получает от туда же, от куда
команда stat.
Python имеет большое значение для превращения Vim в IDE, так как многие
плагины основаны на нём.
На OpenSuse 15.3 команда python запустит python2.x, но для дел vim-ных
нам нужен python3. В OpenSuse нет стандартного update-alternatives, как
на Ubuntu, поэтому просто измените ссылки:
$ cd /usr/bin
$ ls -la | grep python
# Только если мы имеем симлинк, тогда:
$ sudo rm python
$ sudo ln -s python3 pythonКонечно у вас уже должен быть установлен Python3
Небольшое отступление.
Иногда нужно установить пакеты Python-а именно с Python2. По умолчанию
pip в наши дни будет использовать Python3.
Можно было бы сделать следующее:
# Скачать нужный `get_pip.py`
$ curl -O https://bootstrap.pypa.io/pip/2.7/get-pip.py
# Установить `pip` с `Python2`
$ sudo python2 get-pip.pyНо, далее вы получите ошибку:
ImportError: No module named xml.etree.ElementTree
В связи с этим проще просто портировать проект на Python3, вот различия
синтаксиса.
Часто вам нужно будет узнать список установленных модулей и их версии.
Для этого используйте: pip freeze | grep <module>.
Центральные пакеты Python3-а устанавливаются по расположжению:
/usr/lib64/python3.<x>/site-packages/, но при вызове pip устновка будет в
/home/<user>/.local/lib/python3.6/site-packages по этому pip нужно
запускать без sudo.
Вы всегда можете посмотреть данные по модулю с помощью: pip show <MODULE>.
Важно заметить, что сертефикаты представленные самым распространёным
стандартом X.509 могут быть представлены в двух физических форматах:
PEM и DER.
PEM-Base64 ASCIIDER- двоичный
В формате PEM файлы обычно имеют расширение .pem, .crt. В DER -
.cer, .der.
Об этом можно больше прочитать тут.
Вкратце об openssl. openssl вызывается с первым параметром подпрограммы,
и остальными параметрами, которые передаются в подпрограмму.
Основные подпрограммы openssl:
s_client- совершает запросы по протоколуTLSx509- работает с сертификатами стандартаX.509req- создание сертификатаcrl- работа со списками отозванных сертификатов
Для того, чтобы сохранить сертификат с необходимого сервера:
$ echo -n | \
openssl \
s_client \
-connect kalevala.ru:443 2> /dev/null | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' \
> kalevala.ru.crt
$ ls kalevala.ru.crtПри необходимости, можно скачать всю цепочку, добавив параметр
-showcertsк подпрогреммеs_clientпрограммыopenssl
Для того, чтобы посмотреть информацию по скаченному сертификату:
$ openssl x509 -in kalevala.ru.crt -noout -text | lessВ случае, если мы просматриваем сертификат в двичном формате
DER, следует добавить параметр-inform derк подпрограммеx509программыopenssl
$ openssl x509 -inform der -in kalevala.ru.cer -noout -textЕсли в одном pem файле у нас много сертификатов, то мы можем просмотреть
все с помощью следующей конструкции. Вывод передаётся в less,
в рамках less можно использовать поиск тем же образом, как в vim:
$ while openssl x509 -noout -text; do :; done < cert-bundle.pem | lessДабы выбрать некоторый сертификат из всего буклета, найдите первую и последнюю
строки текстового представления последнего с помощью программы vim и режима
set nu. Пусть это будут 28-ая и 49-ая строки. Воспользуйтесь командой:
sed -n '28,49 p' cert-bundle.pemДля того, чтобы создать самиздатный сертификат:
$ openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout ilmarinen.key \
-x509 -days 365 -out ilmarinen.crt \
-subj "/C=RU/ST=Vologda/L=Vologda/O=Kalevala/OU=NIT/CN=Ilmarinen"Java активно используется в проектах, и нет ни какой причины
не использовать этот второй по красоте язык после C#-а, учитывая
что в отличии от последнего он полностью OpenSource-ный.
Java используется как среда выполнения замечательной системы сборки
Gradle. Gradle в свою очередь запрашивает зависимости из Maven
репозиториев. Последние в свою очередь могут находиться на локальных
корпоративных хостах. Для обестпечения доступа к онным требуется
произвести некоторые манипуляции с хранилищем ключей Java-ы -
keystore-ом с помощью утилиты keytool.
Подобно тому, как в OS есть pem файл содержащий сертифкаты:
/var/lib/ca-certificates/ca-bundle.pem так же и в java-е есть
подобный файл: $JAVA_HOME/lib/security/cacerts.
Если переменная среды JAVA_HOME не установлена, но команды java
прописана в PATH, то cacerts можно найти с помощью:
$ JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which java)))))
$ CACERTS_PATH=$JAVA_HOME/lib/security/cacerts
$ ls $CACERTS_PATHПредположим мы уже сохранили необходимые сертификаты, как указанно тут.
Далее предполагаем, что мы используем
Java 11. В этой версииjava-ы нам можно не прописывать путь кcacerts; достаточно лишь указать параметр-cacerts. Если же всё таки необходимо прописать путь к хранилищу, передайте слудующий параметр:-keystore $CACERTS_PATH
Хранилище ключей по умолчанию защищено паролем. Этот пароль редко меняют,
оставляя изначальным: changeit.
Далее, импортируем сертификат:
$ sudo keytool \
-importcert \
-trustcacerts \
-cacerts \
-noprompt \
-storepass changeit
-alias kalevala
-file kalevala.ru.crtС помощью этой команды вы можете импортировать как файлы pem, так и der.
Обязательно выберите соответствующий alias.
Если у вас букет сертификатов одной цепочки, импортируйте их по очереди,
давая разные alias-ы и подставляя нужный файл в параметр -file.
Параметр -trustcacerts не обязателен, но желаем.
Для java 8 воспользуйтесь:
$ sudo keytool \
-import \
-keystore $CACERTS_PATH \
-storepass changeit \
-noprompt \
-alias kalevala \
-file kalevala.ru.crtДля того, чтобы просмотреть список всех сертификатов, и найти там свежедобавленные, выполните:
$ keytool \
-cacerts \
-storepass changeit \
-list \
-v | grep kalevalaЕсли мы добавили что-то не то, и хотим удалить:
$ sudo keytool \
-delete \
-cacerts \
-storepass changeit \
-noprompt \
-alias kalevalaВсе эти процедуры будут необходимы для того, что бы обеспечить Gradle
доступом к локальным Maven репозиториям. О Gradle смотрите
ниже. После импорта новых сертификатов, вам будет необходимо остановить
запущенный Gradle сервис:
$ gradle --stopGradle это замечательная экосистема сборки проектов. Стоит
ознакомиться с базовыми сведениями о написании скриптов.
У Gradle-а есть один важный момент. Если вы используете локальный сервер,
то есть не используете опцию --no-daemon, то для того, что бы передать
параметры в скрипт из новых установленных переменных среды, вам надо
перезапустить сервис.
$ export PARAM=value
$ ./gradlew --stop
$ ./gradlew <цель>Поиск образов наследников по идентификатору:
for i in $(docker images -q)
do
docker history $i | grep -q e969c38d7c77 && echo $i
done | sort -uВ нашей работе очень важна визуализация всевозможных схем. Создавайте диаграммы как можно больше и чаще. Как минимум они помогут лично вам, уложив у вас в голове процессы, структуры, архитектуру наилучшим образом.
Мы используем плагин PlantUML в Visual Studio Code.
На Linux-е настройка относительно проста. Всё можно установить с помощью
манагера проектов. Если вам необходимо установить на Windows-е, необходимо
выполнить следующее.
- Установите плагин в
VS Code - Скачайте
plantuml-<VERSION>.jarс официального сайта, и положите файл на диск в удобном расположении - Скачайте
zipархивGraphvizс официального сайта, и так же положите содержимое архива в удобном вам месте - Скачайте любой
Java 11или вышеSDKилиRuntime - Создайте переменную среды
GRAPHVIZ_DOTуказывающую наdot.exeиз третьего пункта - Добавтье в переменную
PATHпуть до папкиbinсодержащуюjava.exe - Создайте переменную
JAVA_HOMEс путём до папки содержащей папкуbinиз шестого пункта - Пропишите в
.vscode/settings.jsonследующую конфигурацию заменяя...на актуальные пути
{
"java.home": "C:\\...\\jre",
"plantuml.jar": "C:\\...\\plantuml-1.2022.4.jar",
"plantuml.java": "C:\\...\\bin\\java.exe",
"plantuml.render": "Local"
}После установки переменных, выключитt все инстансы
VS Codeи запустите среду снова.
К сожалению в Linux-ах нет настолько удобного инструмента как TortoiseGit,
который позволяет делать интерактивное слияние любой ветки в рабочее
пространство. Поэтому необходимо использовать meld, который устанавливается
с помощью sudo zypper in meld.
- В репозитории переключитесь на ветку В КОТОРУЮ планируем слияние:
git checkout <target_branch> - Создайте новую ветку командой
git checkout -b <target_branch>-meld - Переключите индекс на исходную ветку c которой планируем слиять:
git reset --soft <source_branch> - Запустите
Meldи в интерфейса выберите опциюVersion Control View - Задайте путь к репозиторию
- При необходимости, перегружайте рабочее пространство в
MeldклавишейF5 - Совершите интерактивное слияние
- Закоммитьте изменения командами
git add .иgit commit ... - Переключитесь на целевую ветку:
git checkout <target_branch> - Совершите слияние из промежуточной ветки командой
git merge <target_branch>-meld - Залейте изменения на
GitLab, убедитесь, что всё собирается наCI
Создайте в корне проекта заигнорированную папку .vscode.
Прочитайте документацию по конфигурированию settings.json.
Создайте файл .vscode/c_cpp_properties.json
(путь относительно корня проекта) с содержимым:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/build/pos_autogen/include/*",
"${ORACLE_HOME}/rdbms/public",
"/opt/qt5/include/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}Установите plugin-ы CMake и Cmake Tools от twxs и Microsoft.
Далее в левой панели появится перспектива CMake. В этой перспективе у вас
будут опции конфигурации, сборки, запуска и отладки проекта.
Требуемые плагины для работы в Visual Studio Code:
| Плагин | Идентификатор |
|---|---|
Better C++ Syntax |
jeff-hykin.better-cpp-syntax |
C/C++ Extension Pack |
ms-vscode.cpptools-extension-pack |
CMake |
twxs.cmake |
CMake Tools |
ms-vscode.cmake-tools |
Markdown All in One |
yzhang.markdown-all-in-one |
PlantUML |
jebbs.plantuml |
Qt tools |
tonka3000.qtvsctools |
Trailing Spaces |
shardulm94.trailing-spaces |
Bookmarks |
alefragnani.bookmarks |
Навигация по посещённым участкам:
Linux:
- Назад:
ctrl + alt + - - Вперёд:
ctr + shidt + -
Windows:
- Назад:
alt + <- - Вперёд:
alt + ->
Команды плагина Cmake-Tools:
Build-F7Debug-Ctrl + F5
Вам возможно понадобится использовать Cygwin с Wind-ы для некоторых задач,
типа перекодировки страниц.
Для установка cygwin-а без прав админа запустите из cmd Windows-а:
> setup-x86_64.exe --no-adminВажно в рамках Cygwin-а установить следующие настройки, обратите внимание,
что используется --global для задания глобальных настроек, вы можете опустить
эту опцию для конфигурации только репозитория:
# Имя пользователя в рамках глобальных настроек
$ git config --global --edit
# Сохранять LF (line feed) в репозитори
$ git config core.autocrlf input
# Игнорировать права запуска файла, тк в cygwin-е это право недоступно
$ git config core.filemode falseВ мире есть прекрасный инструмент, который к сожалению существует только
для Wind-ы. Это - TortoiseGit. Надеюсь в какой то момент его всё же
соберут для Linux-а.
Есть один важный момент. После перегрузки компьютера pageant слетает.
Для решения этого вопроса:
- Откройте папку автозапуска:
Win + R,shell:startup - Создайте ярлык для
C:\Program Files\TortoiseGit\bin\pageant.exe - Скопируйте ярлык в папку автозапуска
- В свойствах ярлыка, вконце пути добавьте путь до ключа
Putty
Для валидации копонентов на проектах Delfi необходимо обзавестись конвенцией
имён в некоем framework-е UI классов конкретного ПО. Используя эту
конвенцию и декларативный подход DML файлов, мы можем создать процесс
валидации, обрабатывая дерево композиций:
- Кто в составе какой формы или окна, или по другому - композиция
- Тип объекта
- Имеем ли мы базовый объект или наследование -
objectиinherited
Полагаясь на конвенцию имён мы можем обогатить метаданные структуры привязанной
к некоторой сущности на UI. К примеру если тип объекта TFrKalevala, можно
предположить, что Fr - это фрейм. Так же можно создать промежуточные классы,
к примеру ABWList. В данном случае A, это abstract. Данная конвенция
может заставит валидатор убедиться, что необходимые свойства списка
переопределены. Следующий этап, внедрение XSLT и XSD. Написать XSLT,
который переведёт DFM в XML и создать XSD который будет накладывать
валидацию. Это позволит создать громадную массу правил очень простыми
способами. Более того, файл валидации может быть в руках самих разработчиков.
Пример экранирования слешей в путях сохранённых в переменных при передачи
переменных команде sed:
$ OLD_LIB=/path/to/old/lib
$ NEW_LIB=/path/to/new/lib
$ sed -i "s/${OLD_LIB//\//\\/}/${NEW_LIB//\//\\/}/" fileРазмеры папок для всех случаев жизни, включая Docker:
#!/bin/bash
for name in `sudo ls -a $1`; do
sudo du -sh $1/$name
doneДанный проект использует GitHub действие: Markdown link check.