All streams
Search
Write a publication
Pull to refresh
45
0

Разработчик

Send message

Чьё-то мнение можно изменить путём аргументации по существу. Мнению, изложенному в указанных вами статьях, не верят (нигде) просто потому, что оно оторвано от действительности, а изложенные утверждения и не подкрепляются фактами. Проще говоря, это неправда.


Вот читаю я первую статью:


Известно что:
Во время существования государства Киевской Руси о Московском государстве не было ни одного упоминания. Известно, что Московское княжество, как улус Золотой Орды, основан ханом Менгу-Тимуром только в 1277 году. К этому времени Киевская Русь уже существовала более 300 лет;

Как я уже писал выше, ни в одной из летописей (ни в Ипатьевской, ни в Лавреньтьевской, ни в "Повести...") никаких упоминаний о т. н. "Киевской Руси" нет. Это новодел, который обозначает часть истории русского государства, в течении которого его столица (в реалиях того времени — великокняжеский двор) находился в Киев. Однако Киев не был ни первой, ни единственной столицей Руси.


Далее идёт прекрасное передёргивание "о Московском государстве не было ни одного упоминания". Предполагается (ложно), что Московское княжество является первой предтечей современной русской государственности, а "Киевская Русь" — украинской; делается неявный и ложный вывод о том, что раз о Москве не упоминали, то современная Украина древнее.


Известно, что Московское княжество, как улус Золотой Орды, основан ханом Менгу-Тимуром только в 1277 году. К этому времени Киевская Русь уже существовала более 300 лет;

Московское княжество не основано ханом, и не в 1277 г. Оно было выделено в отдельный удел по завещанию Александра Невского в 1263 г.


В 1169 г. Андрей Боголюбский захватил и разрушил Киев: пришел как варвар, который не чувствовал никакого родства со славянской святыней – Киевом.

Обычное Средневековье, точно так же поступали тогда все, и дело в "варварстве", а в том, что так было принято. Про "не чувствовал родства" вообще за гранью. Жанну д’Арк чуть позже выдал англичанам кто бы вы думали — герцог Бургундский, который вроде бы такой же француз, но почему-то воевал на стороне англичан. Вы скажете, что это предательство, но нет — это феодализм, который что на Руси, что во Франции остаётся феодализмом.


Таким образом мы видим, что статья претендующая на историчность полна нестыковок и ошибок и прямых подтасовок (про Москву сказали, а про Владимир и Новгород "забыли"), т. е. является в значительной мере пропагандой, а не журналистикой и уж тем более историческим исследованием, при чём пропагандой довольно топорной и неуклюжей.

что империя, не имея своей красивой древней истории, выбрала путь заимствования

Российская Империя возникла в 1721 г. не на пустом месте, а стала продолжением Царства Русского, которое в свою очередь было провозглашено после венчания на царство Ивана IV в 1547 г. До этого Царство Русское было Великим княжеством Московским, которое в свою очередь берёт своё начало от Владимиро-Суздальского княжества, а оно — от Ростовского. Ну а в самом начале пути была Старая Ладога и Новгород, где начиналось княжение Рюриковичей.

Спасибо за обзор, обязательно делайте ещё!
Московия — часть Руси вокруг Москвы, подобно тому как Cracovia — область вокруг Кракова, а Varsovia — область вокруг Варшавы, но и то, и другое — часть Polonia.

Выдохнул, спасибо, как всегда на высоте!


Глядя только на файл, мы не можем понять, какое же настоящее полное имя Foo. Придется посмотреть на содержимое нескольких пакетов.

Правильно ли я понимаю, что тупо заменив импорт со звёздочкой на импорт только нужных классов можно сильно облегчить жизнь любимой "Идее"? Ведь тогда у неё будет точно ограниченный список файлов для проверки и индексация должна проходить быстрее для случаев, когда в пакете 20 классов, а включено всего 4.


Конечно, мы найдем не только java.util.List, а еще java.awt.List ...

Кмк, не обязательно, ведь если у нас "девятка" и модуль с java.awt.List не включен в список зависимостей нашего модуля, то при наличии списков классов стандартной библиотеки, разбитых помодульно, можно проверять только классы из подключенных модулей.

Мой вывод: между работоспособностью приложения и улучшением производительности всегда нужно выбирать работоспособность.
Тоже интересный подход.
Epsilon GC реализует только «выделение», а «освобождением» не занимается вообще.

Интересный подход. Краем уха я когда-то слышал о подходе с выключенной сборкой мусора: множество одинаковых приложений запускается в кластере, при этом каждая отдельная ВМ запускается без сборщика, т. е. паузы отсутствуют вообще. Память выедается и неизбежно наступает ООМЕ, после чего ВМ убивается и запускается заново, а запросы перенаправляются на другие приложения того же кластера. Таким образом 100% ЦП занято приложением, не отвлекаясь на мусор.


Получается, с Epsilon GC можно не собирать свою ВМ для отключения сборщика, а просто запуститься с нужной настройкой.

Не понял вашу мысль.
И вам спасибо!

Мне кажется, что выбор между Spring Data JDBC и Spring Data JPA сродни выбору между ложкой и вилкой. И тем, и тем мы едим, но щи удобнее есть ложкой, а пельмени — вилкой.

Иными словами, выбирать нужно исходя из создавшегося положение и моя заметка как раз о случаях, когда лучше выбрать Spring Data JPA и не наступить на грабли.

Не за что, наберу ещё материала — и будет вторая часть про кастомизацию репозиториев. Там тоже есть интересные моменты.

Здесь для упрощения всё показано в одном методе, однако возможна (и мне подобные встречались) ситуация, когда у нас есть что-то вроде


BankAccount acc = repository.findById(id).orElseThow(NPE::new);
check(id);

public void (check) {
  boolean available = repository.findIfAvailable(id);
  if (!available) throw new IllegalStateException();
}

при чём всё это выполняется в одной транзакции (т.е. используется одна и та же сессия). Для неискушенного разработчика неочевидно, что второй repository.findById(id) возьмёт сущность из наличия.


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

Сам по себе Спринг вполне себе управляем. Вот Спринг бут — это действительно огромная и сложная махина.
Можно и так, правда, в этом случае часть методов, объявленных в интерфейсе и тело будет иметь только в интерфейсе, другая же часть будет реализована в классе. ИМХО, лучше уже всё делать единообразно.
Особенно про LDAP — хоть в музей относи

Да уж, впору начинать их коллекционировать и на собеседованиях просить соискателей рассказать о своих случаях.

Дело не в прослойке, а в ошибках компиляции.


@Service
@RequiredArgsConstructor
public class Service
  private final SomeRepository someRepository;

  @Transactional
  public void foo(long id) {
    SomeEntity something = someRepository.findOne(someId);
    if (something == null) {
      something = someRepository.save(new SomeEntity());
    }
    useSomething(something);
}

На СБ1 (для которого Спринг Дата 1.*) это работает, на СБ2 (для которого Спринг Дата 2.*) нужно:


  • вызывать другой метод
  • сменить тип переменной something на Optional<SomeEntity>
  • заменить проверку пустой ссылки на Optional::isPresent или цепочку Optional::orElse/Optional::orElseGet

И так в каждом сервисе.

Не за что, мне очень понравились ваш доклад и эта статья, по его следам думаю написать статью про Спринг Бут и некоторые его особенности.

Точно не скажу, разговор был формата курилки. Спросил про миграцию на СБ2, вылезло несколько проблем, а поскольку задача была не очень важной, то занимались ей в перерывах между основной работой.


Вот что запомнилось точно — проблемы со Спринг Датой. Начиная с версии 2 изменились названия ключевых методов в JpaRepository:


interface JpaRepository<T, ID> {
  //было
  <T> T findOne(ID id);
  <T> List<T> findAll(Iterable<ID> ids);

  //стало
  <T> Optional<T> findById(ID id);
  <T> List<T> findAllById(Iterable<ID> ids);
}

В проекте несколько десятков репозиториев и тысячи обращений к указанным методам. Миграция "в лоб" (использование новых методов) зацепила бы каждый второй файл. Поэтому воспользовались возможностью подгонки репозиториев под свои нужды:


//основа для всех репозиториев
@NoRepositoryBean
public interface BaseJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
  // определяем метод findOne, аналогичный тёзке, существовавшему в версиях 1.*
  @Deprecated
  T findOne(ID id);

  // тоже для findAll
  @Deprecated
  List<T> findAll(Iterable<ID> ids);
}

public class BaseJpaRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements BaseJpaRepository<T, ID> {

  private JpaEntityInformation<T, ?> entityInfo;
  private EntityManager entityManager;

  public BaseJpaRepositoryImpl(JpaEntityInformation<T, ?> entityInfo, EntityManager entityManager) {
    super(entityInfo, entityManager);
    this.entityInfo = entityInfo;
    this.entityManager = entityManager;
  }

  //обеспечиваем совместимость поведения
  @Override
  public T findOne(ID id) {
    return findById(id).orElse(null);
  }

  @Override
  public List<T> findAll(Iterable<ID> ids) {
    return findAllById(ids);
  }
}

//какой-нибудь репозиторий
interface SomeRepository extends BaseJpaRepository<SomeEntiy, Lond> {
}

И о чудо! Все ошибки компиляции исчезают, код работает как и прежде, а изменено всего 2 класса, а не 200. Теперь можно неспешно заменять устаревшее АПИ на новое, благо "Идея" заботливо подсветит все вызовы помеченные @Deprecated.

Information

Rating
Does not participate
Registered
Activity