Anonymous
Или по сохранению файла?
heavycharged
Это чо - букву ввёл, и код весь заново сразу начинает исполняться?
нет, иде не сразу флашит на диск. иногда нужно жмакнуть Ctrl+S
heavycharged
тот же goland когда шаблоны редактируешь, то не видно изменений, потом возвращаешься, ctrl+s и вуаля
Anonymous
нет, иде не сразу флашит на диск. иногда нужно жмакнуть Ctrl+S
Так, а если один файл поправил, сохранил и идёшь поправлять второй, эта штука пытается сломаный код запустить?
heavycharged
да, она запускается, и крашится. иногда даже вылазит терминал с кучей ошибок)
heavycharged
но это как настроишь)
Anonymous
Хехе, и это всё на продакшен сервере 👌
Anonymous
Хехе, и это всё на продакшен сервере 👌
мне кажется вы пытаетесь применить специфичный рецепт проистекающий из моего вопроса к общим задачам... не думаю что так сработает :)
Anonymous
но в целом я понял общую концепцию, благодарю за ответы
Anonymous
да да, меня ввело в заблуждение что запуск быстро происходит… вероятно это из-за того что на простом коде тренировался, на больших проектах так не работает
heavycharged
из-за строгой статической типизации, здесь о 95% всех ошибок сообщит IDE, остальное всякие nil dereference и ошибки в логике, не то сунули, не туда, и т.д. так что в целом, билдить на каждой правке тут нету необходимости. во всяком случае, я когда рефакторю, то почти сразу все стартует как нужно.
Denis
есть https://github.com/nathany/looper которая перезапускает тесты на каждое сохранение файла, удобная штука
.
Ребят
.
Какие есть хорошие варианты лога запросов net/http?
Anonymous
Какие есть хорошие варианты лога запросов net/http?
Я конечно валенок Но я бы сделал общую функцию для отправки запросов, и в ней писал все в лог файл
.
Мне чисто в консольку
.
Ну без всяких функций
.
нет
.
мне чисто для бенча
.
так как Apache AB нифига не показывает толком
Anonymous
Без функций не получится Хотя бы fmt println
heavycharged
запросы то входящие или исходящие?
.
Я хочу знать с каким кодом возвращаются ответы
.
или исходящие
.
Короче
.
Мне просто надо знать с каким кодом возвращаются запросы
.
И чтобы это чисто в консоль
heavycharged
ну миддлвер тебе нужно, если запросов много.. там же просто его сделать, это самый простой путь
heavycharged
попробуй siege юзай, или JMeter
heavycharged
они пишут сколько запросов с каким статусом
heavycharged
зачем тебе в приложухе логировать это дело, у тебя ещё сильнее упадет производительность из-за этого
.
Понял
.
https://github.com/codesenberg/bombardier
.
А про это что скажете?
.
для теста
Anatoliy
А есть тут люди что ботов телеграмных писали?) Интересует вопрос - как отлавливать нажатия кнопок? Пользуюсь https://github.com/go-telegram-bot-api/telegram-bot-api Сами кнопки тоже отрисовываются, а вот нажатия отловить на них не могу 😩
Anonymous
Inline
Там callback
Anonymous
Надо ловить
Anatoliy
Там callback
msg := tgbotapi.NewMessage(upd.Message.Chat.ID, upd.Message.ReplyToMessage.Text) data := fmt.Sprintf("%d-1",upd.Message.ReplyToMessage.MessageID) data2 := fmt.Sprintf("%d-2",upd.Message.ReplyToMessage.MessageID) btn1 := tgbotapi.InlineKeyboardButton{ Text: "+", CallbackData: &data, } btn2 := tgbotapi.InlineKeyboardButton{ Text: "-", CallbackData: &data2, } nikr := tgbotapi.NewInlineKeyboardRow(btn1, btn2) msg.ReplyMarkup = tgbotapi.NewInlineKeyboardMarkup(nikr) bot.Send(msg) Вот собственно сами кнопки с сообщением
Anatoliy
А вот пытаюсь отловить Callback: if update.CallbackQuery != nil { logger.Info("CallbackQuery") logger.Info(update.CallbackQuery) И он не отлавливается вообще
Anatoliy
В цикле с апдейтами сделай проверку If update.CallbackQuery != nil бла бла бла
Спасибо, проверка была, но была она аж после проверки что если это не Message то пропускаем вообще все :(
Anatoliy
Просто стандартное if update.Message == nil { continue } зло :)
.
хорошая штука или нет?
.
https://github.com/codesenberg/bombardier
Wingman
Подскажите пожалуйста. Принципиально не вдупляю в некоторые базовые штуки с select/chan/таймаут, etc. Пример прерывания некоего процесса по таймауту, как его в куче мест приводят: ` for { select { case <-time.After(300 * time.Second): return default: сделать_что-то_долгое() } } ` Вроде как по наступлении таймаута через 5 минут цикл должен прерваться. Но ведь если сразу после запуска процесс у меня попадёт в default, и там будет выполнять что-то долгое/подвисшее 10, например, минут, то до первого case дело не дойдёт, пока это что-то не выполнится? Получается, что от такого таймаута толку мало? Не понимаю :(
heavycharged
в данном примере, да, смысла мало
heavycharged
что-то большое нужно дробить на что-то маленькое
Wingman
печаль
Wingman
а если вдруг что-то, от нас не зависящее, но время ожидания чего нужно ограничить? :)
heavycharged
нужно делать done chan struct{}, который мы закрываем по прошествии 5 минут, а в самой долгой задаче, если там идут всякие for, делаешь так for _, i := range some { select { case <-done: return default: // обрабатываем } }
Wingman
гмгм
heavycharged
https://blog.golang.org/pipelines
heavycharged
вот тут более подробно
heavycharged
суть в том, что из закрытого канала чтение происходит мгновено и бесконечно, а значение возвращается нулевого типа, получается что если ты попадаешь на закрытый канал, то значение читается мгновено, попадает на нужный case <- done после чего делает return
Wingman
нужно делать done chan struct{}, который мы закрываем по прошествии 5 минут, а в самой долгой задаче, если там идут всякие for, делаешь так for _, i := range some { select { case <-done: return default: // обрабатываем } }
Ну это если там есть всякие for. Ну вот чуть менее абстрактный пример: я телнечусь на оборудование, отправляю команду, иииии жду вывода - ничего больше сделать не могу. Предположим, что в телнет-клиенте нет встроенных таймаутов (ну просто для примера ведь). Тогда получается, что мы зависли в default:, если ожидаем в нём данных от железки, и прервать это ожидание извне никак нельзя
heavycharged
ну у тебя в отдельной горутине это все происходит?
Wingman
угу
heavycharged
сек, сейчас попробую что-то придумать..
heavycharged
чтобы показать как это дело обыграть правильно
Michael
Они уже зарабатывают там
Телеграм скоро запустит свою валюту грам
heavycharged
первая горутина, та часть где default - это твоя долгоиграющая задача... которая тоже в горутине должна запускаться, и должна вызвать close(ready) когда все будет готово.
heavycharged
или через 20 секунд будет close(done), и тогда эта же горутина должна написать в ту, чтобы та сделала return
heavycharged
в целом, если у тебя прямо в коде for {} и не предусмотрено механизм прерывания, то никак ты из него не выйдешь, по крайней мере я не знаю таких способов
Wingman
https://play.golang.org/p/-lh96lTDaR-
Ну тут опять же тикер, после каждого тика которого опять проход по select идёт если вместо тикера воткнуть sleep, то ой :)
Wingman
https://play.golang.org/p/12iTQNY7dEI что-то типа такого