Пікірлер
@AlexandrIvshin
@AlexandrIvshin Күн бұрын
nil-не всегда тот, за кого себя выдает(с) Где то заплакал питонист.))
@asylzhan_ahmetow
@asylzhan_ahmetow 2 күн бұрын
Далеко не самое лучшее объяснение. Те, кто не знают про интерфейсы ничего не поймут
@Mimookrokodill
@Mimookrokodill 8 күн бұрын
Видео супер
@sstansm7f
@sstansm7f 8 күн бұрын
Общие требования к CLI утилитам из этой презентации 10:42 наличие мануала, актуального утилите. От себя добавлю: имеется юридический аспект, если утилита поставляется пользователю за пределы компании-разработчика. В случае если использование утилиты привело к убыткам у пользователя возможны иски к поставщику утилиты. 11:10 должен быть help вызываемый при помощи флагов -h, --help или при вызове утилиты без аргументов. 14:40 вывод команды: человеко читаемый (по умолчанию) и машинно читаемые форматы, например, json (может быть ещё csv?). 17:15 возможность запуска критических операций в режиме Dry Run. От себя добавлю: должен быть запрос на подтверждение критической операции: yes/no? $ 19:30 отображать ход выполнения длительных операций 20:30 для отображения DEBUG сообщений использовать режим Verbose 21:20 тексты ошибок должны быть понятны пользователю и не должны содержать внутреннюю информацию понятную только программистам 23:10 позиционные аргументы и флаги командной строки должны представлять единообразную систему 24:00 число позиционных аргументов не должно быть больше 2, чтобы пользователь не запутался 24:40 желательно иметь короткие версии для флагов - экономит место 28:10 если много команд, то желательно их поместить в иерархию или дерево команд 29:15 именование команд из 2 позиционных аргументов: object action либо, более редко встречается, - action object. Далее идут флаговые аргументы. 29:55 порядок object action либо action object должен быть единообразным для CLI утилиты 30:45 если выполняется длительная операция, то должен быть graceful shutdown, то есть обработка прерывания от клавиатуры Ctrl+C - закрытие открытых, заблокированных и т.п. ресурсов 31:55 передача аргументов через конфигурационные файлы и переменные окружения 32:40 при смешанной системе передачи аргументов утилите должны быть приоритеты: наибольший приоритет имеют флаги, потом переменные окружения, потом конфиги 33:20 дистрибуция должна требовать от пользователя наименьшее количество шагов по установке 39:30 коды завершения утилиты (exit codes) важны для использования CLI утилиты в сценариях (скриптах) автоматизации
@user-if1dj7fy2y
@user-if1dj7fy2y 15 күн бұрын
Чудесно звучит 🎉 Когда будет продолжение этой темы разговора
@storm-kd4op
@storm-kd4op 21 күн бұрын
вы здорово объясняете. спасибо
@victorkochkarev2576
@victorkochkarev2576 25 күн бұрын
Отличное видео, спасибо вам.
@Evg2002
@Evg2002 25 күн бұрын
спасибо брат
@ztarlitz1
@ztarlitz1 28 күн бұрын
чего вы там все изучаете? мне кто-то лет 25 назад дал конфиг на vim и с тех пор я этим конфигом пользуюсь и чего-то там изучать никакой нужды нет. Мои познания самого vim ограничиваются 15 минутами, которые понадобились на чтение vimtutor. В 99% случаев ничего за пределами этих знаний вам не понадобится. Поэтому сама постановка вопроса стоит ли изучать vim звучит как-то странно, как будто вы теорию супер струн собрались изучать. Взяли да потратили 20 минут времени на vimtutor вот и все изучение.
@medencev
@medencev Ай бұрын
13:26 4 аксиома действительна только для небуферизированных каналов func main() { ch := make(chan int, 1) ch <- 1 close(ch) fmt.Println(<-ch, <-ch, "surprise") }
@Seniorius
@Seniorius Ай бұрын
Иногда линтер жалуется на интерфейсы. Например нельзя делать возврат интерфейсов
@OlzhasKaribayev
@OlzhasKaribayev Ай бұрын
perfect
@user-zg8ij3kt1h
@user-zg8ij3kt1h Ай бұрын
func (m *SQLMap) getContext() context.Context { const DefaultTimeout = time.Duration(60 * time.Second) ctx, cancel := context.WithTimeout(context.Background(), DefaultTimeout) defer cancel() newCtx, cancel := context.WithTimeout(ctx, m.timeout) defer cancel() return newCtx } Так допустимо делать?
@deferpanic
@deferpanic Ай бұрын
А зачем? К тому же как произойдет выход из getContext, все созданные внутри контексты отменятся
@user-zg8ij3kt1h
@user-zg8ij3kt1h Ай бұрын
@@deferpanic даа((( что, если нужно натянуть контекст на несколько методов? Причём, таймаут должен быть общим для всех, а доступа к main() нет?
@user-zg8ij3kt1h
@user-zg8ij3kt1h Ай бұрын
Круто, респект! Хотелось бы ещё примеров с использованием deadline-ов и работы с БД через контексты.
@AdamsonBor
@AdamsonBor Ай бұрын
Привет! На 45:45 ты предлагаешь обернуть все в транзакции. Как это сделать правильно? Переписать методы стора и добавить дополнительное поле к методам или как?
@user-name-2598
@user-name-2598 Ай бұрын
рановато я сюда зашёл)) на assert уже проблемы появились(
@AleksandrPopov-te8tq
@AleksandrPopov-te8tq Ай бұрын
интересное, а главное, понятное и доступное видео)
@sergemio
@sergemio Ай бұрын
Здравствуйте! Подскажите пожалуйста, как можно с вами связаться, email или что-ещё. Нужна небольшая консультация
@deferpanic
@deferpanic Ай бұрын
t.me/tomakado
@qrthack3233
@qrthack3233 2 ай бұрын
1 0 1 мой друг, хочу в backend, выбираю между C#, Golang, Node.js, Java, что посоветуешь, чтобы легче было устроиться на работу с перспективой? Или с какого языка посоветуешь начать?
@YGNETATEL_3000
@YGNETATEL_3000 2 ай бұрын
Я предлагаю вам пройтись по этому документу и разобрать каждый пункт" - Автор. 0:30 На этом моменте чуть не выключил видео что бы найти в инете этот документ и пройтись по нему. На деле посыл автора был - Вместе пройтись . А сколько людей выключило на этом моменте ?
@codingjerk
@codingjerk 2 ай бұрын
Спасибо за видос, если ещё не пробовал - рекомендую посмотреть модальные редакторы helix или kakouine. В них используется другая, более логичная и удобная парадигма управления ­- вместо action-movement (как в виме) там selection-action. Я уже около года на helix, доволен
@deferpanic
@deferpanic 2 ай бұрын
Посмотрю, спасибо!
@AleksandrPopov-te8tq
@AleksandrPopov-te8tq 2 ай бұрын
дальше "подготавливаем окружение" не ушел, и postgres стоит и docker, а работать не хотят((
@redice8928
@redice8928 2 ай бұрын
Использование собственных кастомных библиотек, и проектирование некоторых моментов «не по гошному» я могу понять только в собственном проекте, но никак не в обучающем видео, которое показано остальным как пример для сохранения в свой репозиторий. Считаю такое максимально бестактным.
@TraderOff-Road
@TraderOff-Road 2 ай бұрын
как называется IDE на видео? upd: Goland нашел снизу в коменнтах, оставлю тут)
@MartinXProject
@MartinXProject 2 ай бұрын
Спасибо за очень качественный контент
@MartinXProject
@MartinXProject 2 ай бұрын
Большое спасибо за полезную информацию!
@PoringLoveSmoke
@PoringLoveSmoke 2 ай бұрын
Подача 10/10
@user-fb6fr5nx9u
@user-fb6fr5nx9u 3 ай бұрын
In memory + с надежной персистентностью это tarantool, протестированное многими корпами решение
@nikolaikorotaev9470
@nikolaikorotaev9470 3 ай бұрын
Лучшее видео по этой теме, что я видел в интернете. Есть смысл на бусти подписаться!
@user-qx3km6wp1p
@user-qx3km6wp1p 3 ай бұрын
Поверхностный взгляд на код: - В storage идет чтение из БД напрямую в структуры model. Это очень плохой подход, т.к. у нас фактически получается что общие модели зависят от структуры БД. Правильнее чтобы в storage были свои структуры, которые на выходе конвертируются в структуры model. - Имена интерфейсов лучше писать так, чтобы они заканчивались на er, т.к. в противном случае получается не интерфейс, ориентированный на какой-то набор операций, а просто непонятное нечно. Например ArticleStorage - интерфейс, отвечающий за что? Глобально за работу с хранилищем? Нет - у него всего один метод Store. Значит это нечто вроде ArticleSaver. - В Notifier передается указатель на объект tgbotapi.BotAPI вместо того чтобы определить интерфейс с методом Send и передавать уже его. - Неструктурированные логи. Вместо log лучше сразу привыкать к zap (причем без Sugar), slog и т.п.
@user-qx3km6wp1p
@user-qx3km6wp1p 3 ай бұрын
Такие миграции никогда не пройдут ревью в серьезной команде: - поля времени без таймзоны - varchar вместо text (это бессмысленно, т.к. varchar это просто text с навершенным на него ограничением на длину) - устаревший синтаксис (SERIAL вместо IDENTITY, CONSTRAINT вместо REFERENCES) - goose StatementBegin/StatementEnd там где он не нужен Это только то что сразу бросается в глаза Кроме того, миграции это то, что доступно извне и используются внешними утилитами при деплое, т.е. идеологически не должно быть в Internal. Но это уже холиварная тема.
@MrBoBrilO
@MrBoBrilO Ай бұрын
Надушнил так надушнил
@user-qx3km6wp1p
@user-qx3km6wp1p 3 ай бұрын
Чтобы это все понять, надо поработать какое-то время в хайлоаде. Иначе, скорее всего, в одно ухо влетит - из другого вылетит, т.к. нет базы.
@deusexmachine2834
@deusexmachine2834 3 ай бұрын
Пишу телеграм-бота, пытался вручную написать middleware для того, чтобы бот не читал слишком старые сообщения, как вдруг увидел эту библиотеку. Спасибо за объяснение.
@AlanAbishev
@AlanAbishev 3 ай бұрын
Отличная подача материала, а так же качество презентации
@aleksandrtm6163
@aleksandrtm6163 3 ай бұрын
Хорошая подача, спасибо за информацию, было оч приятно послушать
@dizelvinable
@dizelvinable 3 ай бұрын
Очень полезная информация! Спасите большое!
@kostais
@kostais 3 ай бұрын
Спасибо. Хороший материал
@laylaserizawa5899
@laylaserizawa5899 3 ай бұрын
спасибо за видео, очень полезно 🙂
@kselnaag2482
@kselnaag2482 3 ай бұрын
Приветствую, не знаю как на других языках, но в GO, все логеры, которые я видел, выдают логи в os.StdErr, а не в Out (небольшая поправочка). Засим вопрос от человека пишущего свой логер: есть ли смысл Fprintf (или функцию с ним) оборачивать в горутину, ибо в GO вроде отдельная очередь на I/O. Естественно , только нагрузочное может дать ответ на этот вопрос со 100% точностью, но до этого еще далеко.
@deferpanic
@deferpanic 3 ай бұрын
А с какой целью это делать? Если хочется для перфоманса, то тот самый пресловутый I/O не даст получить выигрыш. Я бы скорее сохранял записи в какой-то бакет, и вываливал его, как только он заполнится. Но тут надо помнить про риск потерять часть записей.
@kselnaag2482
@kselnaag2482 3 ай бұрын
@@deferpanic Тогда уж лучше по таймеру буфер освобождать, а не по заполнению. При многопоточке I/O в параллель не встанет ?
@deferpanic
@deferpanic 3 ай бұрын
Либо по таймеру, да. Надо на конкретный кейс смотреть
@kselnaag2482
@kselnaag2482 3 ай бұрын
​ @deferpanic kselnaag/shortlink2 + я как раз спрашивал про базовый шаблон минимального микросервиса, у меня получилось так: SimpleDomainModel, layering+SOLID, web морда пока не запилена, но критиковать уже можно =D
@xdFOrfq8VVH6j5kXAh
@xdFOrfq8VVH6j5kXAh 3 ай бұрын
Посмотрите у вашей библиотеки возможность писать логи в os.Stdout. Даже у стандартного log
@user-jh6li8ep7d
@user-jh6li8ep7d 3 ай бұрын
😮
@wildjoe6259
@wildjoe6259 3 ай бұрын
Спасибо! Отличное освещение темы.
@it1860
@it1860 3 ай бұрын
1
@aleksandrzaremba6520
@aleksandrzaremba6520 3 ай бұрын
Спасибо автору, очень качественное видео и сильно экономит время перед собесом
@deferpanic
@deferpanic 3 ай бұрын
00:00 - Вступление 02:01 - №1. Кодовая база 04:50 - №2. Зависимости 07:04 - №3. Конфигурация 09:26 - №4. Внешние сервисы 10:40 - №5. Сборка, релиз и выполнение 13:02 - №6. Процессы без состояния 14:42 - №7. Привязка портов (port binding) 16:04 - №8. Конкурентность 17:10 - №9. Одноразовые и утилитарные процессы 19:54 - №10. Паритет окружений 23:40 - №11. Логи 25:32 - №12. Инструменты администрирования Полезные ссылки: - Оригинальный документ “The Twelve-Factor App”: 12factor.net/ - Сигналы в UNIX: ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB_(Unix) - Patterns of Enterprise Application Architecture, Martin Fowler: books.google.ge/books/about/Patterns_of_enterprise_application_archi.html?id=FyWZt5DdvFkC&redir_esc=y - Logs Are Streams, Not files: adam.herokuapp.com/past/2011/4/1/logs_are_streams_not_files/
@nikitajolobov4591
@nikitajolobov4591 4 ай бұрын
спасибо тебе огромное за это мега полезное видео!
@BION5555
@BION5555 4 ай бұрын
Нет, есть более удобные редакторы. Точка)
@zverekkk_2532
@zverekkk_2532 4 ай бұрын
Спасибо!