• Почему при сборке compose не видит переменные окружения?

    @khevse
    Опция --env-file должна помочь:
    Ответ написан
    Комментировать
  • Linter для Go для выявления переменных без явной инициализации?

    @khevse
    Частично покрывает ваш кейс для случаев
    var x bool
    switch y {
    case 1:
     x:=true
    ....
    }
    
    print(x)


    govet:
      check-shadowing: true
      enabled-all: true
      disable:
      - fieldalignment


    источник
    Ответ написан
  • Как в контейнере сделаться рутом?

    @khevse
    Используйте при запуске обоих контейнеров опцию установки текущего пользователя, тогда права на файлы будут одинаковые как в контейнерах, так и в самой операционной системе, в которой выполняется запуск docker
    docker run -it --rm --user "$(id -u):$(id -g)" -v"..." imagename:imagetag
    Ответ написан
    Комментировать
  • Как протестировать метод с помощью testify?

    @khevse
    Два разных способа с использование обычного табличного теста и с использованием testify.Suite. Оба варианта делаю одно и тоже.

    package worker
    
    import (
      "context"
      "errors"
      "fmt"
      "testing"
      "time"
    
      "github.com/stretchr/testify/require"
      "github.com/stretchr/testify/suite"
    )
    
    type TestQueue struct {
      ch     chan string
      errRes error
    }
    
    func NewTestQueueWithErr(errRes error) *TestQueue {
      return &TestQueue{
        errRes: errRes,
      }
    }
    
    func NewTestQueueWithRes(res string) *TestQueue {
      ch := make(chan string, 1)
      ch <- res
    
      return &TestQueue{
        ch: ch,
      }
    }
    
    func NewTestQueueWithoutRes() *TestQueue {
      return &TestQueue{
        ch: make(chan string),
      }
    }
    
    func (t *TestQueue) TakeMessage() (<-chan string, error) {
      if t.errRes != nil {
        return nil, t.errRes
      }
      return t.ch, nil
    }
    
    type TestDownload struct {
      errRes error
    }
    
    func NewTestDownload(err error) *TestDownload {
      return &TestDownload{
        errRes: err,
      }
    }
    
    func (t *TestDownload) Download(_ string) error {
      return t.errRes
    }
    
    // TABLE TEST
    
    func TestWorker(t *testing.T) {
      testErr := errors.New("fail")
    
      for _, tc := range []struct {
        Name     string
        Queue    Queue
        Download Download
        WantErr  error
      }{
        {
          Name:     "success",
          Queue:    NewTestQueueWithRes("uri"),
          Download: NewTestDownload(nil),
          WantErr:  nil,
        },
        {
          Name:     "error",
          Queue:    NewTestQueueWithErr(testErr),
          Download: NewTestDownload(nil),
          WantErr:  testErr,
        },
      } {
        t.Run(tc.Name, func(t *testing.T) {
          assert := require.New(t)
    
          ctx, ctxCancel := context.WithTimeout(context.Background(), time.Millisecond)
          defer ctxCancel()
    
          worker := NewWorker(tc.Queue, tc.Download)
          err := worker.Worker(ctx)
          if tc.WantErr != nil {
            assert.ErrorIs(err, tc.WantErr)
          } else {
            assert.NoError(err)
          }
        })
      }
    }
    
    // SUITE TEST
    
    func TestWorkerSuite(t *testing.T) {
      suite.Run(t, &WorkerSuite{})
    }
    
    type WorkerSuite struct {
      suite.Suite
    }
    
    func (s *WorkerSuite) BeforeTest(_, name string) {
      fmt.Println("todo init:", name)
    }
    
    func (s *WorkerSuite) TestSuccess() {
      ctx, ctxCancel := context.WithTimeout(context.Background(), time.Millisecond)
      defer ctxCancel()
    
      worker := NewWorker(NewTestQueueWithRes("data"), NewTestDownload(nil))
      s.Require().NoError(worker.Worker(ctx))
    }
    
    func (s *WorkerSuite) TestError() {
      testErr := errors.New("fail")
    
      ctx, ctxCancel := context.WithTimeout(context.Background(), time.Millisecond)
      defer ctxCancel()
    
      worker := NewWorker(NewTestQueueWithErr(testErr), NewTestDownload(nil))
      s.Require().ErrorIs(worker.Worker(ctx), testErr)
    }
    Ответ написан
    Комментировать
  • Получить наглядный граф путей выполнения в golang?

    @khevse
    Если граф нужен в рамках одного сервиса, то возможно вам поможет https://github.com/ofabry/go-callvis. Пользовался один раз на одном из проектов. После увиденного ужаса петель вызовов закрыл и больше никогда не пользовался )
    Если нужен диаграмма вызовов в рамках нескольких сервисов, то тут без jaeger не обойтись. Этот инструмент больше к оптимизации узких мест, чем просто к изучению кода.
    Ответ написан
  • Как выйти из тупика, как поднять уровень?

    @khevse
    Я бы предложил походить на собеседования. Начать с местных компаний, а после попробовать пройти собеседование в компании уровня ozon, avito и т.п.. Уровни вопросов очень различаются от компании к компании. Вероятно, что после собеседований будут отказы, но это не главное в этом процессе. Главное - это послушать вопросы и понять, где вы слабы(ответы, где и что неверно, вам конечно же не дадут). Учить ответы именно на эти вопросы не имеет смысла, т.к. в разных компаниях их задают с разными уточнениями. Ответы лучше брать из книг, т.к. только там тема будет раскрыта максимально широко.
    Собственно этот путь поможет вам понизить самооценку и получить новые знания. Как бонус, вы сможете посмотреть какими продуктами занимаются различные компании и вероятно найдете какое-нибудь интересное направление. А зная направление, уже сможете развивать уникальные навыки.
    Удачи вам.
    Ответ написан
  • Как улучшить навыки в построении архитектуры БД и проектирования систем?

    @khevse
    Здесь можно найти общие моменты.

    Если поподробнее, то порекомендовал бы книги (лучше в порядке их следования):
    1. Чистая архитектура
    2. Высоконагруженные приложения
    3. Шаблоны проектирования для облачной среды (если нужно углубиться в микросервисы и немного познакомиться с kubernates)
    4. Совершенный софт (тут и про архитектуру и про управление проектами)
    5. Проектирование событийно-ориентированных систем (здесь про паттерны работы с kafka, о самой kafka нужно в других книгах искать)
    Ответ написан
    2 комментария
  • Как добавить c++ исходники в голанг библиотеку?

    @khevse
    Когда-то давно делал подобное, но под windows. Пример вроде не сложный, я думаю что у тебя получится разобраться.
    Ссылка на github
    Ответ написан
    Комментировать
  • Выбор ноутбука до 22 тыс?

    @khevse
    Поиск будет очень сложен. Потому что цены сильно взлетели. Наблюдал лично как в черную пятницу на предварительно выбранные модели цены поднялись на 2-3тыс.
    Я бы не стал делать акцент на SSD. Увеличение оперативной памяти дает хороший результат, потому что уменьшает количество обращений к файлу подкачки. Стоит она дешевле, а объем диска значительно больше и HDD имеет более долгий срок службы.

    Перед новым годом брал родителям за 24тыс вот такой аппарат (сейчас он за 30тыс.). После покупки в указанную комплектацию добавил ещё 4ГБ ОЗУ:

    Acer ASPIRE 3 (A315-41-R6T2)(NX.GY9ER.062)
    Размер экрана: 15.6 "
    Операционная система: Win 10 Home
    Процессор: AMD Ryzen 3 2200U
    Частота процессора: 2500 MHz
    Количество ядер процессора: 2
    Размер оперативной памяти: 4 Гб
    Тип памяти: DDR4
    Объем жесткого диска: 500 Гб
    Разрешение экрана: 1920x1080
    Тип экрана: матовый
    Тип видеоадаптера: встроенный
    Видеопроцессор: AMD Radeon Vega 3
    Видеопамять: SMA
    Оптический привод: DVD-нет
    Интерфейсы: USB 2.0x2, USB 3.0, HDMI, вход микр./вых. на наушники Combo, LAN (RJ-45)
    Беспроводная связь: Wi-Fi, Bluetooth 4.0

    тогда в отбор попали вот такие модели:
    - Lenovo V130 15 Intel Core i3 7020U 2300 MHz/15.6"/1920x1080/4GB/500GB HDD/DVD-RW/Intel HD Graphics 620/Wi-Fi/Bluetooth/Windows 10 Home (81HN00ENRU)
    - Acer Extensa EX2540-36X9 (Intel Core i3 6006U 2000 MHz/15.6"/1920x1080/4GB/500GB HDD/DVD нет/Intel HD Graphics 520/Wi-Fi/Bluetooth/Linux)
    - Acer ASPIRE 3 (A315-41-R6T2) AMD Ryzen 3 2200U 2500 MHz/15.6"/1920x1080/4GB/500GB HDD/DVD нет/AMD Radeon Vega 3/Wi-Fi/Bluetooth/Windows 10 Home (NX.GY9ER.062) - этот был выбран, т.к. процессор гораздо мощнее.

    Возможно найдете младшие модели в этих линейках, которые вам подойдут. Но и возможно, что вариант с б/у, как посоветовали выше, будет лучше.
    Ответ написан
    1 комментарий
  • Как разбить транзакцию по микросервисам сохранив консистентность данных?

    @khevse
    Однозначного ответа на данную задачу нет, потому что помимо сохранения консистентности данных могу быть дополнительные требования. Например:
    - таблица слишком большая, поэтому применяется шардирование (оно же партиционирование);
    - используется репликация с одним или несколькими ведущими узлами;
    - требуется линеаризация;
    - и т.д. и т.п. как по отдельности так и в совокупности.

    Могу только порекомендовать вот эту книгу (сейчас сам её дочитываю):
    https://www.piter.com/product/vysokonagruzhennye-p...
    В ней очень подробно расписана работа с системами работающими с большими объемами данных.

    Книгу нашел в вопросе:
    Книга по распределенным отказоустойчивым системам?
    Ответ написан
    Комментировать
  • [golang] Как выполнить статическую линковку с++ библиотек при сборке?

    @khevse Автор вопроса
    Всем спасибо, вопрос решил.

    Получилась частично статическая, т.е. враппер линкуется статически, а остальные библиотеки идут как 3rd-Party.
    Из недостатков работы с MinGW- нет возможности статически подключить библиотеки gcc и stdc++. Из-за этого
    приходится тащить вместе с исполняемым файлом библиотеки libgcc_s_seh-1.dll и libstdc++-6.dll. Но это исключительно особенность работы с MinGW.
    Ответ написан
    Комментировать