Search
Write a publication
Pull to refresh
30
0
Александр Трахимёнок @astec

User

Send message

Go synctest: Решение проблемы нестабильных тестов

Reading time7 min
Views1.1K


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


func TestSharedValue(t *testing.T) {
    var shared atomic.Int64
    go func() {
        shared.Store(1)
        time.Sleep(1 * time.Microsecond)
        shared.Store(2)
    }()

    // Проверяем общее значение через 5 микросекунд
    time.Sleep(5 * time.Microsecond)
    if shared.Load() != 2 {
        t.Errorf("shared = %d, want 2", shared.Load())
    }
}

Этот тест запускает горутину, которая изменяет общую переменную. Она устанавливает shared в 1, спит 1 микросекунду, а затем устанавливает её в 2.


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


Однако...

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

Как утекает память, если забыть отписаться от Observable

Level of difficultyEasy
Reading time8 min
Views10K

Многие, конечно, знают, что в Angular-сообществе принято трепетно следить за подписками на Observable, потому что это чревато утечками памяти. Но не все видели эти утечки в глаза и не встречались с их последствиями. Давайте смоделируем простую ситуацию по следам утечки, с которой недавно столкнулся я (первый раз).

Читать далее

Как вынести Go-модуль в open source с сохранением авторства

Level of difficultyMedium
Reading time5 min
Views1.5K

Так случается, что команда решает вынести часть проекта в open source и использовать ее как внешнюю зависимость. Как правило, это самостоятельный пакет или инструмент, лишенный какой-либо бизнес-специфики, способный принести пользу сообществу и получить дальнейшее развитие. Большинство коммерческих разработчиков имеет персональные профили на открытых платформах и поддерживает собственные портфолио, поэтому при переносе мы хотим сохранить авторство и историю коммитов. Основная сложность здесь в том, что необходимо полностью исключить всю внутреннюю корпоративную информацию: названия репозиториев и проектов, имена и имейлы сотрудников, внутренние идентификаторы тикетов и любые формулировки, отражающие задачи продукта. Важно, чтобы такая информация отсутствовала по всему дереву коммитов. Для этого мы будем пользоваться такими инструментами,

как git grep, git filter-branch и git rebase --interactive. В статье приводятся порядок шагов и общие рекомендации по оформлению открытого проекта.

Я Константин Соколов из бэкенд-разработки в Positive Technologies. Люблю программировать на Go.

Читать далее

Ключевание стоковых изображений с помощью Batch API от OpenAI

Level of difficultyMedium
Reading time12 min
Views2.2K

Атрибутирование изображений – обязательный этап их подготовки для продажи на фотостоках. У каждой работы (фотографии или иллюстрации) должно быть название, описание, ключевые слова, и все это на английском.

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

Читать далее

Как написать Google Calendar на коленке? Обзор FullCallendar

Level of difficultyEasy
Reading time6 min
Views8.3K

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

Спустя несколько часов поисков я наткнулся на плейлист разработчиков из Индии. В жизни все циклично — именно эти видео мне и помогли. Так я познакомился с классной open source-библиотекой FullCalendar, о которой расскажу в этой статье. Если вы уже начали составлять календари на 2025 год, добро пожаловать под кат!
Читать дальше →

Продал IT-компанию REG.RU и ушел «на пенсию» в Самарский университет, захватив с собой гибкие методологии и Kaiten

Reading time7 min
Views35K

Меня зовут Валерий Студенников, я программист, и вершиной моей IT-карьеры стала компания REG.RU, где я был сооснователем, техническим директором и руководителем разработки.

За 10 лет REG.RU стала №1 в России по количеству зарегистрированных доменных имен, а затем вошла в тройку лидеров по web-хостингу и VPS. В 2021 году мы с партнером продали компанию, я ушел «на пенсию» и с тех пор занимаюсь преподаванием в Самарском университете, обучая студентов различным IT-предметам.

Именно в REG.RU я стал активно применять гибкие методологии и впервые столкнулся с Kaiten, и так получилось, что и то и другое забрал с собой и сейчас использую в преподавательской деятельности. Собственно, об этом и хочу рассказать.

Читать далее

Все, что вы хотели знать про иерархию инжекторов в Angular

Level of difficultyMedium
Reading time8 min
Views8.2K

Привет. Меня зовут Дмитрий, я фронтенд-разработчик в компании «Цифровая индустриальная платформа». В своей работе мне часто приходится использовать Dependency Injection (DI) в Angular. Это мощный и популярный инструмент, который упрощает работу с зависимостями в наших приложениях. Он позволяет легко интегрировать необходимые сущности в компоненты, упрощает процесс тестирования и поддерживает принцип инверсии зависимостей. Однако часто мы не используем все возможности DI, потому что не знаем, как он работает под капотом. Давайте разберемся, как функционирует DI, что такое иерархия инжекторов и какие изменения принесла версия Angular 14.

Читать далее

Web components как альтернатива iframe на примере Angular-компонентов

Level of difficultyMedium
Reading time12 min
Views6.4K

Всем привет! Я Сергей, фронтенд-разработчик из команды привлечения Центрального университета. Занимаюсь проектами, связанными с регистрацией абитуриентов на мероприятия, и внутренними проектами по управлению мероприятиями. 

Осенью мы ждем поступление бакалавров. Чтобы начать набор, нужно встроить форму регистрации в лендинг на CMS. Форма довольно простая: пара полей для ввода данных, диалоговое окно с текстом соглашения об обработке персональных данных и кнопка отправки данных на сервер. Для скорости работы и проверки работоспособности идеи решили встроить приложение через iframe. Но форма стала обрастать различными бизнес-требованиями, которые приносили проблемы. В статье расскажу, с какими трудностями мы столкнулись и как их решали.

Читать далее

Таск-менеджер в Telegram, No-code для создания платных подписок на сайте и в приложении – и другие российские стартапы

Reading time4 min
Views3.5K

10 новых российских сервисов для создания онлайн-инструкций, интернет-магазинов в Телеграм, подписи документов, чтения книг, управления командой и многого другого. Битва за «Продукт недели» началась!

Product Radar — здесь каждую неделю публикуются лучшие онлайн-сервисы и железки от русскоязычных команд.

Читать далее

Docker для Angular-приложений: от простого к несложному

Level of difficultyMedium
Reading time16 min
Views7.9K

Привет, Хабр! Меня зовут Артём, я разрабатываю фронтенд систем управления сетью в YADRO. С Docker знаком давно и часто его использую. Но когда столкнулся с задачами, где недостаточно просто скопировать шаблонный Docker-файл и подправить пару строчек, решил больше погрузиться в эту тему. 

В статье я разберу типовые вопросы, связанные с запуском Angular-приложений в контейнерах, — это поможет в дальнейшем справиться с более замысловатыми задачами. Текст будет полезен тем, кто уже что-то знает про Docker, но не углублялся в детали или хочет освежить знания на практике.

Читать далее

Playwright и Allure как хорошая практика для разработки веб-приложения

Level of difficultyMedium
Reading time6 min
Views5.3K

Разработчики вечно ищут баланс: как выпускать фичи быстро, качественно и желательно небольшой командой. Наш рабочий рецепт – это фронты + e2e-тесты. Рассказываю, как мы используем автотесты и визуализируем их результаты.

Читать далее

Подписки на GraphQL: Почему мы используем SSE/Fetch вместо Websockets

Reading time10 min
Views2.3K

WunderGraph предоставляет подписки GraphQL через SSE (Server-Sent Events) или Fetch (в качестве резервного варианта). В этом посте объясняется, почему мы решили выбрать этот подход и считаем его лучше, чем использование WebSockets.

Читать далее

Эффективные трассировки в Go

Level of difficultyMedium
Reading time6 min
Views3.9K

Пакет runtime/trace содержит мощный инструмент для понимания программ Go и устранения неполадок. Функциональность внутри позволяет создавать трассировку исполнения каждой горутины за определенный период времени. С помощью go tool trace command (или превосходного инструмента gotraceui с открытым исходным кодом) можно визуализировать и исследовать данные в этих трассировках.

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

Читать далее

Все, что я думаю о премиях и бонусах после 29 лет работы в продажах

Level of difficultyEasy
Reading time6 min
Views22K

• Что делать с зарплатными рисками?

• Какими должны быть премии и бонусы?

• Как не продешевить и не переплатить?

В этой статье я постарался интересно и вдумчиво проанализировать свой опыт работы с разными схемами материальной мотивации

Легко представить сколько мне довелось увидеть схЭм как работодатели пытаются не заплатить менеджерам по продажам и наоборот — как менеджеры пытаются получить то, о чем не договаривались. Зарплата, как и любая свободная цена — это всегда компромисс между продавцом и покупателем. Для того, чтобы работодатель рад был платить бонусы, а менеджер по продажам их получать, нужно понимать логику рассуждений с обеих сторон. Поговорим о логике работодателя.

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

Можно выделить два вида зарплатных рисков. Первый заключается в том, что материальная мотивация требует материальных затрат, а мотивации не дает. Т.е. работодатель обязан платить какую-то сумму, а сотрудник не обязан ее отрабатывать. Второй риск в том, что, несмотря на все усилия сотрудника и выплаченную ему окладную часть, продаж все равно нет. Очевидно, что вернуть расходы будет невозможно.

Читать далее

Обзор библиотеки Go Kit

Level of difficultyEasy
Reading time10 min
Views5.7K

Салют, Хабр!

Go Kit предоставляет стандартизированный способ создания сервисов, с ее помощью можно легко реализовать совместимость сервисов. С его помощью можно легко интегрировать различные транспортные протоколы, такие как HTTP, RPC, gRPC, и многое другое, а также реализовывать общие паттерны: логирование, метрики, трассировка. В общем, Go Kit хорошо подходит для разработки микросервисов на go.

Мотивацию создания этой либы разработчики описали так:

Go стал языком сервера, но он по-прежнему недостаточно представлен в так называемых «современных корпоративных» компаниях, таких как Facebook, Twitter, Netflix и SoundCloud. Многие из этих организаций обратились к стекам на основе JVM для создания своей бизнес-логики, во многом благодаря библиотекам и экосистемам, которые напрямую поддерживают их микросервисные архитектуры.

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

Читать далее

Итак, вы думаете, что знаете Git? Часть вторая: новое в Git

Level of difficultyEasy
Reading time4 min
Views29K

Автор оригинала Скотт Чакон — сооснователь GitHub и основатель нового клиента GitButler. Этот клиент ставит во главу угла рабочий процесс и удобство разработки, в том числе код-ревью, и не является просто очередной обёрткой над CLI git.


Далее в нашей серии постов из трёх частей у нас новые фичи! Здесь я расскажу про пять относительно новых вещей в git, о которых вы могли не слышать, потому что ну почему вы?


Мы взглянем на:


Погружаемся!

Шаблон телеграмм бота на go

Level of difficultyMedium
Reading time4 min
Views17K

Шаблон для телеграмм ботов на go - Ваш надежный помощник в создании удобного и функционального бота.

В него можно легко добавлять новые модули, расширяющие возможности бота.
Не тратьте время на банальности, его уже потратили для Вас !

Run Go, Run !

Итак, вы думаете, что знаете Git? Часть первая: старый добрый Git

Level of difficultyEasy
Reading time4 min
Views16K

Автор оригинала Скотт Чакон — сооснователь GitHub и основатель нового клиента GitButler. Этот клиент ставит во главу угла рабочий процесс и удобство разработки, в том числе код-ревью, и не является просто очередной обёрткой над CLI git.


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



Давайте покопаемся!

Простой скрипт на Python для управления личными финансами

Level of difficultyEasy
Reading time3 min
Views28K

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

Читать далее

Представляем gqlgen: генератор серверов GraphQL для Go

Reading time9 min
Views3.8K

В 99designs мы находимся на пути деконструкции нашего PHP-монолита в микросервисную архитектуру, при этом большинство новых сервисов пишется на Go. В этот период наша фронтенд-команда также применила безопасность типов, перейдя с Javascript на TypeScript и React.

После того как мы внедрили безопасность типов в бэкенд и фронтенд, стало очевидно, что наши конечные точки REST, созданные на заказ, не могут преодолеть разрыв между типами. Нам нужен был способ объединить эти системы типов и распутать наши конечные точки API.

Нам нужна была система безопасности типов для API. GraphQL выглядел многообещающе. Однако, изучив его, мы поняли, что не существует серверного подхода, который бы отвечал всем нашим требованиям. Поэтому мы разработали свой собственный, который мы назвали gqlgen.

Читать далее
1
23 ...

Information

Rating
Does not participate
Location
Ирландия
Date of birth
Registered
Activity