• Как определить ненастоящий user-agent и стоит ли их блокировать?

    webinar
    @webinar Куратор тега Веб-разработка
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Вы идете по стопам ДонКихота. Это война с ветряными мельницами, которая напряжет только часть ни в чем не повинных пользователей. Боты будут тихо смеяться наблюдая за этим.

    существует ли в сети скрипт определения всех действующих user-agent по браузерам, их версиям и операционным системам или "все сам, все сам, ручками"?

    А при чем тут скрипт, тут просто список их нужен. Скрипт - там перебор простой. Но какая вероятность, что в списке все учтено и он свежий?

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

    Берет список, перебирает, сравнивает с Вашей строкой. Читать про циклы и условные операторы.

    неужели придется как-то отслеживать все новые версии браузеров

    Да ну нет конечно. Разработчики браузеров, перед тем как выкатить свой код, обязательно позвонят Вам предварительно. И разработчики гугла сидят и думают:
    - Давай не будем менять имя поискового бота, вдруг weranda заблокирует его.
    - Точно, надо позвонить предупредить
    - Да и вообще по интернету найти все списки подобные и подобавляться
    - Отличная идея, нам же как раз заняться не чем

    стоит ли оно того?

    нет. Не вижу не единого плюса и кучу минусов.
    Ответ написан
    Комментировать
  • Как выполнить асинхронно часть метода?

    @Dmtm
    Android
    почему запросы выполняются в контроллере а не в самом CompletableFuture?
    примерно так:
    CompletableFuture.supplyAsync(...)
    .exceptionally(....)
    .thenApply(....)
    .thenAccept(....);
    Ответ написан
    2 комментария
  • Как правильно писать в коде имена сложных терминов?

    @Dugayoyo
    Можешь писать javaDoc на русском/ двух языках.
    Ответ написан
    Комментировать
  • Как в Spring разослать асинхронные Http запросы, не блокируя поток?

    EugeneP2
    @EugeneP2
    Java Dev
    1) Кэшироапние. Все 5 внешних сервисов возвращают каждый раз уникальный ответ? Или сам сервис каждый раз возвращает уникальный ответ? - Если нет, то ответы нужно кэшировать + ограничивать время жизни кэша.

    2) Высокие тайминги внешних сервисов 5 * 350 = ~ 2000 - эти запросы нужно распараллелить. Создаем threadPool на много потоков и добавлять в него задачи Callable и по возвращенным Futures дожидаемся всех результатов и возвращаем их клиенту.

    3) увеличить в конфигах максимальное количество потоков самого контейнера (томката/джетти)

    4) Запустить сервис на разных машинах/инстансах и настроить лоад балансер, например Ribbon из спрингового стека технологий.

    ​Правильный совет вам дали sim3x и Довольный Жизнью , реализация через очередь и воркеры с последующим запросом результата клиентом по айди. На такой архитектуре работают много банковских сервисов и выдерживают большие нагрузки.

    ​Если вам уже так критично количество потоков или вы как то ограничены, то вам стоит обратить внимание на реактивное программирование Spring WebFlux
    Ответ написан
    Комментировать
  • Как работать с Redis из Java?

    @nkoksharov
    Попробуй Redisson. Помогает избавиться от кучи кода и сосредоточится на бизнес-модели приложения. Также реализует кучу объектов и сервисов типа: BitSet, BloomFilter, Set, SortedSet, Map, ConcurrentMap, List, Queue, Deque, BlockingQueue, BlockingDeque, ReadWriteLock, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, RemoteService, ExecutorService, ScheduledExecutorService...
    Ответ написан
    Комментировать
  • Как в Spring разослать асинхронные Http запросы, не блокируя поток?

    @kidar2
    А может клиент сам сделает эти 5 запросов на сторонние сервисы? Если это веб, то на js задача легко решается Зачем нам промежуточный?
    Ответ написан
    1 комментарий
  • Возможно ли слушать SpringBoot порт, на котором уже запущен локально Apache?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Если порт открыт одной программой, другая его использовать уже не может. Можно попробовать настроить Apache на проксирование трафика.
    Ответ написан
    Комментировать
  • Как использовать максимум процессора для выполнения многопоточной задачи?

    Простой ресурсов сам по себе - не проблема, а счастье. Проблемой является простой ресурсов при заметной деградации сервиса.
    Но в тестовом режиме, загружая систему примерно на 100 000 запросов с 2000 потоков (через tomact: ab -n 1000000 -c 3000 ") проц всё ещё остаётся загружен всего на 36%.

    Ответ приходит за какое время? Сколько времени выполняется 1 запрос при нулевой загрузке? При каком количестве запросов происходит деградация сервиса?
    увеличить использование процессора и ускорить выполнение не обязательно ходят вместе. Процессор может простаивать по причине ожидания ввода-вывода, но так же и потому, что он легко справляется с текущей нагрузкой.
    В любом случае, спрашивать надо не на тостере, а у профилировщика: куда уходит время цпу, в каких ситуациях появляется простой цпу, какое соотношение простоя к полезной работе. Если сервис долго ждет ввод-вывод - нужно ускорять именно ввод-вывод, а не стараться нагрузить процессор.
    Ответ написан
    3 комментария
  • Как правильно вызвать окно в Java FX?

    jsdevel
    @jsdevel
    Java разработчик. Хороший парень, наверное.
    Попробуй.
    @Override
        public void start(Stage primaryStage) throws Exception {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("mainframe.fxml")); //смотрит уже в resources
            primaryStage.initStyle(StageStyle.TRANSPARENT);
            primaryStage.setScene(new Scene(fxmlLoader.load(), 1100, 700));
            primaryStage.show();
        }
    Ответ написан
    Комментировать
  • Как правильно вызвать окно в Java FX?

    libalex
    @libalex
    Backend / Android Developer (Java, Kotlin)
    Если FXML лежит в папке ресурсов, то попробуйте InfoForm.class.getResource("/test.fxml")
    Ответ написан
    Комментировать
  • Как сделать Drag'n'Drop интерфейс со связями между элементами?

    jamakasi666
    @jamakasi666 Куратор тега Java
    Просто IT'шник.
    Сам Drag'n'Drop делается достаточно просто, нодами интерфейса тоже достаточно просто управлять и кастомизировать, тут проблема может возникнуть скорее с io этих нод.
    Ответ написан
    Комментировать
  • Как преобразовать html в Map или массив?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Во-первых, у тега form нет атрибута modelAttribute.
    Во-вторых, у вас в результате работы цикла будет куча форм с одинаковым именем, что делает html невалидным.
    В-третьих, отправлена за один раз может быть только одна форма. Соответственно, контролер получит только один экземпляр полей name, phone и email, не из чего будет делать List.

    Лучше сделать так:
    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
    
    ...
    
    <form:form modelAttribute="formData" method="post">
      <c:forEach items="${formData.sprints}" var="sprint" varStatus="status">
        <input type="text" name="sprints[${status.index}]['name']" placeholder="Name"></td><br>
        <input type="text" name="sprints[${status.index}]['phone']" placeholder="Phone"><br>
        <input type="text" name="sprints[${status.index}]['email']" placeholder="E-Mail"><br>
      </c:forEach>
        <input type="submit" value="Сохранить">
    </form:form>

    public class SprintsForm {
    	private List<Map<String, String>> sprints;
    
    	public List<Map<String, String>> getSprints() {
    		return sprints;
    	}
    
    	public void setSprints(List<Map<String, String>> sprints) {
    		this.sprints = sprints;
    	}
    }

    @Controller
    @RequestMapping("/")
    public class FormController {
        @RequestMapping(method = RequestMethod.GET)
        public ModelAndView showForm() {
            SprintsForm formData = new SprintsForm();
            return new ModelAndView("form" , "formData", formData);
        }
    
        @RequestMapping(method = RequestMethod.POST)
        public ModelAndView handleForm(@ModelAttribute SprintsForm formData, BindingResult result) {
            if (result.hasErrors())
                return new ModelAndView("form", "formData", formData);
            
            ...
        }
    }
    Ответ написан
  • Как ограничить доступ к папке на Ubuntu?

    vesper-bot
    @vesper-bot
    Любитель файрволлов
    Создай группу для папки, добавь в группу себя и того гостя, выставь права на папку 750 и владельца себя с той группой, которую создал.
    Ответ написан
    1 комментарий
  • Как ограничить доступ к папке на Ubuntu?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Это не совсем ответ на Ваш вопрос, но направление в нужную сторону. Основных способов у Вас примерно полтора:
    1. Стандартная система прав Linux (а так же масса прочих ссылок по запросу "права доступа linux")
    2. ACL (я бы назвал это "расширенная система прав")
    Ответ написан
    Комментировать
  • Как получить параметры полей класса без использования рефлексии?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Я подозреваю, что можно сделать так - в методе fillAllFields можно позвать super.fillAllFields. Затем позвать super.getAllFields().getSize(), и заполнить свои поля, начиная с позиции, где закончились поля родителя.
    Метод getAllFields - ещё проще, надо позвать super.getAllFields() и в этот массив в конец добавить свои поля.
    Кажется, что это будет работать для любой иерархии.
    Ответ написан
    1 комментарий
  • Как создать правильную структуру MVP android?

    public interface  LoginPresenter{
     void clickOnSignInBtn();  //презентер после вызова этого метода дергает методы модели, выполняющие подключеник к апи и вход, и вызывает  showSelectionWindow() c названиями аккаунтов, полученных из модели.
     void accountSelected(String s); // после того как юзер выбрал аккаунт, вьюшка дергает этот метод с параметром, какой аккаунт выбран, тут не обязательно должна быть строка, после этого презентер дергает соответствующий метод из вашей модели, выполняющий авторизацию уже определенного юзера, если все хорошо - вызывает
    //openMainActivity() и передает туда инфу для интента, если нет - showError()
    }
    
    public interface LoginView {
    void showSelectionWindow(List<String> accountsNames);  //показать меню выбора.
    void openMainActivity(String arg); // В реализации вьюшка кладет в интент аргумент и запускает новую активити.
    void showError(String msg); 
    /* Сюда можно добавить другие нужные вам методы, аля 
            showProgress(), showMessage()
    */
    
    }
    Ответ написан
    2 комментария