Search
Write a publication
Pull to refresh
198
0
Сергей Новоградцев @snipsnap

Java разработчик

Send message

Ревью кода в распределенной команде

Reading time12 min
Views42K


Здесь описаны мои исследования, как сделать ревизию кода в команде более приятным занятием, которое может дать новый опыт всем участникам. У нас полностью географически распределённая команда, все коммуникации выполняются через интернет, и зачастую асинхронно. Мы используем Trello для описания возможностей продуктов, поодиночке создаём код, отправляем в GitHub пулл-реквесты, а также пользуемся встроенной в GitHub функцией их ревью. Это отличается от просмотра кода лицом к лицу в офисе и даже по видеочату.

Если не подходить к делу всерьёз, то асинхронная и письменная ревизия кода может стать причиной катастрофы в команде, приведя к ухудшению взаимодействия и сотрудничества. Но если все участники будут стараться делать всё хорошо, то такой подход может работать очень эффективно.
Читать дальше →

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

Reading time7 min
Views19K
Мне на глаза попался документ с правилами и рекомендациями по процессу ревью кода внутри компании. Я решил, что такой полезной информацией надо поделиться с внешним миром. С благословения автора я публикую работу.


Читать дальше →

Механизм представлений — особая кубинская магия

Reading time8 min
Views6.7K

КПДВ


Представления, или views, это одна из концепций платформы CUBA, не самая расхожая в мире веб-фреймворков. Понять её — значит уберечь себя от глупых ошибок, когда из-за неполностью подгруженных данных приложение внезапно перестает работать. Давайте посмотрим, что представляют из себя представления (каламбур) и почему это на самом деле удобно.


Проблема незагруженных данных


Возьмём предметную область попроще и рассмотрим проблему на её примере. Предположим, у нас есть сущность Customer, которая ссылается на сущность CustomerType в отношении много-к-одному, иными словами, покупатель имеет ссылку на некий тип, его описывающий: например, "дойная корова", "грубиян" и т.п. Сущность CustomerType имеет атрибут name, в котором хранится имя типа.


И, наверное, все новички (а то и продвинутые пользователи) в CUBA рано или поздно получали такую ошибку:


IllegalStateException: Cannot get unfetched attribute [type] from detached object com.rtcab.cev.entity.Customer-e703700d-c977-bd8e-1a40-74afd88915af [detached].


Ошибка Cannot get unfetched attribute в CUBA UI


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


Что такое представление?


Представление в CUBA — это, по сути, набор столбцов в базе данных, которые должны быть загружены вместе единым запросом.

Читать дальше →

TensorFlow.js и clmtrackr.js: отслеживание направления взгляда пользователя в браузере

Reading time12 min
Views23K
Автор статьи, перевод которой мы публикуем, предлагает поговорить о решении задач из сферы компьютерного зрения исключительно средствами веб-браузера. Решить подобную задачу не так уж и трудно благодаря JavaScript-библиотеке TensorFlow. Вместо того, чтобы обучать собственную модель и предлагать её пользователям в составе готового продукта, мы дадим им возможность самостоятельно собрать данные и обучить модель прямо в браузере, на собственном компьютере. При таком подходе серверная обработка данных совершенно не нужна.


Испытать то, созданию чего посвящён этот материал, можно здесь. Вам для этого понадобится современный браузер, веб-камера и мышь. Вот исходный код проекта. Он не рассчитан на работу на мобильных устройствах, автор материала говорит, что у него не было времени на соответствующие доработки. Кроме того, он отмечает, что рассматриваемая тут задача усложнится в том случае, если придётся обрабатывать видеопоток с движущейся камеры.
Читать дальше →

Первый байндинг для Exonum: почему мы выбрали Java

Reading time6 min
Views5.4K
Ядро нашего фреймворка для разработки приватных блокчейнов Exonum написано на Rust, поскольку этот ЯП ориентирован на безопасность работы с памятью. Однако наряду со многими преимуществами, Rust имеет ряд особенностей, усложняющих «взаимодействие» с ним: его синтаксис непривычен для многих разработчиков, а порог вхождения довольно высок.

Чтобы упростить работу с платформой Exonum и сделать её более доступной для аудитории, мы решили написать байндинг-библиотеку. Языком для байндинга стал Java.

Почему мы выбрали Java, рассказываем под катом.

Читать дальше →

«Научиться Spring — бессмысленное занятие» — Джош Лонг, главный евангелист Spring о внутренней кухне проекта

Reading time19 min
Views24K

Сегодня у нас в виртуальной студии самый известный в мире докладчик по Spring — Джош Лонг.


Именно его докладами открываются Java-конференции по всему миру. Именно он отвечает на вопросы сообщества, делает Spring Tips на YouTube, именно его «This week in Spring» мы читаем каждую неделю и многое другое.


Кстати, Джош разрешил использовать все материалы в нашем собственном «This week in Java», но он делает их в таком объеме и глубине, что эти данные ни разу не получилось сжать до формата «дайджеста на 15 минут».


Иногда кажется, что он находится во всех городах одновременно, читает доклады и пишет статьи в один момент. Сегодня мы будем разбираться, как это у него получается. Узнаем про «юргенизацию кода», причины удивительной живучести Spring и то, как он умудрился прожить столько лет без глобальных переписываний всего с нуля и другие интересные фишки.




Участники


Josh Long, Spring Developer Advocate at Pivotal


Евгений Трифонов, Олег Чирухин — редакция JUG.ru Group

Читать дальше →

Потоковая передача данных из REST сервиса в MQ очередь

Reading time7 min
Views21K
Привет, Хабр!

В статье я опишу способ разработки REST сервиса, позволяющего принимать файлы и сохранять их в систему обмена сообщениями в потоковом режиме без необходимости хранения всего файла на стороне сервиса. Также будет описан обратный сценарий, при котором клиент будет получать в качестве ответа файл, размещенный в системе обмена сообщениями.

Для наглядности я приведу примеры кода разработанного сервиса на JEE7 под сервер приложений IBM WebSphere Liberty Server, а в качестве системы обмена сообщениями будет выступать IBM MQ.
Тем не менее, описанный метод подходит и для других аналогичных платформ, т.е. в качестве системы обмена сообщений может выступать любой поставщик JMS API, а в качестве сервера приложений любой JEE сервер (например, Apache Tomcat).
Читать дальше →

Как это сделано: пишем «Сапера» за 4 минуты

Reading time4 min
Views49K
image

От переводчика: этот пост — перевод оригинальной статьи Маки Чиза, опытного кодера, который не только пишет классные программы, но и демонстрирует возможности различных языков своим коллегам, как новичкам, так и профессионалам.

«Сапер» — веселая игра, многие из нас в нее играют. Может быть, вы хотите сделать «Сапера» сами?
Читать дальше →

Загубить производительность

Reading time17 min
Views19K

Эта заметка является писанной версией моего доклада "Как загубить производительность с помощью неэффективного кода" с конференции JPoint 2018. Посмотреть видео и слайды можно на странице конференции. В расписании доклад отмечен обидным стаканчиком смузи, так что ничего сверхсложного не будет, это скорее для начинающих.


Предмет доклада:


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

В кулуарах мне указали на некоторые неточности/упущения в докладе, они здесь отмечены. Замечания также приветствуются.

Читать дальше →

Как это работает в мире java. ConcurrentMap

Reading time11 min
Views42K

Основной принцип программирования гласит: не изобретать велосипед. Но иногда, чтобы понять, что происходит и как использовать инструмент правильно, нам необходимо это делать. Сегодня изобретаем ConcrurrentHashMap.


Сперва нам понадобятся 2 вещи. Начнем с 2х тестов — первый скажет, что у нашей реализации нет data races (на самом деле нам нужно проверить, правилен ли наш тест также путем тестирования заведомо некорректной реализации), второй тест мы будем использовать для тестирования производительности с точки зрения throughput.


Читать дальше →

Слово на букву «М», или Монады уже здесь

Reading time8 min
Views42K


Про монаду ходит множество мемов и легенд. Говорят, что каждый уважающий себя программист в ходе своего функционального возмужания должен написать хотя бы один туториал про монаду — недаром на сайте языка Haskell даже ведётся специальный таймлайн для всех отважных попыток приручить этого таинственного зверя. Бывалые разработчики поговаривают также и о проклятии монад — мол, каждый, кто постигнет суть этого чудовища, начисто теряет способность кому-либо увиденное объяснить. Одни для этого вооружаются теорией категорий, другие надевают космические костюмы, но, видимо, единого способа подобраться к монадам не существует, иначе каждый программист не выдумывал бы свой собственный.

Действительно, сама концепция монады неинтуитивна, ведь лежит она на таких уровнях абстракции, до которых интуиция просто не достаёт без должной тренировки и теоретической подготовки. Но так ли это важно, и нет ли другого пути? Тем более, что эти таинственные монады уже окружают многих ничего не подозревающих программистов, даже тех, кто пишет на языках, никогда не считавшихся «функциональными». Действительно, если приглядеться, то можно обнаружить, что они уже здесь, в языке Java, под самым нашим носом, хотя в документации по стандартной библиотеке слово «монада» мы едва ли найдём.

Именно поэтому важно если не постичь глубинную суть этого паттерна, то хотя бы научиться распознавать примеры использования монады в уже существующих, окружающих нас API. Конкретный пример всегда даёт больше, чем тысяча абстракций или сравнений. Именно такому подходу и посвящена эта статья. В ней не будет теории категорий, да и вообще какой-либо теории. Не будет оторванных от кода сравнений с объектами реального мира. Я просто приведу несколько примеров того, как монады уже используются в знакомом нам API, и постараюсь дать читателям возможность уловить основные признаки этого паттерна. В основном в статье пойдёт речь о Java, и ближе к концу, чтобы вырваться из мира legacy-ограничений, мы немного коснёмся Scala.
Читать дальше →

Как автоматизировать создание виртуальных машин? Рассказываем подробно

Reading time16 min
Views19K
Создание новой виртуальной машины — это рутина, отнимающая много времени. И чем больше инфраструктура и организация, тем больше процедур, связанных с этим процессом. Мы автоматизировали это процесс с помощью PowerShell.

Добро пожаловать под кат, если вам это интересно.



Читать дальше →

JRebel

Reading time8 min
Views39K
На Хабре несколько раз публиковались статьи, где JRebel либо просто упоминался, либо выкладывалась информация, что вышла новая версия. При этом, не всем читателям было понятно, о чём вообще речь, и как данное ПО работает.

Как непосредственному участнику разработки данного продукта, мне хотелось бы прояснить некоторые моменты, почему JRebel существует и как он может помочь Java-разработчику.

Откуда ноги растут?



Изначальная проблема известна практически любому разработчику, который работает с Java: после каких-либо изменений в проекте, для того, чтобы увидеть результат, тратится довольно много времени на сборку и развёртывание в контейнере. На Хабре уже публиковались отличные статьи о том, как можно ускорить или автоматизировать процесс разработки, не стану повторяться. Но дело в том, что в упомянутых способах есть свои изъяны: далеко не все изменения возможно перегрузить в развёрнутом приложении штатными средствами; очень легко получить утечки памяти, которые приведут к надобности перезапуска контейнера. Технические детали хорошо расписаны в серии статей в нашем сайте — любопытных приглашаю почитать.

Куда уходит время?


Как выглядит цикл разработки web-приложения, в классическом виде:
1. Сделали изменения в коде (или в ресурсах)
2. Собрали JAR/WAR/EAR
3. Развернули полученный архив в контейнере
4. Открыли развёрнутое приложение, и, после некоторых манипуляций увидели результаты своего труда.

В зависимости от размера приложения, используемого контейнера, и некоторых других факторов, этапы 2, 3 и 4 могут занимать от нескольких секунд, до совершенно невменяемых цифр. Наша компания проводила опрос разработчиков относительно используемых технологий и времени которое затрачивается на развёртывание приложения. Как оказалось, в среднем на развёртывание тратится около 3 минут за раз, и около 10 минут в час. В плачевных случаях, где на развёртывание уходит более получаса, нет даже смысла спрашивать у человека, сколько раз в час он может повторить этот процесс. Ответ очевиден.

Когда перезапуск контейнера/приложения занимает считанные секунды, проблема, описанная выше, не ощущается так сильно. Однако, по мере роста и усложнения проекта, неудобства дадут о себе знать. Тут-то и можно задуматься: может быть, JRebel — это то, что вам нужно?
Читать дальше →

Как заработать на хостерах

Reading time5 min
Views11K
Когда я писал свой проект Поиск VPS, то не сильно задумывался о его монетизации. В голове летали только стандартные мысли — повесить Яндекс.Директ или Google AdWords. До того момента я, естественно, знал о партнерских программах хостеров, но не думал, что на них можно много заработать: все-таки программа предполагает, что пользователь будет приводить своих друзей, количество которых у всех ограничено.


— Тащить их трудно…
— Сделать миллион узелков было еще труднее!

Читать дальше →

CloudFlare реализовала поддержку Encrypted SNI

Reading time2 min
Views15K
24 сентября CloudFlare объявили о поддержке расширения TLS 1.3 Encrypted SNI.

image

Преимущества ESNI

  • Никто не видит на какой домен вы заходите. Все что знает провайдер это только IP адрес на который вы обращаетесь.
  • Domain Fronting не нужен.

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

В современном интернете на одном IP адресе может располагаться множество различных доменов. Чтобы предоставить вам верный сертификат серверу необходимо знать на какой именно домен вы обращаетесь. Поэтому hostname передается открытым текстом, до начала установления TLS сессии.
Читать дальше →

Роскомнадзор и Телеграм боты через прокси

Reading time2 min
Views72K

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

Читать дальше →

Для чего хакерам Микротик и как я спрятал 100 тыс. RouterOS от ботнета

Reading time9 min
Views338K
RouterOS очень мощный инструмент в руках профессионалов и ответственных специалистов. Но в руках новичков или тех, кто делает всё на «и так сойдёт» Mikrotik начинает жить своей жизнью и превращается в ноду ботнета.

Ещё в мае 2018 я писал статью с рекомендациями как защитить свой Микротик.

Как ни странно, но в сети до сих пор тысячи «открытых» роутеров Mikrotik и армия ботнета пополняется.

Я в свободное от работы и отдыха время искал уязвимые устройства по всей сети и делал настройки в соответствии со своими рекомендациями, то есть добавлял правила фаервола, которые закрывали доступ к роутеру не из локальной сети. В комментариях писал информацию об уязвимости и оставлял адрес телеграм-канала @router_os, где можно было мне задать интересующие вопросы (у нормального админа они должны были появиться).



С мая по сегодняшний день я «вырвал» из лап ботнета более 100 тысяч устройств Mikrotik.

Учитывая то, что я не могу выступить на MUM 2018 в Москве, то свой доклад я решил опубликовать на habr.com
Читать дальше →

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

Reading time18 min
Views57K

Screenagers — так с недавних пор в Америке называют подростков. Это слово образовано из двух английских слов: screen (экран) и teenager (тинейджер). Ведь нынешние подростки уже выросли с телефоном в руках.

В 2016 году там же в Америке сняли документальный фильм с таким названием, его и по сей день показывают родителям и детям по всему миру. В нем наглядно представлены последствия длительного и бесконтрольного использования гаджетов, как они влияют не только на жизнь ребенка, но и на его здоровье.

В Россию массовое использование гаджетов пришло позже, но на сегодняшний день мы уже догоняем Америку по количеству времени, которое проводим в интернете. А это значит, что данная проблема касается уже нас и наших детей.
Читать дальше →

«Истина в последней инстанции» или зачем нужен Database First Design

Reading time9 min
Views14K

В этой весьма запоздалой статье я объясню почему, по моему мнению, в большинстве случаев при разработке модели данных приложения необходимо придерживаться подхода "database first". Вместо "Java[любой другой язык] first" подхода, который выведет вас на длинную дорожку, полную боли и страданий, как только проект начнет расти.


image
"Слишком занят, чтобы стать лучше" Licensed CC by Alan O’Rourke / Audience Stack. Оригинальное изображение

Читать дальше →

Обзор вакуумного формовщика Mayku FormBox: пусть детали размножаются

Reading time5 min
Views21K


3D-печать всем хороша, но есть одно “но” — это занятие для терпеливых. А что, если вы сможете быстро тиражировать однажды напечатанную модель многократно?

Сегодня мы рассказываем про Mayku FormBox — настольный вакуумный формовщик, который поможет выпускать небольшие тиражи ваших 3D-принтов значительно быстрее.

Information

Rating
Does not participate
Location
Kassel, Hessen, Германия
Registered
Activity