Легковесный дистрибутив 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; } -----------------------------------------------------------------------------------------