Ответы пользователя по тегу Go
  • Как улучшить качество декомпозиции в Go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    неприлично долго думаю над тем что нужно вынеси в отдельный пакет, а что достаточно вынести в отдельную структуру


    Такая-же проблема и у меня. Я тоже долго думаю над дизайном. Но суть в том что в большинстве задач
    ты и бизнес не всегда знаете куда пойдет проект дальше. И поэтому нарисовать идельный дизайн нельзя.
    Я-бы даже сказал что попытка сопровождать идеальный дизайн - может затянуть внедрение проекта.

    Поэтому просто откажись от декомпозиции. Пиши сначала прототип в олимпиадном стиле. Тоесть функция
    main - и погнал писать как чукча. Что вижу то и пою.

    И после того как ты напишешь 1000 строк например к тебе придет понимание как следует декомпозировать.
    И к этому моменту у тебя будут ДОКАЗАТЕЛЬСТВА выгодности твоего дизана. И теоретические споры можно
    уже исключить.
    Ответ написан
    1 комментарий
  • Я усложняю или так правильно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если ты начинающий - то лучше написать работающее приложение. А архитектура должна быть мотивированной.
    Вот в книжках по шаблонам проектирования так и пишут дескыть motivation.

    А если на пустом hello world делать архитектуру - то оно выглядит как-то странно. И принцип KISS/Yagni
    никто не отменял. И бритву Оккама.
    Ответ написан
    2 комментария
  • Библиотека для индексации документов Golang?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Когда-то давным давно использовали logrotate. Эта утилита просто дробила лог на дневные и часовые
    и прочие доли. Это позволяло искать быстрее. Если ты заранее знаешь что событие произошло например
    за последние сутки а не за последние 10 лет к примеру. Но logrotate может не работать под Windows.

    Коробочного решения для твоего вопроса я не знаю. Кроме Elastic ничего не приходит в голову.

    Есть еще программный продукт Splunk. Но я его никогда не использовал поэтому советовать не буду. Почитай сам.

    Вообще тебе нужен разработчик. Я думаю что дешевле всего трекать отдельные логи по событию event:login к примеру. Я так делал для сужения поиска. Для библиотек log4j это конфигурируется на уровне приложения.
    Там как-то добавляется appender + rule.
    Ответ написан
    Комментировать
  • Как под капотом реализованы интерфейсы в go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут пишут https://go.dev/tour/methods/9 весьма сухо.

    Interfaces
    An interface type is defined as a set of method signatures.
    A value of interface type can hold any value that implements those methods.


    Судя по всему Google не особо заинтересован описывать детали реализации интерфейса.
    Возможно на реализацию нет спеки. И Google планирует в будущем ее изменять.
    Ответ написан
    Комментировать
  • Как правильно запускать хранимые процедуры?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно в проекте заводят отдельный модуль. Версионный контроль для БД. Можно на базе
    liquibase или flyway. Можно на базе каких-то Go-технологий.

    Но суть такова. Хранимка устанавливается синхронно с обновлением версии комплекса. Как
    часть установочного pipeline. И далее из кода ты ее просто вызываешь по имени.
    Ответ написан
    Комментировать
  • Почему падает скорость при скачивание с lux?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если youtube не предоставляет никаких гарантий относительно скорости - то это нормально. Это нормальная политика троттлинга всех "качков". В противном случае инфраструктура youtube упала-бы для всех остальных клиентов которые смотрят видео с браузеров. Ведь расчет средней нагрузки на сети идет как раз из обычных пользователей а не качков.

    Названий у таких алгоритмов много. Троттлинг, шейпинг, rate limiting, leaky bucket (протекающее ведро).
    Ответ написан
    3 комментария
  • Как сравнить значения из разных моделей в Go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    А попробуй замени это
    {{$projectID := .Note.ProjectID}}
    на константу
    {{$projectID := "00000011112222" }
    Ответ написан
    Комментировать
  • Как сжать файл?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для exe-шников еще в 90-е создавались не архиваторы а всякие "упаковщики". Из таковых я помню UPX https://upx.github.io/
    Ответ написан
    Комментировать
  • Как в golang заменить текст в консоли?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Не знаю как в Го-шке. Но в сях есть два базовых подхода к работе с текстовой графикой.
    Первое - это печатать управляющией символы (backspace) чтоб стирать предыдущие.
    Так например работает текстовый архиватор Rar пока печатает прогресс. Все это на уровне STDOUT.

    Второе - это использовать библиотеки наподобие ncurses. Это такая Rich-графика в тексте.
    Можно делать красивые цветные текстовые таблицы наподобие TurboVision. И даже интерактивность.
    Диалоговые окна. Edit boxes e.t.c.
    Ответ написан
    Комментировать
  • Какой проект с открытым исходным кодом на go можно использовать, чтобы поучиться писать backend на go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вот еще в гитхабе есть. Курьируемый список проектов. Про веб фреймворки
    https://github.com/avelino/awesome-go#web-frameworks

    Да и вообще просто поищи по ключевым словам backend/web.
    Ответ написан
  • Как запустить на фоне программу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Поскольку речь идет об .exe то скорее всего автор хочет запускать без command-shell окошка.

    Вот так.
    start /B программа.exe
    Ну и цикл там сделать внутри.
    Ответ написан
  • Как сформировать деревья в json используя golang?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я-бы предложил для начала уйти от этого странного способа описанию деревьев к инверсному списку
    По сути - добавить еще одну колонку которая указывает на родителя.

    id name     path  parent
    -----------------------
    1  Беларусь 1     null
    2  Россия   2     null
    3  Минск    1.3   1
    4  Москва   2.4   2
    5  СПБ      2.5   2
    6  Невский  2.5.6 5


    Ну а дальше - select... connect prior и получим ранжированый курсор по дереву. Там-же будет
    доступно виртуальное поле level. И обходом этого курсора можно сделать JSON документ.
    Если level растет - то увеличиваем indentation и открываем вложенный элемент соотв.

    Если go-lang поддерживает stremable json writers то даже лучше.
    Ответ написан
    9 комментариев
  • Как конвертировать строку в any тип protobuf в Go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Попробуй замени any на bytes.
    map<string,bytes> property = 1;
    Ответ написан
    Комментировать
  • Как считывать из бесконечного Stdout?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Читай не по строкам а по символам.
    Ответ написан
  • Какой лучший паттерн для тестирования дао на GO?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно там где танцует Go - там рядышком docker/kubernetes. Тоесть не проблема очень быстро поднять тестовую БД, наполнить ее данными и сразу прогнать все тесты по DAO.

    Иного способа протестировать DAO я думаю не существут. Смысл DAO - доступаться к внешним источникам данных. Если его мокать - то это уже не тестирование DAO а тестирование логики следующего уровня. Бизнес-логики и прочее.
    Ответ написан
    Комментировать
  • Всегда ли нужно переиспользовать переменные?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Оба примера - одинаковы по смыслу поэтому можно брать любой.

    Но если-бы я писал это на Rust/Scala то я всегда предпочитал бы константу. Ибо идеология и доказуемость значения в константе важнее гипотетических performance fixes.

    В данном случае - я все равно не специалист в Go и поэтому исходил бы из best practices и рекомендаций от самих создателей. Что они пишут по обработке ошибок? Дают ли они примеры? Вот если они в документации шлёпнут хотя-бы один сниппет с присвоением константы - то я скажу Окей мне все ясно и пойду писать код.

    Где там идолы что пишут у себя в pet-projects - надо смотреть.
    Ответ написан
    Комментировать
  • Как задать тип для структуры, где может быть массив или строка?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ты переусложняешь. Сделай просто массив строк.

    {
        "data": ["string"]
    }


    Это покрывает все твои кейсы с 1 строкой и с null. И маппинг упрощается.
    Ответ написан
  • Какой можно применить алгоритм для хранение индекса для 50 миллиардов записей в golang?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Немного бухгалтерии. Если взять по максимуму.

    Размер одной записи должен быть порядка 60 + 32 +8 = 100 символов (байт для простоты)

    При 50 млрд записей объем хранимых данных должен быть порядка

    50 000 000 000 * 100 = 5 000 000 000 000 = 5 триллионов байт.

    В дисковом хранении это будет примерно 4.5 терабайта. Задачка для in-memory неподъемная. Нужен диск + мемори.

    Если я там где-то ошибся в расчетах - то только в средних значениях. Если подставить не максимумы а среднее - то цифры будут поскромнее. Но в любом случае - многовастенько для покупки памяти.

    Вобщем нужна дисковая БД которая встраивается в приложение. На требование менеджеров которые запретили использовать БД забейте. Они ничего не понимают. Делайте БД встраиваемую в приложение. В качестве таких (встраиваемых систем можно поробовать) LevelDb, BerkeleyDb, RocksDb. Они поддерживают индекс класса B+Tree и это даст возможность искать группы записей по одному ID. Для этого класса систем любую запись можно найти за 4-5 дисковых IOPS. Если какдый IOPS стоит 15 мс (это я так мерял свой собственный магнитный HDD) то любой поиск группы ключей для TTFB будет порядка 15 * 5 = 75 милисекунд. Ну если вы поставите SSD - то быстрее.

    По поводу предложений хранить в файлах. До того как обсуждать это - надо уяснить требования по времени отклика. Сколько секунд вы согласны ждать - насколько можно и партицировать (или шардировать ваш файл).
    В простейшем случае мы делим большой CSV файл на 512 partitions по хешу от ID и получаем соотв время фулл-скана всего файла поделенное на 512. Дальше - играйтесь с этим параметром партишенинга выводя его на доступный уровень отклика. Из недостатков - будет россыпь файлов. Надо почиать документацию на вашу файловую систему (ext4?) и тюнить ее так чтоб она не сдохла от такого числа inodes.

    Я поддержу оба сценария. И с встраиваемой БД и с файлами. Но с БД надежнее т.к. есть транзакции а файлы у вас могут быть в крешнутом состоянии долго. И вы об этом ничего знать не будете.

    По поводу Parquet. Не взлетит. Скорее всего индекс по данному типу файла - это совсем не то что вкладывают туда релационные системы. Обычно Parquet/Orc/Delta вкладывают в индекс смысл - отбрасывания тех полосок данных (stripes) которые бесполезны при чтении всего файла. Такой индес - обычно просто либо range-признак либо карта Блума. И в случае с range - дает эффект на сортированных данных. Для прочих - будет бесполезно т.к. фулл-скан все равно обеспечен. А если фулл-скан то зачем тогда вообще индекс.

    Вобщем для дизайна архитектуры нам нужны цифры. Средние длины по колонкам. И я-бы еще запросил кардинальность по полю ID.
    Ответ написан
    7 комментариев
  • Как правильно указать тип?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вынеси всю одинаковость в новую функцию. Обработки ошибок и прочее. А кастомные вещи пускай будут в специальных функциях TaskLocal, TaskRemote. Там у тебя останется 5 строчек (я так думаю).
    Ответ написан
    Комментировать
  • Как обрезать json до определённого тега?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Есть строка джсона длинной 25000+ строк.

    Это какая-то ерунда. JSON - это никакая не стркоа. Это JavaScript object notation. Собственно это заложено в аббревиатуру. И работать с ним надо через API который работает с JSON.

    Игры со строками ни к чему хорошему не приведут. Пропустишь escaping и будет просто зря потраченное время и забаговнный код.
    Ответ написан
    Комментировать