Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


среда, 17 июля 2019 г.

Windows 10: "режим бога" - GodMode

Попался материал.

«Режим бога» позволяет объединить в одном месте все инструменты для настройки компьютера. Он был доступен в предыдущих версиях Windows и, как оказалось, есть в Windows 10.
Для его включения надо создать папку с хитрым именем:

GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}

После создания (или переименования "новой папки" - не существенно) появится такая иконка:



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




У меня их 211 штук. Разумеется, часть из них доступна через "панель управления" и другие "параметры", но лично меня дико бесит, что в "десятке" настройки не сведены в одно место, а размазаны по куче мест. Такая папка будет получше.

понедельник, 15 июля 2019 г.

MySQL в Zimbra: пароль доступа и некоторые параметры

Решил поглубже поковыряться в БД зимбры. И понял, что не знаю пароля. Решение:
su - zimbra
zmlocalconfig -s | grep mysql | grep password
На выходе получаем что-то вроде:
mysql_logger_root_password = AWHZ60JYaBw8_hVkA9NDVGh0irmp7xVz
mysql_root_password = lkAd7vkYI.Q_VeWt8uyL9kj0
zimbra_logger_mysql_password = 2iiyAVj3GeH0akkCe6M1o_HvY
zimbra_mysql_password = uMv4EsNqPZdK5htERx97VY5m
и видим пароли как для пользователя root, так и для пользователя zimbra. ЧТД.

В этой БД есть разные параметры, в т.ч. и различные даты/времена. Как выяснилось, хранятся они в стандартном юниксовом формате "число секунд с начала эпохи". Не ломая голову, просто преобразуем это длинное целое в человекочитаемый вид:
date -d @дата_в_формате_unix
Теперь о хранении данных о пользователях. Все они хранятся в БД zimbra в таблице mailbox. Емайл почему-то хранится в поле comment. а номер почтового ящика - в поле id. Номер п/я - это составное число вида
UGG
где GG - номер группы (БД mboxgroupGG), от 1 до 100. При формировании id пользователя, находящегося в группе с номером <10 к номеру группы дописывается ведущий ноль, например для сотой группы gg="00"
U - номер пользователя в группе, начиная с нуля, причем если U=0, то id=GG (ведущие нули в базе, понятное дело, не хранятся), при U=1 id=1GG, например, для сотой группы id=100.

Именно id используется в пути к каталогам хранения данных и индексов почтового ящика. Например, для 3-го пользователя из 94-ой группы путь будет:
/opt/zimbra/store/0/394/
Однако, если пользователь еще не обращался к своему почтовому ящику, то каталоги с его id могут отсутствовать. Например, недавно коллега сделал учетку для нового кладовщика, но не настроил ее комп. Пользователь с id=ugg уже есть в группе gg, а вот пути /opt/zimbra/store/0/ugg/ еще нет.

суббота, 13 июля 2019 г.

bash: хардлинки и файл - кто на кого указывает? files and hardlinks

Разгребал очередной завал в зимбре и выяснил, что есть там дедупликация: если сообщение приходит нескольким получателям, то вместо размножения файлов создаются хардлинки на один его экземпляр. Например, у одного из сообщений, отправленных по общему списку рассылки, было за 60 хардлинков.
Возник вопрос: а где же остальные ссылки на этот файл, если файлов с такими же именами нет? Пришлось копаться в этих ваших интернетах, и удалось накопать такой интересный материал.

Весь материал копировать не буду, ограничусь основным:

1. количество хардлинков:
ls -l имя_файла
например:
drwxr-xr-x  2 root   root     4096 апр 17 23:55  模板
цифра "2" после прав доступа показывает количество хардлинков на этот файл, точнее - на его иноду.

2. что за инода?
stat 模板
   Файл: 模板
   Размер: 4096      Блоков: 8          Блок В/В: 4096   каталог
Устройство: 819h/2073d Inode: 6004887     Ссылки: 2
Конкретно у каталога с шаблонами от WPS Office номер инода 6004887

3. на фиг оно нам надо?
Хардлинк - это одна из записей в каталоге, указывает на конкретное размещение файла в файловой системе. Место такое одно, а вот ссылок на него может быть много. На каталог без вложенных подкаталогов, как этот с китайским названием, всего две ссылки. Если в каталоге есть подкаталоги, то ссылок становится больше для обратной связи от каталогов более низкого уровня.

4. не, а всё-таки, на кой мне знать эту иноду, если мне нужно найти дубликаты?
А вот на кой:
Вариант 1:
find ~/ -inum 6004887
/home/sergei/模板
Начиная с домашней папки я поискал и нашел файл с таким номером иноды. Но почему он один? Потому что это пустой каталог, в котором есть только файлы и еще есть "псевдо-файл" с именем "." (точка), ссылающийся на самого себя. То есть, по факту ссылок две - из каталога предыдущего уровня и сам-на-себя, а файл всего один. Но если зайти внутрь:
~/模板$ ls -l
drwxr-xr-x   2 root   root    4096 апр 17 23:55  ./ 

drwxr-xr-x 144 sergei sergei 16384 июл 11 06:03  ../
то видно, например, что на домашний каталог аж 144 ссылки

5. всё равно непонятно, неужто нельзя быстрее, чем сначала узнавать иноду, а потом долго и нудно искать?
Можно! Оказывается - можно.
find ~/ -samefile 模板
/home/sergei/模板


То есть, чтобы найти все ссылки на конкретный файл, можно просто воспользоваться ключом -samefile. ЧТД.

среда, 29 мая 2019 г.

MySQL: цикл со счетчиком, который используется для получения остальных полей

Задал вопрос на StackOverflow (на английском). И, видать, так тщательно его описал, что сам понял, как на него ответить.

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

Теперь опишу здесь ситуацию по-русски:

Итак, как я уже писал, в моей конторе используются кодированные имена компьютеров. Кодировка описывается простым регэкспом:

cnt30[0-9]{3}[1-9a-z]{1}

где часть  [0-9]{3} по сути - номер рабочего места, а хвост [1-9a-z]{1} (в предыдущем посте я неправильно указал, что хвост начинается с нуля) - "квалификатор", указывающий на номер компьютера для этого рабочего места. Например, cnt300022 может быть десктопом на рабочем месте №002, а cnt30002a - ноутбуком, закрепленным за этим местом.

четверг, 28 марта 2019 г.

Немного о regexp в MySQL

Таблетка для памяти:

Есть служба, компы в которой могут иметь имена от cnt30150 до cnt30149z.
Шаблон для тех, кто понимает:

cnt30[0-9]{3}[0-9a-z]{1}

При этом только 3 цифры после cnt30 есть собственно номер компа, а последний знак - дополнительный индекс, который может повторяться у разных компов.

Для отбора компов вышеупомянутой службы из базы OCS Inventory используем такое регулярное выражение:

select id,name from hardware where name rlike "cnt301(3[5-9]{1}|4[0-9]{1})."

То есть, выбираем компы, имена которых начинаются с cnt301, после чего идет либо тройка, за которой должна следовать цифра от 5 до 9, либо четверка, после которой должна быть цифра от 0 до 9, и заканчивается это одним любым символом.

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

Конечно, можно было задать этот же диапазон как:

select id,name from hardware where name >= 'cnt301350' and name <= 'cnt30149z'

что тоже правильно, но ведь это не так красиво, а?

пятница, 15 марта 2019 г.

bash: разница между двумя моментами времени

Есть у нас хитрая система учета рабочего времени, которая требует указывать продолжительность выполненных работ исключительно в минутах. Например, с 8:45 до 13:30 я был на выезде. Вопрос: сколько минут я должен записать?

Не, оно, конечно, несложно - "без 15 минут 5 часов", то есть, 4 часа 45 минут или 285 минут.
Но в гробу я видал заниматься временнОй арифметикой в уме - у меня есть и более интересные занятия. Поэтому написал небольшой не оптимизированный скрипт без наворотов, который чисто средствами баша считает разницу в минутах (и не только) между двумя моментами времени в пределах одних суток. Допиливать его под переход суток и т.п. мне лень, допилю, когда и если понадобится.

(примечание: между двумя вхождениями "Descriptions" идет длинный коммент в стандарте heredocs - см. руководство по башу, чтобы не ставить кучу диезов)

#!/bin/bash
<
<<Descriptions
 timediff - разница между двумя временами в пределах суток
 $1 - начальное время
 $2 - конечное время

 Формат параметров:
 ч:м[:с]
 ведущие нули не обязательны, но если нужно указать только минуты, то ноль часов указывать обязательно:
 :12:34 - неправильно
 0:12:34 - правильно

 Проверки на допустимость параметров не делаются, поэтому в случае чего вываливается с ошибкой "смените пользователя"

Descriptions

# с учетом возможной переделки, используем переменные для времен
# пока что $TimeX и $n - одно и то же, но в будущем это может измениться
TimeS=$1
TimeF=$2

# TimeStamp Start/Finish
TSS=$( date +%s -d $TimeS )
TSF=$( date +%s -d $TimeF )

# Разница в секундах, целых минутах, целых часах
DiffS=$(( $TSF-$TSS ))
DiffM=$(( $DiffS/60 ))
DiffH=$(( $DiffM/60 ))
# Сколько секунд сверх целых минут и минут сверх целых часов
ExtraS=$(( $DiffS-$DiffM*60 ))
ExtraM=$(( $DiffM-$DiffH*60 ))

# продолжительность в разных единицах
echo ${DiffS}s
echo ${DiffM}m
echo ${DiffH}h

# в минутах и секундах (минут может быть больше 60)
echo ${DiffM}:${ExtraS}"(m:s)"
# в часах, минутах и секундах
echo ${DiffH}:${ExtraM}:${ExtraS}"(h:m:s)"

Например:

$ timediff.sh 8:45 13:30
17100s
285m
4h
285:0(m:s)
4:45:0(h:m:s)