Pull to refresh
10
0

Senior Software Developer

Send message

Стажёр Вася и его истории об идемпотентности API

Reading time11 min
Views222K

Идемпотентность — звучит сложно, говорят о ней редко, но это касается всех приложений, использующих API в своей работе.


Меня зовут Денис Исаев, и я руковожу одной из бэкенд групп в Яндекс.Такси. Сегодня я поделюсь с читателями Хабра описанием проблем, которые могут возникнуть, если не учитывать идемпотентность распределенных систем в своем проекте. Для этого я выбрал формат вымышленных историй о стажёре Васе, который только-только учится работать с API. Так будет нагляднее и полезнее. Поехали.


image

Читать дальше →
Total votes 219: ↑216 and ↓3+213
Comments163

Как стоит и как не стоит использовать HttpClient в .NET

Level of difficultyMedium
Reading time10 min
Views13K

Всем привет! Меня зовут Андрей Федотов, я бэкенд-разработчик в одной из команд платформы интернета вещей ZIIoT Oil&Gas. В этой статье я рассказываю, что нужно знать и как работать с HttpClient в .NET, чтобы не получить трудноподдерживаемый и сложный код и не нарваться на глобальный рефакторинг.

Читать далее
Total votes 15: ↑11 and ↓4+7
Comments17

Аксиома выбора и принципиальные ограничения человеческого разума

Reading time6 min
Views26K

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

На мой взгляд, у философии должен быть конкретный объект рассмотрения: бесконечности в теории множеств, трансфинитные числа, теории и доказуемость, гипотеза математической вселенной Макса Тегмарка. И тогда есть реальный прогресс (например, теорема Геделя), а слова просто облегают каркас, задаваемый конкретикой. Иначе получается попытка построить конструкцию из жидкой манной каши, какой-то интеллектуальный онанизм.

Георг Кантор, положивший начало теории множеств и открывший разницу типов мощностей (по-английски cardinalities), на мой взгляд, куда больший философ, чем Кант и Гегель. Вы можете не вынимать ложечку из чашки кофе, когда пьете его и съедать яблоко с огрызком, но знать отличие счетного множества от континуума обязаны, если вы связаны с IT или любой технической сферой.

Одной из интересных в философском плане вещей является знаменитая (в узких кругах) Аксиома Выбора (AC) - внешне совершенно безобидная, но с чудовищными последствиями. Аксиома утверждает, что, если существуют два непустых множества, то существует и множество, содержащее ровно по одному элементу из обоих.

Читать далее
Total votes 51: ↑48 and ↓3+45
Comments454

Проблема останова лжеца Гёделя и брадобрея Кантора

Reading time12 min
Views15K

Здравствуйте, меня зовут Дмитрий Карловский. А вы на канале Core Dump, где мы берём различные темы из компьютерной науки и деконструируем их по полочкам.


А на этот раз мы разберём тему "абсурда" — почему он возникает и к каким странным последствиям приводит неосторожное обращение с ним. Докажем, что Санты не существует. Научимся пересчитывать линейки. Остановим временную петлю. И элегантно преодолеем столетний кризис оснований математики.


Так что забирайтесь в кроличью нору — вас ждёт короткое, но увлекательное приключение.



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

Читать дальше →
Total votes 67: ↑49 and ↓18+31
Comments173

MVCC in PostgreSQL-4. Snapshots

Reading time9 min
Views6.3K
After having discussed isolation problems and having made a digression regarding the low-level data structure, last time we explored row versions and observed how different operations changed tuple header fields.

Now we will look at how consistent data snapshots are obtained from tuples.

What is a data snapshot?


Data pages can physically contain several versions of the same row. But each transaction must see only one (or none) version of each row, so that all of them make up a consistent picture of the data (in the sense of ACID) as of a certain point in time.

Isolation in PosgreSQL is based on snapshots: each transaction works with its own data snapshot, which «contains» data that were committed before the moment the snapshot was created and does not «contain» data that were not committed by that moment yet. We've already seen that although the resulting isolation appears stricter than required by the standard, it still has anomalies.
Read more →
Total votes 4: ↑4 and ↓0+4
Comments0

Как попробовать ELK-стек за один вечер и наконец-то перестать grep'ать логи

Reading time8 min
Views67K

Как часто вы, в очередной раз матерясь и grep'ая простыню текста, говорили себе, что вот-вот перестанете хранить логи в файлах и переедете на ELK?

Я - часто, а виной тому кажущаяся сложность настройки всей системы в целом.

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

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

В данной статье мы: разберем компоненты ELK стека и развернем его одной командой; законфижим Filebeat и научим его собирать и отправлять логи; рассмотрим интерфейс Kibana и научимся искать по логам; настроим Kibana и разберемся с правами доступа; поговорим об индексах, шаблонах и об автоудалении индексов (неактуальных логов);

Читать далее
Total votes 15: ↑13 and ↓2+11
Comments20

Зачем нужен Refresh Token, если есть Access Token?

Reading time4 min
Views228K
Недавно мы в Voximplant улучшали авторизацию в SDK. Посмотрев на результаты, я несколько опечалился, что вместо простого и понятного токена их стало две штуки: access token и refresh token. Которые мало того что надо регулярно обновлять, так еще документировать и объяснять в обучающих материалах. Помня, что в OAuth два токена нужны в основном из-за разных сервисов, на которых они используются (даже вопрос на stackoverflow есть), а у нас такой сервис один, я несколько офигел и пошел на второй этаж вытрясать души из разработчиков. Ответ получился неожиданным. Его нет на stackoverflow. Зато он есть под катом.
Читать дальше →
Total votes 74: ↑70 and ↓4+66
Comments296

Добавляем Refresh Token

Reading time4 min
Views127K


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

Читать дальше →
Total votes 21: ↑19 and ↓2+17
Comments26

Компактная реализация RSA для встраиваемых применений

Reading time15 min
Views59K
RSA является широкоизвестным алгоритмом шифрования с открытым ключом. На его основе, кроме асимметричного шифрования, можно также реализовать электронную подпись (ЭЦП). Эти возможности привлекательны для встраиваемых систем, микроконтроллеров. Сам метод шифрования с виду чрезвычайно прост:
C = (Me) mod n (1)
где C,M,e,n — целые числа, M — открытый текст, числа e и n представляют собой открытый ключ, C — шифротекст. mod — остаток от деления.

Расширование выглядит столь же просто:
M = (Cd) mod n (2)
где C,M,n играют ту же роль, что и при шифровании, d — закрытый ключ.

При этом n=p*q, где p и q — простые числа (секретные), e обычно равно 65537, d вычисляется на основе e, p и q. Криптостойкость основана на том, что для достаточно больших p и q задача разложения n на множители или обращения формулы шифрования без знания p и q не решается за приемлемое время.

Но эта кажущаяся простота обманчива. За ней скрывается огромное количество деталей и сложностей реализации. Особенно если стоит цель получить эффективную по быстродействию и памяти реализацию, пригодную для применения в микроконтроллерах. Я не нашел в интернете подходящих библиотек, а попытки изучения исходников libgcrypt заводят в такие дебри, из которых не выберешься. Поэтому я написал свою компактную библиотеку, которой и делюсь с уважаемыми читателями.
Читать дальше →
Total votes 33: ↑31 and ↓2+29
Comments29

Хватит использовать RSA

Reading time9 min
Views53K


Привет, %username%!

RSA — первый широко используемый алгоритм асимметричной криптографии, который до сих пор популярен в индустрии. Он относительно прост, на первый взгляд. Шифрование и подпись RSA можно посчитать на листке бумаги, чем часто занимаются студенты на лабораторных работах.
Но существует просто огромное количество нюансов, без учёта которых вашу реализацию RSA сможет взломать даже ребёнок.
Читать дальше →
Total votes 40: ↑40 and ↓0+40
Comments45

Как решали шашки

Reading time14 min
Views37K

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


image

Марион Тинсли – профессор математики, священник, лучший игрок в шашки в мире – сидел за столом напротив компьютера и умирал.

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

Его оппонентом был "Chinook" («Шинук»), программа, играющая в шашки, созданная Джонатаном Шеффером, человеком с вьющимися волосами, пухлым, занимающим должность профессора Альбертского университета. В тот день он управлял машиной. Благодаря маниакальной работе над «Шинук», она стала очень хорошим игроком. Она не проиграла ни одной игры за последние 125 игр – и с тех пор, когда они близко подошли к победе над Тинсли в 1992 году, Шеффер с командой потратили тысячи часов на улучшение программы.
Читать дальше →
Total votes 56: ↑52 and ↓4+48
Comments18

Поиск утечек памяти в приложениях на .NET Core под Linux

Reading time7 min
Views12K

.NET Core становится всё более и более зрелой платформой. На нём уже достаточно комфортно можно вести разработку, используя тот же Rider или VS Code.


Однако, и там не всё гладко. Например, отладка кода на .NET Core 2 заработала только в Rider 2017.2, который вышел, буквально на днях (были ещё EAP сборки). Приходилось пользоваться VS Code. В нём работает отладка, однако, чтобы заработал запуск тестов надо руками ставить beta-версию расширения для C#.


Я думаю, суть ясна, что инструментальная поддержка пока сильно далека от аналогичной при разработке под Windows.


Для некоторых вещей пока нету готовых средств. Например, для профилирования.


Из источников, которые доступны в сети, самыми содержательными, по моему мнению, на текущий момент являются статьи Саши Гольдштейна:



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

Читать дальше →
Total votes 21: ↑21 and ↓0+21
Comments4

Блокировки в PostgreSQL: 2. Блокировки строк

Reading time14 min
Views57K
В прошлый раз мы говорили о блокировках на уровне объектов, в частности — о блокировках отношений. Сегодня посмотрим, как в PostgreSQL устроены блокировки строк и как они используются вместе с блокировками объектов, поговорим про очереди ожидания и про тех, кто лезет без очереди.



Блокировки строк


Устройство


Напомню несколько важных выводов из прошлой статьи.

  • Блокировка должна существовать где-то в разделяемой памяти сервера.
  • Чем выше гранулярность блокировок, тем меньше конкуренция (contention) среди одновременно работающих процессов.
  • С другой стороны, чем выше гранулярность, тем больше места в памяти занимают блокировки.

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

Есть разные пути решения этой проблемы. В некоторых СУБД происходит повышение уровня блокировки: если блокировок уровня строк становится слишком много, они заменяются одной более общей блокировкой (например, уровня страницы или всей таблицы).

Как мы увидим позже, в PostgreSQL такой механизм тоже применяется, но только для предикатных блокировок. С блокировками строк дело обстоит иначе.
Читать дальше →
Total votes 24: ↑24 and ↓0+24
Comments7

Как мы ловим Deadlock`и на PostgreSQL и чиним их

Reading time7 min
Views68K

Предисловие


Ситуация: есть высоконагруженная мета-игра для наших танков под названием Глобальная карта. Эдакая пошаговая настолка для команд, где бои происходят в реальном танковом клиенте. В пиковые часы на карте несколько тысяч руководителей кланов производят игровые действия: атакуют друг друга, перемещают дивизии, покупают, продают, грабят корованы. Помимо этого, существует десяток сервисов, которые также могут вносить изменения в игровую ситуацию: подкидывают деньжат, штрафуют, добавляют игроков в клан и прочее.

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


Читать дальше →
Total votes 35: ↑32 and ↓3+29
Comments29

Рентабельный код 2: крадущийся DDD, затаившийся CQRS

Reading time20 min
Views50K

Трем программистам предложили пересечь поле, и дойти до дома на другой стороне. Программист-новичок посмотрел на короткую дистанцию и сказал, «Это не далеко! Это займет у меня десять минут». Опытный программист посмотрел на поле, немного подумал, и сказал: «Я мог бы добраться туда за день». Новичок посмотрел на него с удивлением. Гуру-программист посмотрел на поле и сказал. «Кажется минут десять, но я думаю пятнадцати будет достаточно». Опытный программист рассмеялся.

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

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

Гуру программист пустился в путь, и пошел прямо через поле. Целеустремленно и прямо. Он достиг цели всего за десять минут.
«Как тебе это удалось?» — спросили двое других — «Как ты умудрился не зацепить ни одной мины?»
«Легко» — ответил он. «Я не закладывал мины на своем пути».

Как ни прискорбно, придется признать – мы сами закладываем себе мины. В первой части я подробно разобрал основные риски в разработке ПО и описал технологические и методологические способы ослабления этих рисков. За прошедший год я получил множество комментариев, основной смысл которых сводился к следующему: «все круто, но с чего начать и как все это будет выглядеть в реальном мире». Действительно, первый текст носит скорее теоретический характер и представляет собой каталог ссылок. В этой статье я постараюсь привести как можно больше примеров.
Читать дальше →
Total votes 30: ↑27 and ↓3+24
Comments19

Спасибо за собеседование, мы ответим о нашем решении… сейчас

Reading time8 min
Views55K
Когда я сам был кандидатом и ходил по собеседованиям, больше всего меня бесило ожидание обратной связи: долго, скучно, нельзя обсудить решение. Оказавшись на месте интервьюера, я заметил, что чаще всего все нужные выводы делаются буквально за 5 минут после встречи. Остальное время — бесполезное растягивание процесса и бюрократия. Главная причина не отвечать сразу понятна — эмоционально сложно обсуждать решение с кандидатом, ведь часто нужно отказывать. В итоге программисты увиливают и передают эту задачу HR.

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



Читать дальше →
Total votes 76: ↑72 and ↓4+68
Comments223

Что помешало экипажу Crew Dragon выйти из корабля?

Reading time5 min
Views128K


Вчера, во время трансляции посадки американского космического корабля Crew Dragon, многие обратили внимание на заминку, которая возникла перед открытием бокового люка. Газоанализатор показал превышение концентрации тетраоксида азота — токсичного топливного компонента двигателей корабля. Астронавтам пришлось полчаса ждать чтобы химия выветрилась, а команда спасателей это время провела в противогазах.
Total votes 208: ↑207 and ↓1+206
Comments185

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

Reading time8 min
Views19K

Этот пост изначально должен был быть ответом на пост "Честный рассказ об образовании в IT. Стоит ли оно того?", однако, по-видимому, вышел за эти пределы и может рассматриваться как самостоятельное произведение.


Нам часто приходится читать в подобных постах, а также слышать из уст студентов и выпускников, что их ожидания от учёбы в университете не оправдались. Эту проблему можно рассматривать с разных сторон. Я коснусь лишь некоторых аспектов. А именно, тех, которые относятся ко взаимодействию университетов и студентов. Итак, давайте разберём сетования автора исходного поста, сформулируем причины происходящего, и дадим вновь поступающим советы о том, как отучиться в университете, и не пожалеть, о том, что это было скучно и бесполезно.

Читать дальше →
Total votes 7: ↑6 and ↓1+5
Comments49

Устранение дублирования Where Expressions в приложении

Reading time4 min
Views21K
Допустим, у вас есть товары и категории. В какой-то момент клиент сообщает, что для категорий с рейтингом > 50 необходимо использовать другие бизнес-процессы. У вас достаточно опыта и вы понимаете, что где сегодня 50 завтра будет 127.37 и хотите избежать появления магических чисел в коде, поэтому делаете так:

    public class Category : HasIdBase<int>
    {
        public static readonly Expression<Func<Category, bool>> NiceRating = x => x.Rating > 50;

       //...
    }

    var niceCategories = db.Query<Category>.Where(Category.NiceRating);

К сожалению, этот номер не пройдет, если вы хотите выбрать продукты из соответствующих категорий, потому что NiceRating имеет тип Expression<Func<Category, bool>>, а в случае с Product нам потребуется Expression<Func<Product, bool>>. То есть, необходимо осуществить преобразование Expression<Func<Category, bool>> => Expression<Func<Product, bool>>.

    public class Product: HasIdBase<int>
    {
        public virtual Category Category { get; set; }

       //...
    }

    var niceProductsCompilationError = db.Query<Product>.Where(Category.NiceRating); // так нельзя!

К счастью, осуществить это довольно просто!
Код под катом
Total votes 22: ↑18 and ↓4+14
Comments82

Information

Rating
Does not participate
Location
Ижевск, Удмуртия, Россия
Registered
Activity

Specialization

Chief Technology Officer (CTO)