Yuriy
То есть модуль apache (там есть ограничение на размер) на Go не получится написать. Это я уже понял.
Вы все пытаетесь убедить себя, что go вам не подходит? Таки да! Вам не подходит...
🔥
У меня в среднем сервисы по 50 метров весят)
Но зато к примеру ща я мвп сделал за 3 дня)
🔥
Насобирал готовых кусков склеил соплями и завтра уже в продакшене будут)
Игроман
Вы все пытаетесь убедить себя, что go вам не подходит? Таки да! Вам не подходит...
Какая Вам разница в чём я хочу себя убедить? А Вам так надо найти во мне врага? Когда изучаешь что-либо всегда надо изучать ВСЕ стороны объекта. Не стоит искать врагов среди собеседников!
Игроман
У меня в среднем сервисы по 50 метров весят)
Ну в сравниваемом примере есть разбор параметров командной строки и сам сервер. И больше ничего.
Игроман
🔥
Но го не совсем про размер
🔥
В Go можно линковать динамически? Это как?
Это уже у Гугла спроси я последний раз этим занимался года 2 назад
Игроман
Но го не совсем про размер
Меня волнует не размер, а нету ли там жучков-стукачей. Вот, например, в репозитариях моего KaliLinux отсутствует пакет golang. В преамбуле к дистрибутиву сказано, что все небезопасные пакеты удалены из дистрибктива
🔥
Только пентестеры по идеи
Игроман
Это уже у Гугла спроси я последний раз этим занимался года 2 назад
Кстати, было бы прекрасно, если бы приложение на Go можно было бы линковать с объектным модулем из си или с си-библиотекой
Игроман
А кто то в здравом уме пользуется кали на повседневной основе?)
Все, кому нужно удобство! Я использую для жизни, хотя я не пентестер. Там шикарный терминал, нет дурацкой панели, как в ubuntu. В терминале можно запускать много шелов и размещать их в режиме screan. То есть там сам терминал -- уже среда разработки! И таких фич для разработчика там уйма! А live-версия если вообще чудо: можно сохранять свои данные на самом носителе, чего нет ни в одном другом дистре
Игроман
Плюс го хранит рефликции, а в с++ как я помню их так и не завезли
Reflect -- это технология "отражения" типа как в Шарпе. В Шарпе reflect оправдан существованием промежуточного слоя .NET. Но ведь в Go нет промежуточного слоя! Или все же есть?
🔥
Reflect -- это технология "отражения" типа как в Шарпе. В Шарпе reflect оправдан существованием промежуточного слоя .NET. Но ведь в Go нет промежуточного слоя! Или все же есть?
Я подразумевал хранение информации о структурах и прочее для маршала и анмаршала в например json А если подробнее то вот: https://pkg.go.dev/reflect
Игроман
Да фикция все эти сорцы. Несколько раз пытался их компилить, уходило много времени и заканчивалось всё тем, что для успешной компиляции необходимо было положить в дистриб некий бинарный модуль без исходников. Ну либо он автоматом скачивается. Но я когда компилю из исходников всегда отключаю интернет. Не люблю когда сборщик втихую скачивает бинарики из сети!
Denis
С опциями "-w -s" получилось 1966К. Тоже очень много
https://blog.filippo.io/shrink-your-go-binaries-with-this-one-weird-trick/
Игроман
Я шарпах ничего серьезней формочек не делал)
Я тоже: как только началось "импортозамещение", так сразу же языки с промежуточным слоем в гос.компаниях позапрещали. Народ либо уволился либо стал более адекватно подходить к выбору средств разработки. А когда появилась сертификация ЯП, то все быстренько перешли на Qt и иже с ним.
Khikmat
Добрый день ребят. кто ниб использовал golangci-lint ? Запускаю golangci-lint ./... Он не находит ничего пока прям в папку где .go файлы не указать
Игроман
Ну ты видимо пытался поставить юзая скомпиленый бутстраппер, а бутстраппер сам нужно скомпилить чтоб он потом сорцы го копилил) https://golang.org/doc/install/source
Не помню. Давно это было. IMHO приличное ПО, написанное ЧЕСТНЫМИ разработчиками должно компилиться ЛОКАЛЬНО. Гугль же неоднократно был замечен в попытках подсадить пользователей на иглу
Игроман
Ну меня он получается подсадил)
Не для всех это критично. Для меня -- очень критично
Игроман
Помню историю с GWT, например, когда Гугль тупо кинул программистов.
🔥
Есть тут кто в серверном железе разбирается, вы можете объяснить в чем различия между буферизованной и не буферизованной памятью на практике с какими нибудь примерами?
Null
CRM Hack - прием заявок до 5 августа Офлайн-хакатон от ИТ- компании Т1 Консалтинг. Задача - предложить необычную фичу для CRM, которую компания готовит к запуску. Сфера применения CRM: финансы, телеком, транспорт и ритейл. На хакатоне ждут решения для трех базовых процессов в CRM: 📌 Маркетинг 📌 Продажи 📌 Обслуживание Призовой фонд хакатона 500 000 рублей и возможность сотрудничества с Т1 Консалтинг (ранее Техносер Консалтинг). Знаешь, как сделать CRM особенной и можешь предложить свою идею? Тогда участвуй в CRM Hack! Прием заявок заканчивается 5 августа на сайте: crmhack.ru
Игроман
Один и тот же исходник go-сервера компилю разными компиляторами и получаю исполнительные модули разных размеров: gccgo: 35К go: 2799К
Olga
panic: runtime error: invalid memory address or nil pointer dereference
Olga
что может значить ребятки?
Vitaliy
panic: runtime error: invalid memory address or nil pointer dereference
Нигде slice / map не инициализируется не через make()?
Vitaliy
map инициализируется
А надо через make, потому что variable1 := map[int]int (и прочие типы) будут только декларацией без создания (нулевой указатель). Такая неясность.
George
чтобы понять почему так - надо понимать разницу между ссылочными типами (slice, map, channel, ...) и типами значений. (строго говоря, в го нет ссылочных типов, но если не душнить с определениями - то жизнь становится проще и понятней)
Игроман
что за .gox - файлы ставятся вместе с gccgo? Их можно чем-то открыть?
Maks
может он компилит без сборщика мусора
George
должен признать, что это сильно вводящее в заблуждение утверждение. Корявая попытка выразить другую мысль
George
Dmitry
@name_666
Вот что вспомнил. С# и Ява тоже компилируемые
Maks
Вот что вспомнил. С# и Ява тоже компилируемые
Только сишарп компилируется в промежуточный код и ему нужен рантайм как и язва
Maks
🤦‍♂️
И это говорит плюсник)
Георгий
Подскажите новичку. Сделал систему опроса промышленных контролеров по modbus tcp на nodejs. Раз в секунду через promise.allsettled запускаю параллельно функции для опроса каждого контроллера. После того когда они все отвечают или выдают ошибку результат агрегируется в Джейсон и идёт его обработка дальше. Как можно в го организовать данный код. С помощью каких конструкций. Изучаю го и хочу повторить тоже самое на нем
Георгий
Как организовать параллельный запрос по всем устройствам?
@Thermophoto
На гоу есть какие-нибудь фрейморки?
Vitaliy
На гоу есть какие-нибудь фрейморки?
Orm не рекомендуется, но если хочется, то gorm. Http: начать с gin. Перейти на echo, если ощутишь, что "надо" (может не надо) Cli: viper
Vitaliy
На гоу есть какие-нибудь фрейморки?
Но чистый го заряженный. Если что-то легкое,то не надо париться
Vitaliy
Подскажите новичку. Сделал систему опроса промышленных контролеров по modbus tcp на nodejs. Раз в секунду через promise.allsettled запускаю параллельно функции для опроса каждого контроллера. После того когда они все отвечают или выдают ошибку результат агрегируется в Джейсон и идёт его обработка дальше. Как можно в го организовать данный код. С помощью каких конструкций. Изучаю го и хочу повторить тоже самое на нем
Смори. Это надо какой-то scheduler. Контроллеры могут отвечать дольше секунды? Как аффектит хранение данных запоздалый ответ с датчиков? Раз в секунду - это прям секунда, или условная желательная секунда? И вообще... Что если аггрегат жсона будет считаться дольше? Таймаут и пропуск "тика" , или просто кладем с тайстэмпом в бд?
Георгий
Смори. Это надо какой-то scheduler. Контроллеры могут отвечать дольше секунды? Как аффектит хранение данных запоздалый ответ с датчиков? Раз в секунду - это прям секунда, или условная желательная секунда? И вообще... Что если аггрегат жсона будет считаться дольше? Таймаут и пропуск "тика" , или просто кладем с тайстэмпом в бд?
Дольше секунды контроллеры не могут отвечать, ТК у них тайм-аут 200мс, и по их истечению ошибка доступности. Поэтому запоздалых нет. Жсон небольшой, Так что все ок и кладём в бд с таймстемпом. Модбас устаревший протокол и сам никакие трапы кидать не может. Нужно принудительно опрашивать.
Таршиш
Дольше секунды контроллеры не могут отвечать, ТК у них тайм-аут 200мс, и по их истечению ошибка доступности. Поэтому запоздалых нет. Жсон небольшой, Так что все ок и кладём в бд с таймстемпом. Модбас устаревший протокол и сам никакие трапы кидать не может. Нужно принудительно опрашивать.
Надо не таймер раз в секунду, а просто в отдельном потоке опрашивать каждый датчик и через мьюьекс регистрировать его в главном модуле. Тогда время опроса датчика вообще пофиг. Из модулей если писать на плюсах: std::thread для управления потоком std::mutex для мьютекса
Denis
Подскажите новичку. Сделал систему опроса промышленных контролеров по modbus tcp на nodejs. Раз в секунду через promise.allsettled запускаю параллельно функции для опроса каждого контроллера. После того когда они все отвечают или выдают ошибку результат агрегируется в Джейсон и идёт его обработка дальше. Как можно в го организовать данный код. С помощью каких конструкций. Изучаю го и хочу повторить тоже самое на нем
Изучаю го 2 дня, я бы сделал так 1. создал бы слайс каналов. 2. запустил бы пачку горутин которые опрашивают сервера, каждыя горутина получает на вход канал, и пишет в него доступности 3 сделал прогнал бы в цикле слайс каналов Примерно так func main() { results := make([]chan bool) for _, server := range servers /*Это твои сервера*/ { result := make(chan bool) go CheckServer(server, result) results = append(results, result) } for _, res := range results { <-res } } Поскольку нам не нужно обрабатывать результаты по мере их поступления, то ничего страшного если один из запросов заблочит цикл. Если бы результаты нужно было бы обрабатывать по мере поступления такая схема бы не подошла. А так она работает как Promise.allSetled ТАм ниже еще подсказали что можно сделать через WaitGroup
Denis
Так если сделать буферизированный канал тогда цикл в конце не заблочится? Просто я не понимаю как это сделать с помощью буферизированного канала
Denis
Так если у нас 10 горутин, то какая из них его должна закрывать?
Denis
А ну да, можно через wg, но я wg еще не изучил
@name_666
Только сишарп компилируется в промежуточный код и ему нужен рантайм как и язва
Ну. У с Шарпа срл вроде так. Там фраемворк. У Явы Ява-машина.
@name_666
Ну, раз уж пошли разделения на интерпретируемый и компилируемые. Не вдаваясь в подробности.
Maks
Ну. У с Шарпа срл вроде так. Там фраемворк. У Явы Ява-машина.
я к тому что у го рантайм внутри скомпилированного приложения
@name_666
я к тому что у го рантайм внутри скомпилированного приложения
Это вечная дискуссия. Вообщем, ничего не имею против инструментов. Но, как мне кажется, занимаемое место на диске не показатель качества технологий.
Denis
Это вечная дискуссия. Вообщем, ничего не имею против инструментов. Но, как мне кажется, занимаемое место на диске не показатель качества технологий.
Ява компилируется в байт код джава машины, его исполняет джава машина(рантайм), это позволяет программам на джава программе запускаться на разных девайсах без перекомпиляции. Го лагн компилируется в машинный код. Но в асемблере, конструкций типо каналов го, или средств для управления памятью(сборка мусора) нет. Потому в экзешник залетает дополнительный машинный код связанный с этим. Но весь экзешник состоит из машинного кода(рантайм + сама программа). Потому программы го не переносимы между операционками. Но в общем случае рантайм го и джава машина выполняют примерно одни и те же функции. Но в го ланге рантайм сшивается с программой что позволяет отказаться от промежуточного байт кода. А джава рантайм например занимается ещё и jit компиляцией байт-кода Что касается производительности то го ланг и джава примерно одинаково производительны
@name_666
Ява компилируется в байт код джава машины, его исполняет джава машина(рантайм), это позволяет программам на джава программе запускаться на разных девайсах без перекомпиляции. Го лагн компилируется в машинный код. Но в асемблере, конструкций типо каналов го, или средств для управления памятью(сборка мусора) нет. Потому в экзешник залетает дополнительный машинный код связанный с этим. Но весь экзешник состоит из машинного кода(рантайм + сама программа). Потому программы го не переносимы между операционками. Но в общем случае рантайм го и джава машина выполняют примерно одни и те же функции. Но в го ланге рантайм сшивается с программой что позволяет отказаться от промежуточного байт кода. А джава рантайм например занимается ещё и jit компиляцией байт-кода Что касается производительности то го ланг и джава примерно одинаково производительны
Согласен. На все сто.
@name_666
Спасибо за разъяснения.
George
Ява компилируется в байт код джава машины, его исполняет джава машина(рантайм), это позволяет программам на джава программе запускаться на разных девайсах без перекомпиляции. Го лагн компилируется в машинный код. Но в асемблере, конструкций типо каналов го, или средств для управления памятью(сборка мусора) нет. Потому в экзешник залетает дополнительный машинный код связанный с этим. Но весь экзешник состоит из машинного кода(рантайм + сама программа). Потому программы го не переносимы между операционками. Но в общем случае рантайм го и джава машина выполняют примерно одни и те же функции. Но в го ланге рантайм сшивается с программой что позволяет отказаться от промежуточного байт кода. А джава рантайм например занимается ещё и jit компиляцией байт-кода Что касается производительности то го ланг и джава примерно одинаково производительны
George
Ява компилируется в байт код джава машины, его исполняет джава машина(рантайм), это позволяет программам на джава программе запускаться на разных девайсах без перекомпиляции. Го лагн компилируется в машинный код. Но в асемблере, конструкций типо каналов го, или средств для управления памятью(сборка мусора) нет. Потому в экзешник залетает дополнительный машинный код связанный с этим. Но весь экзешник состоит из машинного кода(рантайм + сама программа). Потому программы го не переносимы между операционками. Но в общем случае рантайм го и джава машина выполняют примерно одни и те же функции. Но в го ланге рантайм сшивается с программой что позволяет отказаться от промежуточного байт кода. А джава рантайм например занимается ещё и jit компиляцией байт-кода Что касается производительности то го ланг и джава примерно одинаково производительны
Хорошо описал, но последнее предложение странно. Го почти во всех бенчмарках быстрее. Откуда утверждении про "примерно одинаковы"?
Denis
Хорошо описал, но последнее предложение странно. Го почти во всех бенчмарках быстрее. Откуда утверждении про "примерно одинаковы"?
В какой-то статье читал, там примерно одинаково было, но да, го ланг был чуть быстрее. Правда это с год назад было, сейчас может быть другая ситуация
Maks
Это вечная дискуссия. Вообщем, ничего не имею против инструментов. Но, как мне кажется, занимаемое место на диске не показатель качества технологий.
Ну смотри. В современном мире деплой продакшина, его масштабирование и прочее это такое дело, что в любом случае будет куча машин, и придется на каждую ставить отдельно рантайм. Рантайм го очень мал, если сравнивать его с рантаймом джавы например иди с рантаймом шарпа. А использовать одну машину для многих прил сейчас не серьезно.
Maks
Ну и к тому же джит это отстой) андроид давно ушел от джита в частичный аот, частичный джин с демоном который делает дополнительно аот)
Таршиш
В какой-то статье читал, там примерно одинаково было, но да, го ланг был чуть быстрее. Правда это с год назад было, сейчас может быть другая ситуация
Если читать статьи про бенчмарки, то видишь одно, а если самому попробовать, то получишь совсем другое. Например, реальная производительность Javа в десятки, а может быть и в сотни раз ниже той, что рекламируют в популярных бенчмарках. В этом отношении сравнение Go с Java -- это как сравнение ракеты и пешехода: Go бесспорно выигрывает.
Таршиш
Изучаю го 2 дня, я бы сделал так 1. создал бы слайс каналов. 2. запустил бы пачку горутин которые опрашивают сервера, каждыя горутина получает на вход канал, и пишет в него доступности 3 сделал прогнал бы в цикле слайс каналов Примерно так func main() { results := make([]chan bool) for _, server := range servers /*Это твои сервера*/ { result := make(chan bool) go CheckServer(server, result) results = append(results, result) } for _, res := range results { <-res } } Поскольку нам не нужно обрабатывать результаты по мере их поступления, то ничего страшного если один из запросов заблочит цикл. Если бы результаты нужно было бы обрабатывать по мере поступления такая схема бы не подошла. А так она работает как Promise.allSetled ТАм ниже еще подсказали что можно сделать через WaitGroup
На практике обязательно выяснится, что у каждого датчика могут быть свои особенности. Поэтому (если писать на си++) я бы сначала озаботился написанием отдельного класса для каждого типа датчика. Каждый класс пусть наследуется от общего класса родителя. Чтение датчиков одного класса должно осуществляться в отдельном потоке. Результат сохраняется в общем потоке с использованием блокировки (мьютекс). Лучше сделать это демоном, который будет стартовать вместе с системой.
Maks
Помню мне как то сказали что без наследования можно прекрасно работать и даже лучше порой. Я долго это воспринимал в штыки. Но иногда оказывается так, что наследование реально становится не удобным. Из за того что наследование может иметь несколько уровней