четверг, 3 февраля 2022 г.

Проверка работоспособности Сервиса ЭП АЦК

Для проверки работоспособности Сервиса ЭП АЦК версии 1.0.4.3 и выше нужно открыть ссылки:
http://127.0.0.1:50003/cservice?act=GetVersion
https://127.0.0.1:50004/cservice?act=GetVersion
Обе ссылки должны выдавать один и тот же результат, пример:
{"result": "1.0.4.3"}

вторник, 25 января 2022 г.

Подключение к сайтам с шифрованием по ГОСТ

Выбор алгоритма шифрования в "Яндекс.Браузер" зависит от параметра "Подключаться к сайтам, использующим шифрование по ГОСТ. Требуется КриптоПро CSP.".

Если параметр отключен, то шифрование соединения будет не по ГОСТ, пример при открытии сайта https://www.cryptopro.ru/certsrv/:

Когда параметр включен, то соединение шифруется по ГОСТ:

понедельник, 17 января 2022 г.

Active Directory Domain Services: Атрибуты именования пользователей

User Naming Attributes статья в разделе "Active Directory Domain Services" на "Windows App Development" ресурса "Microsoft Docs". В этой статье описан алгоритм построения имени пользователя:

Атрибут userPrincipalName — это имя входа для пользователя. атрибут состоит из имени участника-пользователя (UPN), которое является наиболее распространенным именем для входа Windows пользователей. Пользователи обычно используют свое имя участника-пользователя для входа в домен. Этот атрибут является индексированной строкой с одним значением.

UPN — это имя входа в стиле Интернета для пользователя, основанное на стандарте RFC 822.

Утилита whoami:

Отображает сведения о пользователе, группе и привилегии для пользователя, который в данный момент вошел в локальную систему. Если используется без параметров, Whoami отображает текущий домен и имя пользователя.

воскресенье, 9 января 2022 г.

showme_azknums.py

Пример запуска:

showme_azknums.py 2.54.0.500_FB_21003_UFALEI_2022-01-04

Пример результата:

C:\apps\azk\f\2.54.0.500_FB_21003_UFALEI_2022-01-04

АЦК-Финансы: 2.54.0.500

Отчеты АЦК: 2.54.0.80

СОФИТ: 2.54.0.447

Модуль ЕИС: 12.0.0.1

Исходный код скрипта:

# 09.01.2022

# Утилита сообщает версии системной сборки АЦК-Финансы и ее подсистем - отчеты, СОФИТ, ЕИС - в указанной пользователем папке.

# Принцип утилиты строится на том, что в каждой сборке АЦК-Финансы есть определенные jar-файлы (символизирующие системную сборку и ее подсистемы), содержащие определенные properties-файлы, в которых есть переменные "version.major", "version.minor", "version.release", "version.build" с информацией о полном номере версии (патча).

import sys, os, zipfile, webbrowser

# Список проверяемых jar-файлов и properties-файлов:

check_list = [

# АЦК-Финансы:

 {"jar": "server/AzkServer.jar", "properties": "com/bssys/version.properties", "encoding": "windows-1251"}

,{"jar": "server/AzkRepKernel.jar", "properties": "com/bssys/azkserver/reports/repversion.properties", "encoding": "windows-1251"}

,{"jar": "server/AzkSofit.jar", "properties": "com/bssys/azkserver/sofit/sofitversion.properties", "encoding": "windows-1251"}

,{"jar": "server/eis.jar", "properties": "azk/eis/version.properties", "encoding": "windows-1251"}

# АЦК-Госзаказ:

,{"jar": "server/ordersrv.jar", "properties": "com/bssys/version.properties", "encoding": "unicode_escape"}

]

# Папка сборки АЦК, которую пользователь указал в командной строке при запуске утилиты:

azkdir = ''

if len(sys.argv) == 2: azkdir = sys.argv[1]

tmp_env_dir = os.environ['TEMP']

tmpdir = os.path.join(tmp_env_dir, 'showme_nums_temp')

outputfile = os.path.join(tmp_env_dir, 'showme_nums_output.txt')

outputfile_write = open(outputfile,'w')

ss_out = sys.stdout

sys.stdout = outputfile_write

if len(azkdir) > 0 and os.path.isdir(azkdir):

    print(os.path.abspath(azkdir))

    for jarfile in check_list:

        product_name = ''

        version_major = ''

        version_minor = ''

        version_release = ''

        version_build = ''

        # jarpath - полный путь к jar-файлу из check_list:

        jarpath = os.path.join(azkdir, jarfile["jar"])

        if os.path.isfile(jarpath) and zipfile.is_zipfile(jarpath):

            # Извлекаем properties-файлы из jar-файла:

            zipfile.ZipFile(jarpath).extract(jarfile["properties"], path=tmpdir)

            # print(tmpdir + check_list[jarfile])

            tmpjarfile = os.path.join(tmpdir, jarfile["properties"])

            tmpjarfile_read = open(tmpjarfile, mode="r", encoding=jarfile["encoding"])

            for tmpjarfile_line in tmpjarfile_read:

                # Убираем лишний символ переноса в конце строки jar-файла:

                tmpjarfile_line = tmpjarfile_line.replace('\n','')

                # Делим строку по символу "=":

                tmpjarfile_split = tmpjarfile_line.split('=')

                if tmpjarfile_split[0] == 'product.name':

                    product_name = tmpjarfile_split[1]

                if tmpjarfile_split[0] == 'version.major':

                    version_major = tmpjarfile_split[1]

                if tmpjarfile_split[0] == 'version.minor':

                    version_minor = tmpjarfile_split[1]

                if tmpjarfile_split[0] == 'version.release':

                    version_release = tmpjarfile_split[1]

                if tmpjarfile_split[0] == 'version.build':

                    version_build = tmpjarfile_split[1]

        if len(product_name) > 0:

            print(f'{product_name}: {version_major}.{version_minor}.{version_release}.{version_build}')

elif len(azkdir) > 0 and not os.path.isdir(azkdir):

    print(f"Указана несуществующая папка сборки АЦК: {azkdir}")

else:

    print(f"Утилиту \"{os.path.basename(__file__)}\" нужно запускать с указанием папки сборки АЦК, в формате:\n{os.path.basename(__file__)} <папка сборки АЦК>\n\nПример:\n{os.path.basename(__file__)} azkfin2.54.0.500_ORA_21001_AMUR")

outputfile_write.close()

sys.stdout = ss_out

#input("\nНажмите клавишу \"Enter\" для закрытия окна...")

#Открыть файл с результатом в ассоциированном приложении:

webbrowser.open(outputfile)

пятница, 24 декабря 2021 г.

Связки баз разных СУБД

По аналогии с DBLink. При необходимости использования одной базы в качестве источника данных для другой базы на уровне SQL-запросов можно использовать:

- oracle_fdw;

- postgres_fdw;

- firebird_fdw.

четверг, 9 декабря 2021 г.

Видеомонтаж (начало)

Появилась потребность в видеомонтаже. Но при этом базовых знаний нет. Поэтому пока использую:

1. Видеоредактор "Kdenlive" (https://kdenlive.org/en/), но результат экспорта получается очень большой (сотни мегабайт), поэтому:

2. Результат сжимаю с помощью https://www.youcompress.com/ru/

четверг, 18 ноября 2021 г.

Если при обращении к JIRA API возвращается код состояния HTTP 403 - дело в капче

Если при обращении к JIRA API возвращается код состояния HTTP 403, скорее всего, причина в капче. Такая ситуация чаще всего случается в период смены пароля, например, когда истек срок его действия: если в этот период вовремя не скорректировать данные для авторизации микросервиса, который обращается к JIRA API по паре логин-пароль, тогда JIRA для учетной записи с таким логином включает режим требования ввода капчи (это можно увидеть, если вручную более трёх раз ввести некорректно пароль в интернет-браузере). В таком режиме микросервис не может подключиться, так как JIRA API будет возвращать код состояния HTTP:
HTTP 403 Forbidden
Дополнительную информацию можно также увидеть в какой-либо среде разработки, например, SoapUi или Postman:
Решение:
- ввести капчу вручную (режим требования ввода капчи JIRA отключает после первого же успешного ее (капчи) ввода);
- перевести микросервис на другой тип авторизации, например, по токену.

пятница, 22 октября 2021 г.

Confluence: "Expand all"

В оформлении страниц в Confluence применяется макрос "Expand macro", который позволяет создавать в тексте развертываемые (свертываемые) блоки. Могут встречаться страницы, на которых таких блоков (макросов) очень много и приходится тратить существенное время на то, чтобы раскрыть их все (например, если вам нужно проверить наличие своего имени в каждом из таких блоков).

Для решения такой проблемы хочется иметь кнопку, которая позволяет раскрыть все такие одним нажатием.

Вариант решения с созданием такой кнопки описан здесь: обсуждение "Can I toggle expand all Expand Macros in a page?" в community.atlassian.com.

Описание решения: нужно добавить на панель закладок закладку, которая вместо страницы будет содержать текст:

javascript:(function()%7B%24(".expand-control").each(function()%7B %24(this).trigger("click")%3B%7D)%7D)()



Успешно проверено в Google Chrome 94.0 и Confluence 6.4.3.

вторник, 12 октября 2021 г.

Шаблон для доработок

*Описание проблемы:*

*Цель/потребность доработки:*

*Предлагаемое решение Заказчика:*

*Заключение сотрудника БФТ (L2):*

+Предлагаемое решение Сотрудника БФТ (L2) (согласовано с Заказчиком):+

*История обращений:*
[SP-|https://sd.bftcom.com/browse/SP-] → [FIN-|https://jira.bftcom.com/browse/FIN-]

*Контактные данные Заказчика:*

Шаблон для дефектов

*Описание проблемы:*

*Предусловия:*

*Порядок действий:*

*Ожидаемый результат:*

*Фактический результат:*

*БД:*

*Заключение:*

*Обоснование заключения:*

*Временное решение:*

*Информация о критичности:*

среда, 8 сентября 2021 г.

Менеджер удаленных подключений

MobaXterm понравился больше, чем mRemoteNG, потому что MobaXterm "пробрасывает" сочетания горячих клавиш в RDP-сессиях, а mRemoteNG - нет.

Но бесплатная версия MobaXterm с ограничениями.

среда, 1 сентября 2021 г.

Открытие URL-адресов с помощью мыши в Sublime Text

 Установить плагины:

- Clickable URLs

- PackageResourceViewer


Открыть файл "Default (<название операционной системы>).sublime-mousemap" с помощью:

Ctrl+Shift+P -> "PackageResourceViewer: Open Resource"-> "Default" -> "Default (...OS...).sublime-mousemap"


Добавить туда блок:

    {

        "button": "button1",

        "count": 2,

        "modifiers": ["ctrl"],

        "press_command": "drag_select",

        "command": "open_url_under_cursor"

    }


Теперь URL-адрес будет открываться после двойного щелчка по нему левой кнопкой мыши с зажатой клавишей Ctrl.


Источники: 1, 2.

вторник, 31 августа 2021 г.

gpedit.msc для "Windows 10 Home Edition"

bat-файл:

@echo on

pushd "%~dp0"

dir /b %SystemRoot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt

dir /b %SystemRoot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt

for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"

pause

Запустить с привилегиями администратора.

 Источник.

понедельник, 16 августа 2021 г.

Python: последовательное подключение к СУБД Oracle, затем PostgreSQL

 Попытка подключения сначала к СУБД Oracle, а затем к PostgreSQL в таком виде:

import jaydebeapi

...

jaydebeapi.connect('oracle.jdbc.driver.OracleDriver', ora_url, [db_username, ora_password], './ojdbc6.jar')

jaydebeapi.connect('org.postgresql.Driver', pg_url, [pg_user, pg_password], './postgresql-42.2.1.jar')

приводит к ошибке:

TypeError: Class org.postgresql.Driver is not found


Решение: предварительно загрузить JDBC-драйвер СУБД PosgreSQL в экземпляр JVM - см. строку "jpype.startJVM(... classpath=...":

import jaydebeapi

import jpype

...

jHome = jpype.getDefaultJVMPath()

jpype.startJVM(jHome, classpath=['./ojdbc6.jar','./postgresql-42.2.1.jar'])


jaydebeapi.connect('oracle.jdbc.driver.OracleDriver', ora_url, [db_username, ora_password], './ojdbc6.jar')

jaydebeapi.connect('org.postgresql.Driver', pg_url, [pg_user, pg_password], './postgresql-42.2.1.jar')


jpype.shutdownJVM()

вторник, 27 июля 2021 г.

pip

 Вместо "pip install ..." можно использовать "python -m pip install ...".

Полезно, когда работаешь на "чужом" сервере и не знаешь, куда установлена (и установлена ли) утилита "pip".

пятница, 29 января 2021 г.

Подключение к Firebird 3.0 с помощью Python 3

Описание проблемы:

Выполнение python-кода:

import fdb

con = fdb.connect(dsn='127.0.0.1/3050:base.fdb', user='SYSDBA', password='masterkey', charset='WIN1251')

прерывается ошибкой:

Traceback (most recent call last):

  File "try.py", line 4, in <module>

    con = fdb.connect(dsn='127.0.0.1/3050:base.fdb', user='SYSDBA', password='masterkey')

  File "C:\python38-32\\lib\site-packages\fdb\fbcore.py", line 800, in connect

    load_api(fb_library_name)

  File "C:\python38-32\\lib\site-packages\fdb\fbcore.py", line 231, in load_api

    setattr(sys.modules[__name__], 'api', ibase.fbclient_API(fb_library_name))

  File "C:\python38-32\\lib\site-packages\fdb\ibase.py", line 1385, in __init__

    raise Exception("The location of Firebird Client Library could not be determined.")

Exception: The location of Firebird Client Library could not be determined.


Решение:

Создаем строковый параметр, который указан в строках немногим выше той, что указана в этой строке стека ошибки:

File "C:\python38-32\\lib\site-packages\fdb\ibase.py", line 1385, in __init__

например, "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Firebird Project\Firebird Server\Instances\DefaultInstance" с путем до программной папки Firebird, например, "C:\firebird\3.0.6.33328-0_x64\".

Создаем папку "C:\firebird\3.0.6.33328-0_x64\bin\".

Копируем туда "C:\firebird\3.0.6.33328-0_x64\bin\fbclient.dll" разрядности "x32".

Архив