• Golang + Websoket. Как получать изменения от других сервисов?

    Была похожая задача: Вместо велосипедостроения воспользовался готовым инструментом:
    centrifugo

    Написан на go, есть клиенты под все популярные языки. Управляется по rest api и grpc.
    Ответ написан
    Комментировать
  • Golang в чём смысл?

    @nakem
    Я тоже раньше мыслил такими категориями. Мне тоже казалось, что самые крутые технологии - это те, которые на бенчмарках всех выносят и на хабрах хвалят. "Топ 5 языков для изучения в 2019\20\21\22\23..."
    Нет)) Это не так. Можно принять это за догму:)))
    Ответ написан
    Комментировать
  • Как обычно логируют краши от паник?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Если говорить про http сервер - я перенял практику из Django.

    У меня есть http middleware, который:
    - вызывает recover
    - нормально отвечает на запрос, а не падает, т.е. 500 + что мы уже знаем об ошибке и работаем над её устранением
    - собирает всю информацию по запросу, http заголовки, cookies, настройки сервера, переменные окружения и т.д. и оповещает меня по почте/телеграм

    Это даёт мне возможность узнавать о проблеме до того, как кто-то напишет в поддержку.

    Люди, в хорошем смысле, удивляются, когда у них что-то не получается, сервер отвечает 500, они не поймут что делать. А я уже узнал об этом, исправил ошибку и написал им письмо о том, что была ошибка, но уже всё исправлено :)
    Ответ написан
    Комментировать
  • INSERT INTO при тестировании через sqlmock?

    kvaks
    @kvaks
    для INSERT нужно добавлять результат и не забывай про обрамлять слешом SQL запросы в mock (regex online)

    вот пример кода
    mock.ExpectExec(`INSERT INTO Products \(model, company, price\) values \('\$1', \$2, \$3\)`).
    				WithArgs(tt.args.model, tt.args.company, tt.args.price).
    				WillReturnResult(sqlmock.NewResult(1, 1))
    Ответ написан
    1 комментарий
  • Как в Go контролировать количество горутинов?

    sgjurano
    @sgjurano
    Разработчик
    Классическая идея (ещё из C) - делать это с помощью каналов, вот как это должно быть устроено:
    вы заводите канал, который будет играть роль семафора (мьютекса со счетчиком), пишете туда столько байт, сколько хотите максимум запускать сопрограмм, перед запуском каждой из них вычитываете один байт из канала, при завершении пишете его туда же. Таким нехитрым образом вы получаете ограничение сверху на число одновременно запущенных сопрограмм.

    Вот пример кода:
    5bc32f5fdd143124004584.jpeg

    Из вот этой книжки, рекомендую прочитать, кстати:
    5bc32f687decc787834192.jpeg
    Ответ написан
    Комментировать
  • В чем юридическая сила графической подписи в PDF (Факсимиле)?

    alexgp13
    @alexgp13
    Руководитель ИТ-проектов
    Нет юридической силы. Точнее, не больше, чем у переписки по электронной почте или у скана документа.
    Ответ написан
    Комментировать
  • Как проверить, есть ли элемент в массиве без цикла?

    Никак не проверить, только цикл.
    В го пока нет дженериков, поэтому такие функции отсутствуют в стандартной библиотеке.
    Ответ написан
    Комментировать
  • Как поставить задержку во время выполнения горутин?

    yellow79
    @yellow79
    Senior Software Engineer
    Для таких целей есть https://pkg.go.dev/golang.org/x/time/rate
    Ответ написан
    Комментировать
  • Сколько занимает в памяти Struct{}{}?

    не смотря на то что сама структура занимает 0 байт, конечно же есть накладные расходы на ее объявление, хранение указателя, ссылки и т.п. Так что это совсем не 'ничего', но использование struct{} имеет наименьшее потребление памяти https://medium.com/easyread/golang-series-empty-st...

    P.S. https://www.reddit.com/r/golang/comments/om990a/ho...
    Там есть интересное пояснение как работает empty struct в golang.
    Ответ написан
    Комментировать
  • Сколько занимает в памяти Struct{}{}?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Всё верно, она занимает 0 байт.
    Можно проверить:
    package main
    
    import (
        "fmt"
        "unsafe"
    )
    
    type S1 struct {
        f1 int
    }
    
    func main() {
        s1 := S1{}
        s2 := struct{}{}
    
        fmt.Printf("s1 size: %v\n", unsafe.Sizeof(s1))
        fmt.Printf("s2 size: %v\n", unsafe.Sizeof(s2))
    }

    Вывод
    s1 size: 8
    s2 size: 0


    Там, где в мапе нужны только ключи - я всегда делаю значение struct{}{}
    Ответ написан
    4 комментария
  • Как узнать за какое время скомпилировалась программа на Golang?

    axifive
    @axifive
    Software Engineer
    Вам нужно засечь время исполнения.
    В Unix системах есть команда: timego ....
    В Windows PowerShell есть Measure-Command{start-process go ... }

    А дополнительную отладочную информацию можно получить с помощью флагов
    https://pkg.go.dev/cmd/compile#hdr-Command_Line
    Ответ написан
    Комментировать
  • Как в админке Битрикс - Заказы, разделить заказы по группе пользователей?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Можно на событии OnSaleAdminOrderList добавить фильтр. Я привожу пример на основе групп пользователей розницы и оптовиков. Можно легко адаптировать под типы плательщика.

    В примере $getListParams это то что будет передано в запрос по OrderTable.

    <?php
    
    \Bitrix\Main\EventManager::getInstance()->addEventHandler( 
        'sale', 
        'OnSaleAdminOrderList', 
        'OnSaleAdminOrderListHandler'
    ); 
    
    
    function OnSaleAdminOrderListHandler(\Bitrix\Main\Event $event) 
    {
        $getListParams = $event->getParameters();
        $reailManagerGroupId = 1; //ID группы менеджеров розницы
        $wholesaleManagerGroupId = 2; //ID группы менеджеров оптовиков
        $optUserGroup = 3; //ID группы оптовых покупателей
        $reatilUserGroup = 4; //ID группы розничных покупателей
        global $USER;
    
        $userGroups = \CUser::GetUserGroup($USER);
        if (in_array($reailManagerGroupId, $userGroups)) {
            $getListParams["filter"]["USER_GROUP.GROUP_ID"] = $reatilUserGroup;
        } else if(in_array($wholesaleManagerGroupId, $userGroups)) {
            $getListParams["filter"]["USER_GROUP.GROUP_ID"] = $optUserGroup;
        }
    
    
        $result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $getListParams);
        return $result;
    }
    Ответ написан
    4 комментария
  • Как автоматически распознавать диаграммы?

    @dmshar
    Зачем браться за задачи, по которой вы не в состоянии нагуглить информации, при условии, что информации этой в сети - выше крыши. Ну вот прямо с сегодняшней ленты Хабра - что бы не далеко ходить:
    Обнаружение объектов с помощью YOLOv3 на Tensorflow 2.0
    И такой информации в день по три статьи! А у вас все гораздо проще, чем распознавание произвольных объектов. Берете - ИЗ ЭТОЙ СТАТЬИ ИЛИ ИЗ СОТНИ ПОДОБНЫХ - , настраиваете (вернее - упрощаете до вашего простейшего объекта - круговой диаграммы), обучаете на собранном вами датасете - и получаете то, что вам надо.
    Обучить его тому "из какого сервиса сделан скрин" - это следующая задача. Принцип остаётся тем-же, только вот настройку придется проводить более тонкую, да обучающий датасет немного другой собирать.
    Мой совет - начинайте с простого. Разберетесь - и вторую задачу решите легче.
    Ответ написан
    Комментировать
  • Что использовать для PHP разработки? Vagrant, Ansible или Docker?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Это зависит от того, что, куда и как вы будете диплоить.
    По хорошему чем ближе окружения для разработки к продакшну - тем лучше.

    Лично я работал со следующими связками:
    - Vagrant + bash provisioning
    Этот способ с самым низким погором вхождения, но он очень требователен к качеству кода И процесса установки и обновления.

    - Vagrant + ansible provisioning
    Этот способ по сути включает в себя bash provisioning, но в структуре ansible. Работая в команде будьте готовы к тому, что провизионирование далеко не у всех будет нормально работать и это будет источником вашей головной боли. Если базово подтянуть bash у сотрудников еще не вызовет вопросов, то с ansible это процесс будет сложнее.

    - Docker
    Чистый докер требует далеко не маленькой компетенции. В команде я бы настоятельно не рекомендовал его использовать без дополнительных обвязок. По сути вам прийдется сделать свой docker-compose.

    - Docker + docker-compose
    Считаю оптимальным решением для dev окружения при работе как в команде, так и без.
    Ответ написан
    8 комментариев
  • Почему db.Find сьедает одно из значений таблицы?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    99%, что дело в названиях полей
    Если из базы вы извлекаете данные в структуру Post - допишите там db:"userId", чтобы получилось примерно так
    UserId int `json:"userId" db:"userId"`
    или для gorm
    UserId int `json:"userId" gorm:"column:userId"`
    Ответ написан
    2 комментария
  • В каких приложениях Go существенно эффективнее чем Node.js и PHP?

    Супер превосходства в производительности и не будет. Но при правильной архитектуре будет нормальное превосходство.
    В nodejs, например, чтобы распараллелить задачу на несколько ядер, нужно делать много доп. движений, вручную раскидывая задачи. В Go это делается автоматически и гораздо удобнее, просто используешь горутины, а рантайм сам беспокоится о том, запустить их конкурентно или параллельно. Ну и плюс, в го ты просто пишешь последовательный код, вместо колбэков, это легче.
    Строгая статическая типизация дает возможность вылавливать много проблем до релиза, код просто не скомпилится, вместо того, чтобы упасть в продакшне. Это очень критично для крупных проектов, над которыми работает много людей. Рефакторинг тоже проще по этой причине. Пхп и нода не дают такой возможности.
    Разработчики на го не редкие и не дорогие, они довольно быстро воспитываются из разработчиков на других языках, что тоже удобно компаниям. Плюс, код довольно стандартен, на го почти нет нескольких способов сделать одно и то же, он прививает единый подход.
    Сумма этих всех факторов и является причиной популярности го.
    Ответ написан
  • В каких приложениях Go существенно эффективнее чем Node.js и PHP?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Бенчмарки - это хорошо, но очень важно понимать что именно там меряли и почему результаты именно такие.

    Несколько лет назад я тоже делал бенчмарки Python, PHP, Node, Go.
    Для меня были важны две вещи:
    1 - скорость ответа сервера/кол-во запросов в секунду
    2 - объём сервиса в памяти, т.к. от этого зависит стоимость ресурсов

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

    Но вся эта разница сошла на нет, как только добавился всего один простой SQL запрос в базу, в таблицу с 10 строками. И на этом фоне разница по скорости ответа была меньше 10%.

    Иными словами если ваш сервис работает с базой - критической разницы по скорости работы между Go/Rust/PHP/Node/Java, особо не будет.

    Другое дело если ваш сервис не будет делать запросы в базу, или будет кешировать результаты запросов, тогда вы почувствуете ощутимую разницу.

    Еще очень важно понимать сколько ваш скрипт потребляет ресурсов. Это становится критически важным, когда вы имеете дело с большими нагрузками.

    Один экземпляр Go занимал в памяти порядка 6мб RAM, при том, что Pytho+Django порядка 60мб.
    Node уже не помню сколько, но что-то близкое к Python'у.

    Вот тут уже, когда серверов у вас будет много - количество серверов с Go у вас будет в 10 раз меньше, соответственно расходы за эти сервера у вас будут в 10 раз меньше :)

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

    Где-то читал статью, что у людей было API на порядка 40 серверов на Node, после переписывания на Go - серверов осталось два, из которых второй запасной :)
    Ответ написан
    13 комментариев
  • Обрезка текста в Golang?

    @neolink
    Да у вас и обрезка не по символам, а по байта, вот пример работы через rune
    play.golang.org/p/A732dMq-5O
    Ответ написан
    3 комментария
  • Как создать агента в своём модуле?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А в чем собственно вопрос? Делайте как по документации

    1) При установки модуля добавляем агент:
    \CAgent::AddAgent( "\\Your\\Module\\SuperClass::superAgent();", "your.module", "N", 10 * 24 * 3600, "", "Y");

    где
    "\\Your\\Module\\SuperClass::superAgent();" - код php который должен выполняться (точка с запятой в конце строго!!!)
    "your.module" - название вашего модуля
    "N" - периодичность
    10 * 24 * 3600 = периодичность запуска
    '' - первая дата проверки (оставлять пустой)
    "Y" - активность агента

    2) При удалении - очищаем агенты
    \CAgent::RemoveModuleAgents("your.module");
    3) Если файлы располагаются по канонам d7 ( /your.module/lib/superclass.php ), то ничего больше делать не нужно, если старый - то нужно прописать в include.php автолоадер для вашего класса с агентом
    Ответ написан
    2 комментария