Pull to refresh
0
0
Send message

Manticore — альтернатива Эластику на C++ с 21-летней историей

Reading time53 min
Views25K

5 лет назад мы форкнули Manticore из open source версии некогда популярного open source поискового движка Sphinx 2.3.2. У нас было два пакетика травы, семьдесят пять ампул мескалина, три C++ разработчика, один саппорт-инженер, опытный пользователь, менеджер, мать пятерых детей, помогающая нам на полставки и гора багов, крэшей и технических долгов. И вот, по прошествии 5 лет и сотен новых пользователей мы готовы сказать, что Manticore можно использовать как альтернативу Elasticsearch и для полнотекстового поиска и для аналитики данных.

В этой статье хочется: вспомнить как всё начиналось и что было до SOLR и Elasticsearch, максимально объективно обрисовать текущую ситуацию, попытаться понять куда нам двигаться дальше.

Читать далее
Total votes 117: ↑117 and ↓0+117
Comments83

«Выглядит похоже». Как работает перцептивный хэш

Reading time6 min
Views121K
За последние несколько месяцев несколько человек спросили меня, как работает TinEye и как в принципе работает поиск похожих картинок.

По правде говоря, я не знаю, как работает поисковик TinEye. Он не раскрывает деталей используемого алгоритма(-ов). Но глядя на поисковую выдачу, я могу сделать вывод о работе какой-то формы перцептивного хэш-алгоритма.
Читать дальше →
Total votes 149: ↑145 and ↓4+141
Comments46

Децентрализованный поиск для свободного веба

Reading time12 min
Views10K

Возможно ли создать поисковую систему, которую тяжело подвергнуть цензуре, влиянию и блокировке?

Говоря техническим языком, возможно ли выполнять полнотекстовый поиск не имея удаленного сервера, удобным для пользователя способом, одновременно храня поисковый индекс в peer-to-peer системе и имея возможность быстро обновлять поисковый индекс?

Да, это возможно!

Под катом описание архитектуры поискового движка Summa на Rust и набора приемов, позволивших ответить утвердительно на все вопрос

Читать далее
Total votes 53: ↑51 and ↓2+61
Comments21

Как работает компьютер: глубокое погружение (на примере Linux)

Level of difficultyHard
Reading time48 min
Views137K



Введение


Я делала много вещей с компьютерами, но в моих знаниях всегда был пробел: что конкретно происходит при запуске программы на компьютере? Я думала об этом пробеле — у меня было много низкоуровневых знаний, но не было цельной картины. Программы действительно выполняются прямо в центральном процессоре (central processing unit, CPU)? Я использовала системные вызовы (syscalls), но как они работают? Чем они являются на самом деле? Как несколько программ выполняются одновременно?


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


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


Более удобный формат статьи.

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

Паттерн Unit of Work в разрезе чистой архитектуры DDD на языке Golang

Level of difficultyMedium
Reading time9 min
Views15K

Всем привет! Недавно мне выпала возможность разработать шаблон сервиса, который можно было бы использовать как для монолитной, так и для микро‑сервисной архитектуры. Шаблон должен был придерживаться принципов Domain‑Driven Design (DDD). В этом процессе, я столкнулся с двумя интересными проблемами:

Проблема 1: Сложности обеспечения транзакционности базы данных

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

Проблема 2: Нарушение изолированности слоя

В попытке решить первую проблему, некоторые разработчики переносят работу с транзакциями на уровень слоя приложения, чтобы избежать прямой зависимости от базы данных. Однако, такой подход, несмотря на его обоснование, может нарушить изолированность слоев и противоречить принципам DDD и чистой архитектуры. Это, в конечном итоге, затрудняет поддержку приложения и усложняет его масштабирование.
Эти две проблемы стали отправной точкой для исследования применения паттерна Unit of Work и его роли в обеспечении надежности и консистентности данных в контексте Golang и DDD.

В статье я расскажу о своем подходе к решению этих задач.

Читать далее
Total votes 6: ↑4 and ↓2+3
Comments7

Что происходит, когда запускаешь «Hello World» в Linux

Level of difficultyMedium
Reading time15 min
Views27K

Сегодня я задумалась о том, что происходит, когда запускаешь в Linux простую программу «Hello World» на Python.

print("hello world")

Вот как это выглядит в командной строке:

$ python3 hello.py
hello world

Но внутри происходит гораздо больше. Я объясню, что там творится, и, что гораздо важнее, расскажу об инструментах, при помощи которых вы сами сможете исследовать происходящее. Мы воспользуемся readelf, strace, ldd, debugfs, /proc, ltrace, dd и stat. Я не буду рассматривать относящиеся к Python части, только объясню, что происходит при выполнении динамически компонуемых исполняемых файлов.
Читать дальше →
Total votes 98: ↑98 and ↓0+98
Comments10

Разработка приложений для платёжных терминалов Ingenico

Level of difficultyHard
Reading time35 min
Views17K
Приветствую всех!

Скажите: интересовались ли вы хоть раз тем, как устроены и работают банковские платёжные терминалы, к которым вы прикладываете свою карту едва ли не ежедневно? Хотели ли вы узнать, как написать что-то своё под какое-нибудь из данных устройств?

Если ваш ответ — «Да», то этот пост определённо для вас.



Обычно тема программирования POS-terminal'ов покрыта завесой тайны, но сейчас мы постараемся её развеять. В ходе данной статьи разберёмся с азами разработки под такие девайсы. Узнаем, где скачать нужный софт, как его установить, а также, собственно, как скомпилировать и запустить нашу первую программу. Традиционно будет много интересного.
Читать дальше →
Total votes 85: ↑85 and ↓0+85
Comments51

Реализуем с нуля функцию косинуса на языке C

Level of difficultyHard
Reading time10 min
Views14K

Я изучил, как реализовать функцию косинуса при помощи нескольких разных подходов. Одна из реализаций почти в три раза быстрее, чем math.h, но придётся смириться с точностью до четырёх знаков после запятой.

Задавались ли вы когда-нибудь вопросом, как в математической библиотеке вашего любимого языка программирования реализованы тригонометрические функции, например, косинус? Это настолько популярная функция, что её можно встретить в каждой математической библиотеке, поэтому реализация должна быть довольно простой, ведь так? Ну уж нет. Почти совершенно точно, что это не так.

Моё исследование началось с того, что мой друг и коллега Стивен Марц работал над ядром операционной системы и я предложил, чтобы он отрисовал на экране функцию косинуса. Я часто использую косинус в качестве «hello, world» для графических приложений. Возникла проблема: его ядро не задействовало стандартную библиотеку C (а значит, прощай math.h!), а целевой платформой являлась архитектура RISC-V (а значит, никаких подобий команды fcos Intel!).

Так началось моё долгое приключение.
Читать дальше →
Total votes 43: ↑40 and ↓3+54
Comments29

Постквантовая защита WhatsApp, новый Matrix 2.0 и PoW-задачи для входа на сайт

Reading time4 min
Views3.6K


На Хабре уже упоминали, что протокол Signal получил постквантовую защиту, хотя в краткой новости не вдавались в детали. Но это действительно важное событие с учётом того, что количество пользователей этого протокола превышает 1 млрд человек за счёт WhatsApp.

Signal применяется для криптографической защиты сессий в одноимённом мессенджере, в Google RCS, WhatsApp и др. Опенсорсный протокол можно использовать в любом ПО.

Итак, что изменилось в криптографической подсистеме?
Читать дальше →
Total votes 6: ↑6 and ↓0+6
Comments2

Время изменений: депрекация datetime.utcnow() в Python

Level of difficultyEasy
Reading time5 min
Views6.7K

Как-то я изучал release notes новой версии Python 3.12, и в разделе о депрекациях моё внимание привлекла следующая фраза:

utcnow() и utcfromtimestamp() из datetime.datetime устарели и будут удалены в будущей версии.

Если вы следили за моими туториалами по веб-разработке, то видели, что я часто использую utcnow(); очевидно, мне придётся переучиваться и использовать альтернативу, готовясь к неизбежному удалению этой функции (вероятно, это произойдёт спустя несколько лет, так что причин для паники нет!).

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

Читать далее
Total votes 12: ↑11 and ↓1+16
Comments5

Clickhouse, Grafana и 3000 графиков. Как построить систему быстрых дашбордов

Reading time17 min
Views29K

Меня зовут Валя Борисов, и я — аналитик в команде Ozon. Задача нашей команды — создавать инструменты для мониторинга и анализа скорости. 

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

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

Читать далее
Total votes 41: ↑41 and ↓0+41
Comments25

Учимся разрабатывать REST API на Go на примере сокращателя ссылок

Level of difficultyMedium
Reading time30 min
Views44K

В этой статье мы напишем полноценный REST API сервис — URL Shortener — и задеплоим его на виртуальный сервер с помощью GitHub Actions.

Говоря «полноценный», я имею в виду, что это будет не игрушечный проект, а готовый к использованию:

  • мы выберем для него актуальный http-роутер,
  • позаботимся о логах,
  • напишем тесты: unit-тесты, тесты хэндлеров и функциональные,
  • настроим автоматический деплой через GitHub Actions и др.

Но важно понимать, что «готовый к продакшену» != «энтерпрайз».

Кратко обо мне: меня зовут Николай Тузов, я много лет занимаюсь разработкой на Go, очень люблю этот язык. Также веду свой YouTube-канал, на котором есть видеоверсия текущего гайда, с более подробными объяснениями.
Читать дальше →
Total votes 48: ↑47 and ↓1+55
Comments40

Пишем gRPC сервис на Go — сервис авторизации

Level of difficultyMedium
Reading time63 min
Views40K

Пишем gRPC сервис на Go — сервис авторизации


В этой статье мы научимся писать полноценный gRPC сервис на Go на примере сервера авторизации с полноценной архитектурой, готовой к продакшену. Мы напишем как серверную часть, так и клиентскую. В качестве клиента мы возьмём мой сервис — URL Shortener, о котором у меня также есть статья и видео-гайд на ютубе. Попутно мы познакомимся с базовыми подходами к работе с авторизацией. И в конце настроим автоматический деплой сервиса с помощью GitHub Actions на удалённый сервер.


Видео-версия этого гайда с более подробными объяснениями

Исходный код проекта: https://github.com/GolangLessons/sso


Итого, наш план:


  • Напишем простой, но полноценный gRPC-сервис
  • Разберемся с базовыми принципами работы авторизации — чтобы не было скучно
  • Настроим автоматический деплой в прод — потому что руками деплоить лень
  • Подружим его с уже готовым сервисом URL Shortener — чтобы был практический смысл
  • Напишем полноценные функциональные тесты

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


Кратко обо мне: меня зовут Николай Тузов, я много лет занимаюсь разработкой на Go, очень люблю этот язык. Также веду свой YouTube-канал.

Читать дальше →
Total votes 62: ↑60 and ↓2+66
Comments44

Избранное: ссылки по IT безопасности

Reading time3 min
Views110K




Давно хотел написать этот пост с подборкой полезных ссылок, так как очень часто спрашивают подобное (думаю, у многих, кто в этой (да и в других) сфере). Ссылки разбиты на категории.




Читать дальше →
Total votes 92: ↑86 and ↓6+80
Comments18

Сделай сам: dll hijacking под MS Office для самых маленьких

Reading time5 min
Views30K
Прошло уже три дня с тех пор, как исследователь Parvez Anwar опубликовал информацию о множественных dll hijacking уязвимостях в продуктах Microsoft Office, а какой-либо реакции не наблюдается. Ни CVE, ни сообщений на специализированных ресурсах, Windows Update не качает свежих патчей. Что ж, может, так и нужно, может быть, это не уявимость, а особенность продукта?
Между тем, эксплуатация этой особенности проста и доступна даже ребенку. И, раз уж производитель пока эту «фичу» не удалил, почему бы не написать о ней небольшую статью.

Речь пойдет о Windows 7. Работает ли это на других версиях — мне на текущий момент неизвестно, нужно проверять. Принцип действия описываемого явления (как и многих других, впрочем) основан на старой доброй технологии COM/OLE/ActiveX.
Читать дальше →
Total votes 48: ↑46 and ↓2+44
Comments5

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

Reading time4 min
Views157K

Предисловие


Скорей всего, матерым системным администраторам статья будет не очень интересна. В первую очередь она ориентирована на новичков, а также на людей, которые столкнулись с подобной проблемой — необходимостью удалить огромное количество файлов из одной папки в ОС Linux (Debian в моем случае), а также с закончившимся местом на диске, когда df -h выдает что почти 30% свободно.
Читать дальше →
Total votes 111: ↑107 and ↓4+103
Comments144

Куда исчезает место на жестком диске в Mac OS Х

Reading time1 min
Views175K
Являясь счастливым обладателем MacBook Pro с SSD на 256Gb, стал замечать, что система непонятным образом «разрастается».

Вроде бы фильмы качаются на внешний жесткий диск, на SSD находятся только рабочие файлы, а место куда-то исчезает.
Из 256Gb со временем осталось лишь 107Gb.

Утилита OmniDiskSweeper показывала, что должно быть занято около 70 Gb пользовательскими данными. Вопрос — куда делись еще примерно 80Gb?

Набрав в терминале
# du -h -d 1 /
увидел в корне странную папку с названием /.MobileBackups, как раз и занимающую 80Gb.

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

Отключается все это через консоль:
# sudo tmutil disablelocal

Дополнительно можно почитать здесь.
Total votes 78: ↑50 and ↓28+22
Comments41

Web Scraping с помощью python

Reading time7 min
Views562K

Введение


Недавно заглянув на КиноПоиск, я обнаружила, что за долгие годы успела оставить более 1000 оценок и подумала, что было бы интересно поисследовать эти данные подробнее: менялись ли мои вкусы в кино с течением времени? есть ли годовая/недельная сезонность в активности? коррелируют ли мои оценки с рейтингом КиноПоиска, IMDb или кинокритиков?
Но прежде чем анализировать и строить красивые графики, нужно получить данные. К сожалению, многие сервисы (и КиноПоиск не исключение) не имеют публичного API, так что, приходится засучить рукава и парсить html-страницы. Именно о том, как скачать и распарсить web-cайт, я и хочу рассказать в этой статье.
В первую очередь статья предназначена для тех, кто всегда хотел разобраться с Web Scrapping, но не доходили руки или не знал с чего начать.

Off-topic: к слову, Новый Кинопоиск под капотом использует запросы, которые возвращают данные об оценках в виде JSON, так что, задача могла быть решена и другим путем.
Читать дальше →
Total votes 40: ↑31 and ↓9+22
Comments48

Интересные приемы программирования на Bash

Reading time6 min
Views130K
Эти приемы были описаны во внутреннем проекте компании Google «Testing on the Toilet» (Тестируем в туалете — распространение листовок в туалетах, что бы напоминать разработчикам о тестах).
В данной статье они были пересмотрены и дополнены.
Читать дальше →
Total votes 181: ↑175 and ↓6+169
Comments67

[ZeroNights2016] [CTFzone] Разбор полётов за 50

Reading time3 min
Views7K


Ну, что же, вот и завершился ZeroNights 2016. Хотелось бы поблагодарить организаторов данного мероприятия и всех её участников: за два дня прозвучало множество удивительных дайджестов, мы делали себе алкогольные коктейли, думали как взломать «умный дом», доказывали свой интеллект в викторинах и, разумеется, множество участников CTF попытались побороться за звания «лучших в своём деле» — одними из таких стали и мы. В связи с вышеизложенным, данный цикл статей посвятим райтапу по CTFzone.
Продолжение внутри
Total votes 18: ↑17 and ↓1+16
Comments3

Information

Rating
Does not participate
Registered
Activity