Спонсоры
Технотекст
Отправить статьюСамодельный стратостат
Допустим, вы интересуетесь космосом, но космос для вас недоступен. Выше 10км не подняться, а посмотреть "что там?" очень хочется. По классификации NASA — нижняя граница космоса начинается на 100км от поверхности Земли. Эта статья будет не совсем про космос, но про возможность создания своего стратосферного зонда с нуля. Я много видел примеров успешного запуска и несколько статей на Хабре, но почти все они — это отчеты. Я же хочу оставить статью, которая сможет претендовать на "complete guide" для юных покорителей. Запаситесь терпением и безлимитным интернетом — будет много текста, картинок и даже пару видео. Это был долгий путь для нас, но я намерен сделать его не таким изнурительным для всех желающих. Поехали?
Моделирование и визуализация при анализе и проектировании ИТ систем. И не только
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/getpro/habr/upload_files/2a9/eb3/539/2a9eb353983bc16fa6090fbbdbb94c82.jpg)
Какие способы моделирования, диаграммы и визуализации используют чаще всего при проектировании информационных систем? Какие нотации использовать, чтобы сделать информацию более понятной для других, а какие устарели? Разбираемся с результатами опроса...
Цифровая логистика: решение транспортной задачи спроса и предложения с помощью библиотеки DOcplex от IBM
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/webt/mm/ma/xo/mmmaxo649zjoyjvdgiwdgizzyw0.png)
Всем привет, меня зовут Дмитрий Кузин (Application Development Senior Analyst в Accenture), и в своей статье я делюсь историей о том, как запрос на решение задачи в корпоративной рассылке привел к освоению Python библиотеки DOcplex от IBM, предназначенной для решения оптимизационных задач.
Я бы хотел поделиться личным опытом решения транспортной задачи с применением Python-библиотеки DOcplex от IBM. Если вкратце, то это задача про то, как с наименьшими затратами доставить продукцию или товары от производителей к покупателям, учитывая предложение первых и спрос вторых. В статье я дам основные определения транспортной задачи, покажу, как правильно сформулировать её условие, а также приведу пример решения на Python.
SQL миграции в Postgres. Часть 1
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/webt/yz/lf/vi/yzlfvii0kq0wrmqixd4sun3okia.jpeg)
Как обновить значение атрибута для всех записей таблицы? Как добавить первичный или уникальный ключ в таблицу? Как разбить таблицу на две? Как ...
Если приложение может быть недоступно какое-то время для проведения миграций, то ответы на эти вопросы не представляют сложности. А что делать, если миграции нужно проводить на горячую – не останавливая базу данных и не мешая другим с ней работать?
На эти и другие вопросы, возникающие при проведении миграций схемы и данных в PostgreSQL, постараемся дать ответы в виде практических советов.
Можно ли подружить Stream API и JPA?
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/getpro/habr/upload_files/b7b/992/4ef/b7b9924ef3a74fe4af40919c55a7865c.jpeg)
В этой статье я хотел бы познакомить сообщество с библиотекой JPAstreamer. Идея этой библиотеки очень проста, но в то же время гениальна - получать нужные нам сущности из базы так, как если бы мы просто обрабатывали поток сущностей в стриме.
Если интересно посмотреть, что может библиотека, то прошу под кат.
Читаем EXPLAIN на максималках
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/getpro/habr/upload_files/f16/71a/54f/f1671a54fa7dfc5a4822bf6c4cbd9a8a.png)
Многим, кто работает с MySQL, известно, что команда EXPLAIN используется для оптимизации запросов, получения информации об использованных и возможных индексах. Большинство разработчиков и администраторов СУБД этой информацией и ограничивается. Я же предлагаю изучить команду EXPLAIN максимально подробно.
Написание компилятора на Haskell + LLVM
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/getpro/habr/upload_files/8bf/9da/8ab/8bf9da8ab2389bff724179f9ad0073bf.png)
На работе я пишу почти исключительно на Python, с университетской скамьи остались некоторые знания C/C++, в одном pet-project использовал Haskell. С таким багажом знаний я взялся за написание компилятора на основе LLVM - зачем и что получилось я уже рассказывал в предыдущей статье.
Эту статью я пишу для тех, кто, как и я, заинтересован в изучении Haskell, создании собственных языков программирования, или хочет поиграться с LLVM - но не знает с какого конца подойти к задаче.
Я кратко расскажу про необходимый минимум знаний Haskell, про свои ошибки и к каким решениям я пришел - а так же про решения, к которым я не пришел, и про которые узнал позже - и как их можно интегрировать в ваш pet-компилятор. На все это я по возможности дам ссылки на изучение.
Логическая репликация в PostgreSQL. Репликационные идентификаторы и популярные ошибки
![image](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/webt/rc/4w/c4/rc4wc4pblkhrdji9tkuwdwvt2ro.jpeg)
Начиная с 10 версии, перенести данные с одной базы PostgreSQL на другую несложно, с обновлением, без обновления — неважно. Об этом немало сказано и сказанное сводится к следующему: на мастере, 10 версии и выше, устанавливаем параметр конфигурации
wal_level="logical"
. В pg_hba.conf добавляем такую строку:host db_name postgres 192.168.1.3/32 trust
Затем рестартуем на мастере postgres и выполняем на реплике из-под пользователя postgres:
pg_dumpall --database=postgres --host=192.168.1.2 --no-password --globals-only --no-privileges | psql
pg_dump --dbname db_name --host=192.168.1.2 --no-password --create --schema-only | psql
Теперь подключаемся на мастере пользователем
postgres
к базе db_name
и создаём публикацию:CREATE PUBLICATION db_pub FOR ALL TABLES;
а на реплике создаём подписку:
CREATE SUBSCRIPTION db_sub CONNECTION 'host=192.168.1.2 dbname=db_name' PUBLICATION db_pub;
По завершении репликации переключаем приложение или балансировщик на новую базу.
Теперь вы знаете постгрес (и с какой стороны доить слонеску) и можете идти устраиваться ДБА.
Для любознательных есть пара небольших деталей под катом.
Мы Опубликовали Качественный, Простой, Доступный и Быстрый Синтез Речи
Вторая часть — https://habr.com/ru/post/563484/
Вокруг темы синтеза речи сейчас много движения: на рынке есть огромное число тулкитов для синтеза, большое число закрытых коммерческих решений за АПИ (как на современных технологиях, так и на более старых, т.е. "говорилки") от условных GAFA компаний, большое количество американских стартапов, пытающихся сделать очередные аудио дипфейки (voice transfer).
Но мы не видели открытых решений, которые бы удовлетворяли одновременно следующим критериям:
- Приемлемый уровень естественности речи;
- Большая библиотека готовых голосов на разных языках;
- Поддержка синтеза как в
16kHz
так и в8kHz
из коробки; - Наличие своих собственных голосов у авторов решения, не нарушающих чужие права и лицензии;
- Высокая скорость работы на "слабом" железе. Достаточная скорость работы на 1 потоке / ядре процессора;
- Не требует GPU, команды ML инженеров или какой-либо дополнительной тренировки или для использования;
- Минимализм и отсутствие зависимостей / использование в 1 строчку / не надо ничего собирать или чинить;
- Позиционируется именно как готовое решение, а не очередной фреймворк / компиляция чужих скриптов / тулкитов для сбора плюсиков;
- Решение никак не связано и не аффилировано с закрытыми экосистемами и продуктами Гугла / Сбера / Яндекса / вставить нужное;
Мы попытались учесть все эти пункты и представить комьюнити свое открытое некоммерческое решение, удовлетворяющее этим критериям. По причине его публичности мы не заостряем внимание на архитектуре и не фокусируемся на каких-то cherry picked
примерах — вы можете оценить все сами, пройдя по ссылке.
Выбор библиотеки ассертов для проекта на Kotlin
В одном из старых проектов в кучу были навалены ассерты из JUnit, kotlin.test и AssertJ. Это было не единственной его проблемой: его вообще писали как письмо Дяди Федора, а времени остановиться и привести к единому виду не было. И вот это время пришло.
В статье будет мини-исследование про то, какие ассерты лучше по субъективным критериям. Хотел сначала сделать что-то простое: накидать набор тестов, чтобы быстренько копипастом клепать варианты. Потом выделил общие тестовые данные, некоторые проверки автоматизировал, и как поехало все… В результате получился небольшой розеттский камень и эта статья может пригодится вам для того, чтобы выбрать библиотеку ассертов, которая подойдет под ваши реалии.
Сразу оговорюсь, что в статье не будет сравнения фреймворков для тестирования, подходов к тестированию и каких-то хитрых подходов к проверке данных. Речь будет идти про несложные ассерты.
Обеспечение доступности веб-контента: стандарты, критерии, пример реализации
![image](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/webt/hm/-6/l9/hm-6l9osczqwvqaazkkv5pwvioo.png)
Привет, меня зовут Павел. Я занимаюсь изучением и тестированием доступности.
Когда начинал изучать этот вопрос, я понимал, что это делается с заботой о людях с нарушением зрения, слуха, моторики, но я не имел представления как именно это делается.
Поэтому, в начале уходило много времени на поиск информации, затем на чтение документации, просмотр видео инструкций про доступность, на эксперименты с контентом, что, в итоге, помогло определиться с подходом и начать внедрять доступность в наши продукты.
В данной статье мы погрузимся в вопрос доступности контента, разберемся, почему важна доступность в интернете, чем она регламентируется и как реализуется. В завершение, я расскажу на реальном примере, как мы с командой работали над повышением доступности нашего продукта — конструктора онлайн-курсов iSpring Suite.
Модульный PHP монолит: рецепт приготовления
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/getpro/habr/upload_files/7c4/ce0/16d/7c4ce016d38fd21bd63ae31f61914693.jpg)
Статья написана по мотивам моего доклада на митапе. В нем я рассказываю историю того, как мы взяли и не распилили монолит на микросервисы, и что сделали вместо этого.
На тот момент наша команда работала над приложением, начало которому было положено еще в 2009 году не искушенными в архитектуре студентами. К 2018 это уже был типичный big ball of mud (большой ком грязи), или, этакий «монолит-копролит», как выразился один наш коллега. Думаю, многим знакомо.
Строим систему доменных событий в модульном монолите
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/getpro/habr/upload_files/358/700/305/3587003050c35745c0ed6e0e32f0a3b1.png)
Всем привет! В этой статье хочу поделиться опытом построения системы доменных событий (domain events) в нашем модульном монолите и микросервисах, рассказать о том, как мы гарантируем их доставку, следим за консистентностью в рамках транзакций, используя transactional outbox, чем доменные события отличаются от интеграционных и всё это в рамках multi tenant приложения. Подробнее под катом.
Обзор операторов PostgreSQL для Kubernetes. Часть 1: наш выбор и опыт
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/webt/ua/vc/qf/uavcqfdufe1gl7frmnoszrcwiau.png)
Всё чаще от клиентов поступают такие запросы: «Хотим как Amazon RDS, но дешевле»; «Хотим как RDS, но везде, в любой инфраструктуре». Чтобы реализовать подобное managed-решение на Kubernetes, мы посмотрели на текущее состояние наиболее популярных операторов для PostgreSQL (Stolon, операторы от Crunchy Data и Zalando) и сделали свой выбор.
Эта статья — полученный нами опыт и с теоретической точки зрения (обзор решений), и с практической стороны (что было выбрано и что из этого получилось). Но для начала давайте определимся, какие вообще требования предъявляются к потенциальной замене RDS…
Аварии как опыт #1. Как сломать два кластера ClickHouse, не уточнив один нюанс
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/getpro/habr/upload_files/26c/f0f/da7/26cf0fda792bff3266d0d568448ffe69.png)
Про некоторые свои failure stories мы уже писали и раньше, но теперь мне выпала честь формально открыть специальный цикл из таких статей. Ведь аварии, их причины и последствия — это тоже часть нашей жизни, и исследовать эту «тёмную сторону» не менее интересно, чем всё остальное. Тем более, что они всё больше влияют даже на повседневный быт, так что из любой аварии можно и нужно извлекать уроки. Да и читатели не раз просили нас рассказывать о таком почаще — давайте попробуем!
Первая история — о том, как плоха и к каким последствиям может привести недостаточная коммуникация. Мы, конечно, высоко ценим и поддерживаем культуру открытого, качественного и (при необходимости) максимально плотного взаимодействия. Однако и на старуху бывает проруха. Произошедшее здесь — отличная иллюстрация того, как проблема скорее организационного характера находит слабое место в технических особенностях и выливается в неожиданный сбой.
Перейдем к технической стороне…
Использование GitHub в обучении студентов
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/getpro/habr/upload_files/352/857/039/3528570390c5ae114487b2b6ddb48137.png)
В своей преподавательской практике использую GitHub...
Но для начала давайте представлюсь. Зовут меня Старинин Андрей. И я преподаю программирование, хотя по первому образованию я биолог.
html2json
Как обычно мы храним в базе данных что-то, что нужно показать пользователю и обладает некоторыми свойствами разметки? Кто хотя бы раз делал свой блог, хабр или похожее сразу скажет — html. А что, если я скажу, что можно сделать иначе? JSON.
Я бы хотел рассмотреть преимущества и недостатки подобного хранения, ну или попытаться, по крайней мере.
Возвращение Бурана
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/webt/kp/aj/3c/kpaj3cxm_rsccvbkgulkvarrxqs.jpeg)
Каждую осень в различных частях земного шара с 4 по 10 октября отмечается всемирная неделя космоса. Так совпало, что именно в канун праздника было опубликовано мое первое тематическое игровое Android приложение. В рамках ежегодного космического недельного торжества я хотел бы рассказать историю о первом опыте выпуска Android игры “Возвращение Бурана”.
Лучшие практики для деплоя высокодоступных приложений в Kubernetes. Часть 1
![](https://webcf.waybackmachine.org/web/20220224222239im_/https://habrastorage.org/getpro/habr/upload_files/022/78c/d14/02278cd14306a311223f2d55755807b5.png)
Развернуть в Kubernetes приложение в минимально рабочей конфигурации нетрудно. Но когда вы захотите обеспечить своему приложению максимальную доступность и надежность в работе, вы неизбежно столкнётесь с немалым количеством подводных камней. В этот статье мы попытались систематизировать и ёмко описать самые важные правила для развертывания высокодоступных приложений в Kubernetes.
Функциональность, которая не доступна в Kubernetes «из коробки», здесь почти не будет затрагиваться. Также мы не будем привязываться к конкретным CD-решениям и опустим вопросы шаблонизации/генерации Kubernetes-манифестов. Рассмотрены только общие правила, касающиеся того, как Kubernetes-манифесты могут выглядеть в конечном итоге при деплое в кластер.