• Как сделать грамотный счетчик в питоне?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    По феншую и правильно по хорошему бы реализовать класс, в котором будешь хранить состояние счётчиков

    import subprocess
    from time import sleep
    
    class CameraMonitor:
        def __init__(self):
            self.IP12 = '192.168.0.100'
            self.IP13 = '192.168.0.101'
            self.RODOS12 = '192.168.1.100'
            self.RODOS13 = '192.168.1.101'
            
            self.fail_count = {'Купол 12': 0, 'Купол 13': 0}
            self.reboot_count = {'Купол 12': 0, 'Купол 13': 0}
    
        def ping_camera(self, ip):
            cmd = f'ping {ip} -n 1 -w 100'
            response = subprocess.call(cmd, stdout=subprocess.DEVNULL)
            return response == 0
    
        def cameras_checker(self):
            r_dict = {'Купол 12': self.IP12, 'Купол 13': self.IP13}
            while True:
                for camera, ip in r_dict.items():
                    if self.ping_camera(ip):
                        print(f'Camera {camera} - OK')
                        self.fail_count[camera] = 0
                    else:
                        self.fail_count[camera] += 1
                        print(f'Camera {camera} - Died')
    
                        if self.fail_count[camera] >= 5:
                            self.cameras_reboot(camera)
    
                sleep(5)
    
        def cameras_reboot(self, camera):
            if camera == 'Купол 12':
                ip = self.RODOS12
            else:
                ip = self.RODOS13
            
            self.reboot_count[camera] += 1 
            print(f'Rebooting {camera} at IP {ip}')
    
        def info(self):
            for camera, count in self.reboot_count.items():
                print(f'Перезагрузок {camera}: {count}')
    
    
    if __name__ == "__main__":
        monitor = CameraMonitor()
        monitor.cameras_checker()
    Ответ написан
    3 комментария
  • Функция увеличивает ЗП, если ошибка то уведомление админу?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Не проще отделить шаг уведомления сотрудника и отправлять его только в случае успешного завершения всех предыдущих операций?

    function increaseSalary() {
      return api.getEmployees()
        .then(employeeData => {
          const [minSalaryEmployee] = employeeData.reduce(([minEmployee, minSalary], employee) => {
            const { salary } = employee;
            return (salary < minSalary
              ? [employee, salary]
              : [minEmployee, minSalary]
            );
          }, [null, Infinity]);
          const { id, salary: oldSalary } = minSalaryEmployee;
          const newSalary = oldSalary * 1.2;
          return { id, salary: newSalary };
        })
        .then(({ id, salary }) => api.setEmployeeSalary(id, salary)
          .then(updatedEmployee => {
            return api.notifyEmployee(updatedEmployee.id, `Hello, ${updatedEmployee.name}! Congratulations, your new salary is ${salary}!`);
          })
        )
        .catch(e => {
          return api.notifyAdmin(e);
        });
    }
    Ответ написан
  • Как вывести заголовок для постов WP?

    grantur5707
    @grantur5707
    Full Stack Web Developer

    Я так понимаю, нужно сделать проверку...

    Конечно нужно сделать проверку... Выводите просто заголовок таксономии только в том случае, если для этой таксономии есть посты

    <section id="our-media">
        <div class="container">
            <?php
            $cats = get_terms(array('taxonomy' => 'headline', 'post_type' => 'our-media'));
            foreach ($cats as $cat) {
                $query = new WP_Query(array(
                    'post_type' => 'our-media',
                    'tax_query' => array(
                        array(
                            'taxonomy' => 'headline',
                            'field' => 'term_id',
                            'terms' => $cat->term_id,
                        ),
                    ),
                    'posts_per_page' => -1,
                    'order' => 'ASC',
                ));
    
                if ($query->have_posts()) { ?>
                    <h3><?php echo $cat->name; ?></h3>
                    <ul>
                        <?php while ($query->have_posts()) {
                            $query->the_post(); ?>
                            <li>
                                <!-- код поста -->
                            </li>
                        <?php } ?>
                    </ul>
                <?php }
                wp_reset_postdata();
            }
            ?>
        </div>
    </section>
    
    <section id="units">
        <div class="container">
            <?php
            $cats = get_terms(array('taxonomy' => 'headline', 'post_type' => 'units'));
            foreach ($cats as $cat) {
                $query = new WP_Query(array(
                    'post_type' => 'units',
                    'tax_query' => array(
                        array(
                            'taxonomy' => 'headline',
                            'field' => 'term_id',
                            'terms' => $cat->term_id,
                        ),
                    ),
                    'posts_per_page' => -1,
                    'order' => 'ASC',
                ));
    
                if ($query->have_posts()) { ?>
                    <h3><?php echo $cat->name; ?></h3>
                    <p><?php echo $cat->description; ?></p>
                    <ul>
                        <?php while ($query->have_posts()) {
                            $query->the_post(); ?>
                            <li>
                                <!-- код поста -->
                            </li>
                        <?php } ?>
                    </ul>
                <?php }
                wp_reset_postdata();
            }
            ?>
        </div>
    </section>
    Ответ написан
    1 комментарий
  • Как обойти ошибку "Превышен лимит памяти"?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Убираем создание списка result_lens, чтобы не сохранять промежуточные результаты.
    Вместо этого вычисляем площадь каждой пары на лету и сразу же обновляем значение максимальной площади в переменной max_area.
    Убираем ненужное копирование списка data_copy.

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

    length = input().split()
    data = [int(x) for x in length]
    
    n = len(data)
    max_area = 0
    
    for i in range(n):
        for j in range(i + 1, n):
            pair_width = abs(i - j)
            pair_height = min(data[i], data[j])
            max_area = max(max_area, pair_height * pair_width)
    
    print(max_area)
    Ответ написан
  • Как можно реализовать решение с обратной индексацией?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Используйте отрицательную индексацию вместо reverse():

    class ReversedMyList:
        def __init__(self, data):
            self.data = data
    
        def __len__(self):
            return len(self.data)
    
        def __getitem__(self, index):
            if 0 <= index < len(self.data):
                return self.data[-index - 1]
            else:
                return None
    Ответ написан
    Комментировать
  • Что с телеграм ботом для отправки файлов по выбранной дате что это может быть?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    У вас метод .strftime("%d-%m-%Y") применяется не к тому методу.
    Должно быть так:

    date_button = telebot.types.KeyboardButton((today + datetime.timedelta(days=i)).strftime("%d-%m-%Y"))
    keyboard.add(date_button)
    Ответ написан
    Комментировать
  • Как работать с исходящим вебхуком в Битрикс используя PHP?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Например, вот так:

    $file = 'deal_updates.txt';
    
    $input = file_get_contents('php://input');
    $data = json_decode($input, true);
    
    if (isset($data['event']) && $data['event'] === 'ONCRMDEALUPDATE') {
        $dealId = $data['data']['FIELDS']['ID'];
        $newStatus = $data['data']['FIELDS']['STATUS_ID'];
    
        $updateDate = date('Y-m-d H:i:s');
    
        $log = "Deal ID: $dealId | New Status: $newStatus | Updated at: $updateDate\n";
    
        file_put_contents($file, $log, FILE_APPEND);
    }
    
    http_response_code(200);
    echo 'OK';


    А вообще я бы рекомендовал вам ознакомиться с документацией:
    https://dev.1c-bitrix.ru/learning/course/index.php...
    Ответ написан
    Комментировать
  • Как сделать горизонтальную прокрутку таблицы Bootstrap 5?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    <div class="table-responsive">
      <table class="table">
    
      </table>
    </div>
    
    <script>
      const tableContainer = document.querySelector('.table-responsive');
      
      tableContainer.addEventListener('wheel', function(e) {
        if (e.deltaY !== 0) {
          tableContainer.scrollLeft += e.deltaY;
          e.preventDefault();
        }
      });
    </script>
    Ответ написан
    2 комментария
  • Как перенести историю сообщений из одного чата Telegram в другой?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Копайте в сторону Telegram API и Pyrogram
    https://docs.pyrogram.org/api/client

    from pyrogram import Client
    
    app = Client("my_account")
    
    new_chat_id = "new_chat_id"
    
    with app:
        for message in app.iter_history("source_chat_id"):
            app.send_message(new_chat_id, message.text)
    Ответ написан
    Комментировать
  • Как скачать несколько файлов из FTP-сервера через Python?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    from ftplib import FTP
    import os
    
    ftp = FTP("tipftp")
    ftp.login(user="tuserftp", passwd="tpssword")
    
    local_dir = '/Users/tuser/Documents/py/test/'
    files = ftp.nlst('/Backups/tdir/')
    xml_files = [file for file in files if file.endswith('.xml')]
    
    for file in xml_files:
        local_file = os.path.join(local_dir, os.path.basename(file))
        with open(local_file, 'wb') as tempfile:
            ftp.retrbinary(f'RETR {file}', tempfile.write)
    
    ftp.quit()
    Ответ написан
  • Как можно укоротить код в foreach?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Ты можешь эти ключи вынести в отдельный массив и не перечислять их в foreach:

    $array = [];
    $requiredKeys = ['id', 'name', 'photo'];
    
    foreach ($babysitters as $babysitter) {
        $babysitterData = new \stdClass;
    
        foreach ($requiredKeys as => $key) {
            $babysitterData->${'babysitter_' . $key} = $babysitter->$key;
        }
    
        $array[] = $babysitterData;
    }
    Ответ написан
  • Как связать порты в Docker?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Вы неправильно указали хост. Пробуйте обращаться к api:8080/setup
    Ответ написан
    Комментировать
  • Как разбить текст в текстареа по строкам?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Ответ написан
    Комментировать
  • Почему vue не видит вложенные компоненты?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Неправильно зарегистрировали компонент...

    https://playcode.io/2014763

    66ec67da99b16984880579.png
    Ответ написан
  • Как сделать анимации появления картинок при нажатии на кнопку?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Для вашей задачи достаточно будет использования свойств opacity и transition вместо visibility.

    <div class="knopka">
      <div class="kn">
        <button onclick="showElement()">Показать больше</button>
      </div>
      
      <div class="kn1">
        <button onclick="hideElement()">Скрыть</button>
      </div>
      
      <div class="container" id="imageContainer">
        <div class="scr41">
          <img src="/Untitled (5)/Group 10.png" alt="Image 1">
        </div>
      
        <div class="scr51">
          <img src="/Untitled (5)/Group 11.png" alt="Image 2">
        </div>
    
        <div class="scr51">
          <img src="/Untitled (5)/Group 12.png" alt="Image 3">
        </div>
      </div>
    </div>


    .knopka {
        text-align: end;
    }
    
    .kn {
        margin-top: -55px;
        margin-right: 350px;
    }
    
    .kn button, .kn1 button {
        color: #4E4E4E;
        border-radius: 5px;
        background-color: #F7F7F7;
        font-size: 15px;
        border: none;
        width: 200px;
        height: 40px;
    }
    
    .kn button:hover, .kn1 button:hover {
        background-color: #ffa34857;
        color: rgb(0, 0, 0);
        transition: all 0.6s ease;
    }
    
    .container {
        justify-content: center;
        display: flex;
        opacity: 0;
        transition: opacity 1s ease-in-out;
        pointer-events: none;
    }
    
    .container.show {
        opacity: 1;
        pointer-events: auto;
    }
    
    .scr41 img, .scr51 img {
        margin-top: 70px;
        width: 140px;
    }


    function showElement() {
        const element = document.getElementById('imageContainer');
        element.classList.add('show');
    }
    
    function hideElement() {
        const element = document.getElementById('imageContainer');
        element.classList.remove('show');
    }
    Ответ написан
    Комментировать
  • Очень долгая загрузка видео в Youtube?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Попробуй использовать Browsec Premium (VPN-расширение для браузера) вместе с goodbyedpi. В настройках ВПН для ютуба у меня стоит регион: Финляндия. На данный момент всё работает отлично, но как сказал человек выше, ничего не вечно и в действительности лучше будет поднять свою впнку
    Ответ написан
    Комментировать
  • Как заставить sphinxsearch 3.6.1 выводить несколько полей?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Дело в том, что в Sphinx по умолчанию при запросе SphinxQL возвращаются только id и поля, указанные в индексе. Для вывода конкретных полей нужно указать их в запросе явным образом:

    $sql = "SELECT id, title, content FROM prezumciya_index WHERE MATCH('$query') LIMIT 1000";
    Ответ написан
  • Каким образом спарсить курс на пайтон?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Используйте стандартную либу BeautifulSoup для парсинга контента из html и библиотеку requests для получения содержимого страницы. В вашем случае получить необходимые данные не сложно. Находим строку с валютой USD и из нужной колонки парсим значение курса продаж:

    import requests
    from bs4 import BeautifulSoup
    
    url = 'https://goverla.ua/'
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    
    usd_row = soup.find('div', class_='row', text=lambda t: 'USD' in t)
    
    if usd_row:
        sale_value = usd_row.find_all('div', class_='value row__value')[1].find('h3').text.strip()
        usd_sale_rate = float(sale_value)
    Ответ написан
  • Как настроить события яндекс-метрики в Nuxt 3?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Так используйте глобальную переменную window.ym, которая становится доступной после инициализации метрики.
    В вашем компоненте просто проверяйте наличие переменной перед вызовом reachGoal:

    <template>
      <button @click="sendGoal">Отправить форму</button>
    </template>
    
    <script setup>
    const sendGoal = () => {
      if (window.ym) {
        window.ym(56555551, 'reachGoal', 'form_sent')
      }
    }
    </script>
    Ответ написан
  • Как в systemD запустить программу на Python в виртуальном окружении?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Пропишите просто Environment для активации виртуального окружения в вашем юнит файле:

    [Unit]
    Description=my_prog
    After=network-online.target nss-user-lookup.target
    
    [Service]
    User=pi
    Group=pi
    WorkingDirectory=/home/pi/www
    ExecStart=/home/pi/www/env/bin/python3 /home/pi/www/run.py
    Environment="PATH=/home/pi/www/env/bin:/usr/bin:/bin"
    RestartSec=10
    Restart=always
    StandardOutput=journal
    StandardError=journal
    
    [Install]
    WantedBy=multi-user.target


    Не забудьте перезагрузить конфигурацию
    Ответ написан