🏠: it

Обучение компьютера русскому

У меня на работе пользователям присылалось автоматическое уведомление о кончающемся сроке действия их пароля, где первой строкой была фраза:

Уважаемый пользователь Информационных Систем!

Проблема хорошо описана в статье «Здравствуйте, с вами говорит робот», и мне хотелось очеловечить эти формальные уведомления, например, чтобы первой строкой было обращение по имени и отчеству с соответствующим изменением окончания слова «уважаемый» в зависимости от пола адресата.

Желание решить такую задачу заставляет задуматься о логике родного языка. Считается, что очень логичный язык английский, а в русском всё устроено не пойми как — порядок слов какой хочешь, окончания меняются и так далее. Тем не менее, любой язык логичен, просто большинство использует его интуитивно и не задумывается о принципах функционирования, особенно после окончания школы. Я не исключение, но так как задача требует перевести принципы русского языка на язык, понятный компьютеру, то постигнуть эту логику необходимо и мне, но уже самостоятельно.

Первым делом нужно понять, как отделять мужские ФИО от женских. Просматривая списки, я обнаружил, что ключом к разгадке являются отчества — все мужские отчества заканчиваются на «ич», а все женские — на «на». Сначала я думал, что одинаковы три последних буквы, но, например, у мужчин есть Ильич и Кузьмич, а у женщин Ильинична и Кузьминична, так что остановился на двух.

Так-то лучше:

# Выборка
if ($user.givenname -match "на$") {$body1 = "Уважаемая $($user.givenname)!"}
elseif ($user.givenname -match "ич$") {$body1 = "Уважаемый $($user.givenname)!"}
# А случаи бывают разные
elseif (!($user.givenname)) {$body1 = "Уважаемый $($user.name)!"}
else {$body1 = "Уважаемый пользователь информационных систем АО «Мир шерстяных носков»!"}
# Результат
$body1

Уважаемый Игорь Валерианович!
Уважаемый Михаил Сергеевич!
Уважаемый Игорь Алексеевич!
Уважаемая Олеся Андреевна!
Уважаемая Анна Васильевна!
Уважаемая Светлана Николаевна!
Уважаемый Алексей Владимирович!
Уважаемый Сергей Владимирович!
Уважаемая Любовь Владимировна!
Уважаемая Полина Евгеньевна!

Следующий этап — зависимость окончания слова «день» от их количества. Надо составить фразу «Действие вашего пароля истекает через N дней». Путём нехитрых размышлений получается, что вроде бы все числа, заканчивающиеся на 1 — это «день», на 2,3 и 4 — «дня», а все остальные — «дней». Проверяем:

if ($user.daystoexp -match "1$") {$in = "через $($user.daystoexp) день"}
elseif ($user.daystoexp -match "[234]$") {$in = "через $($user.daystoexp) дня"}
else {$in = "через $($user.daystoexp) дней"}
# Результат
"Действие вашего пароля истекает $in."

Действие вашего пароля истекает через 24 дня.
Действие вашего пароля истекает через 17 дней.
Действие вашего пароля истекает через 14 дня. # !
Действие вашего пароля истекает через 2 дня.
Действие вашего пароля истекает через 49 дней.
Действие вашего пароля истекает через 23 дня.
Действие вашего пароля истекает через 55 дней.
Действие вашего пароля истекает через 12 дня. # !
Действие вашего пароля истекает через 1 день.
Действие вашего пароля истекает через 11 день. # !

Русский язык велик и могуч, его с кондачка не возьмёшь! Исключение — числа с одиннадцати до четырнадцати: они все должны заканчиваться словом «дней», причём, в любой сотне — «через 11, 112, 1513, 614 дней». Исправляем:

if ($user.daystoexp -match "(?<!1)1$") {$in = "через $($user.daystoexp) день"}
elseif ($user.daystoexp -match "(?<!1)[234]$") {$in = "через $($user.daystoexp) дня"}
else {$in = "через $($user.daystoexp) дней"}
# Результат
"Действие вашего пароля истекает $in."

Действие вашего пароля истекает через 24 дня.
Действие вашего пароля истекает через 17 дней.
Действие вашего пароля истекает через 14 дней.
Действие вашего пароля истекает через 2 дня.
Действие вашего пароля истекает через 49 дней.
Действие вашего пароля истекает через 23 дня.
Действие вашего пароля истекает через 55 дней.
Действие вашего пароля истекает через 12 дней.
Действие вашего пароля истекает через 1 день.
Действие вашего пароля истекает через 11 дней.

Так-то лучше! Теперь бездушный компьютер будет обращаться к людям по имени-отчеству, да ещё и правильно склоняя слова, что, по-моему, отлично.

Напоследок расскажу, что, оказывается, дата истечения срока действия пароля вычисляется самим контроллером домена и хранится в атрибуте msDS-UserPasswordExpiryTimeComputed, причём, в нечитаемом формате FileTime (количество 100-наносекундных интервалов с 1 января 1601 г.). Чтобы преобразовать это значение в «нормальный» формат при запросе, нужно написать что-то вроде

Get-ADUser username -Properties msDS-UserPasswordExpiryTimeComputed |
select name,samaccountname,@{n='passexpdate';e={[datetime]::FromFileTime($_.'msDS-UserPasswordExpiryTimeComputed')}}

У нас в домене нет Fine-Grained Password Policies (FGPP), так что при их наличии значение этого параметра надо проверять.

Реконструкция сетевого хранилища

Хранилище, которое я собрал без малого два года назад, совсем перестало запускаться. Оно и раньше не отличалось стабильностью при включении — один из дисков периодически не подхватывался, работало всё довольно медленно, один раз даже пришлось добавлять диск в RAID заново, так как он был потерян, хотя в системе присутствовал. В общем, в работе имелись странности.

Логично было предположить, что не хватает питания, и для проверки я приволок с работы стандартный блок (AeroCool KCAS-700W), подключил его и убедился, что хранилище прекрасно включается и работает. Вернув блок обратно, я решил пересобрать систему в новом корпусе и с новым БП.

Итак, корпус нужен как можно более компактный и совместимый с материнскими платами Mini-ITX, но чтобы туда влезали 2 диска 3,5″ и обычный блок питания ATX — со вcякой экзотикой связываться неохота. На рынке есть предложения компактных корпусов такого рода, например, компании Термалтейк, но стоят они как-то дороговато. К тому же, эти корпуса довольно широкие, а мне нужен был не шире 20 см, чтобы влезть на полку в коридоре. Что касается блока питания, то от него требуется бесшумность и наличие активного модуля коррекции коэффициента мощности (Active PFC). Самой мощности особой не нужно, 300 ватт вполне хватит.

В итоге взял супердешёвый и достаточно компактный корпус Exegate BA-110 и блок питания Zalman ZM400-LX (400 ватт, меньше они в этой линейке не делают), скрутил их вместе, пересадил туда всё остальное железо:

Стенки нового корпуса можно натурально гнуть руками, так как металл тонкий и мягкий, а винты в него нужно закручивать очень нежно, до малейшего сопротивления, иначе резьба тут же сорвётся и затянуть их потом будет невозможно. Но ничего другого от корпуса за 830 рублей и не ожидалось, а на самом деле за свои деньги это очень даже достойное изделие. Единственное, к чему может быть небольшое нарекание — что из четырёх верхних посадочных мест под 3,5-дюймовые диски реально можно использовать только два средних: сверху мешают внутренние разъёмы передней панели, а снизу проходит ребро жёсткости, соединяющее стойки корпуса — это не позволяет разнести диски дальше друг от друга. Но это не проблема, диски при работе всё равно холодные.

Светодиод питания (Power LED) оказался синим и очень ярким, я отключил его, вентилятор 80×80 из старой системы задействовать не стал. В результате хранилище получилось тихим и несветящимся — ровно то, что нужно.

Ubuntu 19.10

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

Также, меня интересовал вопрос, есть ли какой-нибудь хороший редактор кода для Powershell в линуксе. Оказалось, что родной микрософтовский редактор VSCode доступен и прекрасно работает. Теперь можно везде писать скрипты на одном языке и в одном редакторе.

Что сделал - 4

Мониторинг датчиков в серверной

Сделал вот такую красоту:

Скрипт в виде опросника, создающий пользователя в домене

Надоело вручную вбивать данные, придумывать логин, делать почту, заводить в группы и т. д. Для появляющихся в штатном расписании пользователей команды генерируются и присылаются на почту, но новые сотрудники не всегда появляются этим путём.

Скрипт, разбирающий список IP-адресов, перечисленных через пробел

Затем для каждого выясняется имя сопоставленного этому адресу компьютера и ФИО пользователя (благо, ФИО последнего вошедшего пользователя уже забито другим периодически выполняющимся скриптом в описание компьютера). Оказалось, что в Powershell есть прекрасная команда Resolve-DNSName, позволяющая больше не пользоваться старым nslookup.

Сходил поучился

Zabbix-certificate-exam.jpg
Zabbix-certificate-training.jpg

В конце рабочей недели настроил мониторинг MySQL на всех серверах, где он установлен.