• Jakarta mail MessageCountListener как правильно использовать?

    @5465
    Для использования слушателя на папку сообщений в Jakarta Mail, необходимо создать экземпляр javax.mail.Store и подключиться к почтовому ящику с помощью метода store.connect().

    Затем нужно получить объект папки, на которую будет установлен слушатель с помощью метода store.getFolder(). Установить слушателя можно вызвав метод folder.addMessageCountListener(), передав в качестве параметра экземпляр класса, реализующего интерфейс javax.mail.event.MessageCountListener.

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

    public static void main(String[] args) throws MessagingException {
        // Подключаемся к почтовому ящику
        Store store = Session.getDefaultInstance(new Properties()).getStore("имя_протокола");
        store.connect("хост", "логин", "пароль");
    
        // Получаем папку
        Folder folder = store.getFolder("inbox");
    
        // Устанавливаем слушателя
        folder.addMessageCountListener(new MessageCountListener() {
            @Override
            public void messagesAdded(MessageCountEvent messageCountEvent) {
                Message[] messages = messageCountEvent.getMessages();
                if(messages.length!=0){
                    for (Message s :
                            messages) {
                        try {
                            //System.out.println(messages.length);
                            new Downloader().download(s);
                        } catch (MessagingException e) {
                            throw new RuntimeException(e); //todo
                        } catch (IOException e) {
                            throw new RuntimeException(e); //todo
                        }
                    }
                }
            }
        });
    
        // Бесконечный цикл для ожидания событий
        while (true) {
            try {
                Thread.sleep(1000); // Приостанавливаем выполнение на 1 секунду
            } catch (InterruptedException e) {
                // Обработка ошибок
            }
        }
    }


    В этом примере мы создаем бесконечный цикл, который будет ожидать события в папке inbox. Если в папку придут новые сообщения, то будет вызван метод messagesAdded() слушателя, который будет загружать вложения. Если в папку не придут новые сообщения, то программа будет продолжать ждать события.
    Ответ написан
    Комментировать
  • Как хранить дополнительные данные компонентов?

    @5465
    Использование свойства "options" для хранения дополнительных данных компонентов является допустимой практикой, но может быть не совсем удобным, если вы используете множество компонентов и опций.

    Для более удобного хранения и передачи дополнительных данных компонентов, можно использовать объект "props". Props - это свойства, которые можно передавать в компоненты, а также хранить в них дополнительную информацию.

    Пример использования props для хранения данных компонента:

    // Дочерний компонент
    export default {
    props: {
    type: String,
    title: String,
    image: String
    },
    // ...
    }
    
    // Родительский компонент
    export default {
    components: {
    ContactsFilter,
    ContactsMap,
    ContactsList
    },
    data() {
    return {
    views: [
    {
    type: 'contactsview',
    title: 'показать на карте',
    image: ''
    },
    // ...
    ]
    }
    }
    // ...
    }


    В этом примере, свойства компонента (type, title, image) объявлены как props, а затем передаются в дочерний компонент при его использовании в родительском компоненте.

    Таким образом, использование props позволяет более явно указать, какие данные передаются в компонент, а также делает процесс передачи и хранения этих данных более удобным и понятным.
    Ответ написан
    Комментировать
  • Как исправить ошибку No module named 'pipenv.vendor.requirementslib.models.pipfile'?

    @5465
    Проблема, которую вы столкнулись, может возникнуть из-за несоответствия версий pipenv и requirementslib. Вот несколько шагов, которые могут помочь решить эту проблему:

    Убедитесь, что у вас установлена последняя версия pip:

    python -m pip install --upgrade pip

    Установите последнюю версию pipenv с помощью pip:

    pip install --user --upgrade pipenv

    Попробуйте удалить папку pipenv из директории site-packages:

    pip uninstall pipenv
    pip uninstall requirementslib
    rm -rf <path_to_your_python_dir>/Lib/site-packages/pipenv*
    rm -rf <path_to_your_python_dir>/Lib/site-packages/requirementslib*


    После этого установите pipenv с помощью следующей команды:

    pip install --user pipenv

    Если вы все еще получаете ошибку, попробуйте установить requirementslib версии 2.0.0:

    pip install requirementslib==2.0.0

    После установки requirementslib установите зависимости проекта:

    pipenv install --dev

    Наконец, активируйте виртуальное окружение:

    pipenv shell

    Если это не помогает, попробуйте выполнить все вышеперечисленные шаги в другой виртуальной среде.
    Ответ написан
    Комментировать
  • Можно ли в redux toolkit передать параметр в middleware?

    @5465
    Да, в Redux Toolkit можно передавать параметры в middleware. Для этого можно определить middleware-функцию, которая возвращает другую функцию, которая уже принимает параметры.

    Например, для динамической передачи параметра в ваш logger middleware, вы можете определить функцию createLoggerMiddleware, которая будет принимать параметр someType и возвращать middleware-функцию, которая будет использовать этот параметр:

    export const createLoggerMiddleware = (someType: string): Middleware => {
      return () => next => action => {
        if (action.type === someType) {
          alert('blabla');
        }
        return next(action);
      };
    };


    Теперь в setupStore вы можете вызвать createLoggerMiddleware и передать нужный параметр:

    export const setupStore = () => configureStore({
      reducer: rootReducer,
      middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(createLoggerMiddleware('someType')),
    });


    Таким образом, вы сможете динамически настраивать middleware, когда они используются в разных приложениях.
    Ответ написан
    Комментировать
  • Что делать эсли при повороте на наклонной поверхности персонаж подлетает?

    @5465
    Проблема может быть связана с тем, что вектор velocity персонажа не успевает измениться в момент поворота на наклонной поверхности, что приводит к тому, что персонаж подлетает на секунду.

    Вам может помочь следующий подход: при повороте на наклонной поверхности, вместо того, чтобы обнулять вектор velocity, попробуйте изменить его направление в соответствии с углом наклона поверхности. Для этого вам нужно получить нормаль к поверхности в точке, где находится персонаж, и использовать ее направление для изменения вектора velocity.

    Вы можете использовать функцию Physics2D.Raycast для получения нормали к поверхности в точке, где находится персонаж. Затем вы можете использовать функцию Vector2.Reflect, чтобы изменить направление вектора velocity в соответствии с нормалью.

    Пример кода для изменения направления вектора velocity при повороте на наклонной поверхности:

    void Flip()
    {
        if ((onGround) && !JumpControl)
        {
            Vector2 normal = GetSurfaceNormal();
            rb.velocity = Vector2.Reflect(rb.velocity, normal);
        }
    
        Vector3 scale = transform.localScale;
        scale.x *= -1;
        transform.localScale = scale;
        Right = !Right;
    }
    
    Vector2 GetSurfaceNormal()
    {
        RaycastHit2D hit = Physics2D.Raycast(transform.position, -Vector2.up);
        return hit.normal;
    }


    В этом примере функция GetSurfaceNormal использует Raycast для получения нормали к поверхности в точке, где находится персонаж. Затем функция Flip использует Vector2.Reflect для изменения направления вектора velocity в соответствии с нормалью.
    Ответ написан
    3 комментария
  • Как проверить поле на пустоту в Bitrix24 Rest API?

    @5465
    Для проверки поля на пустоту в Bitrix24 Rest API, можно использовать фильтр "!=", который означает "не равно". В данном случае, если нужно проверить на пустоту поле UF_CRM_1664531575783, то можно использовать следующий фильтр:

    filter: {
        '!UF_CRM_1664531575783': ''
    },


    Знак "!" перед названием поля означает отрицание, а пустая строка в значении фильтра означает, что поле должно быть пустым.

    Если нужно проверить несколько полей, то можно добавить соответствующие фильтры, например:

    filter: {
        '!UF_CRM_1664531575783': '',
        '!UF_CRM_1680693572006': ''
    },


    Здесь оба поля должны быть пустыми. Вместо пустой строки можно также использовать значение null или undefined.
    Ответ написан
    Комментировать
  • Как перебрать все сохраненные данные из списка?

    @5465
    Чтобы перебрать все значения из списка, вы можете использовать цикл foreach, как вы уже делали в первом блоке кода. В этом цикле для каждого элемента списка можно создать новый объект типа Program, используя метод FromString, как вы делаете в блоке кода, который вы показали.

    Затем, вы можете вызвать нужный метод для каждого созданного объекта, чтобы выполнить нужные вам действия. Ваш код выглядит примерно так:

    foreach (string betString in bets)
    {
        Program currentBet = Program.FromString(betString);
        // Вызов нужного метода с использованием объекта currentBet
        string betNumberString = currentBet.numberString;
        // ...
    }


    Этот код создаст новый объект Program для каждой строки списка bets и выполнит нужные действия внутри цикла. Обратите внимание, что внутри цикла вы можете использовать свойства объекта currentBet, такие как numberString, bet и т.д., чтобы получить значения из каждой строки списка.

    Если вы хотите, чтобы ваш код перебирал все значения из списка, убедитесь, что вы не используете только последнее значение, как вы говорите. Может быть, вы просто забыли включить цикл foreach или внутри цикла что-то не так. Попробуйте использовать код, который я показал выше, и проверьте, что вы делаете внутри цикла. Если у вас все еще есть проблемы, пожалуйста, уточните, что не работает и предоставьте больше информации о вашем коде и списке данных.
    Ответ написан
  • Почему не билдится путь к картинке, заданный через переменную vue 3, vite?

    @5465
    Проблема, вероятнее всего, связана с тем, что при билде приложения Vite автоматически изменяет путь к статическим ресурсам, таким как изображения, чтобы оптимизировать их загрузку на клиенте.

    В первом случае, когда вы используете переменную для задания пути к изображению, Vite не может изменить этот путь, так как он не указан явно в HTML-коде.

    Во втором случае, когда вы явно указываете путь к изображению в HTML-коде, Vite может изменить этот путь при билде, чтобы оптимизировать загрузку изображения.

    Чтобы решить эту проблему, вы можете явно указать путь к изображению в HTML-коде и использовать его вместо переменной. Если вы хотите сохранить переменную для удобства управления путями к ресурсам, то вы можете создать объект конфигурации, который будет хранить пути к изображениям, и использовать его для задания путей в HTML-коде и в JavaScript-коде.

    Например, в вашем случае, вы можете создать объект конфигурации в отдельном файле, например, config.js, и импортировать его в ваш код:

    // config.js
    export default {
      imagePath: '/src/assets/images/home/'
    }


    // ваш код
    import config from './config.js'
    
    <!-- явно указываем путь к изображению в HTML-коде -->
    <img src="${config.imagePath}nortland.png">
    
    // используем путь к изображению в JavaScript-коде
    item.objects[0].image = `${config.imagePath}nortland.png`;


    Таким образом, вы можете легко изменять пути к изображениям, не меняя их везде в вашем коде. Кроме того, это позволит Vite оптимизировать пути к изображениям при билде.
    Ответ написан
  • Как обновить страницу перед считыванием информации?

    @5465
    Вы можете использовать функцию setInterval для обновления страницы перед считыванием информации. В этом случае, страница будет обновляться каждые несколько минут, что позволит вашему боту получать актуальную информацию.

    Например, вы можете изменить ваш код следующим образом:

    const request = require('request-promise');
    const cheerio = require('cheerio');
    
    client.on("ready", () => {
    const url = '';
    
    async function news() {
    const letter = await request(url);
    let $ = cheerio.load(letter);
    
    
      // Создаем функцию, которая будет обновлять страницу и получать новую информацию
      function updatePage() {
         request(url)
            .then((html) => {
               $ = cheerio.load(html);
               $('.newsletter noindex span').each((index, element) => {
                  const exp = $(element).text();
                  client.channels.cache.get("").send(exp);
               })
            })
            .catch((err) => {
               console.log(err);
            });
      }
    
      // Вызываем функцию updatePage каждые 5 минут
      setInterval(updatePage, 5 * 60 * 1000);
    }
    news();
    });


    В этом примере, функция updatePage будет вызываться каждые 5 минут и будет обновлять страницу, чтобы получить актуальную информацию. Вы можете изменить интервал обновления на свое усмотрение, чтобы получать информацию точно в нужный момент времени.
    Ответ написан
    Комментировать
  • Крякозябры в функции spawn, как исправить?

    @5465
    Проблема с крякозябрами может быть связана с тем, что вывод команды "ping" в консоли использует кодировку, отличную от кодировки консоли, которую вы используете. В этом случае вы можете попробовать использовать параметр кодировки в функции spawn, чтобы установить правильную кодировку для вывода. Вот пример кода, который может помочь:

    const { spawn } = require('node:child_process');
    const iconv = require('iconv-lite');
    
    const command = spawn('ping', ['google.com'], {
      stdio: ['ignore', 'pipe', 'ignore'],
      encoding: 'win1251' // замените кодировку на нужную
    });
    
    command.stdout.on('data', output => {
      console.log(iconv.decode(output, 'win1251')); // замените кодировку на нужную
    });


    Здесь мы используем модуль iconv-lite для декодирования вывода команды с использованием правильной кодировки, установленной в параметре "encoding" функции spawn. В примере мы использовали кодировку "win1251", но замените ее на ту, которую использует вывод команды "ping" в вашей консоли.
    Ответ написан
  • Как загрузить несколько файлов через input?

    @5465
    Проблема заключается в том, что вы создаете только один элемент img, и затем перезаписываете его каждый раз в цикле. Чтобы отобразить все загруженные изображения, вам нужно создавать новый элемент img для каждого файла.

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

    <input type="file" id="input" multiple='multiple' accept="image" >
    
    <div id="images"></div>


    var input = document.getElementById('input');
    var imagesDiv = document.getElementById('images');
    
    input.onchange = function() {	
      var filesArray = this.files;
    
      for (var i = 0; i < filesArray.length; i++) {
        var file = filesArray[i];
        var image = document.createElement('img');
        
        var reader = new FileReader();
        reader.onload = (function(img) {
          return function(e) {
            img.src = e.target.result;
          };
        })(image);
        reader.readAsDataURL(file);
        
        imagesDiv.appendChild(image);
      }
    };


    Здесь мы создаем новый элемент img для каждого файла в цикле, а затем добавляем его внутрь элемента div с id "images". Обратите внимание на использование замыкания, чтобы передать элемент img в функцию onload объекта FileReader. Это необходимо, чтобы изображения отображались в правильном порядке.
    Ответ написан
  • Почему Go ругается на несоответствие одинаковых типов?

    @5465
    Ошибка в этом коде вызвана тем, что в строке вызова syscall.Getrlimit после &rLimit стоит точка с запятой вместо закрывающей скобки.

    Кроме того, ошибка в сообщении компилятора указывает на несоответствие типов указателей на Rlimit. Когда вы передаете &rLimit как аргумент для функции, она ожидает получить тип *Rlimit, а вы передаете тип **Rlimit, то есть указатель на указатель на Rlimit.

    Чтобы исправить ошибку, вам нужно передать адрес rLimit (тип *Rlimit) вместо &rLimit (тип **Rlimit) при вызове функций syscall.Getrlimit и syscall.Setrlimit. Вот исправленный код:

    var rLimit syscall.Rlimit
    if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
        panic(err)
    }
    rLimit.Cur = rLimit.Max
    if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
        panic(err)
    }


    Обратите внимание, что при вызове syscall.Getrlimit мы передаем адрес &rLimit, а не rLimit, так как функция ожидает указатель на Rlimit. Но когда мы передаем &rLimit в качестве аргумента для syscall.Setrlimit, мы передаем указатель на Rlimit, поэтому не нужно использовать оператор взятия адреса &.
    Ответ написан
  • Почему в webpack module federation, при добавлении get параметра в url состояние redux сбрасывается?

    @5465
    Проблема может быть связана с тем, что при добавлении get параметра в URL компонент Dashboard перерендеривается и создается новый экземпляр Redux store для этого компонента, который не содержит сохраненных данных.

    Для решения этой проблемы необходимо сохранять состояние Redux store вне компонента и передавать его внутрь компонента при каждом рендере. Для этого можно использовать React Context API.

    В главном приложении создайте контекст:

    // appContext.js
    import React from 'react';
    
    export const AppContext = React.createContext({});


    В главном приложении оберните ваш компонент в провайдер контекста и передайте в контекст текущее состояние Redux store:

    // App.js
    import { AppContext } from './appContext';
    
    function App() {
      const [store, setStore] = useState(initialState); // начальное состояние Redux store
    
      return (
        <AppContext.Provider value={{ store, setStore }}>
          <Routes>
            <Route path='items' element={<Items />} />
          </Routes>
        </AppContext.Provider>
      );
    }


    В компоненте Dashboard микрофронта, вы можете получить текущее состояние Redux store через контекст и использовать его для отображения данных:

    // Dashboard.js
    import React, { useContext } from 'react';
    import { useSearchParams } from 'react-router-dom';
    import { AppContext } from '../appContext';
    
    function Dashboard() {
      const { store } = useContext(AppContext);
      const [searchParams] = useSearchParams();
    
      // получаем данные из текущего состояния Redux store
      const items = store.items;
    
      // обновляем данные в Redux store, если это необходимо
      if (searchParams.get('update')) {
        const newItems = await fetchItems(); // получаем новые данные
        setStore(prevState => ({ ...prevState, items: newItems })); // обновляем состояние Redux store
      }
    
      return (
        <div>
          {items.map(item => (
            <div key={item.id}>{item.name}</div>
          ))}
        </div>
      );
    }


    Теперь, когда вы добавляете параметр update в URL, компонент Dashboard не будет перерендериваться и состояние Redux store не будет сбрасываться, потому что вы сохраняете его в контексте.
    Ответ написан
    1 комментарий