Home
golang
golang@conference.jabber.ru
Вторник, 12 апреля 2016< ^ >
Deirz установил(а) тему: Go Programming Language.
|| Изучаем: https://gobyexample.com/
|| Тур: http://tour.golang.org/
|| Как писать код: http://golang.org/doc/code.html
|| Как писать эффективный код: http://golang.org/doc/effective_go.html
|| FAQ: http://golang.org/doc/faq
|| 99% ответов о языке Go тут: http://golang.org/ref/spec
|| Сторонние либы: http://godoc.org/ https://github.com/avelino/awesome-go
|| Логи: http://chatlogs.jabber.ru/golang@conference.jabber.ru/
|| This chatroom does not adhere to any codes of conduct, be they implied or explicitly stated by someone. Your feelings can and WILL be hurt without a warning.
Конфигурация комнаты
Участники комнаты

GMT+3
[00:01:21] kpmý вышел(а) из комнаты
[00:16:10] Magiq вошёл(а) в комнату
[00:34:17] Magiq вышел(а) из комнаты: Replaced by new connection
[00:34:19] Magiq вошёл(а) в комнату
[00:34:34] <Magiq > 1
[00:54:22] Magiq вышел(а) из комнаты: Replaced by new connection
[00:54:24] Magiq вошёл(а) в комнату
[01:17:41] <kms> 2
[01:25:04] kms вышел(а) из комнаты
[01:31:27] dzendmitry вышел(а) из комнаты: Replaced by new connection
[01:31:29] dzendmitry вошёл(а) в комнату
[01:47:19] Magiq вышел(а) из комнаты
[02:00:57] dzendmitry вышел(а) из комнаты: Replaced by new connection
[02:00:59] dzendmitry вошёл(а) в комнату
[02:05:13] dzendmitry вышел(а) из комнаты: Replaced by new connection
[02:05:15] dzendmitry вошёл(а) в комнату
[02:14:03] mantyr@jabberon.ru вышел(а) из комнаты: Replaced by new connection
[02:34:36] mantyr@jabberon.ru вошёл(а) в комнату
[02:34:46] <mantyr@jabberon.ru> Бешенные какие-то цены у этого странного типа… http://levelp.ru/courses/programmirovanie/bases-of-programming-in-language-of-go/
[02:34:52] <mantyr@jabberon.ru> Зажрались:)
[02:46:05] dzendmitry вышел(а) из комнаты: Replaced by new connection
[02:46:07] dzendmitry вошёл(а) в комнату
[03:01:30] krab вышел(а) из комнаты: Left Vacuum-IM
[03:18:48] dzendmitry вышел(а) из комнаты: Replaced by new connection
[03:18:50] dzendmitry вошёл(а) в комнату
[03:23:28] dzendmitry вышел(а) из комнаты: Replaced by new connection
[03:23:30] dzendmitry вошёл(а) в комнату
[04:21:03] Deirz вышел(а) из комнаты
[05:10:53] plumbum вышел(а) из комнаты
[06:17:50] mantyr@jabberon.ru вышел(а) из комнаты
[07:18:19] ermine вошёл(а) в комнату
[08:00:03] cheshir вошёл(а) в комнату
[08:19:05] begemot_sun вошёл(а) в комнату
[08:26:37] radioqt вошёл(а) в комнату
[08:28:07] ermine вышел(а) из комнаты
[08:28:53] radioqt вышел(а) из комнаты
[08:35:57] xep вошёл(а) в комнату
[08:35:57] xep вышел(а) из комнаты
[08:40:17] xep вошёл(а) в комнату
[08:40:17] xep вышел(а) из комнаты
[09:13:01] radioqt вошёл(а) в комнату
[09:13:07] radioqt вышел(а) из комнаты
[09:17:42] avz вошёл(а) в комнату
[09:20:23] ftrvxmtrx вошёл(а) в комнату
[09:30:03] Laz вошёл(а) в комнату
[09:35:56] Magiq вошёл(а) в комнату
[09:37:40] <Laz> ну а хуле
[09:37:46] <Laz> спрос рождает предложение
[09:40:29] Magiq вышел(а) из комнаты
[09:52:22] kpmy вошёл(а) в комнату
[09:55:53] kpmy вышел(а) из комнаты: Replaced by new connection
[09:56:01] kpmy вошёл(а) в комнату
[10:05:41] avz вышел(а) из комнаты
[10:05:57] kpmy вышел(а) из комнаты
[10:10:49] cheshir вышел(а) из комнаты
[10:11:52] cheshir вошёл(а) в комнату
[10:12:30] bananan вошёл(а) в комнату
[10:13:13] mks2 вошёл(а) в комнату
[10:30:10] kpmý вошёл(а) в комнату
[10:43:55] plumbum вошёл(а) в комнату
[11:03:03] kms вошёл(а) в комнату
[11:43:29] cheshir вышел(а) из комнаты: Replaced by new connection
[11:43:39] cheshir вошёл(а) в комнату
[11:46:06] ermine вошёл(а) в комнату
[11:58:59] Deirz вышел(а) из комнаты
[11:59:27] Deirz вошёл(а) в комнату
[12:08:17] Magiq вошёл(а) в комнату
[12:22:42] Deirz вышел(а) из комнаты
[12:30:19] Deirz вошёл(а) в комнату
[13:05:44] Deirz вышел(а) из комнаты
[13:08:25] Deirz вошёл(а) в комнату
[13:12:11] plumbum вышел(а) из комнаты
[13:14:14] plumbum вошёл(а) в комнату
[13:54:56] Deirz вышел(а) из комнаты: Disconnected
[13:55:06] Deirz вошёл(а) в комнату
[14:19:02] Deirz вышел(а) из комнаты
[14:28:41] Deirz вошёл(а) в комнату
[14:34:09] mantyr@jabberon.ru вошёл(а) в комнату
[14:42:13] <kpmý> сначала webassembly теперь вот это https://github.com/wicg/webusb
[14:57:25] <Magiq > Как сделать структуру для подсчета событий за определенное время?
[14:57:37] <Deirz> скоро webdriver запилят
[14:59:45] <Magiq > Мне нужно например в го считать заходы на сайт и потом удобно агрегировать. Например показать количество заходов за 10 минут или за день
[15:01:52] <Deirz> возьми go-metrics
[15:04:10] <Laz> возьми graphite
[15:04:29] <Laz> или воще elasticsearch
[15:07:27] <Magiq > Deirz: который из них?
[15:07:37] <Deirz> ну
[15:07:39] <Deirz> какой-то
[15:08:31] <Deirz> посмотри и выбери
[15:09:21] <kpmý> Magiq, сколько в час получаешь?
[15:11:08] <Magiq > мне простой счетчик нужен
[15:11:16] <Magiq > elasticsearch не нужен
[15:12:04] <Magiq > счетчик чтобы я как-то мог по промежуткам времени посчитать сколько
[15:14:28] <kpmý> написать за тебя чтоли?
[15:20:07] <Magiq > эм ну если не долго
[15:20:13] <Magiq > я просто пока даже концепцию придумать не могу
[15:20:25] <Magiq > из-за того что постоянно базы данных использую
[15:20:31] <Magiq > для таких мелких задач еще не приходилось
[15:26:13] <mantyr@jabberon.ru> Вариант в лоб. Делаешь map[int64]int64, где ключ - это timestamp текущей минуты или секунды (смотря что собираешься считать). Добавляешь к этому RWMutex что бы не убить этот мап в хлам… и делаешь Set() с Lock() Unlock() и Get() с RLock() RUnlock(), на основе Get потом делаешь какую-то агрегацию. Но конечно лучше разобраться с тем как хранить времеменные ряды:)
[15:27:27] <Laz> так и хранить
[15:27:36] <Laz> список пар timestamp:value
[15:27:41] <kpmý> денег просите перед помощью)
[15:27:54] <mantyr@jabberon.ru> Ну или действительно что-нить такое использовать https://github.com/rcrowley/go-metrics
[15:28:07] <mantyr@jabberon.ru> kpmý, чего это ты такой жадный?:)
[15:29:03] <kpmý> деньги люблю
[15:30:23] Deirz вышел(а) из комнаты
[15:30:37] Deirz вошёл(а) в комнату
[15:31:39] <mantyr@jabberon.ru> Ну ты раньше таким наглым не был:)
[15:33:15] <kpmý> ну раньше я не так охуевал от просьб "напишите мне тут, если недолго" лол
[15:35:19] <mantyr@jabberon.ru> Ну то что он просит на самом деле не долго. Он же не просит сделать нормальный сервис, ему нужно только type Metrics struct {sync.RWMutex, d map[int64]int64} :)
[15:38:43] <mantyr@jabberon.ru> Но если у вас мысль как сделать более удачнее базовую структуру при таком подходе - мне было бы интересно узнать:)
[15:38:45] <kpmý> хочу печеньки жрать, не хочу смотреть как пацаны демпингуют
[15:39:00] <kpmý> бесплатный труд только в опенсурсе
[15:39:12] <mantyr@jabberon.ru> Окей. Давай откроем фирму по кодингу Golang приложений:) Что умеешь делать?:)
[15:39:12] <kpmý> даже в тюрьме есть зарплата
[15:39:44] <kpmý> умею жрать печеньки
[15:40:11] <mantyr@jabberon.ru> Ну тогда ты не подходишь:)
[15:41:41] <kpmý> да мне похуй, у вас всё равно на фирме все бесплатно работают)
[15:41:59] <cheshir> халявы на халяву не быве
[15:42:03] <cheshir> не бывает :)
[15:43:15] <Magiq > kpmý: почем органы своей мамы продашь?
[15:44:42] <Magiq > mantyr@jabberon.ru это даже не лучший вариант
[15:44:44] <Magiq > далеко не лучший
[15:45:34] <Magiq > логика в том чтобы перебрать ренжом все данные?
[15:45:39] <Magiq > и потом сравнить со временем?
[15:46:02] <mantyr@jabberon.ru> Ты про ту структуру что я предложил?:) Это вариант в лоб:) Я ведь так и сказал в самом начале:)
[15:46:13] <Magiq > ага
[15:46:28] <kpmý> Magiq : органы мамы? не знаю, я вообще программист, а не трансплантолог. а с какой целью интересуешься?
[15:46:35] <Laz> возьми скулайт да и всё
[15:46:36] <Laz> чо за проблемы
[15:47:22] <mantyr@jabberon.ru> Зачем что-то перебирать? В ключе у тебя округлённый timestamp для минуты или секунды или по какому принципу ты хочешь собирать метрику. Далее тебе таких метрик нужно много… а это ещё один map[string]Metrics в который так же надо бы сделать RWMutex:)
[15:47:29] <Magiq > какое-то странное решение проблемы, это как для подсчета людей считатать калькулятором
[15:47:33] <Magiq > Laz:
[15:47:48] <Laz> да
[15:47:59] <mantyr@jabberon.ru> Решений всегда море… возьми любой мониторинг и направь туда данные:) И не парься:)
[15:48:04] <Laz> лепить велосипеды из костылей, к сожалению, совсем не странно
[15:48:34] ftrvxmtrx вышел(а) из комнаты
[15:48:39] <Magiq > mantyr@jabberon.ru а как округлить до десяти минут?
[15:48:49] <Magiq > ты предлагаешь делить?
[15:49:18] <Laz> сделать выборку и просуммировать
[15:50:47] <mantyr@jabberon.ru> Слушай, ну загугли а:)
[15:51:10] <Laz> внатуре
[15:52:21] <Magiq > да гуглил
[15:52:29] <Magiq > не могу запрос составить
[15:53:03] <Laz> https://godoc.org/?q=time%20series
[15:53:18] <Magiq > Package timelib provides time parsing functions.
[15:53:39] <mantyr@jabberon.ru> :)
[15:53:53] <mantyr@jabberon.ru> Решений уже написанных тонна…
[15:55:33] <Magiq > в этих решениях по ссылке одно апи без документации
[15:56:45] <mantyr@jabberon.ru> Учись читать код и пользоваться godoc.org/github.com/user/project ...
[15:58:44] <Magiq > ну если их нормально состовлять
[15:59:02] <mantyr@jabberon.ru> Там документация генерируется автоматически...
[15:59:27] <Magiq > ну автоматически
[15:59:31] <mantyr@jabberon.ru> Программист ты или кто? Разберись.
[15:59:32] <Magiq > но на основании комментариев
[15:59:36] <cheshir> Magiq: посоветуй please, treeview на js для странички :)
[15:59:46] <Magiq > если не комментировать или хуево комментировать кто ж это читать будет
[16:00:05] <mantyr@jabberon.ru> На основании кода. Тебе кроме их API ничего и не нужно. Читай названия, читай структуры, читай входные и выходные параметры. Комментарии нужны только для мест где не очевидно.
[16:00:12] <Magiq > блять так это не апи
[16:00:13] <cheshir> IMHO если кот нормальный можно и без комментариев )
[16:00:14] <Magiq > это название методов
[16:00:26] <Magiq > там первые 2-3 пакета которые я просмотрел даже доков толком нет вообще
[16:00:33] <Magiq > что толку от названия кучи методов
[16:00:40] <mantyr@jabberon.ru> godoc.org заюзай, оно сгенерится само.
[16:00:47] <Magiq > я знаю что такое само
[16:00:48] <Magiq > блять
[16:00:53] <Magiq > я говорю что если комментарии нормально не ставить
[16:00:56] <Magiq > то толку от этой доки 0
[16:01:10] <mantyr@jabberon.ru> Нет, ты щас просто расписался в собственной неоселяторстве.
[16:01:31] <mantyr@jabberon.ru> Нет документации? Напиши сам. Нет нужного метода? Напиши сам.
[16:01:36] <Laz> внатуре
[16:01:44] <Magiq > к чужому пакету?
[16:01:50] <Magiq > ахуеть
[16:01:52] <Magiq > дайте два
[16:01:53] <Laz> не нравится чужой пакет - сделай свой
[16:01:58] <Magiq > смотри вот это дока https://golang.org/pkg/time/#Nanosecond
[16:02:00] <Laz> чо ты как баба хнычешь тут
[16:02:21] <Magiq > а вот это говно https://godoc.org/github.com/influxdata/influxdb/tsdb
[16:02:25] <Magiq > ощутил разницу?
[16:02:28] <Magiq > как мама твоя
[16:02:29] <Magiq > я хнычу
[16:02:31] <Magiq > извини
[16:02:44] <Magiq > на личности не переходи
[16:03:05] <Magiq > вы предлагаете я аргументирую почему вариант не очень
[16:03:13] <Magiq > а решать мои проблема за меня я не прошу
[16:03:19] <Magiq > я лишь говорю что предложенный вами вариант говно
[16:03:26] <Laz> и мой тоже?
[16:03:31] <Laz> а, точно
[16:03:34] <Laz> мой тоже
[16:03:56] <mantyr@jabberon.ru> https://godoc.org/github.com/influxdata/influxdb/tsdb - да вроде тут тоже дофига твоих любимых комментариев.
[16:04:22] <kpmý> степень охуелости повышается
[16:04:27] <mantyr@jabberon.ru> :)
[16:04:32] <mantyr@jabberon.ru> Без труда…
[16:05:06] <Magiq > ты их читал эти комментарии однострочные?
[16:05:31] <mantyr@jabberon.ru> Не вижу проблем переписать чужой код и закоммитить… тоже и с документацией. godoc отличная штука для того что бы упростить чтение кода. Всегда видно какие есть методы, что туда можно отправить и что получить на выходе… если нужно углубиться - просто переходишь к нужному куску кода и читаешь:)
[16:05:46] <mantyr@jabberon.ru> Я редко читаю комментарии, только если внутри непонятный код:)
[16:06:23] <mantyr@jabberon.ru> Покажи комментарий который тебе так мозг вынес?:)
[16:06:24] <Laz> то есть, вместо чтения документации ты читаешь код реализации?
[16:06:35] <Laz> а если внутри непонятный код, то так и быть...
[16:06:37] <mantyr@jabberon.ru> Да. Чаще всего так и ещё я коммичу в чужие проекты и пишу свои.
[16:07:02] <mantyr@jabberon.ru> И ничего так не помогает прокочаться как чтение.
[16:07:05] <Magiq > я в первую очередь читаю документацию а не описание методов
[16:07:27] <Magiq > а уже потом после документации если нужно смотрю на методы и их реализацию
[16:07:38] <Magiq > если я привык к нормальной документации это плохо?
[16:07:52] <mantyr@jabberon.ru> Первое что я смотрю - это какие структуры есть, какие у них методы. Дальше смотрю - а что там внутри. Потом дочитываю комментарии к тому что я уже прочитал. Так я понимаю КАК работает та или иная библиотека в нужном мне контексте.
[16:08:18] <mantyr@jabberon.ru> Суть твоего метода в том что если сделать отличную заманушную документацию то ты к себе в проект возьмёшь хз какой код.
[16:08:55] <mantyr@jabberon.ru> Я считаю что если код требует комментария - значит это уже сложный код.
[16:09:26] <Magiq > я о комментариях вспомнил только потому что  на основании его godoc генерирует
[16:09:44] <Laz> type Reader interface {
    Read(p []byte) (n int, err error)
}
[16:09:45] <Magiq > но согласись что пакеты стандартной библиотеки документированны нормально
[16:09:47] <Laz> чо, сложный код?
[16:09:48] <Magiq > а все что в выдаче не очень
[16:10:02] <mantyr@jabberon.ru> Но если говорить об influxdb то да, там куча не понятно как работающего говна. Много мнений слышал что там с каждым релизом всё к чертям ломают. Зависимостей там тоже тонна. К себе в прод я такое не стану тащить. Просто потому что поддерживать такое не хочется.
[16:10:42] <Magiq > вот, вся проблема в том что у тебя опыт есть работы с этой библиотекой
[16:10:53] <mantyr@jabberon.ru> Повторюсь - не нравится документация, сделай милость напиши свои правки и закоммить. Кто-то ведь выложил то что тебе не понравилось и он тебе ничего не обязан вообще.
[16:10:56] <Magiq > у меня опыта вообще нет и как обычно делается я ищу адекватную документацию которой нет
[16:11:10] <Magiq > читать список методов это можно но долго и не удобно
[16:11:13] <mantyr@jabberon.ru> Magip, опыт такой же как у тебя. Я скачал, почитал и составил мнение.
[16:11:31] <Magiq > нет, я лучше поищу другую
[16:11:38] <Magiq > чем буду коментировать чье-то говно
[16:11:44] <Magiq > не понятно как работающее
[16:11:49] <mantyr@jabberon.ru> Поищи, я тебе конкретно другие проекты советовать не буду, а то и их обосрёшь:)
[16:12:09] <mantyr@jabberon.ru> В этом и проблема таких как ты. Ты что-то используешь и не знаешь что и как.
[16:12:18] <Magiq > да какая разница если можно просто перейти на личности
[16:12:37] <mantyr@jabberon.ru> Типо "а вот эта библиотека решает мои проблемы", а то что внутри может быть от бекдора до херни какой-то несусветной - ты это не проверяешь:)
[16:12:58] <mantyr@jabberon.ru> Дело не в личностях. Дело в том что твой подход очень опасен.
[16:13:00] <Magiq > Я не знаю где вы работаете, но я себе не позволяю время не продуктивно тратить
[16:13:24] <Magiq > прочитать список структур и методов и понять что они делают дольше чем найти что то задокументированное
[16:13:37] <mantyr@jabberon.ru> :)
[16:13:39] <Magiq > я не ныл, а просто прокоментировал что разобраться как работает долго
[16:13:45] <Magiq > долго но я не говорил что нереально
[16:13:59] <Magiq > я брал проект других разработчиков которые без документации просто ливнули из проекта
[16:14:03] <Magiq > на чужом языке
[16:14:08] <Magiq > и в итоге разобрался
[16:14:09] <mantyr@jabberon.ru> Ну дык. Тема сложная:) Если тебе нужен максимально быстрый и максимально корректный по работе код - надо перелопатить тонну как теории так и чужого кода.
[16:14:16] <Magiq > но если бы был выбор я сначало бы прочитал документацию
[16:14:51] <mantyr@jabberon.ru> Я всегда смотрю примеры:) По ним сразу можно составить мнение, просто открываешь _test.go файлы и смотришь говно там или нет:)
[16:14:59] <Magiq > для таких мелких задач как у меня, елси я буду перелопачивать такие библиотеки то меня уволят быстрее
[16:15:09] <Magiq > вот, правильно примеры
[16:15:17] <Magiq > так во примеров в первых трех открытых пакетах я не нашел
[16:15:31] <Magiq > я ж не говорю там нахер вы мне свое говно кинули
[16:15:32] <mantyr@jabberon.ru> А так что бы библиотека была многословно описана - такое редкость, но проблема такой "писанины" в том что она может быстро потерять актуальность и не соответствовать реальности.
[16:15:34] <Magiq > вы помогаете
[16:15:46] <Magiq > я просто прокоментировал что код без примеров и доки
[16:15:58] <Magiq > ну пример же хотябы можно написать
[16:16:02] <mantyr@jabberon.ru> 100500 библиотек для метрик - найди то что нравится тебе:)
[16:16:09] <Magiq > так и сделаю
[16:16:11] <mantyr@jabberon.ru> Там нет тестов совсем?:)
[16:16:22] <mantyr@jabberon.ru> *_test.go файлы…
[16:16:47] <mantyr@jabberon.ru> https://github.com/influxdata/influxdb/tree/master/tsdb - видим что тесты есть...
[16:16:49] <Laz> может, проще скулайт взяьт?
[16:16:53] <Laz> на нём это делается за 15 минут
[16:17:38] <mantyr@jabberon.ru> Скинь ссылку на то о чём ты говоришь:)
[16:17:39] <Magiq > я нашел уже пример простого счетчика нужного мне с предыдущего проекта, это всяко лучше sqlite
[16:17:45] <Magiq > мне нужен просто счетчик всеголишь
[16:17:49] <Magiq > это перегруз брать SQL
[16:18:05] <Laz> ага
[16:18:07] <mantyr@jabberon.ru> Аа… sqlite, я подумал есть какой-то новый проект Скайлайт:)
[16:18:21] <Laz> сейчас всего лишь счётчик
[16:18:24] <Laz> потом агрегация
[16:18:26] <Laz> потом выборки
[16:18:33] <Laz> потом перзистентность
[16:18:37] <Magiq > нет
[16:18:45] <Laz> потом надо сынтегрировать данные с биллингом
[16:19:10] <mantyr@jabberon.ru> Я вот пишу программы которые пуляют данными с такой скоростью что писать метрики в базу - убийство… их надо агрегировать в самом приложении. Но, я потом такой софт отдаю клиентам и надо бы собирать от них мега-потоки данных в единую систему. Так что я не считаю задачу такой уж простой.
[16:19:14] <Magiq > мне грубо говоря нужно по достижению какого-то количества заходов менять логику отображения все
[16:19:26] <Laz> это чо за программа?
[16:19:29] <Laz> мне тоже так надо
[16:19:49] <mantyr@jabberon.ru> Laz, что тебе надо?:) Счётчик?:)
[16:19:55] <Laz> собирать много данных
[16:20:41] <Laz> много счётчиков считай :)
[16:21:21] <mantyr@jabberon.ru> А… ну я пишу много парсеров. Многопоточных. С распознованием текста на картинках и в pdf документах, с генерацией больших xml отчётов (которые я хочу переписать для поточной модификации - дополнении данными), с websockets для отрисовки метрик на клиенте, с управлением всем этим на клиенте через "старт/стоп" ну и прочие радости жизни.
[16:22:38] <mantyr@jabberon.ru> Я пока думаю над тем какая реализация таких счётчиков лучше. Вариант map[string]map[int64]int64 для таких вещей вполне подходит. Весь вопрос потом в хранении этого всего на диске. Поиск по ним и так далее…
[16:23:02] <mantyr@jabberon.ru> При этом если сервер куда отправляем данные не доступен надо писать в кеш на диск и доотправлять позже.
[16:23:45] <mantyr@jabberon.ru> *Excel отчётов. Чего это я xml написал… тупанул:)
[16:24:55] <mantyr@jabberon.ru> C xml другие проблемы. Есть файлы по 4-5 гигабайт с xml внутри… по 2+ миллиона объектов в каждом. Задача получить это всё по сети и уложиться в 5-6 минут на всё. На получение и обработку. Но к теме метрик это никак не относится:)
[16:28:01] <Laz> а я пишу приблуду для сетевого трафика
[16:28:06] <Laz> и там гора счётчиков
[16:30:42] <mantyr@jabberon.ru> И какие счётчики используешь?:)
[16:31:25] <Laz> uint64_t
[16:31:28] cheshir интересует как xml обработать за 5-6 минут?
[16:31:42] <mantyr@jabberon.ru> Не, я о том как организовываешь эти счётчики:)
[16:31:55] <Laz> да баанльно
[16:31:57] <Laz> банально
[16:32:08] <Laz> выделяю по uint64_t на ядро
[16:32:16] <Laz> выравниваю по размеру кэш линии
[16:32:26] <Laz> херачу туда
[16:32:40] <Laz> когда запрос на выборку приходит - прохожу по всему этому, суммирую
[16:32:48] <Laz> это получается один счётчик
[16:33:58] <Laz> проблемы возникают, когда счётчиков много
[16:34:16] <mantyr@jabberon.ru> cheshir, качаешь из сети, юзаешь io.Reader удалённого файла по http. По мере считывания запихиваешь в поточный xml Decoder, по мере разбора и получения нужных токенов - получаешь объекты. Что-то с объектами делаешь… если разорвалось соединение с сервером - надо прозрачно и незаметно для парсера переподключиться, проверить что файл не обновился и докачать с нужного байта где был разрыв. По хорошему надо такой файл бить на куски изначально и качать и обрабатывать не с первого байта, а чанками, совмещая разрезанные токены по концам кусков данных. Если файл обновился - надо возвращать ошибку и софт уже сам будет думать - начать всё занова сейчас или подождать и сделать позже по расписанию.
[16:35:03] <mantyr@jabberon.ru> Ты как-то atomic или Mutex или chan для синхронизации доступа к счётчикам используешь?:)
[16:36:00] <Laz> в не синхронизирую доступ кним
[16:36:04] <Laz> я
[16:36:26] <mantyr@jabberon.ru> Тоесть у тебя поток который мега-пишет туда что-то… а потом приходит читатель за метрикой и может получить мусор?:)
[16:36:36] <Laz> типа того
[16:36:46] <Laz> нам архитектура обещает атомарную работу с uint64_t
[16:36:58] <Laz> так что мусора там не будет
[16:37:11] <Laz> да, на x86 работать не будет
[16:37:16] <mantyr@jabberon.ru> Я тоже так делал. Год назад, когда только перешёл на Golang… правда писал я в такие счётчики редко и их актуальность была не важна.
[16:37:34] <mantyr@jabberon.ru> Хм… а что за архитектура у вас?
[16:37:40] <Laz> x86_64
[16:37:45] 5UN5H1N3 вошёл(а) в комнату
[16:37:56] <mantyr@jabberon.ru> Тоесть самая обычная и распространённая:)
[16:38:07] <mantyr@jabberon.ru> Кинь пруф на атомарность по этому вопросу:)
[16:38:09] <Laz> f.bp
[16:38:12] <Laz> нутк
[16:39:33] <mantyr@jabberon.ru> Magiq, у тебя хоть что-то в open source есть?:)
[16:39:43] <Laz> гм
[16:41:07] <Laz> Intel's Software Developer Manual Vol 3 Chapter 8.1.1
[16:41:23] <Magiq > да
[16:41:23] <Laz> наверное, вот это вот
[16:41:27] <Magiq > https://github.com/freezlite/chat
[16:41:37] <mantyr@jabberon.ru> Ты уверен что этот мануал автоматически распространяется на Golang рантайм?:)
[16:41:59] <Laz> какой мануал?
[16:42:01] <Magiq > почему на одноядерном процессоре операция может быть не атомарной?
[16:42:04] <Laz> а
[16:42:11] <Laz> если чо, я на плюсах пишу
[16:42:14] <Laz> но воще, да
[16:42:24] <Laz> Magiq : у меня много ядер
[16:42:26] <mantyr@jabberon.ru> Где документация??:)
[16:42:40] <mantyr@jabberon.ru> Intel's Software Developer Manual Vol 3 Chapter 8.1.1 - вот этот мануал:)
[16:42:57] <Laz> я сомневаюсь, что разрабы го стали бы выделываться
[16:43:03] <Laz> и записывать инт частями
[16:43:39] <mantyr@jabberon.ru> Magiq, потому что ты не знаешь как оно внутри работает. Процессор выполняет сразу несколько инструкций, а разные структуры могут иметь разное количество инструкций при записи и чтении.
[16:43:56] <Magiq > процессор с одним ядром
[16:43:56] <Laz> кстати, где-то в спеке го я видел гарантию, да
[16:44:03] <Magiq > как оно может выполнить сразу несколько инструкций
[16:44:05] <Laz> Magiq : это ничего не значит
[16:44:16] <Laz> ОС может вытеснить твой процесс в любой момент
[16:44:26] <mantyr@jabberon.ru> Laz, проблема в том что в теории да, а на практике ни ты ни я не в курсе. Я читал что int не атомарный и для него есть atomic, а это что-то да значит...
[16:44:41] <Laz> на практике за тебя не могу сказать, а я в курсе
[16:44:53] <Laz> что запись uint64_t на x86_64 от интела атомарна
[16:44:59] <mantyr@jabberon.ru> Ну круто.
[16:45:06] <mantyr@jabberon.ru> Как проверял?:)
[16:45:15] <Laz> а гошные базовые типы мапятся в нативные
[16:45:27] <Laz> посмотрел в код интела
[16:45:37] <Laz> они этим активно пользуются
[16:45:41] <mantyr@jabberon.ru> Я не спорю, если это по факту так то это дополнительная защита от программистов и это очень хорошо.
[16:45:57] <Laz> это не дополнительная защита
[16:45:58] <Laz> это фича
[16:46:04] <Laz> будешь ты ей пользоваться или нет - дело твоё
[16:46:12] <mantyr@jabberon.ru> Не, до Intel у меня пока нет таких задач что бы их многопоточный код на Си смотреть:)
[16:46:34] <mantyr@jabberon.ru> Ну это фича которая может спасти код от некорректного поведения:)  Так что это считай защита от дурака:)
[16:47:02] <Laz> ну, может и так
[16:47:16] <mantyr@jabberon.ru> Проблема будет если перейти на другой процессор и забыть о том что в коде такое есть:) Я например софт отдаю и не контролирую куда они его потом поставят.
[16:47:29] <Laz> у нас оно не будет на других процах работать
[16:47:40] <mantyr@jabberon.ru> По этому мне критично даже биндинги использовать. Что бы не объяснять про зависимости их лучше не иметь вовсе:)
[16:47:57] <mantyr@jabberon.ru> У вас узкоспециализированное и это всегда интересно:)
[16:47:58] <Laz> статически компиль
[16:48:43] <mantyr@jabberon.ru> Ну да? imagemagick распространять статически скомпиленным и под все платформы?:) Только потому что юзается magick библиотека для графики?:)
[16:49:15] <mantyr@jabberon.ru> Если можно без такого - я обойдусь без такого:)
[16:49:57] krab вошёл(а) в комнату
[17:02:04] <Laz> ну ты же статически компилишь свою прожку под все платформы?
[17:02:17] <Laz> что тебе мешает вкомпилить libmagick?
[17:05:14] <mantyr@jabberon.ru> То что это гемор…
[17:05:23] azovcvb вышел(а) из комнаты
[17:05:57] <mantyr@jabberon.ru> Конкретно imagemagick пробовал… пара его зависимостей всё равно были динамикой…
[17:08:40] <Laz> ну гемор так гемор
[17:08:56] <Laz> пара зависимостей...
[17:26:25] <Magiq > http://pastebin.com/ALYLdSjw
[17:26:38] <Magiq > наговнокодил?
[17:30:00] <mantyr@jabberon.ru> tc.t = time.Now() тут не ясно в чём суть…
[17:31:17] <Magiq > ну если предыдущий таймер истек и счетчик обнулен то нужно новое время вставлять
[17:31:49] <mantyr@jabberon.ru> func (tc TimeCounter) Get() int{ тут у тебя таки есть запись через flushIfExpired() а значит нужен поинтер. Ну и вообще при get лучше ничего не записывать и юзать RLock()
[17:32:13] kpmý вышел(а) из комнаты
[17:32:18] <mantyr@jabberon.ru> Не ясно какую роль таймер играет…
[17:32:59] <Magiq > http://pastebin.com/wyQ2vUwB
[17:33:06] <mantyr@jabberon.ru> type TimeCounter struct{ принято писать sync.Mutex перед теми полями которые он защищает.
[17:33:43] <Magiq > понял
[17:34:22] <mantyr@jabberon.ru> Ну ок… 10 минут прошли - потеряли всё что было и записали новые данные за 2 секунды?:)
[17:34:30] <Magiq > да
[17:34:40] <Magiq > мне данные в разрезе времени нужны
[17:34:46] <mantyr@jabberon.ru> flushIfExpired() тогда должен кудато отправить данные…
[17:34:46] <Magiq > за последние N минут
[17:35:27] <mantyr@jabberon.ru> Плюс у тебя таймер от некоего события, он календарно никогда ровно с 0 до 60 секунд не поймает, будет плавать…
[17:35:47] <Laz> чо-то как-то слишком хитро
[17:35:50] <Laz> и сайдэффектово
[17:36:20] <Laz>     if tc.c == 0 {
        tc.t = time.Now()
    }

[17:36:22] <mantyr@jabberon.ru> Или вот… за 10 минут… ++ ++ ++ ++… потом 10 минут прошло, бац, у нас за последние 10 минут 0.. а как же прошедшие 9 минут + 1 минута текущая?:)
[17:36:25] <Magiq > пусть плавает таймер, мне главное чтобы спросить сколько было за 10 минут
[17:36:29] <Laz> вот это почему в Increment?
[17:36:33] <Laz> оно должно быть в флюше
[17:36:39] <Laz> флюш увидел, что новая эпоха началась
[17:36:46] <Laz> сбросил счётчик, обновил эпоху
[17:37:01] <mantyr@jabberon.ru> Иными словами. 7:00 - 7:10 - данные есть, а вот 7:01-7:11 - данные только за 1 минуту...
[17:37:40] <mantyr@jabberon.ru> Если на то пошло то надо поточный счётчик… что бы ровно за 10 минут от текущего времени.
[17:37:41] <Magiq > нет, потому что после сброса не понятно когда данные опять будут добавленны
[17:38:49] <Magiq > ну в общем в гете мне не нужно время обнулять, если я в flush добавлю tc.t = time.Now() то он лишний раз будет сбрасывать
[17:39:08] <Magiq > mantyr@jabberon.ru смотри тесты
[17:39:10] <Magiq > они работаюьт
[17:39:20] <mantyr@jabberon.ru> Например можно сделать slice [10]int64… и в 0 записывать за текущую минуту, потом скидывать данные вниз из 0 в 1, из 1 в 2, из 10 - в пустоту…
[17:39:29] <Laz> Magiq : ну тогда я не понял задачу
[17:39:39] <mantyr@jabberon.ru> Ну малоли что твои тесты работают. Я тебе говорю о том что твой счётчик как-то странно работает.
[17:39:41] <Laz> да, точно
[17:39:48] <Laz> у нас в стандартной библиотеке есть кольца
[17:39:51] <Magiq > задача знать сколько за последние заданное количество времени произошло инкрементирование
[17:39:59] <mantyr@jabberon.ru> Кстати а где там кольца в стандартной библиотеке?
[17:40:05] <Laz> но нахер надо, будем перекладывать элементы слайса
[17:40:08] <Laz> где-то есть
[17:40:32] <mantyr@jabberon.ru> Вот именно. За последнее. Вот взберло тебе в 7:11 узнать сколько было за 10 минут… а в 7:10 оно обнулилось и за минуту нифига не насчитало - в результате ты получишь не правильную метрику.
[17:40:33] <Laz> кстати, страуструп сказал, что рандомная вставка в вектор быстрее, чем в список :)
[17:40:36] <Laz> в stl
[17:40:55] <Magiq > mantyr@jabberon.ru нет же
[17:41:10] <Magiq > там Sub
[17:41:16] <mantyr@jabberon.ru> Laz, ну я просто с ходу предложил. Про кольца я в стандартной библиотеке ничего не видел, уверен оно там на основе тех же поинтеров…
[17:41:17] <Magiq > ты правильно понял
[17:41:22] <Magiq > *ты непраивльно понял код
[17:41:33] <mantyr@jabberon.ru> Ну окей… где конкретно не правильно я понял?:)
[17:41:34] <Laz> да всё он правильно понял
[17:41:44] <mantyr@jabberon.ru>     1    if now.Sub(tc.t) > tc.d {
    2            tc.c = 0
[17:41:51] <Laz> у тебя оно сбрасывается каждый d
[17:42:03] <Magiq > там time.Now причем тут границы вообще???
[17:42:13] <Magiq > tc.t = time.Now()
[17:42:23] <Laz> бля
[17:42:25] <Laz> tc.c = 0
[17:42:28] <Laz> обнуляется счётчик
[17:42:35] <Laz> каждые d
[17:42:37] <mantyr@jabberon.ru> 10 минутными интервалами… окей… но оно не от произвольной минуты тебе покажет. А только за те интервалы что посчитало… и эти интервалы могут быть такими 7:02:45 - 7:12:45 например:)
[17:43:14] <mantyr@jabberon.ru> Должно быть так. 10 секунд посчитали. Прошла секунда. Данные за первую секунду выкинули, за новую добавили...
[17:43:21] <Magiq > ты сам себе противоречишь
[17:43:29] <Magiq > но оно не от произвольной минуты тебе покажет. и эти интервалы могут быть такими 7:02:45 - 7:12:45
[17:43:38] <Magiq > какраз у меня произвольные инетрвалы
[17:43:40] <mantyr@jabberon.ru> Это я про твой алгоритм.
[17:43:45] <Laz> Magiq : задача какая?
[17:43:45] <Magiq > потому что time.Now
[17:43:59] <Laz> показать, сколько набежало за определённый интервал времени?
[17:44:05] <Magiq > задачи посчитать за прошлое N времени сколько натикало
[17:44:08] <mantyr@jabberon.ru> Если тебе важно знать значения за хер пойми как сгенеренные интервалы… ну и ладно:)
[17:44:09] <Laz> за прошлое?
[17:44:22] <Magiq > ну если time.Duration
[17:44:23] <mantyr@jabberon.ru> Вот прошла секунда - 10 минут как-то изменились? Начало и конец интервала? :)
[17:44:24] <Laz> счётчик начал работу в 0 минут
[17:44:24] <Magiq > конечно за прошлое
[17:44:33] <Laz> d - пять минут
[17:44:38] <Laz> чот он покажет в шесьт минут?
[17:44:49] <Laz> что-то у меня буквы путаются уже...
[17:45:01] <Magiq > да я таки ошибся
[17:45:04] <Magiq > обнулять тоже нужно в Get
[17:45:10] <Magiq > т.е во флуш пихать нужно
[17:45:16] <mantyr@jabberon.ru> Тогда уж так: пишем всегда ++, обнуляем по нормальному time.Tick(d Duration) и значение кидаем куда-то в базу...
[17:45:23] <Laz> не, на другой вопрос отвечай
[17:45:31] <Magiq > нет стоп
[17:45:33] <Laz> счётчик начал работать в 0 минут
[17:45:33] <Magiq > все правильно
[17:45:41] <Laz> d - 5 минут
[17:45:48] <Laz> что ты хочешь увидеть в 6 минут?
[17:45:50] <Magiq > в шесть минут он покажет 0
[17:45:55] <Laz> значение за последнюю минуту?
[17:46:00] <mantyr@jabberon.ru> :)
[17:46:02] <Magiq > если столько сколько натикало после 5 минут
[17:46:03] <Laz> если данные льются рекой
[17:46:10] <Laz> по ляму в секунду
[17:46:11] <mantyr@jabberon.ru> Да, у него за 1 минуту покажет… потому что за 5 минут ещё не набралось:)
[17:46:24] <mantyr@jabberon.ru> И будет ёлочка на графике...
[17:46:25] <Laz> то есть, в шесть минут ты хочешь увидеть за последнюю минуту?
[17:46:55] <Laz> а в семь минут - за последние две?
[17:47:43] <Magiq > таки да
[17:47:47] <Magiq > я понял
[17:48:08] <mantyr@jabberon.ru> ^)
[17:48:09] <Magiq > я запутался сек
[17:48:10] <mantyr@jabberon.ru> :)
[17:49:00] <mantyr@jabberon.ru> Гуглим "кольцевой буфер golang", находим в общем-то только это на каналах, что для задачи не подойдёт:) https://blog.pivotal.io/labs/labs/a-concurrent-ring-buffer-for-go
[17:49:23] <mantyr@jabberon.ru> Потому что нужен доступ к последнему и первому элементу и сдвигу между ними.
[17:50:37] <mantyr@jabberon.ru> Можно накапливать в slice значения за N минут… и раз в M минут перезаписывать слайс беря последние M элементов за последнее время.
[17:50:45] <mantyr@jabberon.ru> Но это наверное грубо.
[17:54:38] <Laz> https://godoc.org/container/ring
[17:54:42] <Laz> сказал же
[17:54:46] <Laz> в стандартной библиотеке
[17:56:05] <Magiq > не удобно кольцом такое решать
[17:56:19] <Magiq > кольцо для других целей сделано
[17:56:48] <Magiq > мне как минимум как ты сказал прийдется брать M элементов за последнее время
[17:57:50] <Magiq > ты выбрал кольцо для самоочищения? оно же фиксированное
[18:02:31] cheshir вышел(а) из комнаты
[18:13:26] <Magiq > http://pastebin.com/r1ckmWcj
[18:13:28] <Magiq > вот исправился
[18:15:54] <Magiq > да я забыл в одном месте блокировку сделать
[18:16:12] Laz вышел(а) из комнаты
[18:18:45] <mantyr@jabberon.ru> Laz, спасибо, гляну:)
[18:19:25] <mantyr@jabberon.ru> t []time.Time ????:)
[18:20:39] Magiq вышел(а) из комнаты
[18:21:16] <mantyr@jabberon.ru> tc.t = append(tc.t[:i], tc.t[i+1:]...) что за бред:)
[18:21:30] <mantyr@jabberon.ru> Но в целом в верном направлении движешься:)
[18:23:22] Magiq вошёл(а) в комнату
[18:32:18] Magiq вышел(а) из комнаты
[20:04:38] plumbum вышел(а) из комнаты
[20:27:42] Deirz вошёл(а) в комнату
[20:31:42] Deirz вышел(а) из комнаты
[21:07:49] azovcvb вошёл(а) в комнату
[21:12:04] 5UN5H1N3 вышел(а) из комнаты
[21:18:23] krab вышел(а) из комнаты: Left Vacuum-IM
[21:19:10] plumbum вошёл(а) в комнату
[21:30:25] Magiq вошёл(а) в комнату
[22:11:47] kpmý вошёл(а) в комнату
[22:37:24] kms вышел(а) из комнаты
[22:47:22] <kpmý> забыл когда последний раз пользовался арифметикой в джавке
[22:47:33] <kpmý> всё больше лямбды дрочим-с
[22:48:38] <kpmý> но вот понадобилось мне пути на чётные и нечётные разделить и всё
[22:50:30] <kpmý> значок % вообще трудный)
[22:51:58] avz вошёл(а) в комнату
[22:53:52] ermine вышел(а) из комнаты
[22:54:24] <kpmý> так я это к тому, что многие начинают язычки с арифметики
[22:54:54] <kpmý> типа "разберём экспрешон (+ 1 2) пук пук"
[22:57:41] unixlike вошёл(а) в комнату
[22:57:50] <unixlike> Hi there !
[22:58:08] <xep> xep here!
[23:00:49] <kpmý> а надо бы начинать язычок с модульности например
[23:01:00] <kpmý> и с системы типов
[23:10:49] <unixlike> хер'а под меня настроили ?
[23:11:15] <unixlike> теперь я не одинок
[23:12:10] <xep> снимай штанишки
[23:12:37] <unixlike> слушаюсь, хозяин
[23:18:31] <xep> ну ты и пидор
[23:23:47] <kpmý> жаль что интерфейсы без методов в пщ никак нельзя проверить, даже если его ембеддишь в структуру
[23:24:11] <kpmý> можно было бы ебашить маркерные интерфейсы и норм
[23:29:01] kms вошёл(а) в комнату
[23:31:35] avz вышел(а) из комнаты
[23:35:35] <kpmý> когда делал свой язычок понял что для хранения данных достаточно основных структур: списка и ассоциативного массива (и ещё множество добавил, очень его люблю :D)
а вот систему типов для ооп и прочих интерфейсов так и не удалось придумать, но я предполагал что это должна быть типа управляемая в рантайме система метаинформации на основе множеств и атомов
[23:40:44] <kpmý> вообще с системой типов всё не очень понятно в дикой природе
[23:41:02] <kpmý> допустим для алгоритмов есть свой минимум - последовательность, ветвление, цикл
[23:41:50] <kpmý> для хранения данных тоже понятно, примитивные типы, указатели, массив, множество, хэш (хранение по порядку, по имени, по identity).
[23:42:19] <kpmý> а вот для системы типов из предметной области чот нихера нет понятного базиса
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!