Virtuozzo PowerPanel. Веб-интерфейс управления ВМ для пользователей Денис Силаков # rpm --import http://repo.virtuozzo.com/vzlinux/security/VIRTUOZZO_GPG_KEY # yum install http://repo.virtuozzo.com/pp/releases/2.0/x86_64/os/Packages/p/pp-release-2.0-3.vl7.noarch.rpm # yum install vzapi-installer # vzapi-installer controller --ask-passwd --private-ip :@ # chown root nodes.lst # chmod 600 nodes.lst # vzapi-installer computes --nodes=nodes.lst # vzapi-installer computes --controller-node # systemctl stop vzapi-compute # systemctl disable vzapi-compute # yum remove vzapi-compute # vzapi host list # vzapi host delete 6ddbb2c1632a42ce9d2d8a83a7c93e04 # vzapi-installer upgrade # openstack --os-cloud local user show admin dn: cn=,ou=,dc= objectClass: person cn: sn: vzapi userPassword: dn: cn=,ou=,dc= objectClass: person cn: sn: admin userPassword: # ldapadd -x -D cn=Manager,dc= -W -f users.ldif [ldap] url = ldap:// user = cn=Manager,dc= password = suffix = dc= user_tree_dn = ou=,dc= user_objectclass = person # systemctl restart httpd # vzapi user sync # openstack --os-cloud local user list ----------------------------------------------------------------------------------------- Оптимизация с помощью виртуализации. Организуем несколько рабочих мест из одного десктопа. Часть 2 Андрей Семенов $ sudo echo "deb http://download.proxmox.com/debian jessie pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list $ wget -O- "http://download.proxmox.com/debian/key.asc" | apt-key add - $ sudo apt-get update $ sudo apt-get install proxmox-ve postfix ksm-control-daemon open-iscsi systemd-sysv ssh $ sudo apt-get remove os-prober vfio vfio_iommu_type1 vfio_pci vfio_virqfd GRUB_CMDLINE_LINUX_DEAULT = "intel_iommu=on" $ sudo update-grub $ sudo dmesg | grep ecap $sudo echo "options vfio_iommu_type1 allow_unsafe_interrupts =1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf $ sudo find /sys/kernel/iommu_groups/ -type l #!/bin/bash shopt -s nullglob for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*} printf 'IOMMU Group %s ' "$n" lspci -nns "${d##*/}" done; echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf $ sudo lspci $ sudo lspci -n -s 01:00 echo "options vfio-pci ids=1002:6779,1002:aa98,10de:0622" > /etc/modprobe.d/vfio.conf echo "options vfio-pci ids=1002:6779,1002:aa98 disable_vga=1" > /etc/modprobe.d/vfio.conf bios: ovmf hostpci0: 01:00,x-vga=on bios: ovmf machine: q35 hostpci0: 01:00,pcie=1,x-vga=on hostpci0: 01:00,x-vga=on machine: q35 hostpci0: 01:00,pcie=1,x-vga=on options vfio-pci ids=1002:6779,1002:aa98,10de:0622,1106:3432 $ sudo lspci -v machine: q35 hostpci0: 01:00,pcie=1,x-vga=on hostpci0: 06:00,x-vga=on hostpci1: 00:14.0 $ sudo qm monitor vmID qm>info usbhost usb0: 174c:5106 usb1: 1220:0008 lsusb -t usb0: host=4-2 usb1: host=3-13 ----------------------------------------------------------------------------------------- Apache POI HSSF – как «приручить» Excel Сергей Ильичев $ cd ~/java $ tar xzvf poi-bin-3.15-20160924.tar.gz $ vim .profile export POI_HOME=$HOME/java/poi-3.15 export POI_CLASSES=$POI_HOME/poi-3.15.jar export CLASSPATH=$CLASSPATH:$POI_CLASSES:. $ source .profile echo $CLASSPATH import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.util.CellRangeAddress; $ java Generator public class POIExample { // вспомогательные переменные private StringTokenizer st; // для строки текстового файла private String line = null; // для строки и ячейки Excel private short rownum; private short cellnum; // Конструктор класса POIExample(String fileName) throws Exception { // выходной поток – новый файл .xls FileOutputStream out = new FileOutputStream("example.xls"); // создаем новую книгу HSSFWorkbook wb = new HSSFWorkbook(); // создаем новый лист HSSFSheet s = wb.createSheet(); // объявляем объект строки HSSFRow r = null; // объявляем объект ячейки HSSFCell c = null; // создаем 3 объекта стилей HSSFCellStyle cs = wb.createCellStyle(); HSSFCellStyle cs2 = wb.createCellStyle(); HSSFCellStyle cs3 = wb.createCellStyle(); HSSFFont f = wb.createFont(); HSSFFont f2 = wb.createFont(); // устанавливаем размер первого шрифта 14 пунктов f.setFontHeightInPoints((short)14); // тип шрифта f.setFontName("TimesNewRoman"); // делаем шрифт полужирным f.setBold(true); // для первого стиля устанавливаем шрифт f2 cs.setFont(f2); // выравнивание cs.setAlignment(cs.ALIGN_LEFT); // обрамление cs.setBorderBottom(cs2.BORDER_THIN); cs.setBorderTop(cs2.BORDER_THIN); cs.setBorderLeft(cs2.BORDER_THIN); cs.setBorderRight(cs2.BORDER_THIN); cs2.setDataFormat(HSSFDataFormat.getBuiltinFormat("text")); wb.setSheetName(0, "Отчет за V квартал"); BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream(fileName), Charset.forName("CP1251"))); rownum = (short) 0; r = s.createRow(rownum); cellnum = (short) 0; c = r.createCell(cellnum); // устанавливаем высоту ячейки заголовка r.setHeight((short) 450); // устанавливаем стиль для ячейки c.setCellStyle(cs3); // текст для заголовка c.setCellValue("Заголовок отчета за V квартал"); // идем по строкам текстового файла while( (line = in.readLine()) != null) { if(line.trim().length()==0) break; // создаем новую строку r = s.createRow(rownum); //уст. высоту r.setHeight((short) 400); // разбиваем строку на токены, разделитель "#" st = new StringTokenizer(line, "#"); String[] a = new String[n]; for (int j = 0; j < st.countTokens(); j++) { a[j] = st.nextToken(); cellnum = (short) j; // создаем ячейку c = r.createCell(cellnum); // первая ячейка пошире и шрифт выровнен по центру // (используем стиль cs) if (j == 0) { c.setCellStyle(cs); s.setColumnWidth((short) cellnum, (short) 14000); } //остальные используют стиль cs2 else { c.setCellStyle(cs2); s.setColumnWidth((short) cellnum, (short) 3500); } // устанавливаем значение ячейки c.setCellValue(a[j]); } // переходим к следующей строке rownum++; } in.close(); // записываем информацию и закрываем выходной поток wb.write(out); out.close(); return; } public static void main (String args[]) throws Exception { String file = ""; for(int n = 0; n < args.length; n++) { if (args[n].equals("-f")) file = args[++n]; else throw new IllegalArgumentException("Неверный аргумент!"); } new POIExample (file); } } cd path\to\program SET CLASSPATH=.;path\to\poi-3.15\poi-3.15.jar java your.packet.POIExample -f %1 start /b path\to\program\example.xls ----------------------------------------------------------------------------------------- Самые частые ошибки в администрировании межсетевых экранов Check Point. Как их избежать Юрий Слободянюк df -h в expert mode fwaccel stat fwaccel off fwaccel on cpwd_admin stop -name FWM -path "$FWDIR/bin/fw" -command " fw kill fwm" cpwd_admin start -name FWM -path "$FWDIR/bin/fwm" -command "fwm" smartcenterR77> set ntp server primary 13.13.13.1 version 2 smartcenterR77> set ntp server secondary 23.23.23.1 version 2 smartcenterR77> save config ----------------------------------------------------------------------------------------- Корпоративный Skype. Переход с MS Lync 2013 на Skype for Business Сергей Болдин Stop-CsWindowsService Start-CsWindowsService New-CsPublicProvider -Identity Skype -ProxyFqdn federation.messenger.msn.com -IconUrl https://images.edge.messenger.live.com/Messenger_16x16.png -NameDecorationRoutingDomain msn.com -NameDecorationExcludedDomainList "msn.com,outlook.com,live.com,hotmail.com" -Enabled $true -EnableSkypeIdRouting $true -EnableSkypeDirectorySearch $true ----------------------------------------------------------------------------------------- Опыт работы в Oracle с таблицами, содержащими большие LOB-столбцы Валерий Михеичев CREATE TABLE AIF.SERVICEMSGXML ( ISN NUMBER, UPDATED DATE, XMLOUT CLOB, XMLIN CLOB ) TABLESPACE AIFDATA; CREATE TABLE AIF.SERVICEMSGXML ( ISN NUMBER, UPDATED DATE, XMLOUT CLOB, XMLIN CLOB ) LOB (XMLOUT) STORE AS ( TABLESPACE AIFDATA ENABLE STORAGE IN ROW CHUNK 8192 ) LOB (XMLIN) STORE AS ( TABLESPACE AIFDATA ENABLE STORAGE IN ROW CHUNK 8192 ) TABLESPACE AIFDATA LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING; CREATE TABLE AIF.SERVICEMSGXML ( ISN NUMBER, UPDATED DATE, XMLOUT CLOB, XMLIN CLOB ) TABLESPACE ADATA LOB (XMLOUT) STORE AS ( TABLESPACE LOBTBS ENABLE STORAGE IN ROW CHUNK 16384) LOB (XMLIN) STORE AS ( TABLESPACE LOBTBS2 ENABLE STORAGE IN ROW CHUNK 8192 ); Select * From DBA_LOBS Where owner='AIF' and table_name = 'SERVICEMSGXML'; Select owner, segment_name, bytes, tablespace_name From DBA_SEGMENTS Where segment_name = 'SYS_LOB0001677384C00014$$'; Select s.owner, d.table_name, d.column_name, s.segment_name, s.segment_type, s. bytes, s.tablespace_name From DBA_SEGMENTS s, DBA_LOBS d Where s.segment_name in (d.segment_name,d.index_name) and s.owner=d.owner and d.owner='AIF' and d.table_name = 'SERVICEMSGXML' order by 3; Select s.owner, s.segment_name, s.segment_type, s.bytes, s.tablespace_name From DBA_SEGMENTS s Where owner='AIF' and segment_name = 'SERVICEMSGXML'; Select DBMS_LOB.GETLENGTH(XMLIN) From AIF.SERVICEMSGXML order by 1 desc; Select value from v$parameter where name ='db_block_size'; Select DBMS_LOB.GETLENGTH(XMLOUT) bytes, count(1) cnt from AIF.SERVICEMSGXML m group by DBMS_LOB.GETLENGTH(XMLOUT) order by 2 desc; ALTER TABLE AIF.SERVICEMSGXML MODIFY LOB (XMLIN) (CACHE); ALTER TABLE AIF.SERVICEMSGXML MODIFY LOB (XMLIN) (DEDUPLICATE); ALTER TABLE AIF.SERVICEMSGXML MODIFY LOB (XMLIN) (COMPRESS HIGH); CREATE TABLE AIF.SVLOG ( ISN , REQUESTHEADER CLOB, REQUESTPARAMS CLOB, CREATED DATE) TABLESPACE AIFDATA PARTITION BY RANGE (CREATED) INTERVAL (INTERVAL '1' DAY) STORE IN (IMAGE) (PARTITION PART_01012017 VALUES LESS THAN (TO_DATE('01.02.2017','DD.MM.YYYY')) LOB (REQUESTHEADER) STORE AS SECUREFILE ( TABLESPACE IMAGE DISABLE STORAGE IN ROW COMPRESS MEDIUM DEDUPLICATE ) LOB (REQUESTPARAMS) STORE AS SECUREFILE ( TABLESPACE IMAGE ENABLE STORAGE IN ROW COMPRESS HIGH DEDUPLICATE ) ) ENABLE ROW MOVEMENT; Select default_tablespace, username from dba_users where username='AIF'; ALTER TABLE схема.имя таблицы SET STORE IN (имя ТП); ALTER TABLE AIF.SVLOG SET STORE IN (IMAGE); ALTER TABLE AIF.SVLOG SET INTERVAL (); ALTER TABLE AIF.SVLOG SET INTERVAL (INTERVAL '1' DAY); INTERVAL (INTERVAL '1' DAY) STORE IN (IMEGE) ALTER TABLE AIF.SVLOG MOVE PARTITION SYS_P156318 TABLESPACE LOBT PARALLEL 32 NOLOGGING COMPRESS UPDATE GLOBAL INDEXES; ALTER TABLE AIF.SVLOG MOVE PARTITION SYS_P156318 LOB (REQUESTHEADER) STORE AS (TABLESPACE LOBT) PARALLEL 32 NOLOGGING COMPRESS UPDATE GLOBAL INDEXES; ALTER TABLE AIF.SVLOG MOVE PARTITION SYS_P156318 LOB (REQUESTHEADER, REQUESTPARAMS) STORE AS (TABLESPACE LOBT) PARALLEL 32 NOLOGGING COMPRESS UPDATE GLOBAL INDEXES; Select s.tablespace_name lob_tablespace_name, s.owner, d.table_name, d.column_name lob_column_name, p.high_value, l.partition_position pos, l.partition_name, l.lob_partition_name, l.lob_indpart_name, s.segment_name, round(s.bytes/1024/1024) lob_part_mb, round(sum(s.bytes/1024/1024) over (partition by s.segment_name, d.column_name)) lob_sum_mb, s.segment_type From dba_segments s,dba_lobs d,dba_lob_partitions l, dba_tab_partitions p Where l.table_owner=d.owner and l.table_name=d.table_name and l.column_name=d.column_name and s.partition_name in (l.lob_partition_name,l.lob_indpart_name) and s.segment_name in (d.segment_name, d.index_name) and s.owner=d.owner and p.table_name=d.table_name and p.table_owner=s.owner and p.partition_name=l.partition_name and d.owner='AIF' and d.table_name ='SVLOG' and s.segment_type='LOB PARTITION' order by d.column_name, s.segment_type, l.partition_position, l.partition_name; Select p.tablespace_name, p.table_owner owner, p.table_name, p.high_value, p.partition_position pos, p.partition_name, s.segment_name, p.num_rows,round(s.bytes/1024/1024) mb, round(sum(s.bytes/1024/1024) over (partition by table_name)) sum_mb From dba_tab_partitions p,dba_segments s Where s.owner=p.table_owner and s.segment_name=p.table_name and s.partition_name=p.partition_name and p.table_owner='AIF' and P.table_name ='SVLOG' order by pos; ALTER TABLE SERVICEMSGXML MODIFY LOB (XMLIN) (SHRINK SPACE CASCADE); ALTER TABLE имя таблицы MODIFY PARTITION имя секции LOB (имя LOB столбца) (SHRINK SPACE); ALTER TABLE имя таблицы TRUNCATE PARTITION имя секции UPDATE GLOBAL INDEXES; ----------------------------------------------------------------------------------------- О совместном доступе к файлам в PHP Игорь Орещенков Участок кода № 1 ... if (flock ($fp, LOCK_EX)) { fwrite ($fp, ...); } ... Ошибочный участок кода № 2 ... $data = fread ($fp, ...); ... Исправленный участок кода № 2 ... if (flock ($fp, LOCK_SH)) { $data = fread ($fp, ...); } ... Листинг 1. Участок кода, иллюстрирующий чтение из файла в конкурентной среде Листинг 2. Участок кода, иллюстрирующий запись в файл в конкурентной среде Листинг 3. Участок кода, иллюстрирующий изменение файлового счетчика в конкурентной среде Листинг 4. Модуль update.php имитирует формирование HTML-файла контроллером Test"; $part2 = "

Hello, world!

"; $fp = fopen ($fn, file_exists ($fn)? 'r+': 'w'); if ($fp !== FALSE): if (flock ($fp, LOCK_EX)): echo "File $fn locked. Please wait...\n"; ftruncate ($fp, 0); fputs ($fp, $part1); while ($pause > 0): echo "$pause "; sleep (1); $pause--; endwhile; fputs ($fp, $part2); flock ($fp, LOCK_UN); echo "\nFile $fn unlocked.\n"; endif; fclose ($fp); else: echo "Can't open file $fn.\n"; endif; ?> Листинг 5. Модуль index.php имитирует чтение HTML-файла диспетчером Листинг 6. Сценарий test.bat для автоматизации совместного тестирования модулей update.php и index.php под Windows @ECHO OFF SET INDLOG=index7.log SET PHPEXE=C:\EXE\PHP7\php.exe ECHO TEST: %PHPEXE% > %INDLOG% START %COMSPEC% /C %PHPEXE% update.php TIMEOUT /T 5 /NOBREAK ECHO *************** >> %INDLOG% ECHO *** PHASE 1 *** >> %INDLOG% ECHO *************** >> %INDLOG% %PHPEXE% index.php >> %INDLOG% TIMEOUT /T 10 /NOBREAK ECHO. ECHO *************** >> %INDLOG% ECHO *** PHASE 2 *** >> %INDLOG% ECHO *************** >> %INDLOG% %PHPEXE% index.php >> %INDLOG% Листинг 8. Сценарий test.sh для автоматизации совместного тестирования модулей update.php и index.php под Linux #!/bin/sh INDLOG=index7.log php update.php & for i in 1 2 3 4 5; do echo -n "$i"; sleep 1; done echo "***************" >>$INDLOG echo "*** PHASE 1 ***" >>$INDLOG echo "***************" >>$INDLOG php index.php >>$INDLOG for i in 1 2 3 4 5; do echo -n "$i"; sleep 1; done echo "***************" >>$INDLOG echo "*** PHASE 2 ***" >>$INDLOG echo "***************" >>$INDLOG php index.php >>$INDLOG Листинг 10. Исправленный модуль index.php, использующий разделяемую блокировку ----------------------------------------------------------------------------------------- Программная реализация энигмоподобной системы в среде 1С Кирилл Ткаченко Ротор = Новый Массив(МаксНомерКолеса + 1, МаксНомерСимвола + 1); ГСЧ = Новый ГенераторСлучайныхЧисел(МойКлюч); Алфавит = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"; k = Найти(Алфавит, Сред(СтрокаИсходная, i, 1)); k = ?(k > 0, k - 1, 0); Для j = 0 По МаксНомерКолеса Цикл k = Ротор[j][k]; КонецЦикла; СтрокаЗашифрованная = СтрокаЗашифрованная + Сред(Алфавит, k + 1, 1); Для j = 0 По МаксНомерКолеса Цикл Ротор[j].Добавить(Ротор[j][0]); Ротор[j].Удалить(0); КонецЦикла; j = МаксНомерКолеса; Пока j >= 0 Цикл k = Ротор[j].Найти(k); j = j - 1; КонецЦикла; // Функция НовыйРотор // // Параметры: // МойКлюч – целое положительное число, которое будет // использоваться для шифрования и дешифрования, // как начальное значение генератора // МаксНомерКолеса – максимальный номер колеса // МаксНомерСимвола – максимальный номер символа // // Возвращаемое значение: // Созданный ротор // Функция НовыйРотор(МойКлюч, МаксНомерКолеса, МаксНомерСимвола) // Создается двумерный массив Ротор, // с номерами строк 0, 1, ..., МаксНомерКолеса, // номерами столбцов 0, 1, ..., МаксНомерСимвола Ротор = Новый Массив(МаксНомерКолеса + 1, МаксНомерСимвола + 1); // Создается новый объект ГенераторСлучайныхЧисел, // начальным значением которого является МойКлюч ГСЧ = Новый ГенераторСлучайныхЧисел(МойКлюч); // Для всех строк массива, то есть для всех колес ротора, // 0, 1, ..., МаксНомерКолеса Для i = 0 По МаксНомерКолеса Цикл // Для каждого символа, 0, 1, ..., МаксНомерСимвола Для j = 0 По МаксНомерСимвола Цикл // присваивается его порядковый номер // по умолчанию, 0, 1, ..., МаксНомерСимвола Ротор[i][j] = j; КонецЦикла; // Для каждого номера символа, 0, 1, ..., // МаксНомерСимвола, производится его обмен // с псевдослучайным элементом Для j = 0 По МаксНомерСимвола Цикл // Выбирается псевдослучайный индекс в массиве t1 = ГСЧ.СлучайноеЧисло(0, МаксНомерСимвола); // Производится обмен t2 = Ротор[i][j]; Ротор[i][j] = Ротор[i][t1]; Ротор[i][t1] = t2; КонецЦикла; КонецЦикла; // Возврат созданного ротора Возврат Ротор; КонецФункции // Используемое подмножество символов алфавита Алфавит = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"; // Наибольший номер колеса, 0, 1, ..., МаксНомерКолеса МаксНомерКолеса = 6; // Наибольший номер символа, 0, 1, ..., МаксНомерСимвола МаксНомерСимвола = СтрДлина(Алфавит) - 1; // Ключ, который используется для шифрования и дешифрования, // целое положительное число МойКлюч = 1; // Исходная строка для шифрования СтрокаИсходная = "ААААААААМАМАМЫЛАРАМУАААААААА"; // Ее зашифрованный вариант СтрокаЗашифрованная = ""; // Расшифрованный вариант зашифрованного текста СтрокаРасшифрованная = ""; // Процесс шифрования // Создается новый ротор. Псевдослучайная последовательность // обменов символов в колесах опеределяется ключом, начальным // значением генератора Ротор = НовыйРотор(МойКлюч, МаксНомерКолеса, МаксНомерСимвола); // Для каждого символа строки, 1, 2, ..., длина строки Для i = 1 По СтрДлина(СтрокаИсходная) Цикл // Получается номер символа в алфавите, в данном случае, // А - 0, Б - 1, ... k = Найти(Алфавит, Сред(СтрокаИсходная, i, 1)); k = ?(k > 0, k - 1, 0); // Символ шифруется. В каждом колесе от первого к последнему Для j = 0 По МаксНомерКолеса Цикл // Находится следующий код, соответствующий символу k = Ротор[j][k]; КонецЦикла; // Зашифрованный символ, выбранный по номеру из алфавита, // добавляется к результату СтрокаЗашифрованная = СтрокаЗашифрованная + Сред(Алфавит, k + 1, 1); // Производится поворот колес. Для каждого колеса Для j = 0 По МаксНомерКолеса Цикл // Первый элемент - символ - становится последним Ротор[j].Добавить(Ротор[j][0]); Ротор[j].Удалить(0); КонецЦикла; КонецЦикла; // Процесс дешифрования // Создается новый ротор. Псевдослучайная последовательность // обменов символов в колесах опеределяется ключом, начальным // значением генератора Ротор = НовыйРотор(МойКлюч, МаксНомерКолеса, МаксНомерСимвола); // Для каждого символа строки, 1, 2, ..., длина строки Для i = 1 По СтрДлина(СтрокаЗашифрованная) Цикл // Получается номер символа в алфавите, в данном случае, // А - 0, Б - 1, ... k = Найти(Алфавит, Сред(СтрокаЗашифрованная, i, 1)); k = ?(k > 0, k - 1, 0); // Символ дешифруется. В каждом колесе от последнего // к первому j = МаксНомерКолеса; Пока j >= 0 Цикл // Находится предыдущий код, соответствующий символу k = Ротор[j].Найти(k); j = j - 1; КонецЦикла; // Дешифрованный символ, выбранный по номеру из алфавита, // добавляется к результату СтрокаРасшифрованная = СтрокаРасшифрованная + Сред(Алфавит, k + 1, 1); // Производится поворот колес. Для каждого колеса Для j = 0 По МаксНомерКолеса Цикл // Первый элемент - символ - становится последним Ротор[j].Добавить(Ротор[j][0]); Ротор[j].Удалить(0); КонецЦикла; КонецЦикла; // Вывод исходной, зашифрованной и расшифрованной строки Сообщить(СтрокаИсходная); Сообщить(СтрокаЗашифрованная); Сообщить(СтрокаРасшифрованная); ----------------------------------------------------------------------------------------- Представление кодированными деревьями сценариев системы управления интеллектуального здания Николаев П.Л., Хорошко Л.Л. сценарий 1 если (T1<= 15 и S1) то если (S2 или A2) то если (не A3) то A3 = истина; A1 = ложь; A2 = ложь; иначе если (не A4) то A4 = истина; -----------------------------------------------------------------------------------------