Как стать автором
Обновить
29
0
Артём Владимирович Горчаков @worldbeater

Кроссплатформенное ПО, анализ данных

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

Распределенный SQL в Picodata

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров2.3K

Недавно мы выпустили новую значительную версию Picodata — распределенной in-memory СУБД с открытым исходным кодом. Это продукт на основе Tarantool c поддержкой плагинов на Rust и некоторыми другими интересными особенностями, о которых можно почитать в статье Picodata: простое масштабирование Tarantool.

Одно из главных улучшений в новом релизе Picodata 23.12 — возможность выполнять распределенные (кластерные) SQL-запросы непосредственно из консоли Picodata, без дополнительных настроек. Можно управлять глобальными и шардированными таблицами (DDL), модифицировать данные в них (DML) и, разумеется, читать из них (DQL). Также, мы теперь поддерживаем централизованное управление пользователями, ролями и привилегиями на основе списков контроля доступа (ACL), опять же — в рамках всего кластера.

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

Погрузиться в детали
Всего голосов 14: ↑14 и ↓0+14
Комментарии2

SonarQube: делаем код лучше

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров16K

Привет! Меня зовут Сергей, я один из разработчиков продукта «Сервис персонализации» в компании Sportmaster Lab, и в этом посте я расскажу про SonarQube – платформу для непрерывного анализа и измерения качества программного кода, разработанную компанией SonarSource.

Сейчас SonarQube является чем-то вроде отраслевого стандарта. В частности, это стандарт центра компетенций Sportmaster Lab. В своей работе SonarQube использует статический анализ кода: реальное его выполнение не требуется, так как анализируются именно «исходники». Предмет анализа этого инструмента — потенциальные ошибки и уязвимости, стандарты оформления кода, наличие тестов и уровень покрытия ими, а также дублирование кода и его поддерживаемость. SonarQube поддерживает большое количество языков программирования, его можно встраивать в конвейер CI/CD и в вашу среду разработки. А еще — файлы отчетов сторонних инструментов (Eslint, Stylelint, OWASP Dependency Check и многие другие).

В этой статье вы узнаете:

как работать с SonarQube;

как он может помочь вам в работе и сделать ваш код лучше.

Эта статья — мой сугубо личный опыт работы с SonarQube в качестве пользователя, поэтому я не буду останавливаться на таких «административных» моментах, как развертывание SonarQube, создание в нем нового проекта и настройка его интеграции с GitLab.

Читать далее
Всего голосов 28: ↑26 и ↓2+24
Комментарии9

Использование машинного обучения в статическом анализе исходного кода программ

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

Использование машинного обучения в статическом анализе исходного кода программ

Машинное обучение плотно укоренилось в различных сферах деятельности людей: от распознавания речи до медицинской диагностики. Популярность этого подхода столь велика, что его пытаются использовать везде, где только можно. Некоторые попытки заменить классические подходы нейросетями оканчиваются не столь уж успешно. Давайте взглянем на машинное обучение с точки зрения задач создания эффективных статических анализаторов кода для поиска ошибок и потенциальных уязвимостей.
Читать дальше →
Всего голосов 31: ↑31 и ↓0+31
Комментарии14

Тройка полезных монад

Время на прочтение4 мин
Количество просмотров47K
Внимание: перед тем как читать текст ниже, вы уже должны иметь представление о том, что такое монады. Если это не так, то прежде прочитайте вот этот пост!

Перед нами функция half:


И мы можем применить её несколько раз:
half . half $ 8
=> 2


Всё работает как и ожидалось. Но вот вы решили, что хорошо бы иметь лог того, что происходит с этой функцией:


half x = (x `div` 2, "Я только что располовинил  " ++ (show x) ++ "!")


Что ж, отлично. Но что будет если вы теперь захотите применить half несколько раз?
half . half $ 8


Вот то, что мы хотели бы, чтобы происходило:


Спойлер: автоматически так не сделается. Придётся всё расписывать ручками:
finalValue = (val2, log1 ++ log2)
    where (val1, log1) = half 8
          (val2, log2) = half val1


Фу! Это ни капли не похоже на лаконичное
half . half $ 8


А что, если у вас есть ещё функции, имеющие лог? Напрашивается такая схема: для каждой функции, возвращающей вместе со значением лог, мы бы хотели объединять эти логи. Это побочный эффект, а никто не силён в побочных эффектах так, как монады!
Читать дальше →
Всего голосов 63: ↑58 и ↓5+53
Комментарии7

Изучаем МойОфис: как использовать макросы в редакторах документов и электронных таблиц

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

Привет, Хабр! Недавно в нашем корпоративном блоге мы рассказали о выходе новой версии МойОфис 2021.02, в которой появились удобные инструменты для работы с формулами и математическими выражениями, а также со сводными таблицами.

Помимо этого, в состав релиза 2021.02 вошел программный отладчик макрокоманд. Он проверяет исполнение кода и помогает обнаружить ошибки синтаксиса. Сегодня мы продемонстрируем возможности работы с макросами в документах на примере текстового редактора «МойОфис Текст», а заодно коснемся темы создания надстроек, которые позволят расширить функциональные возможности редактора.

Читать далее
Всего голосов 18: ↑18 и ↓0+18
Комментарии7

Привет, я робот Макс! Как устроен цифровой ассистент Госуслуг

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

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

Читать далее
Всего голосов 27: ↑22 и ↓5+17
Комментарии27

Раздувание кода стало астрономическим

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

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

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

… но по сути, речь идёт о том, что нужно зарегистрировать несколько файлов, считать их, загрузить, а затем закрыть соединение и записать в файл лога, всё ли прошло успешно, а если нет, то что именно случилось. В этом нет ничего сложного, и даже я писал с нуля подобный код при помощи Wininet API и PHP на сервере, общающемся с моей базой данных MySQL. Наверно, моя система была не такой надёжной, как системы уровня энтерпрайза, однако поддерживала сотни тысяч загруженных файлов, их верификацию, скачивание и логирование. Наверно, это работа для одного кодера на две-три недели?

Специальный инструмент загрузки на сервер, которым я пользуюсь сегодня, суммарно имеет 230 МБ клиентских файлов и задействует 2,7 тысяч файлов для управления этим процессом.
Читать дальше →
Всего голосов 413: ↑399 и ↓14+385
Комментарии864

JIT-компилятор Python в 300 строк

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

Может ли студент второго курса написать JIT - компилятор Питона, конкурирующий по производительности с промышленным решением? С учётом того, что он это сделает за две недели за зачёт по программированию.

Как оказалось, может, но с нюансами.

Читать далее
Всего голосов 138: ↑137 и ↓1+136
Комментарии37

Получение Y-комбинатора в 7 простых шагов

Время на прочтение3 мин
Количество просмотров6.8K
Y-комбинатор это метод реализации механизма рекурсии в языке программирования который не поддерживает его изначально (на самом деле, он используется больше для осуществления программирования мозгов). Однако требуется, чтобы язык поддерживал анонимные функции.
Читать дальше →
Всего голосов 58: ↑55 и ↓3+52
Комментарии47

Антиплагиат исходного кода: гибридный подход с использованием парсера ANTLR

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

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

Читать далее
Всего голосов 12: ↑11 и ↓1+10
Комментарии18

Кратчайшее введение в создание компилятора

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

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


Если первый опыт окажется успешным, то в будущем вас могут ожидать и другие 15-минутные "зарисовки" по тематике компиляторов.

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

Почему для открытия меню Windows читает один файл сто тысяч раз?

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

«Проводник тратит 700 мс на то, чтобы открыть контекстное меню панели задач. 75% этого времени он выполняет 114 801 операцию считывания из одного файла, средний объём считываемых данных 68 байт.

Мне стоит написать пост об этом, или достаточно саркастичного твита?»


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

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

Этот пост написан как проверка скоростного блогинга. От момента нахождения проблемы и саркастичного твита о ней до публикации поста прошло примерно 90 минут.
Читать дальше →
Всего голосов 195: ↑189 и ↓6+183
Комментарии591

Модели глубоких нейронных сетей sequence-to-sequence на PyTorch (Часть 1)

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

Этот туториал содержит материалы полезные для понимания работы глубоких нейронных сетей sequence-to-sequence (seq2seq) и реализации этих моделей с помощью PyTorch 1.8, torchtext 0.9 и spaCy 3.0, под Python 3.8. Материалы расположены в эволюционном порядке: от простой и неточной модели к сложной и обладающей наибольшей точностью.

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

Нейросети в исследовании процессов

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

Нейронные сети – это статистические вычислительные модели, применяемые к множеству практических задач, в том числе обработка изображений, машинный перевод и поиск шаблонов. При обучении с учителем, нейросеть тренируется на примере уже известных объектов, то есть для всех исходных данных у нас есть предопределенный правильный ответ. Главная идея обучения нейросети – это настроить такую конфигурацию, при которой ответы модели будут максимально приближены к корректным. Что же до рекуррентных нейросетей, то они не только обучаются на исходных объектах, но и предоставляют контекст для каждого следующего предсказания. Это помогает нейросети сохранять состояние, в котором было принято решение. В этой статье мы обсудим применение рекуррентных нейросетей (РНС) в проблеме исследования процесса в process mining.

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

Для прояснения подхода возьмём лог событий L = [(a, b, c, d, e), (a, b, d)] в качестве примера. Внутренние вычисления нейросети требуют предобработку последовательностей событий следующим образом.

Читать далее
Всего голосов 4: ↑3 и ↓1+2
Комментарии2

Принципы работы IQueryable и LINQ-провайдеров данных

Время на прочтение8 мин
Количество просмотров74K
Средства LINQ позволяют .Net-разработчикам единообразно работать как с коллекциями объектов в памяти, так и с объектами, хранящимися в базе данных или ином удаленном источнике. Например, для запроса десяти красных яблок из списка в памяти и из БД средствами Entity Framework мы можем использовать абсолютно идентичный код:

List<Apple> appleList; 
DbSet<Apple> appleDbSet;
var applesFromList = appleList.Where(apple => apple.Color == “red”).Take(10);
var applesFromDb = appleDbSet.Where(apple => apple.Color == “red”).Take(10);

Однако, выполняются эти запросы по-разному. В первом случае при перечислении результата с помощью foreach яблоки будут отфильтрованы с помощью заданного предиката, после чего будут взяты первые 10 из них. Во втором случае синтаксическое дерево с выражением запроса будет передано специальному LINQ-провайдеру, который транслирует его в SQL-запрос к базе данных и выполнит, после чего сформирует для 10 найденных записей объекты С# и вернет их. Обеспечить такое поведение позволяет интерфейс IQueryable<T>, предназначенный для создания LINQ-провайдеров к внешним источникам данных. Ниже мы попробуем разобраться с принципами организации и использования этого интерфейса.
Читать дальше →
Всего голосов 26: ↑26 и ↓0+26
Комментарии3

Монады как паттерн переиспользования кода

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


В предыдущей статье мы обсуждали, почему функциональное программирование это совсем не то, что распиарено, и что оно совершенно не противоречит ООП, так, что даже сам "Дядя Боб" пишет про хороший ФП дизайн порождающий хороший ООП дизайн программы (и наоборот).


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


Но ведь в интернете буквально сотни статей про ФП и монады, зачем писать еще одну?


Дело в том, что все их (по крайней мере те что я читал) можно поделить условно на две категории: с одной стороны это статьи где вам объяснят что монада это моноид в категории эндофункторов, и что если монада T над неким топосом имеет правый сопряжённый, то категория T-алгебр над этой монадой — топос. На другой стороне располагаются статьи, где вам рассказывают, что монады — это коробки, в которых живут собачки, кошечки, и вот они из одних коробок перепрыгивают в другие, размножаются, исчезают… В итоге за горой аналогий понять что-то содержательное решительно невозможно.


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


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

Читать дальше →
Всего голосов 108: ↑104 и ↓4+100
Комментарии256

Повышаем надёжность HttpClient’а в .NET Core или как ошибиться в 3 строках кода 4 раза

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

За несколько недель до 14 февраля системе Dodo IS немного поплохело под нагрузкой. Одной из причин стало то, что в backend’ах мобильного приложения и сайта не совсем корректно работали политики поверх HttpClient’а (Retry, Circuit Breaker, Timeout). В этой статье я хочу поделиться с вами потенциальными проблемами, которые могут возникнуть при неправильном использовании таких политик.


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

Юлия → Iuliia. Всё о транслитерации

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

Транслитерация


Транслитерация — это запись кириллических слов латиницей (Анна → Anna, Самара → Samara). Её используют в загранпаспортах, водительских удостоверениях, трансграничной доставке, библиотечных каталогах и множестве других международных процессов.


Так вышло, что я недавно окунулся в эту тему, а в Википедии она раскрыта слабо. Поэтому расскажу, что к чему (спойлер — если вы думаете, что с транслитерацией всё плохо, то на самом деле всё ещё хуже).


И конечно, поскольку это Хабр — предложу open-source библиотеки для решения проблемы.

Читать дальше →
Всего голосов 193: ↑192 и ↓1+191
Комментарии543

Пережевывая логистическую регрессию

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


В этой статье, мы будем разбирать теоретические выкладки преобразования функции линейной регрессии в функцию обратного логит-преобразования (иначе говорят, функцию логистического отклика). Затем, воспользовавшись арсеналом метода максимального правдоподобия, в соответствии с моделью логистической регрессии, выведем функцию потерь Logistic Loss, или другими словами, мы определим функцию, с помощью которой в модели логистической регрессии подбираются параметры вектора весов $\vec{w}$.

План статьи:

  1. Повторим о прямолинейной зависимости между двумя переменными
  2. Выявим необходимость преобразования функции линейной регрессии $ f(w,x_i) = \vec{w}^T \vec{x_i}$ в функцию логистического отклика $\sigma(\vec{w}^T \vec{x_i}) = \frac{1}{1+e^{-\vec{w}^T \vec{x_i}}}$
  3. Проведем преобразования и выведем функцию логистического отклика
  4. Попытаемся понять, чем плох метод наименьших квадратов при подборе параметров $\vec{w}$ функции Logistic Loss
  5. Используем метод максимального правдоподобия для определения функции подбора параметров $\vec{w}$:

    5.1. Случай 1: функция Logistic Loss для объектов с обозначением классов 0 и 1:

    $L_{log}(X,\vec{y},\vec{w}) = \sum\limits_{i=1}^n(-y_i \mkern 2mu log_e \mkern 5mu \sigma(\vec{w}^T \vec{x_i}) - (1-y_i) \mkern 2mu log_e \mkern 5mu (1 - \sigma(\vec{w}^T \vec{x_i})) ) \rightarrow min$



    5.2. Случай 2: функция Logistic Loss для объектов с обозначением классов -1 и +1:

    $L_{log}(X,\vec{y},\vec{w}) = \sum\limits_{i=1}^n \mkern 2mu log_e \mkern 5mu (1+e^{-y_i\vec{w}^T\vec{x_i}}) \rightarrow min$

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

Изучаем Latency: теория массового обслуживания

Время на прочтение27 мин
Количество просмотров44K
Тема latency со временем становится интересной в разных системах в Яндексе и не только. Происходит это по мере того, как в этих системах появляются какие-либо гарантии по обслуживанию. Очевидно, дело в том, что важно не только пообещать какую-то возможность пользователям, но и гарантировать её получение с разумным временем отклика. «Разумность» времени отклика, конечно, сильно различается для разных систем, но базовые принципы, по которым во всех системах проявляется латентность, — общие, и их вполне можно рассматривать в отрыве от конкретики.

Меня зовут Сергей Трифонов, я работаю в команде Real-Time Map Reduce в Яндексе. Мы разрабатываем платформу для обработки потока данных в реальном времени с секундным и субсекундным временем отклика. Платформа доступна для внутренних пользователей и позволяет им выполнять прикладной код над постоянно поступающими потоками данных. Я попытаюсь сделать краткий обзор основных концепций человечества на тему анализа latency за последние сто десять лет, и сейчас мы попробуем понять, что именно про latency можно узнать, применяя теорию массового обслуживания.
Читать дальше →
Всего голосов 51: ↑50 и ↓1+49
Комментарии3
1

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность