Легковесный дистрибутив Bodhi Linux 5.0
Игорь Орещенков
# cd /etc/apt
# sed 's/^deb http:\/\/us/deb http:\/\/ru/g' sources.list >sources.list.ru
# mv -f sources.list.ru sources.list
# apt update; apt upgrade
# service network-manager restart
# apt install language-pack-ru-base language-pack-ru language-pack-gnome-ru-base language-pack-gnome-ru
$ ln -s ~/'Рабочий стол' ~/Desktop
$ sudo su -
# ftp 192.168.1.2
ftp> binary
ftp> get bodhi-5.0.0-legacy.iso
ftp> bye
# mount -rt iso9660 bodhi-5.0.0-legacy.iso /mnt -o loop
# cp -a /mnt isoimage
# umount /mnt
# unsquashfs isoimage/casper/filesystem.squashfs
# rm squashfs-root/boot/{vmlinuz-4.9.0-6-686, initrd.img-4.9.0-6-686}
# rm isoimage/casper/filesystem.squashfs
# mksquashfs squashfs-root isoimage/casper/filesystem.squashfs -b 1024k -comp xz -Xbcj x86
# cd isoimage
# md5sum `find ! -name "md5sum.txt" -follow -type f` >md5sum.txt
# cd ..
# isoinfo -d -i bodhi-5.0.0-legacy.iso | awk -F ':[ ]*' '{if (/^Volume id:/) print$2}' >volumeid.txt
# genisoimage -l -r -J -V "`cat volumeid.txt`" -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -o bodhi-5.0.0-legacy-cd.iso isoimage/
-----------------------------------------------------------------------------------------
Делегируем права на перемещение учетных записей пользователей в Active Directory. Часть 2
Вадим Андросов
Листинг 1. Каркас класса UserMove.Engine
‘методы, доступные пользователям класса
Const ADS_RIGHT_DS_DELETE_CHILD = 2
msgbox ADS_RIGHT_DS_DELETE_CHILD
Dim info
Set info = CreateObject("ADSystemInfo")
Листинг 2. Константы названий классов надстройки
Const ROOM_CLASS = "UserMoveWaitingRoom"
Const START_MOVE_COMMAND_CLASS = "UserMoveStartMoveCommand"
Const DENY_COMMAND_CLASS = "UserMoveDenyCommand"
Const COMMAND_CLASS = "UserMoveCommand"
Const CHAIR_CLASS = "UserMoveChair"
Const LINK_CLASS = "UserMoveChairLink"
Листинг 3. Метод инициализации основного класса надстройки
sub initialize()
timeZoneOffset = "?"
set re = new Regexp
re.ignoreCase = True
re.global = True
delegationClasses = Array(getClassGUID("user"), getClassGUID(COMMAND_CLASS), getClassGUID(DENY_COMMAND_CLASS), getClassGUID(START_MOVE_COMMAND_CLASS))
end sub
dim timeZoneOffset, re, delegationClasses
Initialize
Листинг 4. Определение GUID класса
function getClassGUID(className)
dim classObj
set classObj = getObject("LDAP://schema/" & className)
getClassGUID = GUID2Str(classObj.schemaIDGUID)
end function
Листинг 5. Преобразование Octet String к обычной строке
Function GUID2Str(Guid)
Dim i, b(16)
For i = 1 To 16
b(i - 1) = Right("0" & Hex(Ascb(Midb(Guid, i, 1))), 2)
Next
GUID2Str = "{" & b(3) & b(2) & b(1) & b(0) & "-" & b(5) & b(4) & "-" & b(7) & b(6) & "-" & b(8) & b(9) & "-"
for i = 10 to 15
GUID2Str = GUID2Str & b(i)
next
GUID2Str = GUID2Str & "}"
End Function
Листинг 6. Проверка прав управления подразделением
function canHeManageOU(ou, user)
dim canChange, canMoveChild, i
canHeManageOU = true
for i = 0 to UBound(delegationClasses)
canChange = canDo(ou, user, ADS_RIGHT_DS_WRITE_PROP, delegationClasses(i), true)
canMoveChild = canDo(ou, user, ADS_RIGHT_DS_DELETE_CHILD Or ADS_RIGHT_DS_CREATE_CHILD, delegationClasses(i), false)
canHeManageOU = canHeManageOU and (canChange And canMoveChild)
next
end function
Листинг 7. Проверка наличия прав управления организационной единицей
function canHeManagePath(ouPath, whoPath)
dim ou, user
set ou = getObject(ouPath)
set user = getObject(whoPath)
canHeManagePath = canHeManageOU(ou, user)
end function
Листинг 8. Дополнительные функции проверки прав
function canCurrentManagePath(ouPath)
dim ou
set ou = getObject(ouPath)
canCurrentManagePath = canCurrentManageOU(ou)
end function
function canCurrentManageOU(ou)
dim user
set user = getObject("LDAP://" & info.userName)
canCurrentManageOU = canHeManageOU(ou, user)
end function
function canDo(oper, targetClass, isInherited)
canDo = false
Dim sec, acl, ace
Set sec = ou.Get("ntSecurityDescriptor")
Set acl = sec.DiscretionaryAcl
dim result
For Each ace In acl
result = checkACE(ace, oper, targetClass, isInherited)
if result <> CHECK_ACE_SKIP then
canDo = (result = CHECK_ACE_YES)
exit function
end if
Next
end function
function checkACE(ace, oper, targetClass, isInherited)
checkACE = CHECK_ACE_SKIP
if not isTrusteeInteresting(ace.Trustee) then exit function
dim classGUID
if isInherited then
classGUID = ace.InheritedObjectType
else
classGUID = ace.ObjectType
end if
if isMask(ace.accessMask, oper) then
if ace.AceType = ADS_ACETYPE_ACCESS_DENIED then
checkACE = CHECK_ACE_NO
exit function
end if
if ace.AceType = _
ADS_ACETYPE_ACCESS_ALLOWED then
checkACE = CHECK_ACE_YES
exit function
end if
if classGUID = targetClass then
if ace.AceType = _
ADS_ACETYPE_ACCESS_DENIED_OBJECT then
checkACE = CHECK_ACE_NO
exit function
end if
if ace.AceType = _
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT then
checkACE = CHECK_ACE_YES
exit function
end if
end if
end if
end function
function isMask(mask, flag)
isMask = (mask and flag) <> 0
end function
function isTrusteeInteresting(trustee)
isTrusteeInteresting = false
if trustee = (info.domainShortName & "\" & user.samAccountName) then
isTrusteeInteresting = true
exit function
end if
dim trusteeObj
if instr(1, Trustee, info.domainShortName) <> 1 then exit function
set trusteeObj = getObject("WinNT://" & replace(trustee, "\", "/"))
if trusteeObj.class = "Group" then
if trusteeObj.isMember("WinNT://" & info.domainShortName & "/" & user.samAccountName) then
isTrusteeInteresting = true
exit function
end if
end if
end function
-----------------------------------------------------------------------------------------
PowerShell. Поиск объектов в каталоге Active Directory
Иван Коробко
$path = "LDAP://OU=WorkSpace,DC=Island,DC=ru"
$obj = New-Object DirectoryServices.DirectorySearcher($Path)
$obj | Get-Member
Get-Alias | Format-Table -Property Definition, Name -Autosize
Листинг 1. Поиск объекта с помощью метода FindOne()
# Получение доступа к корню домена
$Search = New-Object DirectoryServices.DirectorySearcher("LDAP://DC=Island,DC=ru")
# Критерий поиска — отображаемое имя группы
$Search.Filter = "(&(cn=Print Managers))"
# Поиск по всему каталогу Active Directory
$Search.SearchScope = 2
# Выполнение поиска
$result = $Search.FindOne()
# Получение доступа к группе с помощью относительного пути
$obj = $result.GetDirectoryEntry()
# Чтение элементов массива
$obj.psbase.properties.member | % {
$member = [ADSI]( "LDAP://"+$_)
Write-Host $member.Name}
$obj = $result.GetDirectoryEntry()
$obj=[ADSI]("LDAP://"+ $result.distinguishedName)
$data = $obj.psbase.properties.СВОЙСТВО
Шаблон 1. Чтение строковых и числовых атрибутов
# Атрибуты name, primarygroup, description и т.д.
$data = $obj.psbase.properties.СВОЙСТВО
write-host $data
Шаблон 2. Чтение массивов
# Атрибуты member, memberOf и т.д.
$data = $obj.psbase.properties.СВОЙСТВО
ForEach ($item in $data) {
Write-Host $item}
Шаблон 3. Чтение массивов (сокращенная запись)
# Атрибуты member, memberOf и т.д.
$obj.psbase.properties.СВОЙСТВО | % {
Write-Host $_}
Листинг 2. Поиск объекта с помощью метода FindAll()
# Получение доступа к корню домена
$Search = New-Object DirectoryServices.DirectorySearcher("LDAP://DC=Island,DC=ru")
# Критерий поиска — отображаемое имя группы
$Search.Filter = "(&(objectClass=User)(cn=A*)(!objectClass=Computer))"
# Поиск по всему каталогу Active Directory
$Search.SearchScope = 2
# Сортировка результатов поиска
$Search.Sort.Direction = 1
$Search. Sort.PropertyName="sAMAccountName"
# Выполнение поиска
$Search.FindAll() | % {
# Получение доступа к группе с помощью относительного пути
$obj = $_.GetDirectoryEntry()
# Чтение данных
Write-Host $obj.samaccountname}
(&(objectClass=User)(!(objectClass=Computer)))
(&(cn=А*))
(&(objectClass=User)(cn=A*)(!objectClass=Computer))
-----------------------------------------------------------------------------------------
Инструментарий ABRT на службе системного администратора
Денис Силаков
# yum install abrt abrt-addon-ccpp abrt-addon-python abrt-addon-kerneloops abrt-addon-pstoreoops abrt-addon-vmcore rubygem-abrt abrt-addon-xorg abrt-java-connector
# systemctl enable abrtd abrt-oops abrt-vmcore abrt-ccpp abrt-pstoreoops
# systemctl start abrtd abrt-oops abrt-vmcore abrt-ccpp abrt-pstoreoops
EVENT=post-create
reporter-upload -u scp://user:pass@server.name/var/spool/abrt-upload || :
-----------------------------------------------------------------------------------------
Программная реализация эмуляции эзотерической простейшей процессорной архитектуры в 1С
Кирилл Ткаченко
Функция ИнициализацияПамяти()
Перем Память;
Перем ПамятьСтр;
Перем Ячейки;
Перем А;
Память = Новый Массив();
ПамятьСтр = "15 17 -1 17 -1 -1 16 1 -1 16 3"
+ " -1 15 15 0 0 -1 72 101 108 108 111"
+ " 44 32 119 111 114 108 100 33 10 0";
Ячейки = СтрЗаменить(ПамятьСтр, " ", ""
"");
Для А = 1 По СтрЧислоСтрок(Ячейки) Цикл
Память.Добавить(Число(СтрПолучитьСтроку(Ячейки, А)));
КонецЦикла;
Возврат Память;
КонецФункции
Процедура САМАГ()
Перем Память;
Перем СчАК;
Перем А, Б, В;
Перем Рез;
Память = ИнициализацияПамяти();
СчАК = 0;
Рез = "";
Пока СчАК >= 0 Цикл
А = Память[СчАК];
Б = Память[СчАК + 1];
В = Память[СчАК + 2];
СчАК = СчАК + 3;
Если А = -1 Тогда
ВвестиЧисло(Память[Б], "-1");
ИначеЕсли Б = -1 Тогда
Рез = Рез + Символ(Память[А]);
Иначе
Память[Б] = Память[Б] - Память[А];
Если Память[Б] <= 0 Тогда
СчАК = В;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Сообщить(Рез);
КонецПроцедуры
САМАГ();
-----------------------------------------------------------------------------------------
Псевдослучайные последовательности на примере построения шахматной позиции в 1С
Кирилл Ткаченко
Функция Abs(А)
Возврат ?(А >= 0, А, -А);
КонецФункции
Функция ИнициализироватьДоску()
Перем Доска;
Перем Ряд, Кол;
Доска = Новый Массив(8, 8);
Для Ряд = 0 По 7 Цикл
Для Кол = 0 По 7 Цикл
Доска[Ряд][Кол] = " ";
КонецЦикла;
КонецЦикла;
Возврат Доска;
КонецФункции
Процедура РазместитьКоролей(Доска, ГПСЧ)
Перем РядI, КолI;
Перем РядII, КолII;
Пока Истина Цикл
РядI = ГПСЧ.СлучайноеЧисло(0, 7);
КолI = ГПСЧ.СлучайноеЧисло(0, 7);
РядII = ГПСЧ.СлучайноеЧисло(0, 7);
КолII = ГПСЧ.СлучайноеЧисло(0, 7);
Если (РядI <> РядII) И (Abs(РядI - РядII) > 1)
И (Abs(КолI - КолII) > 1) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Доска[РядI][КолI] = "K";
Доска[РядII][КолII] = "k";
КонецПроцедуры
Процедура РазместитьФигуры(Доска, Фигуры, Пешки, ГПСЧ)
Перем Н, НН;
Перем Ряд, Кол;
НН = ГПСЧ.СлучайноеЧисло(1, СтрДлина(Фигуры));
Для Н = 1 По НН Цикл
Пока Истина Цикл
Ряд = ГПСЧ.СлучайноеЧисло(0, 7);
Кол = ГПСЧ.СлучайноеЧисло(0, 7);
Если (Доска[Ряд][Кол] = " ") И (НЕ Пешки ИЛИ ((Ряд <> 0) И (Ряд <> 7))) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Доска[Ряд][Кол] = Сред(Фигуры, Н, 1);
КонецЦикла;
КонецПроцедуры
Функция СоздатьДоску()
Перем ГПСЧ;
Перем Доска;
ГПСЧ = Новый ГенераторСлучайныхЧисел(1);
Доска = ИнициализироватьДоску();
РазместитьКоролей(Доска, ГПСЧ);
РазместитьФигуры(Доска, "PPPPPPPP", Истина, ГПСЧ);
РазместитьФигуры(Доска, "pppppppp", Истина, ГПСЧ);
РазместитьФигуры(Доска, "RNBQBNR", Ложь, ГПСЧ);
РазместитьФигуры(Доска, "rnbqbnr", Ложь, ГПСЧ);
Возврат Доска;
КонецФункции
Функция ПолучитьНФЭ(Доска)
Перем НФЭ;
Перем Сч;
Перем Ряд, Кол;
Перем Сим;
НФЭ = "";
Для Ряд = 0 По 7 Цикл
Сч = 0;
Для Кол = 0 По 7 Цикл
Сим = Доска[Ряд][Кол];
Если Сим = " " Тогда
Сч = Сч + 1;
Иначе
Если Сч > 0 Тогда
НФЭ = НФЭ + Строка(Сч);
Сч = 0;
КонецЕсли;
НФЭ = НФЭ + Сим;
КонецЕсли;
КонецЦикла;
Если Сч <> 0 Тогда
НФЭ = НФЭ + Строка(Сч);
КонецЕсли;
НФЭ = НФЭ + "/";
КонецЦикла;
НФЭ = НФЭ + " w - - 0 1";
Возврат НФЭ;
КонецФункции
Процедура СообщитьДоску(Доска)
Перем Рез;
Перем Ряд, Кол;
Рез = "";
Для Ряд = 0 По 7 Цикл
Для Кол = 0 По 7 Цикл
Рез = Рез + " " + ?(Доска[Ряд][Кол] <> " ", Доска[Ряд][Кол], ".");
КонецЦикла;
Рез = Рез + ""
"";
КонецЦикла;
Сообщить(Рез);
КонецПроцедуры
Процедура Главная()
Перем Доска;
Перем НФЭ;
Доска = СоздатьДоску();
НФЭ = ПолучитьНФЭ(Доска);
СообщитьДоску(Доска);
Сообщить(НФЭ);
КонецПроцедуры
Главная();
-----------------------------------------------------------------------------------------
Оптимизация скорости VPN-соединений к удаленным серверам баз данных при использовании маршрутизаторов с ARM-процессорами
Андреев С.В.; Хлупина А.А.
–march=armv7-a
–mfpu=vfpv3-d16
–mcpu=cortex-a15
–mfpu=neon-vfpv4
-----------------------------------------------------------------------------------------
Разработка алгоритма ориентации макета малого космического аппарата по вектору магнитного поля при помощи магнитометра
Косинов А.Н.; Криворотова П.А.; Абрмамеши Д.А.
if (LSS_OK = magnetometer_request_raw(mag_num, &magx_raw, &magy_raw, &magz_raw))
{
mag_calibrated(magx_raw,magy_raw,magz_raw, &magx_cal, &magy_cal, &magz_cal);
magy_cal = - magy_cal;
mag_alpha = atan2(magy_cal, magx_cal)/M_PI*180;
mag_alpha = angle_transformation(mag_alpha, alpha_goal);
printf ("magx_cal =%i magy_cal =%i magz_cal =%i", magx_cal, magy_cal, magz_cal);
printf ("mag_alpha atan2=%i ", mag_alpha);
}
int motor_new_speed_PD(int mtr_speed, int alpha, int16_t alpha_goal, int16_t omega, int16_t omega_goal){
int mtr_new_speed=0;
int kd = -200;
int kp = 100;
mtr_new_speed = mtr_speed + kp*(alpha-alpha_goal) + kd*(omega-omega_goal);
return mtr_new_speed;
}
-----------------------------------------------------------------------------------------