Задать вопрос
  • Как организовать одностороннюю синхронизацию между двумя БД?

    @rPman
    Добавляешь в базу данных триггеры на delete, update и insert, для каждой таблицы (код создания можно сгенерировать по списку таблиц простым скриптом), которые будут заполнять дополнительно созданные тобой таблицы (дублирующую оригинальную структуру или только там что тебе нужно переносить), в которых будут обновленные данные и поля со временем события и его типом. Время тут будет идентификатором (можешь сделать с миллисекундами, параноики могут использовать автоинкрементируемое поле, только сделать его общим на все таблицы, что не выгодно) и единственным индексируемым полем

    p.s. для delete можно отдельную таблицу пилить, что бы не тягать лишние колонки пустые (на сколько я помню во многих базах null может занимать заметно места на диске сравнимо с данными)

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

    Этот скрипт может крутиться в бесконечном цикле, мониторя наличие изменений в базе (например постим инвент из тригера, а на том же php мониторим этот ивент с помощью ibase_wait_event, само собой это можно делать из других языков программирования).

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

    Задержка переноса данных в этом случае будет равна времени их передачи.. без изменения кода самого приложения, это не изменить
    Ответ написан
    5 комментариев
  • Почему функция y=x^x начинает возрастать, начиная с аргумента 1/e?

    Maksim_64
    @Maksim_64
    Data Analyst
    Потому что точка (1/e, f(1/e)), это критическая точка. Критическая точкой называется точки где функция либо не дифференцируема, либо производная функции равна нулю.
    Соответственно наша функция, y = x^x, ее производная будет x^x*(ln(x) + 1). далее приравниваем производную к нулю x^x*(ln(x) + 1) = 0 и решаем для x. Решением данного уравнения будет 1/e Подставляем 1/e в исходное функцию и получаем это вы уже нашли округленно 0.692. (1/e,0.692) - Критическая точка. А в критических точках функция меняет свое направление, то есть если до этого шла на убавление проходя через критическую точку она пойдет на возрастание и наоборот.
    И так ответ Потому что (1/e, f(1/e)) Является критической точкой.
    Также далее посредством тестов можно найти является ли критическая точка локальным минимумом или максимум в нашем случае глобальным потому что она одна. В данном случае тест легко покажет что это точка глобальный минимум. А минимум слева убывает проходит через критическую точку и начинает возрастать.
    ДОПОЛНЕНИЕ К ответу.
    Выходит, что до 1/e функция убывает, а после - возрастает. Откуда берется такая связь?

    Здесь дело в том что данная критическая точка как указал выше является минимумом в контексте вашего вопроса даже не важно глобальным или локальным. Что бы критическая точка называлась минимум производная функции должна быть отрицательной слева от критической точки и положительной справа от критической точки если подставим в производную (ее я привел в самом начале) число не много меньшее чем критическая точка то мы получим отрицательное значение (что значит функция убывает) а если не много большее то положительное значит (функция возрастает). Поскольку функция убывает слева от критической точки и возрастает после нее это и есть определение минимума. Мы сейчас математическим методом нашли минимум. То есть ваша функция убывает до критической точки и возрастает после нее. Потому что точка является минимумом (в данном случае глобальным). Так будет не много точнее.
    Ответ написан
    Комментировать
  • Почему результат выполнения функции сохраняется между вызовами?

    Maksim_64
    @Maksim_64
    Data Analyst
    Потому что объект список мутабельный объект rez = []. Ты ожидаешь, что при каждом новом вызове функции у тебя создается пустой список res, а это не так почитай к чему ведет мутабельные типы в качестве значений по умолчанию у параметров функции.

    1. В первом случае ты вызываешь первый раз работает как ожидаешь, но но список res уже создан и существует.
    2. В втором ты оставляешь без изменения свой дефолтный параметр (список), а он то уже заполнен, и он просто добавляет в него.
    3. В третьем случе ты передаешь новый список (новый объект). По этому работает нормально.

    Общий кейс для решения таких проблем как то так.
    def test(n, rez = None):
        if rez is None:
            rez = []
        for i in range(n):
            rez.append(i)
        return rez
    Ответ написан
    Комментировать