Pull to refresh
18
0.1
Дмитрий Панкрашов @Dmitry89

Web-developer

Send message

Async iterator timeout в Python

Level of difficultyMedium
Reading time5 min
Views2.4K

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

В числе прочих задач, решаемых при реализации возможности стриминга, существует задача определения ситуации, в которой сервис, исполняющий запрос, упал с ошибкой, и больше не может продолжать стриминг ответов. В таком случае мы даже не можем понять что именно произошло - обработка и отдача очередной порции ответа будет, но задерживается, либо же передача прервалась, и нужно сообщить об ошибке “наверх”. В протоколе HTTP, например, для детерминирования корректной вычитки ответа может быть использован заголовок Content-Length. Достаточно посчитать количество вычитанных из сокета байт тела запроса\ответа, и сравнить со значением заголовка. Сходится - мы все получили, не сошлось и сокет закрыт - ошибка. Однако вариант решения с заранее заданным количеством данных в первой порции ответов не является универсальным, поскольку не во всех случаях можно точно понимать, сколько именно данных будет передано. Да и архитектура с использованием брокеров сообщений предполагает постоянное поддержание соединения, поэтому мы можем только знать, что из такой-то очереди поступают ответы на ранее сделанный запрос, и в каком-то из ответов будет метка окончания, как маркер того, что запрос обработан и ответ выслан и получен полностью, а если такого маркера еще не получено - остается продолжать ждать. Но ждать можно бесконечно.

Читать далее
Total votes 10: ↑9 and ↓1+13
Comments3

Хранение загружаемых пользователями файлов

Level of difficultyEasy
Reading time7 min
Views4.7K

В самом начале своей карьеры я имел честь в одно лицо разрабатывать проект, предназначенный для массового пользователя. Надо сказать, что почти все основополагающие принципы того, как провалить проект, были соблюдены, однако, он до сих пор жив. Проект был предназначен для принудительного использования определенной категорией работников бюджетной сферы. Технического задания, аналитики, дизайн-документов, макетов в Фигме, лавандового смузи, и прочих этих ваших модных слов, без которых N лет назад строили БАМ и Траннсиб не было от слова совсем. Зато, были процессы “в бумаге”, которые требовалось оцифровать. Поэтому то, что можно было принять за ТЗ, выглядело как “Эти (работники) заполняют вот это (бумаги) потом несут тем (проверяющим) а дальше все это хранится, сделай чтобы они с компьютера могли загрузить и отправить, у нас тут целый этаж бумагами занят, пожар начнется - всему хана”. Используя весь свой багаж знаний и опыта в построении высоконагруженных систем (на этом месте я отошел от написания статьи сначала проржаться а потом поплакать), я приступил к реализации.

Читать далее
Total votes 14: ↑11 and ↓3+11
Comments2

Разбор crackme от timotei_ (assembler)

Level of difficultyEasy
Reading time5 min
Views3.4K


Предупреждение


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


Введение


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

Читать дальше →
Total votes 15: ↑13 and ↓2+14
Comments11

Разбор crackme от KilLo (.net)

Level of difficultyEasy
Reading time8 min
Views3.9K


Предупреждение


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


Введение


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

Читать дальше →
Total votes 16: ↑15 and ↓1+18
Comments3

Python. Выражения в методах и индексаторах

Level of difficultyEasy
Reading time8 min
Views4K

Если вам когда-нибудь приходилось работать с NumPy, то вы скорее всего знаете, что в индексатор массива можно передать не только индексы начала, конца, и шага. Потрясающая возможность - получить срез массива по некоторому условию, в виде data[data > 0] предает массивам NumPy некоторое сходство с СУБД.

Тут же можно вспомнить про SqlAlchemy и возможность передать в функцию filter некоторое условие для отбора записей session.query(MyModel).filter(MyModel.field == 10).

Отличные, в общем-то возможности, не так ли? Не возникало ли у вас вопроса как они работают внутри? data > 0 и MyModel.field == 10 с точки зрения грамматики языка являются выражениями, и при передаче куда-либо Python попытается вычислить их значения. Попробуем разобраться как это работает.

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

Python package registry в GitLab

Level of difficultyEasy
Reading time8 min
Views8.1K

О чем статья: при разработке проектов, и, особенно, распределенных приложений, возникает необходимость использования некоторых частей приложения в качестве отдельных модулей. Например скомпилированные классы для gRPC, модули для работы с БД, и многое другое, могут применяться в неизменном виде в кодовой базе десятка микросервисов. Оставив за скобками копипасту, как "хорошую" плохую практику. Можно рассмотреть git submodules, однако, такое решение не очень удобно тем, что, во-первых, нужно предоставлять разработчикам доступ к конкретным репозиториям с кодовой базой, во-вторых, нужно понимать, какой коммит надо забрать себе, и в-третьих установка зависимостей для кода, включенного в проект как субмодуль, остается на совести разработчика. Менеджеры пакетов (pip, или, лучше, poetry), умеют разрешать зависимости из коробки, без лишних действий, и, в целом, использование менеджера пакетов значительно проще, чем работа с субмодулем. В статье рассмотрим, как организовать реестр пакетов в GitLab, а также различные подводные камни, поджидающие на пути к удобной работе с ним.

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

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

Централизация логирования микросервисов с Graylog

Reading time6 min
Views26K

Трассировка и анализ ошибок в микросервисной архитектуре без средств централизации логирования обычно причиняет неудобства, поскольку для понимания “что и на каком микросервисе умерло” приходится обходить микросервисы по очереди, сверять и сопоставлять данные в логах. В данной статье рассматривается централизация логирования с помощью Graylog, с примерами кода на Python.

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

Читать далее
Total votes 10: ↑8 and ↓2+7
Comments0

VPN на минималках ч.3

Reading time7 min
Views5.3K

Несмотря на то, что с момента публикации второй части прошло почти полгода — прокрастинация все-таки выиграла битву, но не войну, и поэтому повествование о нелегких буднях в НИИ Велосипедостроения продолжается. В предыдущих частях рассказывалось об общей концепции и предпосылках, и MVP для сервера, отвечающего за запуск преднастроенного контейнера с openssh, и отслеживание состояния клиента, подключенного через websocket. В третьей части статьи поговорим о рисках в части безопасности, и реализации клиентского приложения.

Перефразируя известного персонажа, чью роль исполнил Саша Барон Коэн, можно с уверенностью утверждать, что безопасность данного решения это боль в моя…в общем, если смотрели фильм, то понимаете о чем я.

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

ПуFFIндуй. Волшебная палочка или грабли в PHP

Reading time7 min
Views7.8K

Привет, Хабр! 

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

Прежде чем приступить к изложению сути темы, расскажу историю из практики. Когда-то я занимался автоматизацией такого страшного явления как “аттестация педагогических работников”. Суть заключалась в том, чтобы разработать систему, куда доблестные труженики образования загрузят документы, подтверждающие успехи в работе - грамоты, дипломы учеников, и далее по списку. Стек: PHP+Python (если хотите знать, что тут делает Python - почитайте первую статью), JS (jQuery) на фронте. 

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

Читать далее
Total votes 21: ↑20 and ↓1+26
Comments10

Там сложно, ты не разберешься

Reading time4 min
Views29K

В своей первой статье на Хабре я описывал опыт реверсинга и модификации проекта, доставшегося по наследству. Конечно, в отношении проекта на Python "реверсинг" - это гипербола, однако с чем-то ранее неизвестным столкнуться все же получилось. Если вкратце - вместо классических исходников использовались модули, загружаемые из .pyc, а не классических .py файлов. Философия "защитников" базируется на принципе "Там сложно, никто не разберется".

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

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

VPN на минималках ч.2, или трое в docker не считая туннеля

Reading time7 min
Views10K

Привет, хабр! 

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

Читать далее
Total votes 9: ↑8 and ↓1+7
Comments1

VPN на минималках

Reading time5 min
Views20K

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

- "Ну сейчас начнется" - думаю я. 

- “VPN настраивать не умею”, “У меня все зависло”, “По инструкции настроить не получилось” - подобные реплики от “бизнес-аналитика Алевтины Генриховны” слышно с завидной регулярностью.

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

Читать далее
Total votes 9: ↑8 and ↓1+7
Comments6

Байки бывалого тех.директора

Reading time4 min
Views3.6K
Да знаешь ли ты, не нюхавший пороху cgi-скриптов салабон, что значит быть техническим директором, и всегда нести ответственность за проект? Ощущал ли ты когда-нибудь этот груз ожиданий, чаяний, и надежд? Держал ли ты в своих натруженных руках архитектуру? Эту маленькую, крошечную жизнь (которую в древней Спарте без раздумий выкидывали со скалы), просящую лишь надежды на бытие? Так слушай, салабон, хорошими тех.директорами не рождаются, ими становятся… Как? Записывай!
Читать дальше →
Total votes 11: ↑5 and ↓6+4
Comments0

История небольшого исследования легаси-кода

Reading time7 min
Views11K
Хорошо, когда в команде есть кто-то более опытный, кто покажет что и как надо делать, какие грабли и за каким углом подстерегают, и где скачать лучшие чертежи велосипедов за 2007 год на DVD. Эта история о том, как желаемое было выдано за действительное, что получилось в результате, и как был преодолен кризис.

Это случилось в ту пору, когда я, имея весьма, как мне казалось, посредственный опыт в разработке, искал место, где можно из недоджуниора эволюционировать (или мутировать) хотя бы в уверенного джуниора. Неисповедимыми путями Господними такое место нашлось, в довесок к месту прилагался проект, и “олдскульный” программер, который за свою карьеру систем написал больше чем девок перепортил. “Отлично! Проект, а следовательно деньги на ЗП есть, наставник прилагается, живем!” — подумал я, но затем, как в описании к типичному хоррору, герои в темной тьме столкнулись с ужасным ужасом…
Читать дальше →
Total votes 27: ↑25 and ↓2+23
Comments18

Information

Rating
3,085-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity