Автоматизация MS Windows, или AutoIt как мечта эникейщика Часть 1 Алексей Барабанов // установим режим детектирования скрытого текста в окнах SetTitleMatchMode, 2 DetectHiddenText, on // уберем все окна с экрана WinMinimizeAll // подождем секунду Sleep, 1000 // запустим установку из той же директории Run, autoit-v3-setup.exe // выведем окошко с сообщением MsgBox, 0, AutoIt, Setup done // завершение Exit // установим режим детектирования скрытого текста в окнах SetTitleMatchMode, 2 DetectHiddenText, on // уберем все окна с экрана WinMinimizeAll // подождем секунду Sleep, 1000 // запустим установку из той же директории Run, autoit-v3-setup.exe // дождемся нужного окна и нажмем Next WinWaitActive, AutoIt v3.1.0 Setup Send, {ENTER} // выведем окошко с сообщением MsgBox, 0, AutoIt, Setup done // завершение Exit // установим режим детектирования скрытого текста в окнах SetTitleMatchMode, 2 DetectHiddenText, on // уберем все окна с экрана WinMinimizeAll // подождем секунду Sleep, 1000 // запустим установку из той же директории Run, autoit-v3-setup.exe // дождемся нужного окна и нажмем Next WinWaitActive, AutoIt v3.1.0 Setup Send, {ENTER} // аналогично дождемся license agreement WinWaitActive, , License Agreement Send, {ENTER} // выведем окошко с сообщением MsgBox, 0, AutoIt, Setup done // завершение Exit // установим режим детектирования скрытого текста в окнах SetTitleMatchMode, 2 DetectHiddenText, on // уберем все окна с экрана WinMinimizeAll // подождем секунду Sleep, 1000 // запустим установку из той же директории Run, autoit-v3-setup.exe // дождемся нужного окна и нажмем Next WinWaitActive, AutoIt v3.1.0 Setup Send, {ENTER} // аналогично дождемся license agreement WinWaitActive, , License Agreement Send, {ENTER} // окно с выбором места установки WinWaitActive, , Choose Install Location Send, {ENTER} // завершение установки WinWaitActive, , Click Finish to close Send, {ENTER} // выведем окошко с сообщением MsgBox, 0, AutoIt, Setup done // завершение Exit // V2.64 to V3.0.100 (Version 1.0.6) // Converted with AutoItV2toV3 [Version 1.0.6] // (C) Copyright 2004 J-Paul Mesnage. // установим режим детектирования скрытого текста в окнах AutoItSetOption ( "WinTitleMatchMode", 2 ) AutoItSetOption ( "WinDetectHiddenText", 1 ) // уберем все окна с экрана WinMinimizeAll ( ) // подождем секунду Sleep ( 1000 ) // запустим установку из той же директории Run ( 'autoit-v3-setup.exe' ) // дождемся нужного окна и нажмем Next WinWaitActive ( 'AutoIt v3.1.0 Setup' ) Send ( '{ENTER}' ) // аналогично дождемся license agreement WinWaitActive ( '', 'License Agreement' ) Send ( '{ENTER}' ) // окно с выбором места установки WinWaitActive ( '', 'Choose Install Location' ) Send ( '{ENTER}' ) // завершение установки WinWaitActive ( '', 'Click Finish to close' ) Send ( '{ENTER}' ) // выведем окошко с сообщением $__msgbox = MsgBox ( 0, 'AutoIt', 'Setup done' ) // завершение Exit ----------------------------------------------------------------------------------------------------------------- Чудо-юдо Resource Kit Александр Шибенко netsvc /list \\REMOTESERVER shutdown \\REMOTESERVER /r dumpel -f pr.txt -l system -m print -e 10 @echo off sleep 60 now.exe > c:\log\copy.log net use m: \\server\backup /user:oper 123 if errorlevel 1 echo net use error >> c:\log\copy.log robocopy.exe m:\daily\ d:\archive\ /log:c:\log\rc.log /np /mir /s if errorlevel 1 echo robocopy error >> c:\log\copy.log ----------------------------------------------------------------------------------------------------------------- Kaspersky Anti-Spam 2.0 + Sendmail Денис Городецкий # rpm -i <имя пакета> # /usr/local/ap-mailfilter/bin/install-key <имя_ключевого_файла> # /usr/local/ap-mailfilter/bin/MTA-config.pl #/usr/local/ap-mailfilter/bin/sendmail-config.pl Xfilter1, S=local:/usr/local/ap-mailfilter/run/kasmilter.sock, F=R O InputMailFilters=kasfi # document root dir=/usr/local/ap-mailfilter/www user=mailflt port=2880 host=0.0.0.0 # по умолчанию значится 127.0.0.1, что означает доступ к конфигурации через веб только с локального хоста pidfile=/usr/local/ap-mailfilter/run/kas-thttpd.pid # /usr/local/ap-mailfilter/conf/src/profiles.xml ... # необходимо заменить адрес на реально существующий ... ... ----------------------------------------------------------------------------------------------------------------- Apache как прокси-сервер Валентин Синицын # Для всех прокси-запросов Order deny,allow # Сперва запретить, потом разрешить Deny from All # Запретить всем Allow from 192.168.0.1/24 # Разрешить доступ из внутренней сети организации # Для всех прокси-запросов AuthName “Tresspassers” # «Посторонним в.» AuthFile /some/secret/file # Имя файла, содержащего реквизиты пользователей AuthType Basic # Метод авторизации – базовый Require valid-user # Пропускать всех, кто перечислен в /some/secret/file # chown apache:apache /path/to/cache # chmod 0700 /path/to/cache apxs -c -i -a mod_filter.c FilterProvider Compressor DEFLATE resp=Content-type $text/ FilterProvider Compressor DEFLATE resp=Content-type $application/xhtml FilterProvider Compressor DEFLATE resp=Content-type $application/xml сonfigure \ --enable-proxy –-enable-proxy-http -–enable-proxy-ftp -–enable-proxy-connect\ --enable-cache –enable-disk-cache\ --enable-deflate\ --enable-mods-shared=all ... # Слушать порт 3128 Listen 3128 ... # Загрузить необходимые модули LoadModule cache_module modules/mod_cache.so LoadModule disk_cache_module modules/mod_disk_cache.so ... LoadModule deflate_module modules/mod_deflate.so ... LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so ... LoadModule filter_module modules/mod_filter.so ... # Создать виртуальный хост на порту 3128 NameVirtualHost *:3128 # Включить поддержку прокси-запросов ProxyRequests On # Ограничение доступа по IP Order deny,allow Deny from all Allow from 192.168.0.1/24 # или авторизация по имени пользователя и паролю AuthName "No trespassers" AuthType Basic AuthUserFile <файл с реквизитами пользователей> Require valid-user # Если обе схемы используются совместно, укажите здесь All, чтобы затребовать разрешенный IP-адрес # и правильный пароль Any, чтобы затребовать разрешенный IP-адрес или правильный пароль Satisfy Any # Настройки кэша CacheEnable disk / CacheRoot <путь к каталогу кэша> CacheSize 51200 CacheDirLevels 2 CacheDirLength 3 # «Умный» фильтр для динамического сжатия FilterDeclare Compressor FilterProvider Compressor DEFLATE resp=Content-type $text/ FilterProvider Compressor DEFLATE resp=Content-type $application/xhtml FilterProvider Compressor DEFLATE resp=Content-type $application/xml FilterChain Compressor ----------------------------------------------------------------------------------------------------------------- SVISTAть всех наверх! Сергей Яремчук # rpm -i SVISTA-2004.1056-Lin.i386.rpm # tar xzvf SVISTA-2004.1056-Lin.tgz #./install.sh # /usr/bin/SVISTA-config # SVISTA& # touch /home/sergej/vm/knoppix.hdd ----------------------------------------------------------------------------------------------------------------- Архивируем данные с помощью Bacula Алексей Гринько Director { # описание центра управления, Name = main-dir # которому разрешено обращаться Password = "bacula" # к этой службе файлов } FileDaemon { # описание службы файлов Name = main-fd # имя клиента FDport = 9102 # используемый порт WorkingDirectory = /var/lib/bacula # рабочий каталог Pid Directory = /var/run # файл с номером процесса } Messages { # описание канала сообщений Name = Standard # имя канала director = main-dir = all, !skipped # где он находится } Storage { # определение хранилища Name = main-sd # имя SDPort = 9103 # используемый порт WorkingDirectory = "/var/lib/bacula" # рабочий каталог Pid Directory = "/var/run" # файл с номером процесса } Director { # описание центра управления, Name = main-dir # которому разрешено обращаться Password = "bacula" # к этому хранилищу } Messages { # описание канала сообщений Name = Standard # имя канала director = main-dir = all, !skipped # передавать сообщения в центр управления } Device { # устройство хранения томов Name = FileStorage # имя Media Type = File # тип носителя (файловый) Archive Device = /tmp # путь к устройству LabelMedia = yes # давать томам метки Random Access = Yes # устройство с позиционированием AutomaticMount = yes # автоматическое подключение тома RemovableMedia = no # является ли съемным носителем AlwaysOpen = no # блокировка извлечения носителя } Device { # устройство хранения томов Name = DDS-4 # имя Description = "DDS-4" # описание Media Type = DDS-4 # тип носителя (кассета стриммера) Archive Device = /dev/nsa1 # пусть к устройству AutomaticMount = yes # автоматическое подключение тома AlwaysOpen = yes # блокировка извлечения носителя Offline On Unmount = no # извлекать кассету при размонтировании Hardware End of Medium = no # аппаратное определение конца кассеты BSF at EOM = yes # ставить метку в конце (для FreeBSD) Backward Space Record = no # настройки для устройств Fast Forward Space File = no # с непроизвольным позиционированием TWO EOF = yes # помечать конец кассеты двумя EOF } mysql -u root -p mysql> grant all privileges on bacula.* to bacula@localhost identified by 'baculapwd' with grant option; mysql> flush privileges; JobDefs { # шаблон задания Pool = Default # пул с томами # описание пулов для разных типов архивирования Full Backup Pool = FullBackups Differential Backup Pool = DiffBackups Incremental Backup Pool = IncBackups Name = DefaultJob # имя Type = Backup # тип задания Level = Full # тип архивирования Client=main-fd # клиент Storage = File # хранилище Messages = Standard # канал сообщений Priority = 10 # приоритет Reschedule On Error = yes # повторять ли при ошибке Reschedule Interval = 6h # интервал для повтора Reschedule Times = 3 # количество повторов } Job { # описание задания Name = "UnixCfg" # имя JobDefs = DefaultJob # используемый шаблон FileSet="UnixCfg" # набор файлов Storage = File # используемое хранилище } Job { Name = "BackupCatalog" # имя задания JobDefs = DefaultJob # используемый шаблон FileSet="Catalog" # набор файлов # запускать по графику, выполнить перед заданием и после него Schedule = "WeeklyCycleAfterBackup" RunBeforeJob = "/usr/local/etc/bacula/make_catalog_backup -u bacula -pbaculapwd" RunAfterJob = "/usr/local/etc/bacula/delete_catalog_backup" Write Bootstrap = "/var/lib/bacula/BackupCatalog.bsr" Storage = FileStorage # используем файловое хранилище Priority = 11 # приоритет } FileSet { Name = "UnixCfg" # имя набора файлов Include = signature=MD5 { # опции – посчитать суммы MD5 для файлов /etc # архивировать каталог /etc /usr/local/etc # а также /usr/local/etc } Exclude = { # файлы-исключения *.bak # исключить из архива файлы по маске } } FileSet { Name = "Catalog" Include = signature=MD5 { /var/lib/bacula/bacula.sql } } Schedule { Name = "WeeklyCycle" Run = Full 1st sun at 1:05 Run = Differential 2nd-5th sun at 1:05 Run = Incremental mon-sat at 1:05 } Schedule { Name = "WeeklyCycleAfterBackup" Run = Full sun-sat at 1:10 } Client { Name = main-fd # имя клиента Address = localhost # его адрес, имя DNS FDPort = 9102 # используемый порт Catalog = MyCatalog # используемая служба каталога Password = "bacula" # пароль для доступа File Retention = 30 days # срок хранения файлов в архиве Job Retention = 6 months # срок хранения записей в каталоге AutoPrune = yes # удалять старые записи и файлы } Catalog { Name = MyCatalog # имя каталога # имя SQL-базы данных, пользователь и пароль dbname = bacula; user = bacula; password = "baculapwd" } Storage { Name = File # имя хранилища Address = localhost # IP-адрес или DNS-имя SDPort = 9103 # используемый порт Password = "bacula" # пароль Device = FileStorage # устройство (такое же, как в bacula-sd.conf) Media Type = File # тип носителя (такое же, как в bacula-sd.conf) } Storage { Name = DDS-4 # имя хранилища Address = localhost # IP-адрес или DNS-имя SDPort = 9103 # используемый порт Password = "bacula" # пароль Device = DDS-4 # устройство (такое же, как в bacula-sd.conf) Media Type = DDS-4 # тип носителя (такой же, как в bacula-sd.conf) } <путь> = <тип сообщений1>, <тип сообщений2>,... <путь> = <адресат> = <тип сообщений1>, <тип сообщений2>,... Messages { Name = Standard # имя канала сообщений # команда отправки отчета mailcommand = "bsmtp -h localhost \"\(Bacula\) %r\" -s \"Bacula: %t %e of %c %l\" %r" # команда отправки запроса смены носителя operatorcommand = "bsmtp -h localhost \"\(Bacula\) %r\" -s \"Bacula: Intervention needed for %j\" %r" # отправлять по почте все типы сообщений, за исключением пропущенных файлов mail = root@localhost = all, !skipped # адрес оператора смены носителя operator = root@localhost = mount # продублировать все типы сообщений в консоль Bacula, за исключением пропущенных и несохраненных файлов console = all, !skipped, !saved # записывать сообщения в файл append = "/var/lib/bacula/log" = all, !skipped } Pool { Name = Default # имя тома Pool Type = Backup # тип пула Recycle = yes # стирать ли помеченные на удаление тома AutoPrune = yes # помечать на удаление старые тома Volume Retention = 3m # срок хранения тома 3 месяца LabelFormat = "File-" # формат маркировки тома } bacula-fd -t -c bacula-fd.conf bacula-sd -t -c bacula-sd.conf bacula-dir -t -c bacula-dir.con ----------------------------------------------------------------------------------------------------------------- Базовая настройка маршрутизатора Cisco начального уровня Андрей Маркелов 01: version 12.3 02: no service pad 03: service timestamps debug uptime 04: service timestamps log uptime 05: service password-encryption 06: ! 07: hostname Home 08: ! 09: enable secret xxxxxx 10: enable password xxxxxx 11: ! 12: username homeuser password xxxxxx 13: aaa new-model 14: ! 15: aaa session-id common 16: ip subnet-zero 17: ip dhcp excluded-address 192.168.0.1 192.168.0.90 18: ! 19: ip dhcp pool CLIENT 20: import all 21: network 192.168.0.0 255.255.255.0 22: default-router 192.168.0.88 23: lease 0 2 24: ! 25: vpdn enable 26: ! 27: vpdn-group 1 28: request-dialin 29: protocol pppoe 30: ! 31: interface Ethernet0 32: ip address 192.168.0.88 255.255.255.0 33: ip nat inside 34: ip tcp adjust-mss 1452 34: no cdp enable 35: hold-queue 32 in 36: ! 37: interface Ethernet1 38: no ip address 39: no ip unreachables 40: ip tcp adjust-mss 1452 41: duplex auto 42: pppoe enable 43: pppoe-client dial-pool-number 1 44: ! 45: interface Dialer0 46: ip address negotiated 47: ip access-group 110 in 48: ip mtu 1492 49: ip nat outside 50: encapsulation ppp 51: dialer pool 1 52: dialer-group 1 53: ppp chap hostname homehostname 54: ppp chap password xxxxxx 55: ppp ipcp dns request 56: ! 57: ip nat inside source list 102 interface Dialer0 overload 58: ip classless 59: ip route 0.0.0.0 0.0.0.0 Dialer0 60: no ip http server 61: no ip http secure-server 62: ! 63: access-list 49 permit 192.168.0.13 64: access-list 102 permit ip 192.168.0.0 0.0.0.255 any 65: access-list 110 permit tcp any any gt 1023 established 66: access-list 110 permit tcp any any eq www 67: access-list 110 permit tcp any any eq smtp 68: access-list 110 permit tcp any any eq pop3 69: access-list 110 permit tcp any any eq ftp 70: access-list 110 permit tcp any any eq ftp-data 71: access-list 110 permit tcp any any eq domain 72: access-list 110 permit udp any any eq domain 73: access-list 110 permit udp any eq domain any 74: access-list 110 permit tcp any eq domain any 75: access-list 110 permit icmp any any 76: access-list 110 deny ip any any 77: dialer-list 1 protocol ip permit 78: no cdp run 79: ! 80: line con 0 81: exec-timeout 120 0 82: password xxxxxx 83: no modem enable 84: stopbits 1 85: line aux 0 86: line vty 0 4 87: access-class 49 in 88: exec-timeout 120 0 89: password xxxxxx 90: ! 91: end ----------------------------------------------------------------------------------------------------------------- Реинкарнация данных Сергей Супрунов Листинг 1. Программа dbf2pg.prg на FoxPro * В FoxPro комментарии начинаются символом «*» * Устанавливаем формат даты SET DATE TO YMD SET CENTURY ON * Открываем таблицу для экспорта USE s_cats ALIAS tab * Определяем разделитель как символ табуляции m.delimiter = CHR(9) * Определяем строки для перекодировки в koi8 m.koiabcb = 'стўчфхЎ·щъыьэюяЁЄєЇїцшу¦v¤ •°№рё' m.koiabcs = '+T+¦-+г-г¦T¦=+¦¦TLL-¦L+¦-¦--+-LT' m.koiabc = m.koiabcb + m.koiabcs m.dosabcb = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ' m.dosabcs = 'абвгдежзийклмнопрстуфхцчшщъыьэюя' m.dosabc = m.dosabcb + m.dosabcs * Указываем кодировку m.dstcp = 'koi8' * Создаем результирующий файл и открываем его на запись (дескриптор – в переменной m.txf) m.txf = FCREATE('table.txt') * Делаем таблицу активной SELECT tab * Цикл по всем записям таблицы SCAN * Формируем строку, удаляя лишние пробелы m.temp = ALLTRIM(uniqueid) + m.delimiter + ; ALLTRIM(user) + m.delimiter + ; ALLTRIM(city) + m.delimiter + ; ALLTRIM(address) + m.delimiter + ; ALLTRIM(tariff) + m.delimiter + ; ALLTRIM(category) + m.delimiter + ; IIF(EMPTY(date), '\N', ; STRTRAN(DTOC(date), '/', '-')) * Если встречается табуляция – меняем на 4 пробела m.temp = STRTRAN(m.temp, CHR(9), SPACE(4)) IF m.dstcp == 'koi8' * Если в koi8, то используем свою функцию m.temp = dos2koi(m.temp) ELSE * иначе – пользуемся штатной функцией перекодировки m.temp = CPCONVERT(866, m.dstcp, m.temp) ENDIF * Экранируем символы '\' m.temp = STRTRAN(m.temp, '\', '\\') * Запись полученной строки в файл =FPUTS(m.txf, m.temp) ENDSCAN =FCLOSE(m.txf) USE IN tab *=============================================== * Функция перекодировки из cp866 в koi8-r PROCEDURE dos2koi PARAMETER m.string m.res = '' FOR m.i = 1 TO LEN(m.string) m.pos = AT(SUBSTR(m.string, m.i, 1), m.dosabc) IF m.pos > 0 m.res = m.res + SUBSTR(m.koiabc, m.pos, 1) ELSE m.res = m.res + SUBSTR(m.string, m.i, 1) ENDIF ENDFOR RETURN m.res Листинг 2. Сценарий dbf2pg.py – ручной разбор файла DBF #!/usr/local/bin/python # Класс для хранения информации о полях таблицы class field: def __init__(self): self.name = '' self.type = 'C' self.len = 0 self.dec = 0 self.pos = 0 # Функция формирования файла с разделителями def dbf2pg(fname): # Открываем dbf-Файл в бинарном режиме dbf = open(fname, 'rb') # Считываем заголовок head = dbf.read(32) # Выбираем из заголовка число записей dblen = ord(head[7]) * 16777216 + ord(head[6]) * 65536 + ord(head[5]) * 256 + ord(head[4]) # и позицию первой записи posfirst = ord(head[9]) * 256 + ord(head[8]) wexit = 0 num = 0 totlen = 1 fields = [] while not wexit: # Читаем информацию о полях таблицы line = dbf.read(1) if ord(line) == 0x0D: # Если первый символ – 0x0D, то выход – «оглавление» закончено wexit = 1 else: # Иначе дочитываем до 32-х символов line = line + dbf.read(31) # Новый объект класса field fld = field() # Имя поля – сначала до первого символа 0x00 fld.name = line[:line.find('\0')] # Тип поля – 11-й байт fld.type = line[11] # Смещение поля данных от начала записи fld.pos = ord(line[15]) * 16777216 + ord(line[14]) * 65536 + ord(line[13]) * 256 + ord(line[12]) # Длина поля fld.len = ord(line[16]) # Длина дробной части fld.dec = ord(line[17]) # Заносим информацию в массив fields.append(fld) num = num + 1 totlen = totlen + fld.len if withcommand: # Если переменная истинна, то формируем команду на создание таблицы cmd = 'CREATE TABLE %s (' % tablename for i in range(num): fld = fields[i] cmd = cmd + fld.name + ' ' if fld.type == 'C': cmd = cmd + 'char(' + str(fld.len) + '), ' elif fld.type == 'D': cmd = cmd + 'date, ' elif fld.type == 'N' : cmd = cmd + 'numeric(' + str(fld.len) + ',' + str(fld.dec) + '), ' # Последнюю запятую и пробел меняем на закрывающую скобку и точку с запятой cmd = cmd[:-2] + ');' print cmd # Формируем команду чтения данных из потока ввода cmd = 'COPY users FROM stdin;' print cmd # Формируем сам поток ввода dbf.seek(posfirst) for rec in range(dblen): if dbf.read(1) != '*': # Если запись не помечена на удаление, то обработка: line = '' for i in range(num): # Цикл по всем полям fld = dbf.read(fields[i].len) # Если дата – преобразуем в формат YYYY-MM-DD из формата YYYYMMDD if fields[i].type == 'D': fld = fld[:4] + '-' + fld[4:6] + '-' + fld[6:] # Если дата пустая, меняем ее на значение NULL if fld == ' - - ': fld = '\N' # Для пустых числовых полей ставим значение 0 if fields[i].type == 'N' ї and fld[-1] == ' ': fld = '0' # Экранируем символ ‘\’, если таковой встречается в конце поля, т.к. он экранирует разделитель if fld[-1] == '\\': fld = fld + '\\' # Для строковых полей выполняем перекодировку if fields[i].type == 'C': fld = unicode(fld, 'cp866').encode('koi8-r') # Дописываем к строке записи через разделитель line = line + fld + delimiter # Выводим полученную строку, отрезав последний разделитель print line[:-1] else: # Если запись помечена на удаление, то просто дочитываем ее остаток, ничего не обрабатывая dbf.read(totlen - 1) dbf.close # Если формируются команды для \i, то заканчиваем данные строкой ‘\.’ if withcommand: print '\\.' # Устанавливаем настроечные переменные delimiter = "\t" withcommand = 1 tablename = 'users' # вызываем функцию преобразования dbf2pg('users.dbf') $ ./dbd2pg.py > USERS.TXT Листинг 3. Сценарий dbf2pg.pl #!/usr/bin/perl -w # Подключаем модули для перекодировки и работы с СУБД use Lingua::RU::Charset qw(alt2koi); use DBI; # Устанавливаем соединение с БД $dbh = DBI->connect('dbi:Pg:dbname=serg', 'serg', ''); # Исходный файл и имя итоговой таблицы $fname = 'S_CATS.DBF'; $tabname = 's_cats_pl'; # Открываем файл DBF в бинарном режиме open(DBF, "$fname"); binmode(DBF); read(DBF, $head, 32); $dblen = ord(substr($head, 7, 1)) * 16777216 + ord(substr($head, 6, 1)) * 65536 + ord(substr($head, 5, 1)) * 256 + ord(substr($head, 4, 1)); $posfirst = ord(substr($head, 9, 1)) * 256 + ord(substr($head, 8, 1)); $wexit = 0; $num = 0; $totlen = 1; while(! $wexit) { read(DBF, $first, 1); if(ord($first) == 13) { $wexit = 1; } else { # Далее читаем файл сразу в переменные read(DBF, $name, 10); $name = $first . $name; # Вырезаем из имени символы 0x00 (здесь ^@ - не два символа, просто 0x00 так выглядит в vi) $name =~ s/^@//g; read(DBF, $type, 1); read(DBF, $tmp, 4); read(DBF, $tmp, 1); $len = ord($tmp); read(DBF, $tmp, 1); $dec = ord($tmp); read(DBF, $tmp, 14); $fields[$num]{name} = $name; $fields[$num]{type} = $type; $fields[$num]{len} = $len; $fields[$num]{dec} = $dec; $num++; $totlen += $len; } } # Формируем команду создания таблицы $sqlcommand = "CREATE TABLE $tabname ("; for($i = 0; $i < $num; $i++) { $sqlcommand .= $fields[$i]{name} . ' '; if($fields[$i]{type} eq 'C') { $tmp = 'char(' . $fields[$i]{len}; } elsif($fields[$i]{type} eq 'D') { $tmp = 'date'; } elsif($fields[$i]{type} eq 'N') { $tmp = 'numeric(' . $fields[$i]{len} . ',' . $fields[$i]{dec}; } $sqlcommand .= $tmp . '), '; } $sqlcommand = substr($sqlcommand, 0, length($sqlcommand) - 2); $sqlcommand .= ');'; # Отправляем ее на сервер $sth = $dbh->prepare($sqlcommand); $sth->execute; # Переход на начало данных seek(DBF, $posfirst, 0); for($rec = 0; $rec < $dblen; $rec++) { read(DBF, $first, 1); if($first ne '*') { $sqlcommand = "INSERT INTO $tabname VALUES ("; for($i = 0; $i < $num; $i++) { read(DBF, $fld, $fields[$i]{len}); if($fields[$i]{type} eq 'C') { ($fld) = &alt2koi($fld); $fld = "'" . $fld . "'"; } else { $fld =~ s/\s//g; } if($fields[$i]{type} eq 'D') { if($fld ne '') { $fld = '"' . substr($fld, 0, 4) . '-' . substr($fld, 4, 2) . '-' . substr($fld, 6, 2) . '"'; } else { $fld = 'NULL'; } } if(($fields[$i]{type} eq 'N') && ($fld eq '')) { $fld = '0'; } $sqlcommand .= $fld . ', '; } $sqlcommand = substr($sqlcommand, 0, length($sqlcommand) - 2); $sqlcommand .= ');'; # Отправляем команду INSERT $sth = $dbh->prepare($sqlcommand); $sth->execute; } else { read(DBF, $tmp, 31); } } close(DBF); $dbh->disconnect; ----------------------------------------------------------------------------------------------------------------- Управление безопасностью Internet Explorer Наталья Мельникова Flags(DWORD)= 219 ftp(DWORD)=4 http(DWORD)=4 https(DWORD)=4 Flags(DWORD)=1 ----------------------------------------------------------------------------------------------------------------- Система создания документации POD Часть 2 Алексей Мичурин cat page.man | /usr/bin/tbl | /usr/bin/groff -S -Wall -mtty-char -man -Tps >page.ps use locale; unless(-f $file && -T _ && ($file =~ /\.(pod|pm|plx?)\z/i || -x _ )) unless(-f $file && ($file =~ /\.(pod|pm|plx?)\z/i || -x _ )) \end{document} % Задаём глобальные атрибуты документа \documentclass[10pt, a5paper]{article} \usepackage[magstep2]{scale} %\usepackage[a3paper]{geometry} % Изменяем поля \addtolength{\hoffset}{-1cm} \addtolength{\textwidth}{2cm} \addtolength{\voffset}{-1in} \addtolength{\textheight}{2in} % Красная строка \setlength{\parindent}{0.3cm} % Расстояние между абзацами \setlength{\parskip}{0pt} % Русский стиль оформления абзацев \usepackage{indentfirst} % Оговариваем кодировку документа %\usepackage[cp866]{inputenc} \usepackage[koi8-r]{inputenc} \usepackage[russian]{babel} \selectlanguage{russian} \usepackage{draftcopy} % Включаем графический пакет \usepackage[dvips]{graphicx} %\graphicspath{{ps/}} % Макрос для вставки картинок \newcommand{\inspsfig}[3]{ \begin{figure}[!htbp] \begin{center} \includegraphics[angle=0, width=#2\textwidth]{#1} \end{center} \caption{#3} %\label{text} \end{figure} } % Задаём межстрочный интервал \linespread{1} % Документ начался \begin{document} % В начале документа генерируем оглавление и ... \tableofcontents % ... список иллюстраций \listoffigures % Можно начать документ со следующей страницы %\newpage % а можно просто задать отступ %\vspace{50mm} pod2latex -out file file.pod cat file.tex | sed 's/\\label{_}//g' | sed 's/\(subsection\)\*/\1/g' > file.tex.temp cat doc-head-14pt.tex file.tex.temp doc-tail.tex > file-14pt.tex latex file-14pt.tex latex file-14pt.tex dvips -o file-14pt.ps file-14pt.dvi ps2pdf file-14pt.ps convert file.bmp file.ps =for latex \inspsfig{two.eps}{.35}{Нетрудно заметить, что, совместив двух маленьких дракончиков, мы получим большого.} \newcommand{\inspsfig}[3]{ \begin{figure}[!htbp] \begin{center} \includegraphics[angle=0, width=#2\textwidth]{#1} \end{center} \caption{#3} %\label{text} \end{figure} } pstops '4:-3L@.7(21cm,0)+0L@.7(21cm,14.85cm)' page-14pt.ps page-14pt-booklet-up.ps pstops '4:1L@.7(21cm,0)+-2L@.7(21cm,14.85cm)' page-14pt.ps page-14pt-booklet-down.ps gs -sDEVICE=jpeg \ -sOutputFile=file%03d.jpeg \ -dBATCH \ -dNOPAUSE \ -r72x72 \ page-12pt.ps gs -sDEVICE=ppm \ -sOutputFile=file%d.ppm \ -dBATCH \ -dNOPAUSE \ -r120x120 \ page-12pt.ps for i in 1 2 3 4 do cpaldjvu -dpi 120 file$i.ppm file$i.djvu done djvm -create result.djvu file1.djvu file2.djvu file3.djvu file4.djvu podchecker -warnings file.pod =for html
AB
AB
=encoding koi8-r ----------------------------------------------------------------------------------------------------------------- Техника оптимизации под LINUX Часть 3 Крис Касперски for(a=0;a=0) { a++; do { // после трансформации второй оператор стал первым printf("2-й оператор\n"); // …а первый оператор — вторым printf("1-й оператор цикла\n"); } while(–-a<0); // сюда попало условие из if - break } Листинг 42. Обработка массивов по столбцам (неоптимизированный вариант) for(j=0;j ServerAdmin grinder@ua.fm DocumentRoot /schools/4school/admin ServerName admin.schools.com ErrorLog logs/schools.error_log CustomLog logs/schools.access_log common ScriptAlias /cgi-bin "/schools/4school/cgi" ### Ограничиваем доступ Authtype Basic Authname Admin AuthUserFile /usr/local/apache/private/admin4school Options +Includes require valid-user Authtype Basic Authname Admin AuthUserFile /usr/local/apache/private/admin4school require valid-user ### Учительский сайт ServerAdmin grinder@ua.fm DocumentRoot /schools/4school/tadmin ServerName teacher.schools.com ErrorLog logs/schools.error_log CustomLog logs/schools.access_log common ScriptAlias /cgi-bin "/schools/4school/tcgi" ### Ограничиваем доступ Authtype Basic Authname teacher AuthUserFile /usr/local/apache/private/teacher4school Options +Includes require valid-user Authtype Basic Authname Admin AuthUserFile /usr/local/apache/private/admin4school require valid-user ### Родительско-студенческий сайт ServerAdmin grinder@ua.fm DocumentRoot /schools/4school/padmin ServerName parent.schools.com ErrorLog logs/schools.error_log CustomLog logs/schools.access_log common ScriptAlias /cgi-bin "/schools/4school/pcgi" # apachectl configtest # htpasswd /usr/local/apache/private/teacher4school physicist # /etc/init.d/httpd restart ----------------------------------------------------------------------------------------------------------------- bugtraq, стр. 94 EHLO x99