"Взлом" теста "1С:Профессионал" методом машинного обучения




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

18 Comments

  1. Nikola23

    Хорошее решение в плане освоения академических знаний. Но, для выбранного примера — не оптимальное (вероятно, поиск оптимального решения не ставился в задачу)

    К счастью, для подготовленного пользователя, на сайте http://edu.1c.ru/ очень легко получить ответы, без взлома БД и прочих противоправных действий.

    Reply
  2. ildarovich

    (1) Да, о таком пути знающие люди мне уже рассказали, но тут вся суть в практическом применении математического метода, который может пригодиться и там, где интересующие зависимости спрятаны более тщательно.

    Reply
  3. TODD22
    В основе байесовской модели лежит понятие распределения вероятностей. Оно определяет вероятность каждого из возможных исходов некоторого «случайного» события. Например, бросание игрального кубика характеризуется распределением вероятностей (1/6, 1/6, 1/6, 1/6, 1/6, 1/6), а правильность выбранного «вслепую» варианта ответа описывается распределением (1/5, 1/5, 1/5, 1/5, 1/5). Исходное распределение вероятностей, называемое априорным, может впоследствии уточняться при поступлении дополнительной информации о событии. Например, если стало известно, что число, выпавшее при бросании кубика, четное, то уточненным распределением вероятностей будет распределение вероятностей (0, 1/3, 0, 1/3, 0, 1/3)

    Байес и тер вер конечно был у меня давно. Но разве после броска кубика распределение не останется таким же? Кубик не запоминает своё состояние. И результат следующего броска не зависит от результата пред идущего броска.

    С ответами на тест понятно. Мы отбрасываем неверный ответ и вероятность распределяется между оставшимися.

    Reply
  4. pm74

    (0) интересная тема спасибо

    Reply
  5. ildarovich

    (6)

    И результат следующего броска не зависит от результата пред идущего броска.

    В данном случае два события (отдельные броски кубика) независимы, что как раз и определяется равенством условного и безусловного распределения вероятностей. Но вот любой результат броска (один из шести вариантов) и четный результат того же броска связаны. Поэтому если известно, что результат броска будет четным (например, четные грани красные, мы видим только цвет, а число разобрать не можем), то распределение вероятностей можно уточнить.

    Reply
  6. TODD22

    (8)

    Но вот любой результат броска (один из шести вариантов) и четный результат того же броска связаны.

    Не очень понял.

    Бросаем кубик один раз. Получаем чётное число. При повторном броске выпадение чётного или не чётного равновероятно. Или нет?

    Reply
  7. TODD22

    (8)

    Поэтому если известно, что результат броска будет четным

    Так пока не бросим нам это не известно.

    Reply
  8. ildarovich

    (9) равновероятно

    Reply
  9. spezc

    Круто. А я только только начал погружаться в статистику)

    Reply
  10. TODD22

    (11)Тогда не понимаю как мы после первого броска уточняем вероятность, если события равновероятны?

    Reply
  11. ildarovich

    (10) Я в (8) описал гипотетическую ситуацию, когда кубик бросили ОДИН раз, из-за того, что четные грани кубика красные издалека уже будет видно, что результат четный, а 2, 4 или 6 выпало еще непонятно (пока не видно). Вот в этом случае и нужно использовать условное распределение вероятностей (при условии четности результата).

    В случае с тестом известно количество правильных ответов. Например, семь. Их расположение (какие конкретно были правильные) может быть самым разным. Всего столько, сколько комбинаций выбрать семь из четырнадцати (число сочетаний). Четных три комбинации, а там 7 из 14 — это 3432 комбинации. В расчете на них и пересчитывается распределение.

    Reply
  12. ildarovich

    (13) Кубик приведен как пример для объяснение исходного понятия условной вероятности и формулы Байеса. Решаемая задача чуть сложнее, лучше думать прямо над ней.

    Reply
  13. TODD22

    (14)

    Я в (8) описал гипотетическую ситуацию, когда кубик бросили ОДИН раз, из-за того, что четные грани кубика красные издалека уже будет видно, что результат четный, а 2, 4 или 6 выпало еще непонятно (пока не видно). Вот в этом случае и нужно использовать условное распределение вероятностей (при условии четности результата).

    Ок. Теперь понятно 🙂 Я не так понял. .

    Reply
  14. TODD22

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

    Reply
  15. Evil Beaver

    С возвращением, маэстро!

    Reply
  16. Shaldryn

    (1) а можете мне рассказать?.)

    Reply
  17. ser6702

    Кончайте девочки любить хороших мальчиков, любите девочки летчиков и моряков 😉 Автор рассказывает метод отношения максимального правдоподобия. Подход изначально не академический, а инженерный. Называется относительно-частотный. Есть ещё аксиоматический подход. И там и там по моим остаточным знаниям рассчитывается

    отношение апостериорной плотности вероятности к априорной. В качестве расширения задачи можно предложить задаться вопросом, а что если номер правильного ответа будет случайным образом изменяться, но например не по гауссовскому закону, а будет задана телеметрическая модель. И так вы плавно перейдете к Винеру и далее к Калмановской фильтрации и теории оптимального управления, и вперёд, создавать алгоритмы для «кинжалов» )))

    Reply
  18. Nikola23

    (19) Не уверен, что формат форума позволяет открыто публиковать ответ на ваш вопрос.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *