Pull to refresh
-17
0.3
Василий @Soupbreak

погромист

Send message

Выбор структур данных для самописного текстового редактора

Level of difficultyMedium
Reading time13 min
Views11K

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

Ресурсы


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

  • Build Your Own Text Editor — наверно, самый фундаментальный пост о создании текстового редактора с нуля, который я видел. Это превосходный туториал на случай, если вы хотите начать писать собственный текстовый редактор. Стоит заметить, что в редакторе из этого туториала в качестве внутренней структуры для текста используется, по сути, вектор строк.
  • Text Editor: Data Structures — отличный обзор множества структур данных, которые можно использовать при реализации текстового редактора. (Спойлер: как минимум одна из них будет рассмотрена в моём посте)
  • Плейлист Ded (Text Editor) на YouTube — это потрясающая серия, в которой @tscoding фиксирует процесс создания с нуля текстового редактора. Эти видео стали для меня источником вдохновения.

Зачем?


Если в сети есть так много хороших ресурсов о создании собственного текстового редактора (не говоря уже о том, что уже существует множество феноменальных текстовых редакторов), то зачем я это пишу? На то есть несколько причин:

  1. Я хотел заняться проектом, непохожим ни на один свой прошлый.
  2. Я хотел создать инструмент, которым смогу пользоваться.
  3. Мне всегда хотелось глубже разобраться с созданием собственных структур данных.
Читать дальше →

Разделение контейнера зависимостей в ASP.NET Core

Level of difficultyMedium
Reading time5 min
Views6.7K

Разработчики AspNet Core (здесь и далее речь идёт об AspNet актуальных версий: 6 и 7, но может быть применимо и к более ранним версиям) хорошо знают, что механизм Dependency Injection встроен в этот фреймворк изначально и пронизывает его насквозь. И это здорово упрощает работу с зависимостями и сразу вводит разработку в идеологически правильное русло. Более того, в состав самого AspNet входит вполне приличный дефолтный DI-контейнер разработки Microsoft, что позволяет отказаться от использования сторонних решений. Во всяком случае, при отсутствии совсем уж специфичных требований.

Но иногда такие требования существуют...

React и Typescript: Создание динамического компонента на примере кнопки

Level of difficultyMedium
Reading time6 min
Views20K

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

Читать далее

ClickHouse: полезные лайфхаки

Level of difficultyMedium
Reading time12 min
Views39K

Я начала пользоваться ClickHouse до того, как это стало мэйнстримом: первый раз я столкнулась c этой базой данных лет 8 назад. C тех пор я уверена, что это лучшая DB для аналитики. Большинство аналитиков, которых я знаю, в восторге от ClickHouse (иногда чтобы проникнуться, требуется немного времени: разобраться и привыкнуть к синтаксису).

В этой статье я расскажу что такое ClickHouse и почему я считаю его идеально подходящим мощным инструментом для аналитики. А также поделюсь tips & tricks из моего опыта. Поехали.

Поехали

Оптимизация производительности запросов в ClickHouse: как ускорить неускоряемое

Reading time16 min
Views14K

Привет, Хабр! Меня зовут Максим Кита, я разработчик баз данных, специализируюсь на анализе, планировании и выполнении запросов, а также на оптимизации производительности.

Я расскажу о высокоуровневой архитектуре ClickHouse, CI/CD, тестировании производительности, интроспекции, абстракциях и алгоритмах и выборе библиотек для высокопроизводительных приложений. Поделюсь ниндзя-техниками, которые помогут ускорить ваши системы. Вы сможете попробовать эти советы и практики на своем проекте и оценить насколько они полезны.

Читать далее

Трейсим .NET микросервисы через OpenTelemetry

Level of difficultyEasy
Reading time16 min
Views21K

Трейсинг (возможность отслеживания пути запроса между сервисами в микросервисной архитектуре) - критический важное требование функционирования более-менее крупных систем.

У Uber - тысячи микросервисов. А у Netflix - несколько тысяч

В каком сервисе возникла ошибка? Сервис упал или просто ошибка сети? Что за ошибка возникла?

Стоп!
Рим не за один день был построен

Поэтому начнем с малого и подключим трейсинг к обычной микросервисной системе на ASP.NET Core.

Поможет нам в этом OpenTelemetry

Читать далее

Система для менеджера V 1.0. Собираем стек и структуру

Level of difficultyEasy
Reading time4 min
Views5.1K

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

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

несколько сервисов для планирования и мониторинга задач;

сервисы для построения схем (процессы, пользовательские пути, структура миграции данных и тд);

трекеры времени;

сервисы по аналитике;

инструменты для составления списков.

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

Поэтому я загорелся идеей сделать систему, которая облегчит работу.

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

Как я подошел к идее?

Cмарт-контракт. Solidity + Ganache

Level of difficultyMedium
Reading time10 min
Views4.1K

В данной статье мы познакомимся с тем, как задеплоить очень простой смарт-контракт на локальный блокчейн Ganache. После развёртывания смарт-контракта, мы научимся взаимодействовать с ним путём отправки транзакций в его адрес. Для простоты я буду использовать фреймворк Truffle, так как он облегчает деплой и взаимодействие со смарт-контрактом.

Читать далее

BaaS (Business as а Service) — новый виток в развитии IT-систем

Level of difficultyEasy
Reading time10 min
Views16K

Привет, Хабр! Меня зовут Филипп Сенцов, я преподаю на курсе «Аналитик данных» в Яндекс Практикуме и работаю в «Альфа-Банке». Я техлид по аналитике в команде, отвечающей за инфраструктурную часть BaaS-платформы в банке. До этого я был техническим продактом в «СберТехе», развивал KeyCloak Sber Edition. А ещё раньше занимался интеграциями с системой ЕГАИС в «Магните».

В этой статье я расскажу, что значит понятие BaaS в нашем банке, как сложилась современная индустрия поставки IT-решений в виде сервиса, что её ждёт в будущем и как всё это связано с Open API.

Читать далее

Хватит решать проблемы, которых не существует

Level of difficultyMedium
Reading time3 min
Views12K

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

Читать далее

Тренды венчурной индустрии на примере стартапов Y Combinator и ФРИИ

Level of difficultyMedium
Reading time10 min
Views1.9K

Руководитель интернет-проектов Константин Берлинский написал колонку с анализом проектов, проинвестированных Y Combinator и ФРИИ. По результатам он сделал выводы о трендах, перспективах выхода российских компаний на внешние рынки, преимуществах и недостатках экосистемы стартапов.

Читать далее

Создание фоновых задач в .NET с запросом состояния запущенного таска

Level of difficultyMedium
Reading time12 min
Views8.8K

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

Читать далее

Tinder ушёл… да здравствует $hyoo_match

Level of difficultyEasy
Reading time6 min
Views73K

Здравствуйте, меня зовут Дмитрий Карловский и недавно у меня случился тиндергейт. Но вот беда, Match Group уходит из России, забирая с собой Tinder. С чего же нам теперь кринжевать? Но, как известно, свято место пусто не бывает, так что я запилил свой дейтинг без геймификации и монетизации:

? Tinder ушёл... встречай  match.hyoo.ru - сервис знакомств, которому выгодно, чтобы ты нашёл себе пару и свалил в закат.
Никаких фейков, мёртвых душ, рекламы и вымогательства денег. Поделись с друзьями - пусть тоже найдут свою половинку ?

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

Найти, наконец, свою половинку

Масштабирование БД в высоконагруженных системах

Reading time9 min
Views38K
На прошлом внутреннем митапе Pyrus мы говорили о современных распределенных хранилищах, а Максим Нальский, CEO и основатель Pyrus, поделился первым впечатлением от FoundationDB. В этой статье рассказываем о технических нюансах, с которыми сталкиваешься при выборе технологии для масштабирования хранения структурированных данных.

Когда сервис недоступен пользователям какое-то время, это дико неприятно, но всё же не смертельно. А вот потерять данные клиента — абсолютно недопустимо. Поэтому любую технологию для хранения данных мы скрупулезно оцениваем по двум-трем десяткам параметров.
Читать дальше →

Оптимизация сборки мусора в высоконагруженном .NET сервисе

Reading time16 min
Views33K
Ежедневно в сервисе Pyrus работают десятки тысяч сотрудников из нескольких тысяч организаций по всему миру. Отзывчивость сервиса (скорость обработки запросов) мы считаем важным конкурентным преимуществом, так как она напрямую влияет на впечатление пользователей. Ключевой метрикой для нас является «процент медленных запросов». Изучая ее поведение, мы заметили, что раз в минуту на серверах приложений возникают паузы длиной около 1000 мс. В эти промежутки сервер не отвечает и возникает очередь из нескольких десятков запросов. О поиске причин и устранении узких мест, вызванных сборкой мусора в приложении, пойдет речь в этой статье.


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

Своя СУБД за 3 недели. Нужно всего лишь каждый день немного времени…

Reading time13 min
Views34K
Своя СУБД за 3 недели. Нужно всего-лишь каждый день немного времени уделять архитектуре; и всё остальное время вкалывать на результат, печатая и перепечатывая сотни строк кода.

По закону Мерфи, если есть более одного проекта на выбор — я возьмусь за самый сложный из предложенных. Так случилось и с последним заданием курса о системах управления базами данных (СУБД).

обложка /dropSQL

Дропнуть студентов

Как создать свою СУБД с нуля и не сойти с ума. Практическое пособие начинающему некроманту. Часть первая

Reading time43 min
Views37K

Наступил Апокалипсис.

Нет, не стоит бежать запасаться банками с консервами и крышками отечественной бай-колы! Апокалипсис произошёл только в нашей фантазии и с определённой целью — чтобы проверить, а может ли человек, обладающий только книгами по теме и стандартной библиотекой языка, воссоздать инструмент, который будет служить ему верой и правдой?

Так родился учебный проект SicQL, реляционная СУБД, чей символ — сова — это олицетворение силы знаний и мудрости. Олицетворение тех знаний и той мудрости, которые мы получим, создав с нуля то, чем мы пользуемся каждый день, может, не осознавая всей сложности таких инструментов.

Приглашаю присоединиться к увлекательному путешествию!

Принять приглашение на борт

Динамические методы в .NET (часть 2)

Level of difficultyMedium
Reading time6 min
Views6.2K

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

Мы узнали, как создать простейший динамический метод, в общих чертах обсудили, как работает стековая машина и рассмотрели некоторые простейшие операции Common Intermediate Language, которые можно использовать при генерации методов в runtime, такие как работу с константами, математические и битовые операции, а также работу с аргументами методов и локальными переменными.

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

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

Читать далее

Как на самом деле работает Async/Await в C# (Часть 7)

Level of difficultyHard
Reading time13 min
Views15K

Несколько недель назад в блоге «.NET Blog» появилась статья «Что такое .NET, и почему вы должны выбрать его?». В нем был представлен высокоуровневый обзор платформы, кратко описаны различные компоненты и архитектурные решения, а также обещаны более подробные посты по затронутым темам. Этот пост является первым таким продолжением, в котором подробно рассматривается история создания, архитектурные решения и детали реализации async/await в C# и .NET.

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

Читать далее

Введение в Clickhouse движок AggregatingMergeTree

Level of difficultyEasy
Reading time11 min
Views15K

В процессе разработки витрин данных часто возникает задача предоставления клиентам данных в агрегированном виде. Если данных в хранилище немного, то их можно агрегировать “на лету”, но это плохая практика так как, чем больше будет копиться данных, тем дольше будут выполняться запросы, и тем больше Clickhouse будет съедать ресурсов. В этих случаях логично хранить данные в заранее агрегированном виде, вопрос лишь в том, как реализовать расчет данных агрегированных значений.

В интернете существуют много однотипных статей иллюстрирующих базовое использование материализованных представлений (далее - матвью) на движке AggregatingMergeTree, но если ваша задача выходит за рамки “1 нода, 1 метрика, 1 параметр агрегации” эти статьи вам мало чем помогут. Я посчитал, что моим коллегам может пригодиться своего рода гайд о том, как пользоваться данными представлениями для более сложных задач.

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

В рамках моей задачи хранилище данных (далее - DWH) реализовано в виде реплицированного кластера состоящего из 3 нод, данные на ноды распределяются равномерно в соответствии с ключом сортировки таблиц. Существует исходная таблица source, которая содержит столбцы id, timecode_1, metric_data - данные представляют собой временной ряд утилизации ресурсов с гранулярностью 1 минута. Данные поступают блоками каждые 2 минуты.

Читать далее

Information

Rating
3,537-th
Location
Белград, Белград, Сербия
Registered
Activity

Specialization

Backend Developer, Software Architect
Lead
From 8,000 $
C#
.NET Core