Автоматизация 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
=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