Как стать автором
Обновить
-23
0

Инженер-программист

Отправить сообщение

Boot yourself, Spring is coming (Часть 1)

Время на прочтение32 мин
Количество просмотров45K
Евгений EvgenyBorisov Борисов (NAYA Technologies) и Кирилл tolkkv Толкачев (Циан.Финанс, Твиттер) рассказывают о самых важных и интересных моментах Spring Boot на примере стартера для воображаемого Железного банка.



В основе статьи — доклад Евгения и Кирилла с нашей конференции Joker 2017. Под катом — видео и текстовая расшифровка доклада.
Всего голосов 37: ↑34 и ↓3+31
Комментарии2

Валидация generic параметров в Spring контроллерах

Время на прочтение2 мин
Количество просмотров7K
image
Все мы часто пишем простые методы в контроллерах работающие через числовые идентификаторы.

    @RequestMapping(value = {"/entityName/{entityId}/get"}, method = RequestMethod.GET)
    @ResponseBody
    public Entity get(@PathVariable(value = "entityId") Integer entityId) {
        //возврат значения сущности по ID
    }

Пришедший ID надо валидировать.
Читать дальше →
Всего голосов 17: ↑17 и ↓0+17
Комментарии24

Простой статический сайт на Webpack 4

Время на прочтение15 мин
Количество просмотров140K


После прочтения ряда статей (например, этой) решил перейти на современный подход с использованием Node.js при написании простых сайтов с подхода «динозавров». Ниже представлен разбор примера сборки простого статического сайта с помощью Webpack 4. Статья написана, так как инструкции с решением моей задачи не нашел: пришлось собирать всё по кусочкам.

Читать дальше →
Всего голосов 26: ↑25 и ↓1+24
Комментарии88

Generics + Spring: Да пребудет с вами сила

Время на прочтение5 мин
Количество просмотров16K

Однажды в одном далёком, далёком банке ...


Доброго времени суток, хабр. Сегодня наконец-то вновь дошли руки написать сюда. Но в отличие от предыдущих туториалов — статей сегодня хотелось бы поделиться своим опытом и показать мощь такого механизма как дженерики, который вместе с магией спринга становится ещё сильнее. Сразу хочу предупредить, что для понимания статьи нужно знать основы спринга и иметь представления о дженериках большие чем просто “Дженерики это, ну, то что в ArrayList в ковычках указываем”.

Эпизод 1:


Начнём с того, что на работе у меня стояла задача примерно таким образом: имелось большое количество денежных переводов с определенным количеством общих полей. Помимо этого каждому из переводов соответствовали классы — запросы для перевода из одного состояния в другое и перенаправления на другое апи. Соответственно были билдеры, которые и занимались преобразованием.

Проблему с общими полями я решил просто — наследованием. Таким образом у меня появились классы:

public class Transfer {
    private TransferType transferType;
    ...
}
    
public enum TransferType {
      INTERNAL, SWIFT, ...;
}
    
public class InternalTransfer extends Transfer {
    ...
}
    
public class BaseRequest {
    ...
}
    
public class InternalRequest extends BaseRequest {
    ...
}    

...

Эпизод 2:


Дальше стояла проблема с контроллерами — у них у всех должны были быть одинаковые методы — checkTransfer, approveTransfer и тд. Вот тут то в первый, но не в последний раз мне пригодились дженерики: я сделал общий контроллер с нужными методами, и унаследовал от него остальные:
Читать дальше →
Всего голосов 12: ↑12 и ↓0+12
Комментарии5

Выгружаем данные в Excel. Цивилизованно

Время на прочтение9 мин
Количество просмотров68K
Есть в IT-отрасли задачи, которые на фоне успехов в big data, machine learning, blockchain и прочих модных течений выглядят совершенно непривлекательно, но на протяжении десятков лет не перестают быть актуальными для целой армии разработчиков. Речь пойдёт о старой как мир задаче формирования и выгрузки Excel-документов, с которой сталкивался каждый, кто когда-либо писал приложения для бизнеса.



При чём тут ксилофон?!
Всего голосов 23: ↑23 и ↓0+23
Комментарии27

Процесс ревью кода в hh.ru

Время на прочтение7 мин
Количество просмотров19K
Мне на глаза попался документ с правилами и рекомендациями по процессу ревью кода внутри компании. Я решил, что такой полезной информацией надо поделиться с внешним миром. С благословения автора я публикую работу.


Читать дальше →
Всего голосов 40: ↑37 и ↓3+34
Комментарии2

Рецепт полезного код-ревью от разработчика из Яндекса

Время на прочтение9 мин
Количество просмотров47K



Привет. Меня зовут Сергей, последние пять лет я работаю в Яндексе. За это время участвовал в разработке одиннадцати проектов. Писал код на JavaScript, Python и C++. Некоторые проекты делал в одиночку, другие разрабатывал в группе из восьми человек. Но в каждой команде, на всех проектах, вне зависимости от языка программирования я использовал код-ревью.


С помощью код-ревью я постоянно узнаю что-то новое. Иногда, глядя на чужой код, хочется воскликнуть: "А что, так тоже можно?". В чужом коде я нахожу интересные приёмы и беру их себе на вооружение. Много новых знаний черпаю из комментариев к моему коду. Для меня стало открытием, что люди любят делиться своим опытом. Даже когда я разрабатываю проект в одиночку, то прошу ребят из другой команды посмотреть мои пулреквесты. Это мотивирует писать красивый и понятный код.


Но так было не всегда. Когда-то ревью было для меня наказанием. Я мог неделю с вдохновением писать код, вкладывая в него все силы. Отправлял пулреквест, трижды пинговал ревьювера, а в ответ получал сухое "вроде ок" или, что ещё хуже, десятки комментариев не по существу.


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


Если вы чувствовали это на себе, значит, статья для вас. Сегодня я расскажу о приёмах и инструментах, которые использую каждый день на протяжении пяти лет ежедневного код-ревью.

Читать дальше →
Всего голосов 77: ↑68 и ↓9+59
Комментарии172

Инструкция по работе с TensorFlow Object Detection API

Время на прочтение6 мин
Количество просмотров39K

Перевод TensorFlow Object Detection API tutorial — Training and Evaluating Custom Object Detector.

Мы все умеем водить машину, ведь это довольно легко, правда? Но что вы будете делать, если кто-то попросит вас сесть за штурвал самолета? Совершенно верно — вы прочитаете инструкцию. Аналогично, руководство, которое вы найдете ниже, поможет вам настроить API и наслаждаться приятным полетом.
Читать дальше →
Всего голосов 17: ↑16 и ↓1+15
Комментарии5

Изучение Spring Framework 100% через практику. Активные туториалы и язык разметки KML. Проект KciTasks (beta)

Время на прочтение15 мин
Количество просмотров103K


Spring Framework традиционно считается одним из самых сложных и при этом высокооплачиваемых. Однако, существующие подходы к его изучению крайне неэффективны. Я хотел бы предложить вам принципиально новый подход к изучению спринга, который заключается в использовании концепции активных туториалов. Они представляют из себя сбалансированный набор инструкций, которые поддерживают внимание разработчика и проводят его через те или иные аспекты фреймворка.

В результате, мы получаем целенаправленное обучение, но БЕЗ ступоров, проблем непонимания вида «а где это использовать», а также без скучного и пассивного чтения теории. Совсем.

В рамках статьи представлено 5 учебных задачек, которые покрывают Spring Jdbc/Transactions на 50% от необходимых для сертификации знаний. Главная задача статьи — массово протестировать саму идею, а также вместе с вами разработать большое количество уникальных задачек по всем темам.
Читать дальше →
Всего голосов 21: ↑17 и ↓4+13
Комментарии12

10 советов по использованию ExecutorService

Время на прочтение13 мин
Количество просмотров153K
Предлагаю читателям «Хабрахабра» перевод публикации «ExecutorService — 10 tips and tricks».



Абстракция ExecutorService была представлена еще в Java 5. На дворе шел 2004 год… На секунду – сейчас Java 5 и 6 больше не поддерживаются и Java 7 готовится пополнить список. А многие Java-программисты по-прежнему не в полной мере понимают как работает ExecutorService. В вашем распоряжении множество источников, но сейчас я хотел бы рассказать о малоизвестных тонкостях и практиках по работе с ней.
Читать дальше →
Всего голосов 21: ↑20 и ↓1+19
Комментарии23

Новый синхронизатор Phaser

Время на прочтение5 мин
Количество просмотров56K
Phaser (Этапщик) — мощная и гибкая реализация паттерна синхронизации Барьер. Включен в JDK 7 в составе пакета java.util.concurrent.

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

Читать дальше →
Всего голосов 38: ↑37 и ↓1+36
Комментарии4

Как работает ConcurrentHashMap

Время на прочтение5 мин
Количество просмотров165K
В октябре на хабре появилась замечательная статья про работу HashMap. Продолжая данную тему, я собираюсь рассказать о реализации java.util.concurrent.ConcurrentHashMap.
Итак, как же появился ConcurrentHashMap, какие у него есть преимущества и как он был реализован.
Читать дальше →
Всего голосов 105: ↑100 и ↓5+95
Комментарии14

Магия SSH

Время на прочтение11 мин
Количество просмотров491K
С SSH многие знакомы давно, но, как и я, не все подозревают о том, какие возможности таятся за этими магическими тремя буквами. Хотел бы поделиться своим небольшим опытом использования SSH для решения различных административных задач.

Оглавление:

1) Local TCP forwarding
2) Remote TCP forwarding
3) TCP forwarding chain через несколько узлов
4) TCP forwarding ssh-соединения
5) SSH VPN Tunnel
6) Коротко о беспарольном доступе
7) Спасибо (ссылки)
Читать дальше →
Всего голосов 115: ↑106 и ↓9+97
Комментарии75

Создание шаблонов в IDE от Jetbrains

Время на прочтение4 мин
Количество просмотров25K

Вступление


Сегодня я хочу привести небольшой обзор-туториал темплейтов в ИСР от Jetbrains. Приведенные ниже примеры будут реализованы на Java в Intellij IDEA, но механизм создания одинаков и для других языков и продуктов компании. Думаю все программирующие в данной IDE пользовались встроенными шаблонами. Например когда вы пишете fori, нажимаете TAB или ENTER и у вас появляется цикл for в котором нужно указать имя переменной и условие, а остальной код генерируется за вас.

for (int i = 0; i < ; i++) {   
                               
}    

Или же знакомый всем java-программистам sout -> System.out.println(). Так вот, в Intellij есть поддержка создания своих шаблонов кода. На удивление не нашёл практически никакой инфы на русском и довольно мало на английском(благо есть неплохая документация) когда наткнулся на эту фичу, хотя это сильно ускоряет и помогает в разработке. И сейчас когда дошли руки решил написать небольшую статью об этом. Возможно опытным программистам она мало чем поможет, они и сами смогут разобраться во всём или же уже давно это юзают, но для всех остальных считаю вполне подойдёт. Итак приступим.
Читать дальше →
Всего голосов 26: ↑25 и ↓1+24
Комментарии13

Параллельный парсинг большого количества HTML-страниц с помощью Apache Ignite (GridGain) в 200 строк кода

Время на прочтение12 мин
Количество просмотров30K
Периодически у меня появляются задачи обработать большое количество файлов. Обычно это конвертирование из одного формата в другой: XSLT-трансформация, парсинг, конвертация картинок или видео. Для решения этих проблем я приспособил фреймворк GridGain In-Memory Data Fabric. Он дает возможность делать distributed computing, MapReduce, распределенные кэши и очереди, распределенную файловую систему в памяти, перемещение кода к данным, job stealing, ускорители для Hadoop и многие другие модные ныне вещи. И все это легко и под разные операционки. Вы легко можете все это пощупать под виндовс.

Попробую рассказать о своем опыте использования на примере простенькой задачи.
Читать дальше →
Всего голосов 13: ↑11 и ↓2+9
Комментарии14

Начало работы с микросервисами в Spring Boot

Время на прочтение13 мин
Количество просмотров26K
Всем привет!

В этой статье мы продемонстрируем основные компоненты для создания RESTful микросервисов, используя реестр служб Consul, Spring Boot для всего скаффолдинга, инжекции зависимостей, Maven для сборки, а также Spring REST и Jersey/JaxRS API Java RESTful.

Основные преимущества микросервисов:

  • Микросервисы позволяют ослабить зацепленность вашего кода

  • Микросервисы позволяют различным командам работать над небольшими составляющими, используя независимые технологии, обеспечивая более безопасное и частое развертывание Spring Boot поддерживает различные реализации для создания REST API

  • Обнаружение и вызов сервисов не зависят от сервисной платформы

  • Swagger создает надежную документацию API и интерфейс вызова

Если вы еще не используете микросервисы, вы благополучно не успели в фазу ранних последователей на кривой восприятия технологии, и, вероятно, как раз самое время начинать.

Всего голосов 10: ↑7 и ↓3+4
Комментарии6

Использование возможностей Groovy DSL для конфигурации Java-приложения

Время на прочтение11 мин
Количество просмотров11K

Предыстория


Всем привет! Я хотел бы рассказать историю о страшных конфигах и как их удалось причесать и сделать вменяемыми. Я работаю над довольно большим и относительно старым проектом, который постоянно допиливается и разрастается. Конфигурация задается с помощью маппинга xml-файлов на java-бины. Не самое лучшее решение, но оно имеет свои плюсы — например, при создании сервиса можно передать ему бин с конфигурацией, отвечающий за его раздел. Однако, есть и минусы. Самый существенный из них — нет нормального наследования профилей конфигурации. В какой-то момент я осознал, что для того, чтобы поменять одну настройку, я должен отредактировать около 30 xml-файлов, по одному для каждого из профилей. Так больше продолжаться не могло, и было принято волевое решение все переписать.


Требования


  • Наследование и переопределение (или fallback). Должна быть возможность задать некий базовый профиль, унаследовать от него дочерние и переопределить или добавить в них те места, которые необходимо
  • Маппинг в java-бины. Переписывать по всему проекту использование конфигурации с бинов на проперти вида mongodb.directory.host не хотелось, использовать map-ы из map-ов тоже.
  • Возможность писать в конфиге комментарии. Не критично, но удобно и приятно.

Хотелось бы, чтобы конфиг выглядел примерно так:


Типичный DSL-скрипт на groovy
name = "MyTest"
description = "Apache Tomcat"

http {
    port = 80
    secure = false
}
https {
    port = 443
    secure = true
}

mappings = [
        {
            url = "/"
            active = true
        },
        {
            url = "/login"
            active = false
        }
]

Как я этого добился — под катом.

Читать дальше →
Всего голосов 15: ↑15 и ↓0+15
Комментарии19

Java и Project Reactor

Время на прочтение13 мин
Количество просмотров70K


Всем привет! Меня зовут Лёха, и я работаю бэкенд-разработчиком в FunCorp. Сегодня мы поговорим про реактивное программирование, библиотеку Reactor и немного про веб.


Реактивное программирование часто «подвергается упоминанию», но если вы (как и автор статьи) всё ещё не знаете, что это такое — устраивайтесь поудобнее, попробуем разобраться вместе.

Читать дальше →
Всего голосов 43: ↑43 и ↓0+43
Комментарии15

Знакомство с реактивными потоками – для Java-разработчиков

Время на прочтение12 мин
Количество просмотров22K
Привет, Хабр!

Сегодня мы вернемся к одной из тем, затрагиваемых в нашей замечательной книге "Реактивные шаблоны проектирования". Речь пойдет об Akka Streams и потоковой передаче данных в целом — в книге Роланда Куна этим вопросам посвящены главы 10 и 15-17.
Читать дальше →
Всего голосов 12: ↑12 и ↓0+12
Комментарии4

Как подписать сообщение алгоритмом ГОСТ Р 34.11/34.10-2001 на Java

Время на прочтение3 мин
Количество просмотров13K
В этот статье я расскажу, как подписать произвольное сообщение приватным ключом и сертификатом по алгоритму ГОСТ Р 34.11/34.10-2001 присоединённой (attached) подписью на языке Java.

Для проекта электронного документооборота мне потребовалось сделать подпись алгоритмом ГОСТ. Несмотря на то, что появился он давным-давно, к своему удивлению, я не смог найти в сети ни одного завершённого примера, который бы получал на вход сообщение, ключ и сертификат, а на выходе давал бы подписанное сообщение.

Все найденные примеры или использовали стороннее платное ПО КриптоПро, или не собирались с современными версиями Java, или подписанные сообщения потом не валидировались.

В общем, я потратил много времени, чтобы разобраться, и решил, что полный готовый пример кому-нибудь да пригодится.
Читать дальше →
Всего голосов 5: ↑5 и ↓0+5
Комментарии5

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность