• Как устранить утечку памяти при множественных соединениях в net/http Golang?

    @calculator212
    Вообще есть сомнения что дело в этой мапе, первое что в глаза бросается, это то что вы неправильно обрабатываете ошибки пример из оф доки
    resp, err := http.Get("http://example.com/")
    if err != nil {
    	// handle error
    }
    defer resp.Body.Close()
    body, err := io.ReadAll(resp.Body)

    Вы сначала проверяете на ошибку и если ошибки нет, через defer закрываете соединение.
    Второе - вам стоит почитать про http.Transport и некоторые особенности клиентов, т.к. даже соединения которые должны были закрыться могут висеть очень долго
    tr := &http.Transport{
    	MaxIdleConns:       10,
    	IdleConnTimeout:    30 * time.Second,
    	DisableCompression: true,
    }
    client := &http.Client{Transport: tr}
    resp, err := client.Get("https://example.com")

    Также желательно в самой системе посмотреть таймауты и настройки для tcp соединений (это не так часто нужно но если у вас много запросов клиентских, то может помочь).
    Также можете поискать альтернативные клиенты и пулы клиентов, а также как правильно реюзать соединения

    Получается так что в idleConnWait = {map[http.connectMethodKey]http.wantConnQueue} постоянно записываются новые элементы,
    В целом есть вероятность, что "утечка" тут, но это очень легко проверить даже без профилировщика, т.к. эта мапа уникальна для каждого клиента, то можно напрямую проверять сколько клиент занимает памяти, но на самом деле есть большая вероятность, что проблема в том, что вы неправильно используете client, т.к. эта мапа периодически очищается и расти она должна только до определенного значения
    Ответ написан
    9 комментариев
  • Что означает запись [4]byte в языке Go?

    @calculator212
    а как понять, то что перед типом указано - [4] ?
    В го конкретно в данном случае это будет частью типа, по сути это означает, что массив (именно массив а не слайс) - это отдельный тип, который представляет из себя последовательность из 4 элементов.
    Массив считается отдельным типом сам по себе, т.е. [4]byte, [3]byte, []byte это три разных типа.
    Ответ написан
    1 комментарий
  • Как записать в выходной канал элемент из буфера и разблокировать исходный канал с помощью pause (задача)?

    @calculator212
    - запись в выходной канал queuedData[i]
    Вроде же это слайс структур fanInRecord, из каналов так только pause, видимо нужно добавить в структуру канал и туда писать, но мб я что-то не так понял
    - разблокировка исходного канала с помощью pause."
    Какой из каналов тут исходный? Но в целом механизм паузы реализуется либо через два канала pause/unpause, либо можно использовать один канал, который будет менять значение булевской переменной, которая определяет можно ли сейчас писать в канал или нет
    Ответ написан
    Комментировать
  • Насколько актуальна книга Марка Саммерфильда?

    @calculator212
    в 2013 на английском и только в 2016 году на русском, а это почти 10 лет назад,
    Глобальных измений за 10 лет было не так много, упражнения в этой книге в целом довольно интересные (если затык с ними то можно на гите поискать решения), поэтому в целом книга достаточно актуальная.
    Ответ написан
    Комментировать
  • Как можно применять гибкие методологии управления в сугубо продуктовых проектах с физическим товаром?

    @calculator212
    Конкретно в вашем случае применение scrum близко к бессмысленному, т.к. обычно спринты длятся 1-4 недели (а у вас весь срок это 1 месяц) и по сути в конце спринта нужно показывать готовый (промежуточный) продукт, штуки типа оплаты, отгрузки и т.д. не имеют отношения к этому (по крайней мере в it как минимум в большинстве случаев).
    Хотелось бы получить совет, возможно ли в моей сугубо продуктовой деятельности использовать гибкие методологии / или я уже ее использую?
    Попробовать можно конечно, но вы вероятно не совсем понимаете чем разработка ПО отличается от разработки дизайна для сувениров и т.д. В большинстве случаем разработка продукта длится от 3 месяцев до нескольких лет, и при помощи методологии пытаются разбить задачи и обозначить какие-то сроки по внедрению функционала. В целом скрам не всегда подходит, т.к. разработка некоторых фич может занимать несколько месяцев(иногда конечно завышают сроки), но суть в том что формально по скраму уже не получится работать и если слепо следовать идеологии, то можно принести больше вреда чем пользы.
    Просто, например Сазерленд (создатель скрама) утверждает, что за гибкими методологиями будущее, а всякие водопады должны кануть к лету. И только используя скрам можно повысить работоспособность команды до 800%.
    Сказать можно много чего, человек зарабатывает на продаже своей идеи и логично что он будет её продвигать. Интересно посмотреть как именно скрам повысил производительность на 800%( хз что он вообще под этим подразумевает), в ряде областей скрам полезен, но чаще проблема просто в том, что менеджмент неэффективный, т.к. руководитель просто не понимает специфику своей работы или работы команды, я например видел пример того что руководитель просил каждый день писать отчет о проделанной работе и разбивать это по часам, в итоге на бумаге всё "хорошо" было а на практике это была худшая команда в плане выпуска продуктов и атмосферы.
    Поэтому нужно изучить основные методы, хотя бы немного погрузиться в специфику (думаю есть курсы/видео на ютубе по типу "IT для менеджеров"), чтобы более менее понимать что просить от людей. И почитать книги по типу "мифический человеко-месяц" и "как пасти котов"
    Ответ написан
    Комментировать
  • Есть ли курсы/книги по автотестированию Selenium + C#?

    @calculator212
    Книга Selenium WebDriver Recipes in C#, 3rd Edition: Practical Testing Solutions for Selenium WebDriver, Courtney Zhan, но хз есть ли на русском
    Ответ написан
    Комментировать
  • Как организовать структуру проекта с несколькими модулями Golang?

    @calculator212
    И я хочу сделать 1 модуль который они будут импортировать с некоторым набором общих для них функций.
    Если хотите так сделать, то можно просто сделать интерфейс, у которого методы будут совпадать с общими функциями которые вы хотите вынести, можете его вынести в отдельный файл/модуль при необходимости.
    Я часа 4 ковырялся в статьях и видео уроках но так и не смог из 1 несчастного модуля импортировать функции в другой неменее несчастный модуль
    Можно упрощенную версию сюда выложить и конкретнее написать что не получается
    Ответ написан
    Комментировать
  • Есть ли качественная дорожная карта для web разработки на python?

    @calculator212
    дорожная карта для web разработки на python
    В целом веб разработка не привязана к какому-либо языку, например вопрос с авторизацией пользователей часто решается при помощи cookie/jwt и по сути никак не связан с питоном. Т.е. тебе не нужна карта конкретно под питон, а нужна карта под бэк/фронт
    есть базовая карта для бэкенда(там же для фронта), по которой ты можешь ориентироваться. Из этой карты тебе стоит выцепить основные понятия, как rest, cors, caching и т.д. и изучать это.
    Всякие там протоколы сетевые, ну то есть хочу не просто клипать тупо, а понимать как все между собой связано,
    Можешь пройти курс по сетям, хотя в целом например мне понимание того как работает OSPF, BGP не особо помогает, TCP/udp полезно, но конкретно в питоне редко используется напрямую.
    Если ты изучаешь для хобби и времени у тебя много то можешь конечно распылять время как хочешь, если изучаешь для поиска работы, то следует сконцентрироваться на нужных инструментах и языке, ряд вещей по типу того устроены сети занимает много времени особенно если никто не помогает, а выигрыша про поиске работы немного больше нуля.
    Ответ написан
    Комментировать
  • Пул соединений с БД и транзакции: с чем это кушают?

    @calculator212
    фантомное, грязное чтение и подобное

    Для решения я открывал параллельные соединения с БД

    Это не связанные друг с другом вещи. То что вы описали возникает при транзакциях, я знаю два способа пофиксить это. Первый - использовать FOR UPDATE/LOCK TABLE, в запросах, который будет ждать пока выполняется другая транзакция. Второй использовать serializable и политику ретраев.
    Использовал уровень изоляции serializable
    Он защищает от ошибок с транзакциями, и по сути просто отменяет их в случае ошибок и показывает что была попытка неправильно использовать транзакцию, исправить ошибки в транзакциях он не может.
    На форумах пишут "нужно грамотно управлять пулами соединений", но что это значит? Где про это прочитать?
    Лучше там спросить, что они имеют ввиду.
    И я убрал параллельные соединения и сделал транзакции через основное соединение с БД (то, которое при запуске открывается и больше не закрывается), и это заработало, но теперь так как соединение одно, каждый юзер вынужден ждать завершения транзакций всех остальных юзеров.
    Как бы пользователь в любом случае должен ждать пока другие транзакции завершатся, пул соединений полезен тем, что другие запросы не связанные с этой таблицей могу параллельно выполняться.
    Если вы используете транзакции, по хорошему это нужно нормально тестировать, в тесте быстро запускать 100-150 транзакций, которы едолжны выполниться без ошибок и при этом вы должны получить желаемый результат в БД после их выполнения.
    Ответ написан
    1 комментарий
  • Где найти информацию про школьную информатику?

    @calculator212
    Предлагают пройти профориентацию в IT, а в школе почти полностью отсутствовала информатика.
    Не совсем понятно что подразумевается под профориентацией. Если это просто проверка на то чем хочется заниматься или есть ли этому склонность, то не думаю что нужно как готовиться. Больше влияет, хочешь ли ты этим заниматься и есть ли тяга в целом к IT(если что это большая область а не только программирование).
    Где можно быстро догнать основные темы?
    Если нужна именно школьная информатика, то можно поискать учебники, если непонятно в учебниках, то можно зайти на ютуб и написать "информатика плейлист/плейлисты" простой курс, 10-11 класс, курс посложнее(понадобится гуглить дополнительно скорее всего и искать ответы на непонятные темы)

    PS я хз как сейчас но раньше многие технические вузы принимали без информатики, но при этом программирование/сети/администрирование и прочие вещи там преподавались и те кто хотел после выпуска шли работать программистами/аналитиками и т.д. само собой не все смогли устроиться в it, т.к. кто-то не хотел там работать, а кто-то просто не мог из-за плохих знаний. Но все те кто пошел работать имели интерес к профессии и сами дополнительно занимались, при чем часто это было не изучение готовых курсов или книжек, а чтение мануалов и гугление, т.е. многим просто было интересно сделать дуал бут на своем ПК или установить на виртуалку какой-нибудь hadoop и потестить его.
    Ответ написан
    Комментировать
  • Учебный материал по микросервисам?

    @calculator212
    Кто-нить может поделится толковым материаоаии по данной тематике.
    Где доходчиво объяснено как их создавать
    На мой взгляд если так ставится вопрос, то есть ощущение, что вам не особо и нужны микросервисы. Микросервисы это просто подход к организации приложения, который имеет свои плюсы и минусы.
    Я не совсем понимаю зачем вам нужен готовый курс, т.к. по сути достаточно взять монолитное приложение и попробовать его распилить на микросервисы - это даст гораздо больше, также можно будет лучше понять какие плюсы/минусы дают микросервисы/монолиты много полезного
    Ответ написан
    Комментировать
  • Как предотвратить бесконечную загрузку страницы при отправке post запроса?

    @calculator212
    обновлялся счетчик отправленных сообщений
    Нужно отдельное API которое будет возвращать тебе значение счетчика для текущего чата, например по id чата. На стороне клиента нужно использовать js, сейчас обычно используют fetch реже XHR, соотвественно в js тебе нужно будет запустить фоновый процесс который будет опрашивать сервер раз в секунду например и обновлять счетчик
    Ответ написан
    Комментировать
  • Стоит ли использовать Docker в продакшене для нескольких сайтов на одной VPS?

    @calculator212
    В целом разворачивание БД в проде на докере это в целом довольно дискуссионный вопрос, т.к. это удобно, но дороже по ресурсам и производительность БД становится меньше. В целом БД в докере это чаще про разработку, в целом установка не такая удобная как в докере, но сейчас это всё сводится к паре команд и импорту каких-то настроек.
    и раньше на одной слабой VPS с 512 оперативы я мог запустить штук 5 не требовательных сайтов и они бы все летали
    Если сервер бьет по финансам, то по моему стоит настроить прод без докера, т.к. докер в целом это не про экономию ресурсов а про удобство и изолированность.
    Мне также очень нравится то, что БД пишет данные в volume, который потом можно сжать и скопировать на другой сервер, а не охреневать когда надо перенести базу на сотни гигов
    Честно говоря не понял особой разницы в прямом экспорте из базы, который можно также дампить в архив и в архивации volume, по сути одно и тоже.
    Ответ написан
  • C#, сессии, JWT token?

    @calculator212
    Я думал построить авторизацию на JWT токенах, а токены хранить в базе.
    В целом сейчас это популярный способ для аутентификации, только особенность в том, что хранить токены в базе - это противоречие самой концепции JWT(но многие все равно так делают), т.к. эти токены должны проверяться только сервером на валидность без обращения к БД. Плюс jwt довольно легко неправильно сконфигурировать, в общем если у вас по сути монолитный проект, то jwt не особо и нужен и вполне все можно сделать на куках. Но если хотите использовать jwt, то стоит прочитать про access и refresh токены, какую инфу не стоит хранить в токене и какие алгоритмы выбрать для настройки.
    Ответ написан
  • Как правильно настроить TOR?

    @calculator212
    как правильно настроить TOR чтобы весь выход в инет был сразу через TOR
    Слишком абстрактная формулировка вопроса. отсюда можно начать. В целом если нужно для браузера или какого-то софта, то лучше прописать в самом софте или браузере socks прокси от тора
    Ответ написан
    Комментировать
  • Почему присвоение значения переменной не считается использованием переменной?

    @calculator212

    Вопрос: Почему присвоение переменной значения не считается использованием ?
    В целом можно ответить, что так решили разрабы, но в целом это логично, т.к. при присовении нового значения вы ничего не делаете с переменной, т.е. она фактически просто занимает память и не используется ни в каком выражении.
    value = value + 1
    В целом по логике этот случай тоже можно было бы отнести к неиспользованию, но вероятно тут такая логика, что это значение используется для вычисления нового значения, что по сути является использованием, компилятор не чекает используется дальше вычисленное значение но в данном случае это уже не особо и важно. В целом для обход not used есть такой способ
    // No errors
    a:= 1
    b := 2
    _, _ = a, b


    Про "if value > 5 {" еще проще, это уже полноценное использование переменной в условии
    Ответ написан
    Комментировать
  • Кто нибудь применял или видел generics в серьезных Go проектах?

    @calculator212
    Или, может быть, поделитесь опытом использования на производстве.
    Хз что подразуемевается под серьезным проектом. На практике их получается не так часто использовать. Например изнально была функция, которая на вход получала слайс и преобразовывала его в таски и помещала в пул , потом добавилось несколько других источников данных, с которыми нужно было тоже самое делать. В целом форматы данных отличались, но всё можно было преобразовать к общему формату. Выделил общие методы и использовал дженирики. В целом можно было бы обойтись и без них, но в моей ситуации это было довольно удобно, по сути можно было бы заменить интерфейсом.
    Реальный плюс дженериков в том, что в ide (по крайней мере в goland) проще искать код методов и ты уже сразу знаешь какие типы они реализуют, что упрощает поддержку кода (тут субъективно).
    С одной стороны некоторых возможностей дженериков не хватает, но с другой стороны радует, что код на го не будет похож на плюсовый код в бусте, и в основном дженерики используются там где это нужно.
    Ответ написан
    Комментировать
  • Почему не сетится значение из БД в структуру в поле uint?

    @calculator212
    Гугл с ошибкой не помог :(

    sql: Scan error on column index 1, name "i_size": converting driver. Value type int64 ("-10") to a uint8: invalid syntax
    Можно попробовать еще прочитать ошибку или засунуть ее в гугл переводчик.
    Проблема тут не с sqlx, а с тем, что ты хочешь запихнуть в поле uint отрицательное значение, на что база тебе выдает ошибку(так и должно быть). Если нужны отрицательные значения в базе то используй просто int
    Ответ написан
    Комментировать
  • Как сделать перевод DOCX в PNG в python/js?

    @calculator212
    Напрямую не уверен, что такое получается, на практике чаще видел схему docx -> pdf -> png/jpg, если преобразование нужно для любого документа то обычно используется обертка над тулзами libre office или popler utils, некоторые либы умеют напрямую делать преобразование docx->pdf, но там обычно список документов ограничен, под виндой часто юзают апи ворда для конвертации.
    Ответ написан
  • Применим ли такой способ авторизации?

    @calculator212
    1) В целом зависит от ситуации, но использовать куки это всё еще норм, т.к. если вы плохо понимаете jwt, то можете несколько дыр создадать. В целом токен часто и хранят в куке. Смотря что вы подразумеваете под разницей, но в большинстве случаев есть разница т.к. jwt использует несколько реализаций. Access/Refresh токены, которые вы не можете отозвать и соотвественно завершить сессию принудительно как с куки, если вы создаёте white listс токенами то по сути это уже близко к реализации с куки но всё равно есть отличия.

    2) Нужно внедрять https не особо влияет на эту атаку. Также есть заблуждение что cors спасает, но тут уже вам нужно будет разобраться с этим, но если лень, то можно просто подключить этот токен (его не сложно подключать).

    3) Тут несколько вариантов. Можно редирект возвращать а можно 401 и форму с логином. Можно обработчик сделать на js и при 401 редиректить на страницу с логином как удобнее так и делайте
    Ответ написан
    Комментировать