Рейтинг@Mail.ru
aave

aave

Как автоматизировать обновление антивирусных баз Dr.Web по локальной сети

Опубликовано в Компьютеры и программы

Допустим, у вас на рабочем месте нет подключения к интернету, а локальная сеть есть. И на каком-то из компьютеров в локальной сети периодически обновляются антивирусные базы. Можно, конечно, каждый день копировать базы к себе на компьютер и вручную обновлять их. А можно один раз потратить 15 минут, чтобы настроить автоматизацию этого процесса, и надолго забыть об этом.

Рассмотрим задачу на примере антивируса Dr.Web. Хотя это решение подойдёт для любого антивируса, который позволяет качать антивирусные базы отдельно от программы и не умеет обновлять базы по локальной сети.

Весь алгоритм сводится к четырём простым шагам:

  • создать папку на локальном компьютере, где будет храниться антивирусная база;
  • создать скрипт для автоматического копирования свежих баз с удалённого компьютера на локальный;
  • создать в планировщике заданий задачу и настроить её периодическое выполнение;
  • указать антивирусу, где брать обновления.

1Создание директории для антивирусных баз

Создадим на своём компьютере папку, в которую будут копироваться базы с условного сервера. Пусть это будет, например: C:\DRWEB\DRWEBBASE9

2Создание скрипта для автоматизированного копирования баз антивируса

Теперь создадим скрипт (программу), который будет выполнять копирование антивирусных баз с удалённого компьютера в локальной сети на локальный компьютер. В любом текстовом редакторе создадим файл с расширением *.BAT (например, “copy_bases.bat”) вот с таким содержимым:

@echo off
echo Dr.Web bases copying is in progress...
:: xcopy /s \\server\DRWEBBASE9 C:\DRWEB\DRWEBBASE9/H /E /G /Q /R /Y
:: Может потребовать права Администратора:
robocopy \\server\DRWEBBASE9 C:\DRWEB\DRWEBBASE9 /COPYALL /E
echo Done!

Здесь “server” – это имя в сети удалённого компьютера, на котором хранятся антивирусные базы, а далее сетевой путь к ним. Строки, начинающиеся с двойного двоеточия (“::”) – комментарии. Они не читаются компьютером, но подсказывают пользователю назначение тех или иных строк кода.

В скрипте приведены два разных варианта копирования файлов – с помощью утилиты xcopy и robocopy. Один из вариантов закомментирован.

УтилитаОписание
xcopyУстаревшая утилита для копирования файлов, но всё ещё достаточно популярная и мощная. Впервые появилась в MS DOS 3.2. Описание XCOPY на сайте Microsoft.
robocopyОбновлённая версия утилиты xcopy. Поддерживается в Windows, начиная с Windows 7. Описание ROBOCOPY на сайте Microsoft.

Попробуйте оба варианта и выберете тот, который будет работать у вас. Для проверки нужно дважды щёлкнуть мышью на созданном файле. Должно появиться окно консоли, в котором будут отображаться сведения о процессе копирования баз.

Процесс копирования файлов, запущенный с помощью встроенной утилиты Windows
Процесс копирования файлов, запущенный с помощью встроенной утилиты Windows

По завершению копирования консольное окно закроется.

3Настройка планировщика заданий Windows

После того как когда скрипт создан и проверен, нужно создать в планировщике заданий ОС Windows задание, которое будет периодически запускать наш скрипт. Откроем панель управления и перейдём в раздел «Администрирование». Выберем «Планировщик заданий». В левой части планировщика перейдём в «Библиотеку планировщика заданий». В разделе «Действия» выберем «Создать простую задачу…».

Или кликнем правой кнопкой мыши на свободном месте в центральной части окна и выберем аналогичный пункт.

Откроется мастер создания задач. Введём название задачи, например «Копирование антивирусных баз Dr.Web». Жмём «Далее».

Создание простой задачи в планировщике Windows
Создание простой задачи в планировщике Windows

Теперь зададим периодичность запуска задачи. Укажем подходящий вариант и нажмём «Далее».

Заполнение названия задачи в мастере создания задач
Заполнение названия задачи в мастере создания задач

Настроим время запуска задачи и перейдём далее.

Настройка периодичности запуска задачи
Настройка периодичности запуска задачи

Зададим для задачи действие – «Запустить программу».

Настройка действия, выполняемого задачей
Настройка действия, выполняемого задачей

И на следующем шаге мастера укажем путь к нашему скрипту “copy_bases.bat”.

Указание пути к запускаемому файлу/скрипту
Указание пути к запускаемому файлу/скрипту

Ещё раз убедимся, что все настройки задачи выставлены правильно, и нажмём «Готово». Задание должно появиться в конце списка заданий.

Сводка параметров созданной задачи
Сводка параметров созданной задачи

4Настройка антивирусной программы

Последнее, что осталось сделать – это сконфигурировать антивирусную программу так, чтобы она обновляла свои базы из правильной директории. Идём в настройки антивируса, в раздел, касающийся обновлений, и указываем путь к папке, в которой у нас будут лежать свеженькие антивирусные базы.

Настройка источника обновления антивирусных баз Dr.Web
Настройка источника обновления антивирусных баз Dr.Web

По скриншоту видно, что Dr.Web позволяет обновляться из сетевой папки. Однако работает эта функция, почему-то, плохо. В моей локальной сети, например, антивирус категорически не желает обновляться из директории на удалённом компьютере.

Но после проделанных операций можно быть уверенным, что антивирусные базы всегда будут в актуальном состоянии, как только они будут обновлены на сервере.

Подробнее ...

Как подключить регулятор громкости M62429 к Arduino

Опубликовано в Arduino

Микросхема M62429 предназначена для снижения громкости звука в электрических схемах. Микросхема позволяет управлять одновременно и независимо двумя звуковыми каналами. Диапазон регулировки звука – от 0 до -83 дБ, т.е. микросхема способна ослаблять уровень громкости примерно в 100000 раз.

1Описание регулятора громкостиM62429

Микросхема M62429 выполняется в двух типах корпусов – DIP-8 (8P4) и SOP-8 (8P2S-A). Назначение выводов для обоих типов корпусов приведена на рисунке. Как видно, тут имеется два входа (VIN1, VIN2) и два выхода (VOUT1, VOUT2) для звуковых каналов, питание и земля (VCC и GND), а также две управляющие ножки (DATA и CLOCK).

Питание микросхемы осуществляется напряжением от 4,5 до 5,5 В (абсолютный максимум – 6 вольт).

Расположение выводов на микросхеме M62429
Расположение выводов на микросхеме M62429

Вот так выглядит микросхема в выводном корпусе:

Микросхеме M62429 в DIP-корпусе
Микросхеме M62429 в DIP-корпусе

У меня микросхема в корпусе для поверхностного монтажа. К такой микросхеме сложно подключиться без пайки, поэтому для тестирования я буду использовать вот такой переходник с корпуса SOP-8 на соединители типа PLS:

Микросхема M62429 на плате-переходнике
Микросхема M62429 на плате-переходнике

2Схема подключения микросхемы M62429 к Arduino

Подключим микросхему к Arduino и к микрофону вот по такой схеме:

Схема подключения M62429 к Arduino
Схема подключения M62429 к Arduino

Производитель рекомендует стабилизировать вход питания VCC с помощью развязывающего конденсатора (соединить вход питания с землёй через ёмкость 0,1…0,33 мкФ).

Также производитель рекомендует поставить на вход электролитический конденсатор ёмкостью 2,2 мкФ (схему см. на последней странице технического описания).

Микрофон и динамик на схеме изображены условно просто чтобы показать, что на вход VIN1 микросхемы M62429 подаётся выход с микрофона или иного источника аудиосигнала, а выход – далее в электрическую цепь и на устройство воспроизведения звука.

3Описание последовательного сигнала управления регулятором громкости M62429

Для управления микросхемой M62429 используется последовательный интерфейс с пакетной передачей данных. Длина одного пакета данных – 11 бит. Структура пакета приведена на рисунке.

Структура пакета управления микросхемой M62429
Структура пакета управления микросхемой M62429

Первым битом передаётся номер канала, вторым – использовать ли независимое управление каналами или одновременное, далее 7 бит отведены под код громкости, и завершают пакет два бита, равные "1".

Важно знать параметры импульсов частоты и данных. Микросхема управляется меандром (скважность равна 2), минимальная длительность импульса tWHC (как и tWLC) – 1,6 мкс, а период tcr – 4 мкс. Остальные характеристики импульсов приводятся в техническом описании (datasheet), которое можно скачать по ссылкам ниже.

Временная диаграмма сигнала информационного обмена с микросхемой M62429
Временная диаграмма сигнала информационного обмена с микросхемой M62429

4Скетч для управления микросхемой M62429 с помощью Arduino

Зная всё это, напишем скетч, который будет изменять громкость регулятора от максимума до минимума со скоростью 1 децибел в секунду. Сердце программы – процедура setVolume() и два массива кодов громкости, которые составлены из двух таблиц кодов громкости в техническом описании (таблицы "Volume Code").

Скетч управления регулятором громкости M62429 (разворачивается)
const int CLK = 4;
const int DATA = 2;
const int twhc  = 2;
const int twlc  = 2;

// Коды громкости аттенюатора 1.
// Значения кодов - из таблицы кодов громкости из технического описания.
int att1[21][5] = {
  {1, 0, 1, 0, 1}, //-0db
  {0, 0, 1, 0, 1}, //-4db
  {1, 1, 0, 0, 1}, //-8db
  {0, 1, 0, 0, 1}, //-12db
  {1, 0, 0, 0, 1}, //-16db
  {0, 0, 0, 0, 1}, //-20db
  {1, 1, 1, 1, 0}, //-24db
  {0, 1, 1, 1, 0}, //-28db
  {1, 0, 1, 1, 0}, //-32db
  {0, 0, 1, 1, 0}, //-36db
  {1, 1, 0, 1, 0}, //-40db
  {0, 1, 0, 1, 0}, //-44db
  {1, 0, 0, 1, 0}, //-48db
  {0, 0, 0, 1, 0}, //-52db
  {1, 1, 1, 0, 0}, //-56db
  {0, 1, 1, 0, 0}, //-60db
  {1, 0, 1, 0, 0}, //-64db
  {0, 0, 1, 0, 0}, //-68db
  {1, 1, 0, 0, 0}, //-72db
  {0, 1, 0, 0, 0}, //-76db
  {1, 0, 0, 0, 0}  //-80db
};

// Коды громкости аттенюатора 2
int att2[4][2] = {
  {1, 1}, //-0db
  {0, 1}, //-1db
  {1, 0}, //-2db
  {0 ,0}  //-3db
};

void setup() {
  pinMode(DATA, OUTPUT);
  pinMode(CLK, OUTPUT);
  digitalWrite(DATA, HIGH);
  digitalWrite(CLK, LOW);
  delay(1000);
}

void loop() {
  // Ежесекундно уменьшаем громкость на 1 дБ,
  // по достижении -83 дБ начинаем с начала:
  for (int db=0; db>=-83; db-=1){
    setVolume(0, true, db);
    delay(1000);
  }
  delay(2000);
}

// Задаёт уровень громкости в заданном канале.
// channel – канал, 0 или 1;
// independent – управление одним каналом (true) или обоими сразу (false);
// decibels – ослабление громкости в децибелах, от 0 до -83.
void setVolume(int channel, bool independent, int decibels) {

  // Определяем значения аттенюаторов:
  int att1index = floor(abs(decibels) / 4);
  int att2index = abs(decibels) % 4;
  
  // Задаём в пакете канал:
  digitalWrite(DATA, (bool)channel);
  digitalWrite(CLK, HIGH);
  digitalWrite(DATA, LOW);
  digitalWrite(CLK, LOW);

  // Задаём одновременное или независимое управление каналами:
  digitalWrite(DATA, independent);
  digitalWrite(CLK, HIGH);
  digitalWrite(DATA, LOW);
  digitalWrite(CLK, LOW);

  // Задаём значение 1-го аттенюатора D2..D6:
  for (int i=0; i<5; i++) {
    digitalWrite(DATA, (bool)att1[att1index][i]);
    digitalWrite(CLK, HIGH);
    digitalWrite(DATA, LOW);
    digitalWrite(CLK, LOW);
  }
  
  // Задаём значение 2-го аттенюатора D7..D8:
  for (int i=0; i<2; i++) {
    digitalWrite(DATA, (bool)att2[att2index][i]);
    digitalWrite(CLK, HIGH);
    digitalWrite(DATA, LOW);
    digitalWrite(CLK, LOW);
  }

  // Два последних бита пакета – две единицы:
  digitalWrite(DATA, HIGH);
  digitalWrite(CLK, HIGH);
  delayMicroseconds(twhc);
  digitalWrite(DATA, LOW);
  digitalWrite(CLK, LOW);
  delayMicroseconds(twlc);

  digitalWrite(DATA, HIGH);
  digitalWrite(CLK, HIGH);
  delayMicroseconds(twhc);
  digitalWrite(CLK, LOW);
  digitalWrite(DATA, LOW);
  delayMicroseconds(twlc);
}

Замечу, что в децибелах задавать ослабление громкости не всегда удобно. Можно сделать процедуру, принимающую, допустим, уровень громкости. Типа такого: setVolumeInPercent(0, true, 35), где 0 – второй канал, true говорит о независимом управлении каналами, а 35 – уровень громкости в процентах от максимального (или же наоборот – уровень ослабления аттенюатора).

Загрузим скетч в память Arduino и посмотрим на результат. Я подключил осциллограф к каналам CLOCK и DATA для демонстрации.

Осциллограмма информационного обмена Arduino с микросхемой M62429
Осциллограмма информационного обмена Arduino с микросхемой M62429

Фиолетовый сигнал – CLOCK, зелёный – DATA.

Осциллограмма информационного обмена Arduino с микросхемой M62429
Осциллограмма информационного обмена Arduino с микросхемой M62429

А вот как выглядит осциллограмма напряжения на выходе VOUT1 микросхемы M62429.

Изменение напряжения на выходе микросхемы M62429
Изменение напряжения на выходе микросхемы M62429

Скачать техническое описание на микросхему M62429

Подробнее ...

Работа с *.INI файлами в VB.NET

Опубликовано в Программирование

Как правило, настраиваемые параметры приложения хранятся во внешних по отношению к программе расположениях. Имеется множество способов вынести настройки программы вне кода самой программы. Распространёнными способами являются: хранение параметров приложения в реестре Windows, в базах данных, в конфигурационных XML файлах, в файлах *.config или *.cfg, в специфических двоичных форматах и, конечно же, в *.ini файлах. Эти файлы мы сейчас и рассмотрим.

1Что такое INI-файлы

Что такое INI-файлы известно, наверное, каждому более-менее опытному пользователю операционной системы Windows. Зачастую файл с расширением *.INI – это самый быстрый и удобный способ вынести настраиваемые параметры приложения вне кода программы. Эти файлы имеют свою, довольно простую, структуру и, как правило, отличаются малыми размерами. Это обычные текстовые файлы, которые открываются даже в «Блокноте».

Вообще, INI-файл может иметь некоторые отступления от общепринятых норм, каждый разработчик определяет структуру и синтаксис файла для себя. Но есть некоторые общепринятые соглашения. Собственно, вот как выглядит структура INI-файла в общем виде:

; комментарий
# комментарий в стиле Unix

[Section1]
; комментарий 
key1=value_1
key2=value_2
  
[Section2]
;другой комментарий
key3=value_3 
;ещё один комментарий
key4=value_4

Видно, что *.INI файл может содержать:

  • комментарии;
  • заголовки разделов (секций);
  • параметры в виде пары «ключ-значение»;
  • пустые строки.

Пример INI-файла:

;;;;;;;;;;;;;;;;;;;;;;;;;;
; Copyright Soltau.ru ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;

[Settings]
height=600
width=800
lang=RU

2Создание разделов и ключей INI-файлас помощью Visual Basic .NET и kernel32.dll

Можно изобретать велосипед и создать свой разборщик и генератор для INI-файлов. Но мы поступим более рационально и приземлённо и воспользуемся готовым решением из самой ОС Windows.

Дело в том, что в поставку любой операционной системы семейства Windows входит динамическая библиотека kernel32.dll. Эта библиотека расположена в системном каталоге Windows/system32. Она имеет множество функций для доступа к API Windows. В том числе и для работы с INI-файлами. Описывать все его возможности нет смысла, т.к. их великое множество (вот, например, описание kernel32 на 500+ страниц). Посмотреть все методы библиотеки можно с помощью наших старых знакомых DllExportViewer или DependencyWalker.

Нас здесь интересуют всего два метода: GetPrivateProfileString() для чтения ключей и разделов INI-файлов и WritePrivateProfileString() для записи.

Напишем класс-обёртку для упрощённого доступа к функциям работы с файлами *.INI, предоставляемым библиотекой kernel32:

Код класса IniFile.vb для работы с INI-файлами (разворачивается)
Imports System.IO
Imports System.Runtime.InteropServices
Imports System.Text

Namespace Ini

    Public Class IniFile

#Region "ИМПОРТ DLL"

        ''' <summary>
        ''' Записывает ключ в заданный раздел INI-файла.
        ''' </summary>
        ''' <param name="section">Имя раздела.</param>
        ''' <param name="key">Имя ключа.</param>
        ''' <param name="value">Значение ключа.</param>
        ''' <param name="filePath">Путь к INI-файлу.</param>
        <DllImport("kernel32")>
        Private Shared Function WritePrivateProfileString(ByVal section As String, ByVal key As String, ByVal value As String, ByVal filePath As String) As Long
        End Function

        ''' <summary>
        ''' Считывает ключ заданного раздела INI-файла.
        ''' </summary>
        ''' <param name="section">Имя раздела.</param>
        ''' <param name="key">Имя ключа.</param>
        ''' <param name="[default]"></param>
        ''' <param name="retVal"></param>
        ''' <param name="size"></param>
        ''' <param name="filePath">Путь к INI-файлу.</param>
        ''' <remarks>С помощью конструктора записываем путь до файла и его имя. </remarks>
        <DllImport("kernel32")>
        Private Shared Function GetPrivateProfileString(ByVal section As String, ByVal key As String, ByVal [default] As String, ByVal retVal As StringBuilder, ByVal size As Integer, ByVal filePath As String) As Integer
        End Function

#End Region '/ИМПОРТ DLL

#Region "КОНСТРУКТОР"

        ''' <summary>
        ''' Имя файла.
        ''' </summary>
        Private IniPath As String

        ''' <summary>
        ''' Читаем ini-файл и возвращаем значение указного ключа из заданной секции. 
        ''' </summary>
        ''' <param name="iniPath"></param>
        Public Sub New(ByVal iniPath As String)
            Me.IniPath = New FileInfo(iniPath).FullName.ToString
        End Sub

#End Region '/КОНСТРУКТОР

#Region "МЕТОДЫ РАБОТЫ С INI-ФАЙЛАМИ"

        ''' <summary>
        ''' Проверяет, что заданный ключ существует в INI-файле.
        ''' </summary>
        ''' <param name="section">Имя раздела.</param>
        ''' <param name="key">Имя ключа.</param>
        Public Function KeyExists(ByVal section As String, ByVal key As String) As Boolean
            Return (Me.ReadKey(section, key).Length > 0)
        End Function

        ''' <summary>
        ''' Читает значение заданного ключа в заданном разделе INI-файла.
        ''' </summary>
        ''' <param name="section">Имя раздела.</param>
        ''' <param name="key">Имя ключа.</param>
        Public Function ReadKey(ByVal section As String, ByVal key As String) As String
            Dim retVal As New StringBuilder(&HFF)
            IniFile.GetPrivateProfileString(section, key, "", retVal, &HFF, Me.IniPath)
            Return retVal.ToString()
        End Function

        ''' <summary>
        ''' Создаёт заданный ключ в заданном разделе. Если раздел не существует, он будет создан.
        ''' </summary>
        ''' <param name="section">Имя раздела.</param>
        ''' <param name="key">Имя ключа.</param>
        ''' <param name="value">Значение ключа. Если NULL, то ключ будет удалён. Если String.Empty, то присвоится пустое значение.</param>
        Public Sub WriteKey(ByVal section As String, ByVal key As String, ByVal value As String)
            IniFile.WritePrivateProfileString(section, key, value, Me.IniPath)
        End Sub

        ''' <summary>
        ''' Удаляет заданный ключ из заданного раздела INI-файла.
        ''' </summary>
        ''' <param name="section">Имя раздела.</param>
        ''' <param name="key">Имя ключа.</param>
        Public Sub DeleteKey(ByVal section As String, ByVal key As String)
            Me.WriteKey(section, key, Nothing)
        End Sub

        ''' <summary>
        ''' Удаляет заданный раздел INI-файла.
        ''' </summary>
        ''' <param name="section">Имя раздела.</param>
        Public Sub DeleteSection(ByVal section As String)
            Me.WriteKey(section, Nothing, Nothing)
        End Sub

#End Region '/МЕТОДЫ РАБОТЫ С INI-ФАЙЛАМИ

    End Class  

End Namespace

Использовать класс IniFile можно, например, так:

Dim iniFile as New IniFile("config.ini")
iniFile.WriteKey("SECTION1", "KEY1", "12345")
If iniFile.KeyExists("SECTION1", "KEY1")
    MessageBox.Show("Ключ создан!")
    iniFile.DeleteKey("SECTION1", "KEY1")
    MessageBox.Show("Ключ удалён!")
End If
Подробнее ...

Кодер и декодер кода Хэмминга на VB.NET

Опубликовано в Программирование

Коды Хемминга позволяют закодировать исходное сообщение таким образом, чтобы после передачи его по зашумлённым каналам связи (например, по радиоканалу) и искажениям в принятой информации, можно было восстановить исходное сообщение.

Подробнее ...
Подписаться на этот канал RSS