• Как сделать доступ к HashMap с других классов?

    leahch
    @leahch
    Я мастер на все руки, я козлик Элек Мэк :-)
    Делаете клас-сиглтон и в него кладете все что вам нужно пошарить (инициализируете все в приватном конструкторе).
    public final class Singleton {
    
        private static Singleton instance;
    
        private  final ConcurrentHashMap<UUID, Person> cache; // не static!
    
        public Map<UUID, Person>  getCache() {
            return cache;
        }
        private Singleton() {
             this.cache = new ConcurrentHashMap<>()
        }
    
        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }

    И использование
    Map<UUID, Person> cache = Singleton.getInstance().getCache();


    Ну и на почитать - https://refactoring.guru/ru/design-patterns/single...

    Вобще-то лучше избегать синглтонов, а использовать так называемую технику DI, например с использованием spring или guice (мой выбор). Но начать стоит именно с синглетонов.

    Ну и конечно стандартный синглтон достаточно простой, можно еще сделать его ленивым и наворотить еще штук 20 строчек кода - тут головы взрывались на эту тему лет 10 назад.
    Ответ написан
  • Как сделать доступ к HashMap с других классов?

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

    origami1024
    @origami1024
    went out for a night walk
    Тут не нужно парсить что-то, просто забирай из API данные.
    Например список стран тут: https://de1.api.radio-browser.info/json/countries
    Данные по конкретной стране так: https://de1.api.radio-browser.info/json/stations/b...

    Например, через requests.get:
    import requests
    raw = requests.get("https://de1.api.radio-browser.info/json/stations/bycountryexact/Ukraine")
    print(raw.content)


    Ну и конвертируй JSON в объект так, для полноты ответа:
    import json
    jsoned = json.loads(raw.content)
    print(jsoned[0])
    Ответ написан
  • Как спарсить страницу с json и контент который подгружается при листании на Python?

    hottabxp
    @hottabxp Куратор тега Python
    Эксперт по BeautifulSoup(но это не точно!)
    Здесь ни selenium, ни BS4 не нужен. Здесь достаточно requests и json.
    Так получаем список стран:
    import requests
    import json
    
    url = 'https://de1.api.radio-browser.info/json/countries'
    
    response = requests.get(url)
    countries = json.loads(response.text)
    
    for country in countries:
    	name = country['name']
    	stationcount = country['stationcount']
    	print(f'{name} - {str(stationcount)}')

    Что бы получить данные по стране, обращаемся по адресу:
    https://de1.api.radio-browser.info/json/stations/b...
    вместо россия, указываем страну из предыдущего ответа.

    страницу грузит, но на вкладке Network пуста и тоже ничего не выходит
    и
    Вижу что отправляется json запрос xhr /countries
    несостыковка).
    Посмотрите в интернете, что такое xhr. А также почитайте про инструменты разработчика, это упростит анализ сайта.
    5ec190758bce4994130778.png
    Ответ написан
  • Как построить график функции на excel?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    A1:A31 заполняются числами от -2 до 1 с шагом 0,1
    B1:
    =если(a1<=0;(1+a1^2)/(корень(1+a1^4));1*a1+((sin(a1))^2)/(2+a1))

    По сути x в формуле заменяется на A1, главное скобок не жалеть, тогда меньше вероятность ошибиться.
    И распространить B1 на 30 ячеек вниз.
    Потом выделить оба столбца и вставить диаграмму точечную.

    Больше точек - красивее график. Желательно в значения x вписать пару точек в окрестности нуля, т.к. там прыжок. Например -0,00001 и 0,00001
    Ответ написан
  • Как разрешить пользователю редактировать только собсвенные комментарии?

    @azerphoenix
    У меня есть несколько идей по решению данной задачи. Какая из них корректная не скажу, но тем не менее решит ваши задачи.

    Итак,
    Для начала создадим controllerAdvice

    @RequiredArgsConstructor
    @ControllerAdvice
    public class GlobalControllerAdvice {
    private final UserServiceImpl userServiceImpl;
    
    @ModelAttribute("currentUser")
        public User getUserProfile(
                @AuthenticationPrincipal UserDetails currentUser
        ) {
            if (currentUser != null)
                return (User) userServiceImpl.findUserByEmail(currentUser.getUsername());
            return null;
        }
    
    }


    Теперь, нам доступна переменная ${currentUser} (текущий авторизованный пользователь)

    Далее, допустим, что мы хотим на клиенте отобразить иконку редактирования по клику на которую пользователь сможет отредактировать комментарий.
    Когда вы в html (в шаблонизаторе) циклом выводите список комментариев, то просто сравните текущего авторизованного пользователя и автора каждого комментария. Если equals(), то показываем иконку редактирования, а если нет, то не показываем.

    Например, для thymeleaf
    <div class="comments" th:each="comment : ${comments}"> 
    <input th:if="${comment.author} eq ${currentUser}" type="button" value="Отредактировать комментарий"/>
    </div>

    Или вы можете вместо сравнения объектов сравнить их id и т.д.

    А если нужно проверить автора в методе контроллера, то получаем текущего пользователя:
    @GetMapping("/edit/{commentId}")
    public String editComment(
    @PathVariable("commentId") Long commentId,
    @AuthenticationPrincipal UserDetails currentUser,
    ) {
    User user = (User) userServiceImpl.findUserByEmail(currentUser.getUsername());
    /*
    Далее находим комментарий по его id. находим его автора и сравниваем с user.
    */
    
    }
    Ответ написан
  • Как сделать валидацию данных?

    jaxtr
    @jaxtr
    JavaEE/Spring-разработчик
    Я на практике использую следующий подход: для каждой хранимой сущности, которую может создать/изменить пользователь, я создаю класс, описывающий форму (иногда бывает, что для редактирования и создания используются даже разные классы в виду разного набора полей).
    Это делается по двум причинам: во-первых - не все поля в хранимой сущности пользователи могут создавать/изменять (например, даты создания/редактирования и идентификаторы), во-вторых - вынесение аннотаций валидации из класса сущности.

    Теперь ближе к делу: для валидации существуют аннотации из пакета javax.validation.constraints, а также дополнительные, предоставляемые реализациями Bean Validation API (например @Email из Hibernate Validator).

    Допустим, у нас есть класс, представляющий собой форму регистрации:
    SignUpForm.java
    public class SignUpForm {
        @Email
        private String email;
    
        @Size(min = 8)
        @Pattern(regexp = "какая-нибудь регулярка для проверки надёжности пароля")
        private String password;
    }


    В контроллере мы будем принимать форму таким образом:
    SignUpController.java
    public class SignUpController {
        public ResponseEntity signUp(@RequestBody @Valid SignUpForm form, BindingResult bindingResult) {
        }
    }



    В form будут содержаться данные, отправленные пользователем, а в bindingResult - результат валидации, который можно легко проверить, вызвав bindingResult.hasErrors(). Отмечу только то, что аргумент класса BindingResult должен быть сразу после аргумента, помеченного аннотациями @RequestBody и valid, в других случаях валидация работать не будет.

    Но дальше - больше. Допустим, нам нужно добавить поле для подтверждения пароля и проверять его соответствие паролю. В таком случае нам надо добавить свою аннотацию (в данном случае на класс) и валидатор.
    Новый класс формы:
    SignUpForm.java
    @PasswordMatch
    public class SignUpForm {
        @Email
        private String email;
    
        @Size(min = 8)
        @Pattern(regexp = "какая-нибудь регулярка для проверки надёжности пароля")
        private String password;
    
        private String passwordConfirmation;
    }


    Аннотация:
    PasswordMatch.java
    @Target({TYPE, ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Constraint(validatedBy = PasswordMatchValidator.class)
    @Documented
    public @interface PasswordMatch {
    
        String message() default "{constraints.passwordmatch}";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        @Target({TYPE, ANNOTATION_TYPE})
        @Retention(RUNTIME)
        @Documented
        @interface List {
    
            PasswordMatch[] value();
        }
    }


    Ну и валидатор:
    PasswordMatchValidator.java
    public class PasswordMatchValidator implements ConstraintValidator<PasswordMatch, SignUpForm> {
    
        @Override
        public void initialize(PasswordMatch constraintAnnotation) {
        }
    
        @Override
        public boolean isValid(SignUpForm value, ConstraintValidatorContext context) {
                return Objects.equals(value.getPassword(), value.getPasswordConfirmation());
        }
    }


    И ещё один способ валидации - при помощи спринговых валидаторов. Допустим, нам нужно проверить существование указанного email в нашей БД, что вполне вписывается в процесс валидации. В таком случае пишем валидатор:
    SignUpFormValidator.java
    public class SignUpFormValidator implements Validator {
        public boolean supports(Class<?> type) {
            return SignUpForm.class.isAssignableFrom(type);
        }
        public void validate(Object target, Errors errors) {
            SignUpForm form = (SignUpForm) target;
            // проверяем, что нужно и добавляем ошибки в errors, если они есть
        }
    }


    Регистрируем его в контроллере:
    SignUpController.java
    public class SignupController {
        @InitBinder
        public void initBinder(WebDataBinder binder) {
            binder.addValidators(new SignUpFormValidator());
        }
    }


    После этого Spring будет производить дополнительную валидацию при помощи этого валидатора.

    Более подробно с валидацией в Spring можно почитать в официальной документации.
    Ответ написан
  • Наследуются ли в java аннотации?

    @artemsee
    По умолчанию наследоваться не будет. Однако, если аннотация помечена как Inherited, то наследуется. Так как чаще всего аннотации не наследуются, то можно использоваться вспомагательные средства для поиска аннотаций у класса и его родителей, например библиотека Spring Core содержит методы findAnnotations для поиска конкретных аннотаций у класса (или его родителей) или метода (или методов родителя которые переопределенны данным методом).

    Вот хороший пример, объясняющий принцип работы Inherited: тырц.
    Ответ написан
  • Разъяснение в конфигурации Spring+Hibernate(JPA). Помощь в настройке транзакций. Почему они не проходят?

    zolt85
    @zolt85
    Программист
    Я вам не скажу за всю Одессу, но у нас в Сибири считается, что
    1) @GeneratedValue(strategy = GenerationType.TABLE) - говорит, что нужно использовать таблицу для генерации PK. Не таблицу, на которую маппится сущность, а просто таблицу. Отсюда и возникает таблица hibernate_sequences. И возникает она из-за hibernate.hbm2ddl.auto=update.
    2) Про длину колонки, это опять из-за hibernate.hbm2ddl.auto=update.
    3) @Transaction говорит, что метод будет транзакционным. Что это значит. Это значит, что вызов метода будет обернут в proxy объект, у которого будет сессия, и при вызове всех вложенных методов эта сессия будет одна и та же, и при завершении метода транзакция закроется.
    4) propagation = Propagation.REQUIRED - это означает, что наличие сессии при вызове метода обязательно, если ее нету, то hibernate попытается ее создать.
    5) Откат транзакции (rollbak грубо говоря) происходит, по-умолчанию, только в случае возникновения RuntimeException, как этим управлять написано в документации к hibernate.
    6) значение в аннотации @Repository("personDao") задает имя бина.

    Теперь по классике надо что-то по советовать. Советую Вам не использовать hibernate.hbm2ddl.auto=update. Лучше посмотрите в сторону liquibase для управления состоянием БД.
    И почитайте вводные туториалы по Spring, разберитесь как работает IoC в Spring, как работает AOP в Spring, как Spring управляет бинами. И тогда Вам станет все понятно.

    Дерзайте, удачи Вам!
    Ответ написан
  • Как в excel получить широту и долготу по адресу?

    coderisimo
    @coderisimo
    Уважайте тех ,кто вам помогает , ёклмн! )
    Есть вот такое решение https://www.adventuresincre.com/auto-populate-lati... ,но там ограничение для бесплатных запросов 2500 в день. Значит за неделю с хвостиком управитесь (ну, или смотрите цены).
    Ответ написан
  • Решение задачи Python?

    @illaaa
    num_set = set()
    x = 1
    
    while x != 0:
        x=int(input('введите число '))
        num_set.add(x)
        
    num_set.remove(max(num_set))
    print(max(num_set))
    Ответ написан
  • Как открыть файл с помощью скрипта-python?

    shabelski89
    @shabelski89
    engineer
    а импорты сделаны?

    import os
    os.startfile(r'D:\Games\Watch Dogs 2\bin\WatchDogs2.exe')
    Ответ написан
  • Как открыть файл с помощью скрипта-python?

    @lightmanLP
    Задушил питона
    open открывает файл для получения данных. Чтобы запустить игру вам нужно из стандартной библиотеки os применить функцию startfile()
    Ответ написан