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

Пользователь

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

Так что же не так с поиском работы/работников в ИТ?

Время на прочтение12 мин
Количество просмотров42K
Уже которую неделю один многоуважаемый ИТ-ресурс не отпускают бурления по поводу найма в ИТ. Хотя нет, правильно — «уже который год». Среди участников этих крайне бурных обсуждений есть два устойчивых лагеря, которые всё никак не найдут взаимопонимания.

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

Читать дальше →
Всего голосов 70: ↑60 и ↓10+50
Комментарии241

Валидация в Java-приложениях

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

Этот текст посвящен различным подходам к валидации данных: на какие подводные камни может наткнуться проект и какими методами и технологиями стоит руководствоваться при валидации данных в Java-приложениях.


Validation


Я часто видел проекты, создатели которых вообще не утруждались выбором подхода к валидации данных. Команды работали над проектом под невероятным давлением в виде сроков и размытых требований, и в итоге у них просто не оставалось времени на точную, последовательную валидацию. Поэтому, код валидации у них разбросан повсюду: в сниппетах Javascript, контроллерах экранов, в бинах бизнес-логики, сущностях предметной области, триггерах и database constraints. В этом коде было полно операторов if-else, он выбрасывал кучу исключений, и попробуй разберись, где там у них валидируется этот конкретный кусок данных… Как результат, по мере развития проекта становится тяжело и дорого соблюдать и требования (зачастую довольно путаные), и единообразие подходов к валидации данных.


Так есть ли какой-то простой и изящный способ валидации данных? Способ, который защитит нас от греха нечитаемости, способ, который соберет всю логику валидации воедино, и который уже создан за нас разработчиками популярных Java-фреймворков?


Да, такой способ существует.

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

Почему перенос при целочисленном переполнении — не очень хорошая идея

Время на прочтение11 мин
Количество просмотров14K
Эта статья посвящена неопределённому поведению и оптимизациям компилятора, особенно в контексте знакового целочисленного переполнения.

Примечание от переводчика: в русском языке нет четкого соответствия в употребляемом контексте слова «wrap»/«wrapping». Существует математический термин "перенос", который близок к описываемому явлению, а термин "флаг переноса" (carry flag) — механизм выставления флага в процессорах при целочисленном переполнении. Другим вариантом перевода может быть фраза «вращение/переворот/оборот вокруг нуля». Она лучше отображает смысл «wrap» по сравнению с «перенос», т.к. показывает переход чисел при переполнении из положительного в отрицательный диапазон. Однако, как оказалось, эти слова смотрятся в тексте непривычно для тестовых читателей. Для упрощения в дальнейшем примем в качестве перевода термина «wrap» слово «перенос».

Компиляторы языка C (и C++) в своей работе всё чаще руководствуются понятием неопределённого поведения — представлением о том, что поведение программы при некоторых операциях не регламентировано стандартом и что, генерируя объектный код, компилятор вправе исходить из предположения, что программа таких операций не производит. Немало программистов возражало против такого подхода, поскольку сгенерированный код в этом случае может вести себя не так, как задумывал автор программы. Эта проблема становится всё острее, так как компиляторы применяют всё более хитроумные методы оптимизации, которые наверняка будут опираться на понятие неопределённого поведения.
Читать дальше →
Всего голосов 30: ↑29 и ↓1+28
Комментарии24

Кеширование данных — Java Spring

Время на прочтение6 мин
Количество просмотров43K
Многократно вычитывая одни и те же данные, встает вопрос оптимизации, данные не меняются или редко меняются, это различные справочники и др. информация, т.е. функция получения данных по ключу — детерминирована. Тут наверно все понимают — нужен Кеш! Зачем всякий раз повторно выполнять поиск данных или вычисление?

Так вот здесь я покажу как делать кеш в Java Spring и поскольку это тесно связанно скорее всего с Базой данных, то и как сделать это в СУБД на примере одной конкретной.

Содержание

  • Кеш в Spring
  • Кеш в Oracle PL-SQL функции
Читать дальше →
Всего голосов 11: ↑10 и ↓1+9
Комментарии5

Бесполезный отложенный неблокирующий обмен сообщениями в MPI: лайт-аналитика и туториал для тех, кто немножечко «в теме»

Время на прочтение13 мин
Количество просмотров4.3K
Совсем недавно мне пришлось решать очередную тривиальную учебную задачу от своего преподавателя. Однако, решая ее, мне удалось обратить внимание на вещи о коих я ранее вовсе не задумывался, возможно, не задумывались и Вы. Эта статья скорее будет полезна студентам да и всем, кто начинает свой путь в мир параллельного программирования с использованием MPI.



Наше «Дано:»


Итак, суть нашей, в сущности вычислительной задачи, заключается в том, чтобы сравнить во сколько раз программа, использующая неблокирующие отложенные двухточечные передачи быстрее той, что использует блокирующие двухточечные передачи. Измерения будем проводить для входных массивов размерностью 64, 256, 1024, 4096, 8192, 16384, 65536, 262144, 1048576, 4194304, 16777216, 33554432 элементов. По умолчанию предлагается решать ее четырьмя процессами. А вот, собственно, и то, что мы будем считать:

Читать дальше →
Всего голосов 13: ↑11 и ↓2+9
Комментарии6

Проверка данных — Java & Spring Validation

Время на прочтение14 мин
Количество просмотров127K
Проверка данных класса (bean) в java тема не новая, но актуальная и здесь я объединю различные аспекты: валидацию данных в рамках JSR-303, покажу как это сделать чисто в Java и с использованием Spring, как делать в стандартном приложении и в Web.

Содержание: Валидация данных (JSR-303) в

  • стандартном Java приложении
  • c использованием Spring
  • объединение Java + Spring
  • Spring MVC
Читать дальше →
Всего голосов 12: ↑11 и ↓1+10
Комментарии2

Релизим проект на Java с Maven на новый лад

Время на прочтение3 мин
Количество просмотров6.3K
Все мы давно уже привыкли к Maven, к версионности предложенной им и управлению зависимостями. Maven появился на свет, когда ежедневная сборка проекта была уделом самых смелых, когда считалось нормальным релизиться хотя-бы пару раз в год, Jenkins тогда еще назывался Hudson, а деревья были большими…

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

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

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

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

Далее мы попробуем изменить мир к лучшему и упростить себе жизнь.
Читать дальше →
Всего голосов 12: ↑9 и ↓3+6
Комментарии17

Храним токены авторизации безопасно

Время на прочтение6 мин
Количество просмотров40K
Привет %username%. Меня, независимо от темы доклада, на конференциях постоянно спрашивают один и тот же вопрос — «как безопасно хранить токены на устройстве пользователя?». Обычно я стараюсь ответить, но время не позволяет полностью раскрыть тему. Этой статьей я хочу полностью закрыть этот вопрос.
Читать дальше →
Всего голосов 16: ↑12 и ↓4+8
Комментарии49

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

Настройка валидации DTO в Spring Framework

Время на прочтение6 мин
Количество просмотров48K
Всем привет! Сегодня мы коснёмся валидации данных, входящих через Data Transfer Object (DTO), настроим аннотации и видимости — так, чтобы получать и отдавать только то, что нам нужно.

Итак, у нас есть DTO-класс UserDto, с соответствующими полями:

public class UserDto {

    private Long id;
    private String name;
    private String login;
    private String password;
    private String email;
}

Я опускаю конструкторы и геттеры-сеттеры — уверен, вы умеете их создавать, а увеличивать в 3-4 раза код смысла не вижу — представим, что они уже есть.

Мы будем принимать DTO через контроллер с CRUD-методами. Опять же, я не буду писать все методы CRUD — для чистоты эксперимента нам хватит пары. Пусть это будут create и updateName.
Читать дальше →
Всего голосов 8: ↑8 и ↓0+8
Комментарии22

Завещание Баффета или о чём молчат финконсультанты

Время на прочтение4 мин
Количество просмотров64K
У. Баффет завещал жене после своей смерти вложить все средства  в биржевой фонд ETF на S&P 500 (VOO) и жить в своё удовольствие. Однако книги, интернет и финконсультанты призывают нас составлять диверсифицированные портфели с обязательным включением в них облигаций. К слову, о диверсификации Баффет тоже отзывается не лестно и призывает все яйца хранить в одной корзине, просто внимательно за ней присматривать.

В данной статье мы попробуем разобраться, стоит ли верить оракулу из Омахи или прислушаться к финансовым консультантам. А поможет нам в этом Python и Quantopian.
Читать дальше →
Всего голосов 44: ↑41 и ↓3+38
Комментарии136

Использование generic wildcards для повышения удобства Java API

Время на прочтение6 мин
Количество просмотров151K
Доброго времени суток!

Этот пост для тех, кто работает над очередным API на языке Java, либо пытается усовершенствовать уже существующий. Здесь будет дан простой совет, как с помощью конструкций ? extends T и ? super T можно значительно повысить удобство вашего интерфейса.
Читать дальше →
Всего голосов 39: ↑36 и ↓3+33
Комментарии7

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

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

Наш идеал почти 9 лет был такой: собрание стоя, 15 минут максимум, минимум людей. И лучше вообще в коридоре. Не можешь решить за 15 минут — значит, что-то пошло не так. Звучит круто, правда?

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

Механика, которую нам предложили — это совещание по специальному протоколу. Оно занимает невероятно дохрена времени (4 часа на вопрос, где ушло бы наши 15 минут), навевает скуку и тоску, но если проходить по этапам, появляется ощущение, что решение всё же есть. И его можно реализовать. И оно, скорее всего, получится очень качественное: будет учитывать больше нюансов, будет поддержано теми, кому его исполнять. А это существенно сокращает срок внедрения.

Лучше пару часов потерпеть, но потом внедрить на месяц быстрее.
Читать дальше →
Всего голосов 105: ↑100 и ↓5+95
Комментарии131

Раскрытие памяти (Memory Disclosure) ядра в современных ОС

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

Под катом расположен перевод вступительной части документа Detecting Kernel Memory Disclosure with x86 Emulation and Taint Tracking (Статья Project Zero) от Mateusz Jurczyk.


В переведенной части документа:


  • специфика языка программирования C (в рамках проблемы раскрытия памяти)
  • специфика работы ядер ОС Windows и Linux (в рамках проблемы раскрытия памяти)
  • значимость раскрытия памяти ядра и влияние на безопасность ОС
  • существующие методы и техники обнаружения и противодействия раскрытия памяти ядра

Хотя в документе пристально рассматриваются механизмы общения привилегированного ядра ОС с пользовательскими приложениями, суть проблемы можно обощить для любой передачи данных между различными доменами безопасности: гипервизор — гостевая машина, привилегированный системный сервис (демон) — GUI приложение, сетевые клиент — сервер и т.д.


КДПВ

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

Очень простое объяснение принципов SOLID

Время на прочтение5 мин
Количество просмотров69K
Disclaimer: Всем можно, ну а я чем хуже?!

SOLID — это набор принципов по организации кода. Фактически они декларируют некие правила, которые помогут вам сохранить свои и чужие нервы и время. А могут и не помочь.

Попробуем разобраться в этих принципах на пальцах, без примеров кода и СМС.
Читать дальше →
Всего голосов 60: ↑53 и ↓7+46
Комментарии60

Тест памяти, убивающий ноутбуки — почти детектив

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

(UPD: помимо схем добавлена фотография платы)
(UPD2: информация из IRC-канала libreboot)


  • В RINKAN есть защита по току на 55mA, функционал можно смотреть в описании на TB62501F.
  • PMH7 — это массив вентилей ("same thing as FPGA just programmed with up to 3 metal layers, kinda like maskrom"), у Toshiba он назывался TC-200G
  • PMH7 подключен не только к EC, но и к ICH по шине LPC и выглядит с точки зрения хоста как GPIO-extender.
  • Они уверены что неиспользуемые пины PMH действительно висят в воздухе, а замыкание по пинам с большой вероятностью спалит только выходы PMH, но не LDO
  • Предполагают спонтанный выход из строя двух RINKAN по независящим друг от друга причинам (возможно, спровоцированным нагревом мат.платы в процессе мемтеста)
  • Рекомендуют менять RINKAN на такую же микросхему от ROHM: BD4175KVT-BD4176KVT-BD41760KVT, стоимость около $2
  • Согласны, что нужно провести эксперимент по запуску memtest с ограничением по току

Недавно у нас произошла душераздирающая история — за одно утро умерли два ноутбука Lenovo T500. Умер бы один — никто и разбираться не стал. Но два за одно утро — это уже слишком! Тем более, что по крайней мере один из них (и это подтверждают три пользователя!) нормально работал до последней минуты, был выключен кнопкой питания, перенесен за 100 метров в переговорку и… не включился.


Естественно, в первую очередь были опробованы все кустарные способы реанимации: заменить батарею, заменить адаптер питания… Вытащить батарею и обесточить, сбросить CMOS и так далее… Результат? Ровно ноль — ноутбуки продолжали находиться в состоянии кирпичей.


Стали восстанавливать картину событий, чтобы найти хоть какую-то зацепку. Выяснилось следующее:

Читать дальше →
Всего голосов 293: ↑292 и ↓1+291
Комментарии122

Google's Shell Style Guide (на русском)

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

Предисловие


Какой Shell использовать


Bash единственный язык shell скриптов, который разрешается использовать для исполняемых файлов.


Скрипты должны начинаться с #!/bin/bash с минимальным набором флагов. Используйте set для установки shell опций, что бы вызов вашего скрипта как bash <script_name> не нарушил его функциональности.


Ограничение всех shell скриптов до bash, дает нам согласованный shell язык, который установлен на всех наших машинах.


Единственное исключение составляет если вы ограничены условиями того под что вы программируете. Одним из примеров могут стать пакеты Solaris SVR4, для которых требуется использование обычного Bourne shell для любых скриптов.


Когда использовать Shell


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


Хотя shell-скриптинг не является языком разработки, он используется для написания различных утилит во всем Google. Это руководство по стилю является скорее признанием его использования, а не предложением использовать его в широком применении.

Читать дальше →
Всего голосов 31: ↑30 и ↓1+29
Комментарии10

Рефакторинг с использованием C++17 std::optional

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


В разработке существует множество ситуаций, когда вам надо выразить что-то с помощью "optional" — объекта, который может содержать какое-либо значение, а может и не содержать. Вы можете реализовать опциональный тип с помощью нескольких вариантов, но с помощью C++17 вы сможете реализовать это с помощью наиболее удобного варианта: std::optional.


Сегодня я приготовил для вас одну задачу по рефакторингу, на который вы сможете научиться тому, как применять новую возможность C++17.


Вступление


Давайте быстро погрузимся в код.


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

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

Джон Кармак: Мои истории о Стиве Джобсе

Время на прочтение6 мин
Количество просмотров30K
Однажды моя жена спросила меня «Почему ты бросаешь то, чем ты занимаешься, когда Стив Джобс просит тебя сделать что-то для него? Для всех остальных ты так не делаешь».

Действительно, здесь есть над чем задуматься.

В юности я был поклонником компьютера Apple, Джобс и Возняк были для меня почитаемыми людьми, а желание иметь Apple 2 было определяющей чертой моего детства на протяжении нескольких лет. Годами позже, когда я впервые увидел компьютер NeXT на компьютерной выставке — в те времена, когда я уже продавал свое первое коммерческое ПО — он показался мне взглядом в будущее (но ценник был более чем в 10 000 $ — нехило!).

Когда Id Software стала успешной благодаря Commander Keen и Wolfenstein 3D, первой личной серьезной покупкой для меня стал не автомобиль — это был компьютер NeXT. Как вскоре выяснилось, для разработки нашего ПО он оказался весьма полезен, и в итоге мы перевели на оборудование NeXT всю нашу компанию.

Нам так нравились наши NeXT-ы, что мы хотели выпустить Doom со специальным логотипом «Разработано на компьютерах NeXT» на заставке. Однако, когда мы попросили разрешения на подобный шаг, нам было отказано.

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

Годы спустя, основываясь на своих наблюдениях и косвенных свидетельствах, я пришел к выводу, что в глубине души Стив никогда не был высокого мнения об играх — и что он всегда хотел, чтобы игры не имели настолько большого значения для его платформ, какое они занимали на самом деле. Я никогда не принимал это лично на свой счет.
Читать дальше →
Всего голосов 77: ↑71 и ↓6+65
Комментарии16

Как передать полиморфный объект в алгоритм STL

Время на прочтение4 мин
Количество просмотров11K
Как мы можем прочесть в первой главе книги Effective C++, язык С++ является по сути своей объединением 4 разных частей:

  • Процедурная часть, доставшаяся в наследство от языка С
  • Объектно-ориентировання часть
  • STL, пытающийся следовать функциональной парадигме
  • Шаблоны

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

image
Читать дальше →
Всего голосов 36: ↑34 и ↓2+32
Комментарии8

Информация

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