• Как обычно логируют краши от паник?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Если говорить про http сервер - я перенял практику из Django.

    У меня есть http middleware, который:
    - вызывает recover
    - нормально отвечает на запрос, а не падает, т.е. 500 + что мы уже знаем об ошибке и работаем над её устранением
    - собирает всю информацию по запросу, http заголовки, cookies, настройки сервера, переменные окружения и т.д. и оповещает меня по почте/телеграм

    Это даёт мне возможность узнавать о проблеме до того, как кто-то напишет в поддержку.

    Люди, в хорошем смысле, удивляются, когда у них что-то не получается, сервер отвечает 500, они не поймут что делать. А я уже узнал об этом, исправил ошибку и написал им письмо о том, что была ошибка, но уже всё исправлено :)
    Ответ написан
    Комментировать
  • Как создать переменую областью видимости пакета,чтобы не видели другие горутины и без их блокировки?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Можно сделать что-то тапа такого.
    Реализация не очень красивая, но, думаю, это даст вам понимание в каком направлении можно двигаться.
    package pkg2
    import "fmt"
    
    type Pkg2 struct {
         str2 []string
    }
    
    func New() *Pkg2 {
        return &Pkg2{
            str2: []string{},
        }
    }
    
    func (p *Pkg2) Test(str string){
        p.str2 = append(p.str2, str)
        fmt.Printf("str:%v %v \n", str, p.str2)
    }


    package main
    
    import (
      "sync"
      "pkg2"
    )
    var wg sync.WaitGroup
    
    func main() {
      text:=[]string{"a1", "a2", "a3", "a4", "a5"}
      for i,str:=range text{
        wg.Add(1)
        p := pkg2.New()
        go start(str, p)
      }
      wg.Wait()
    }
    
    func start(str string, p *pkg2.Pkg2){
        p.Test(str)
        wg.Done()
    }
    Ответ написан
    3 комментария
  • Совместимы ли Golang и Machine Learning?

    @dmshar
    Давайте разделим - мухи отдельно, а котлеты отдельно.
    Вопрос первый:
    "Совместимы ли Golang и Machine Learning?" - Ответ "да". Существуют решения для МL и на Go, и на Python, и на С# и на Java, и даже на PHP и JavaScript. А если учесть, что процентов 80 инструментов для МL реализованы на С++ то и он задействован.
    Вопрос в том, на чем чаше работают при решении задач ИИ и ML - это уже совсем другой вопрос.
    Вопрос второй:
    "можно ли мне их будет совмещать в дальнейшем, чтобы работать сразу в двух направлениях." Если под "их" вы понимаете Go и ML - то см. выше. А если "backend" и ML - скорее всего нет. Впрочем, есть такая специальность, как "Machine Learning engineer" или еще говорят "Специалист по дата-инженерии". Там могут оба навыка как-то сблизиться и где-то пересечься. Но это не чистый "backend" и не чистое Машинное обучение. Посмотрите в эту сторону.
    Вопрос третий:
    "Не знаю, что выбрать backend разработку на Golang или Machine Learning" (кстати, а тут уже вы Go противопоставили МL - это случайность?)
    Вот тут за вас никто не решит, и не стоит перекладывать ответственность на других. Посмотрите, почитайте - благо в интернете на эту тему написано столько, что ни на одном форуме вам не расскажут что-то новое. Подумайте, что вам больше нравиться, к чему больше тянет. Вообще говоря это разные сферы - одна чисто технологическая, вторая скорее статистическо-математическая, где программирование используется только как инструмент. Не факт, что вы настолько разносторонне и равномерно подготовлены, что почувствуете себя одинаково комфортно в обоих сферах. И принимайте решение. Самостоятельно! Без оглядки на советы непонятно кого, с непонятно каким опытом и образованием.
    Удачи.
    Ответ написан
    Комментировать
  • Как вытянуть id и текс сообщения в телеграме на go?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Вот тут расписаны все поля структуры Message https://pkg.go.dev/github.com/go-telegram-bot-api/...

    Пример того, как можно получить нужные вам данные
    package main
    
    import (
    	"log"
    
    	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
    )
    
    func main() {
    	bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken")
    	if err != nil {
    		log.Panic(err)
    	}
    
    	u := tgbotapi.NewUpdate(0)
    	u.Timeout = 60
    
    	updates := bot.GetUpdatesChan(u)
    
    	for update := range updates {
                if update.Message == nil { // не обрабатываем если нет сообщения
                    continue
                }
    
                // ID сообщения, int
                log.Printf("message id: %s\n", update.Message.MessageID)
    
                // так вы можете получить текст сообщения полный (тип string)
                log.Printf("message: %s\n", update.Message.Text)
    
                if update.Message.IsCommand() {
                    // так вы получаете команду
                    log.Printf("command: %s\n", update.Message.Command())
    
                    // так вы получаете аргументы (параметры) команды, string
                    log.Printf("command: %s\n", update.Message.CommandArguments())
                }
            }
        }
    }
    Ответ написан
    Комментировать
  • Какие плюсы с перехода на react c vue?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    Но я считаю что на реакте будет лучше.

    Скажите просто несколько доводов в сторону реакт.

    Вот вы нам и скажите )) Вы же говорите что на реакте лучше. Особенно про слабые библиотеки интересно услышать доводы.
    Ответ написан
    4 комментария
  • Какие плюсы с перехода на react c vue?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Перейдя на реакт вы будете страдать. Реакт - это тупо даунгрейд. Всё то же самое, но хуже и местами отсутствует. Есть ли в нём хоть какие-то преимущества перед vue? Не знаю таких.
    Что за проблемы у вас с библиотеками?
    Ответ написан
    2 комментария
  • Как лучше реализовать транзакцию?

    yellow79
    @yellow79
    Senior Software Engineer
    В целом всё выглядит не плохо, но будет лучше, если контекст будем принимать на вход. Так же было не плохо отменять транзакцию в случае ошибки, ну и закрывать prepare тоже не помешает. На каждую итерацию цикла вовсе не обязательно содавать свой собственный prepare, достаточно одного

    func (db *Requests) StorePhotos(ctx context.Context, photos []Photo) error {
    	ctx, cancel := context.WithTimeout(ctx, time.Minute*2)
    	defer cancel()
    
    	tx, err := db.BeginTx(ctx, nil)
    	if err != nil {
    		return err
    	}
    	defer tx.Rollback()
    
    	stmnt, err := tx.PrepareContext(ctx, "INSERT INTO photos (id, owner_id, req_id, url) VALUES ($1, $2, $3, $4)")
    	if err != nil {
    		return err
    	}
    	defer stmnt.Close()
    
    	for _, photo := range photos {
    		if _, err = stmnt.ExecContext(ctx, photo.ID, photo.OwnerID, photo.ReqID, photo.URL); err != nil {
    			return err
    		}
    	}
    
    	return tx.Commit()
    }
    Ответ написан
    5 комментариев
  • Какие есть подходы для стабилизации потребляемой памяти в го-приложении?

    Lynn
    @Lynn
    nginx, js, css
    Что бы потреблять меньше памяти надо потреблять меньше памяти.

    Поскольку в вопросе никакой конкретики нет, то вот вам общие соображения:

    Например если у вас запросили 1000 элементов, то не вычитывать из базы всю 1000, а прочитать 10, отправить часть ответа, прочитать следующие 10 и так далее.

    Второй подход, ограничить одновременные «тяжёлые» запросы — если вы уже обрабатываете «тяжёлый» запрос, то второй такой запрос надо поставить в очередь и начать обрабатывать только после завершения первого.
    Ответ написан
    Комментировать
  • Насколько процесс разработки на Go похож на разработку под Java/C#?

    Maksclub
    @Maksclub Куратор тега Веб-разработка
    maksfedorov.ru
    Язык простой с мощной моделью утилизации ресурсов:
    • испольузется дял всяких молотилок
    • всяких небольших функциональностей
    • для нагруженных серверов
    • в общем случае отличается от Java/C#, тк не удобно разрабатывать бизнес-логику, слишком прост и очень накладно выходит писать таковую
    • утилитарные штуки всякие пишут и узкие места за счет простоты
    Ответ написан
    3 комментария
  • Структура проекта на Golang?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Добрый день.

    Это попытка стандартизировать структуру проекта (многие ориентируются на неё)
    https://github.com/golang-standards/project-layout

    Go-Kit - очень грамотная структура, очень
    https://github.com/go-kit/kit

    И обязательно стоит посмотреть
    https://12factor.net/ru/

    Что касается "Т.е. в одном файле может быть сразу модель, сервис и репозиторий. Есть ли какие-то бестпркатики по этому вопросу?" - то это не совсем так, в одном пакете (папке) может быть и модель, и сервис, и репозиторий". Например вот так:
    yourpackage/service.go
    yourpackage/repo.go
    yourpackage/model.go
    И это всё будет доступно в рамках пакета.

    Лично я использую такую схему:
    cmd/ - команды исполняемого файла
    conf/ - конфиги приложения (env файлы)
    init/ - конфиги logrotated, nginx, systemd и т.д.
    pkg/ - публичные пакеты
    pkg/packagename/ - тут определяются интерфейсы (сервиса, репозитория и т.д.) в разных файлах
    pkg/packagename/endpoints/http - endpoint'ы для HTTP
    pkg/packagename/repo/mysql - реализация репозитория на MySQL
    pkg/packagename/repo/gorm - реализация репозитория на GORM (для примера)
    pkg/packagename/service/ реализация сервиса

    Я написал очень кратко, если что-то не понятно или есть вопросы - пишите, я опишу подробнее
    Ответ написан
    3 комментария
  • Как можно измерить производительность http сервера?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Для подобного тестового кода можно использовать ab (Apache HTTP server benchmarking tool)

    Например так
    ab -n 10000 -c 1000 http://localhost:8080/

    Где:
    -n это количество запросов, которое нужно сделать
    -с это количество одновременных запросов

    Запустил у себя на одном из серверов, результат вот такой
    Server Software:
    Server Hostname:        localhost
    Server Port:            8080
    
    Document Path:          /
    Document Length:        5 bytes
    
    Concurrency Level:      1000
    Time taken for tests:   0.509 seconds
    Complete requests:      10000
    Failed requests:        0
    Write errors:           0
    Total transferred:      1210000 bytes
    HTML transferred:       50000 bytes
    Requests per second:    19627.39 [#/sec] (mean)
    Time per request:       50.949 [ms] (mean)
    Time per request:       0.051 [ms] (mean, across all concurrent requests)
    Transfer rate:          2319.25 [Kbytes/sec] received

    Т.е. при 1000 одновременных запросов сервер сможет обрабатывать в среднем 19627 запросов в секунду

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

    Например если сейчас вы добавите еще один endpoint и будете делать запросы в базу для формирования ответа - RPS будет значительно меньше.
    Ответ написан
  • Какой язык изучать для программирования микроконтроллеров?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    Если серьезно углубляться - то C/C++, Assembler
    JS/Python в контексте разработки для микроконтроллеров - чисто поиграться...
    Ответ написан
    Комментировать
  • На каком я сейчас уровне?

    1. Не умеешь пользоваться гитом, тк загрузил файлы через Upload
    2. Код невозможно проверить, тк ты закинул только cs файлы, но не приложил не менее важный csproj - не разбираешься, как собирается проект.
    3. Про свич кейс тебе уже сказали в комменте.
    Про остальное мало что можно сказать - код самый обычный, на три с минусом, не очень хороший, но и не слишком ужасный.
    С архитектурой плохо, тк детали реализации смешаны с бизнес-правилами.
    По алгоритмам нельзя оценить, тк никаких сложных алгоритмов в твоём проекте нет.

    Уровень, имхо: стажёр/младший разработчик(обязательно под менторством и наблюдением более опытного)
    Ответ написан
    5 комментариев
  • Почему, при выносе пула соединений на уровень файла, паникует?

    @deliro
    Ну не фигня ли?? )

    Нет, ведь у тебя две разных переменные с одним именем — db

    Очень удобное правило

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


    Да и вообще, никогда не создавай глобальных переменных. В продуктовом коде они не нужны в 100% случаев
    Ответ написан
    9 комментариев
  • Почему у более дорогих процессоров память 1 и 2 уровня ниже?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Приписку "на ядро" во втором столбике тоже надо учитывать. Если на нее умножить, все становится на свои места.
    Ответ написан
    Комментировать
  • Почему выдает ошибку - переменная input объявлена, но не используется?

    @deliro
    Ну потому что она объявлена и потому что она не используется, очевидно же.

    Вот это убери
    var input string // переменная используется в блоке for
    Ответ написан
    9 комментариев
  • Динамическое получение скорости работы процессора?

    gbg
    @gbg Куратор тега Windows
    Любые ответы на любые вопросы
    Вадим Ушаков, Понимаете, ваш вопрос в определенном смысле абсурден, потому что вы хотите дословно "измерить неизвестно что неизвестно как".

    Можно пытаться конкретизировать, например, говоря о том, что измерению подлежит частота ядра.

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

    Это если речь идет о вычислениях. Но числодробилки нынче - редкость, больше распространены приложения, привязанные к IO - а там процессор может молотить во все свои гигагерцы - если поток спит и ждет данные, но будет продолжать это делать, пусть и с огромной тактовой частотой.
    Ответ написан
    2 комментария
  • Как правильно назвать обновленный запрос в бэкенде?

    Правильно назвать его, например, /api/v2/product/search/, чтобы у вас уже была встроенная схема версионирования и в будущем вы над этим не думали.

    Однако, если клиенты находятся под вашим контролем, то можно назвать как угодно.
    Ответ написан
    Комментировать
  • Верно ли это утверждение?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Добавлю к пессимизму.
    Верно ли это утверждение? 59 минут назад
    Сломался WordPress Кто поможет? 14 окт.
    Почему так произошло Опенкарт? 06 июл.
    Стоит ли учить Python по книгам? более года назад
    Как двигаться в гейм дев? более года назад
    Как начать путь в сферу game дизайна? более года назад
    Не получается верстать самостоятельно. Как преодолеть это? более года назад


    Этот список говорит нам открытым текстом, что увлекаетесь вы не программированием, а "вайти".
    Ой, геймдев! Ой нет, Питон! А, нет - вёрстка! Ну и понятное дело что всё кончилось вордпрессом.

    Люди, которые действительно увлекаются программированием, не задают вопросов, "стоит ли учиться по книгам". и "как войти вайти". Они учатся. И входят.

    Есть очень большая вероятность, что программирование - это не ваше призвание. А интересуетесь вы им только из-за хайпа. В этом нет ничего плохого. Надо просто найти дело, к которому действительно лежит душа.
    Ответ написан
    2 комментария