• Как в Go контролировать количество горутинов?

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

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

    Из вот этой книжки, рекомендую прочитать, кстати:
    5bc32f687decc787834192.jpeg
    Ответ написан
    Комментировать
  • Пример архитектуры хорошего Golang веб-приложения?

    @alexkdev
    Сам нахожусь в поисках идеального ответа на ваш вопрос, но кое что есть для размышления по этому поводу:
    1. https://github.com/gothinkster/realworld (тут не только Golang)
    2. https://github.com/golang-standards/project-layout
    Ответ написан
    Комментировать
  • Как протестировать вызовы методов у websocket.Conn из gorilla/websocket?

    Tyranron
    @Tyranron
    Чтобы мокать в модульных тестах, есть вот такое:
    https://github.com/posener/wstest

    Также есть вариант делать интеграционки/E2E-тесты через
    https://github.com/gavv/httpexpect
    Запилено тут, юзать через форк (ибо у автора 2 месяц руки не доходят поревьюить).
    Там можно тесты натравливать как напрямую на HTTP-сервер с WS, так и подменить клиент чтобы он сразу к хэндлерам присасывался, не подымая полноценный HTTP-сервер (как раз идею и слизал с posener/wstest).

    Оба решения используются мной на реальном проекте без проблем и вполне удачно.
    Ответ написан
    2 комментария
  • Как большие сайты справляются с отправкой e-mail?

    MedVedar
    @MedVedar
    e-commerce developer
    Пользуются сторонними сервисами. Если очень большие объемы, то есть смысл использовать https://aws.amazon.com/ses/ разница в цене с тем же mailchimp довольно внушительная.
    Ответ написан
    1 комментарий
  • Как лечить спину айтишникам?

    GavriKos
    @GavriKos
    Ну йопт. Вот вы айтишник. Вы же знаете что вопросы по теме надо задавать тем кто шарит в теме, а не сгружать вопросы по программированию переводчикам. Сходите к врачу! И он вам все скажет что и как лучше для ВАШЕГО организма.
    Ответ написан
    11 комментариев
  • Какой sql запрос выполнится быстрее?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    START TRANSACTION;
    select * from users where id = 54 FOR UPDATE
    //проверка бизнес логики на наличие денег
    update `users` set `balance` = `balance` - 150 where `id` = 54;
    COMMIT;


    Запрос "where `id` = 54 and `balance` >= 150" - опасен.
    Innodb лочит не конкретные записи, а диапазоны индексов - при таком запросе в блокировку будут попадать все записи с балансом >= 150, со всеми вытекающими.
    Ответ написан
    Комментировать
  • Какие проблемы решает качественный дизайн сайта?

    nki
    @nki
    bezkart.ru готовая система лояльности
    Основная решаемая задача - пропитание дизайнера.
    Ответ написан
    Комментировать
  • Как реализовать статусы пользователя online/offline - PHP?

    @rPman
    Пожалуйста, поднимите у себя websocket, ресурсов это много не займет, зато возможности у вас появятся огромные, вы сможете не только точно знать момент, когда пользователь закрыл страницу или отключил интернет, но и сможете со стороны сервера эффективно передавать сигналы клиентам (чат например)
    Ответ написан
    2 комментария
  • ДДос атака на nginx пакетами 1 байт?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    500 строк в секунду - это не мощно и, вероятно, даже не DDoS. Если адрес один, то просто закройте ему доступ брандмауэром, а если адреса разные, то настройте лимит запросов в Nginx.

    nginx.conf
    http {
        ...
        limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=30r/s;
        ...
    }

    some_site.conf
    server {
        ...
        location / {
            ...
            limit_req zone=reqlimit burst=10 nodelay;
        }
    }

    После этого запросы с одного ip-адреса начиная с 31-го в секунду будут отбрасываться.

    Как вишенку на торт, можно добавить ещё фильтр для fail2ban:

    nginx-req-limit.conf
    [Definition]
    
    failregex = limiting requests, excess: .* by zone .*, client: <HOST>
    ignoreregex =

    и правило в jail.local
    [nginx-req-limit]
    enabled = true
    port = http,https
    filter = nginx-req-limit
    logpath = /var/www/*/*/logs/error.log # Здесь укажите свой путь к логам виртуального хоста
    findtime = 600
    maxretry = 10
    bantime = 7200

    После этого адреса DoS'еров будут автоматически блокироваться брандмауэром на два часа. Что разгрузит Nginx от обработки паразитного трафика.
    Ответ написан
    11 комментариев
  • Как можно закрепить своё понимание нового стандарта ES6?

    Stalker_RED
    @Stalker_RED
    Пару месяцев назад приняли ES8, а вы закрепляете ES6?

    Начните уже писать код, больше кода, разного. Все эти новшества - это инструменты, облегчающие вам работу. Можно пользоваться бензопилой, можно электропилой, можно ручной пилой. Если вам нужно спилить одну небольшую ветку, а осваивать бензопилу сложно и страшно - пилите ручной. Если вам нужно спилить 500 веток, то есть смысл разобраться с более быстрым и удобным инструментом.

    В общем случае заказчика не волнует какой пилой вы там пилите. Коллег конечно может напрягать - что одна слишком сильно шумит, от другой бензином воняет, а третья - "нучотытакдолго".

    Также не стоит забывать, что браузеры при реализации этих "фич" могут запаздывать на годы. Те-же промисы не работают в IE и никогда работать не будут.
    Ответ написан
    1 комментарий
  • Как определить алгоритмическую сложность функции?

    @SolidMinus
    Внутри foreach используется strcmp, имеющий сложность O(N)

    Цикл также имеет такую сложность. Сложности алгоритмов вложенных перемножаются:

    O(kN^2 + nlogn)

    k - количество внутри алгоритмов со сложностью O(N), так как там strtolower, preg_split и т.д, то, соответственно домножается цикл O(N*(N + N + ... N)) ( в пределах одного блока сложности суммируются )

    nlogn - из-за usort, я не знаю какой там алго используется, поэтому возьмем самый быстрый.

    В результате округляем до того значения, который дает большой самый вклад, т.к при росте сумма nlogn становится незначительной, как и множитель k, то: O(N^2) ответ

    P.S. Существует метод для не-аналитической оценки сложности алгоритма.

    Берешь в цикле увеличиваешь размер входных данных и замеряешь скорость выполнения, строишь график где по Y откладываешь время, а по X - N и обычно точки ложатся в пределах какой либо функции: y=N;Y=N^2;Y=logN и т.д
    Ответ написан
    8 комментариев
  • Как реализуется набор фильтров для различных категорий по характеристикам товара?

    al_gon
    @al_gon
    Для приличной реализации нужен фасетный поиск.
    Или фасетирование. ( https://en.wikipedia.org/wiki/Faceted_search )

    Иерархический поиск тормозит при "Больших Данных".

    Слева иерархический, справа фасетный.
    c41e41856e18411fb0bdd8d20cdef195.gif

    Чтобы у пользователя было возможность принимать решение пошагово
    ( https://en.wikipedia.org/wiki/Data_drilling ) на основании того сколько марок, брендов, цветов, размеров
    или как на скиншоте 45c74008742a479084cdfa4e32c1b8b5.png
    производителей и способов доставки соответсвует фильтру и нужно фасетирование.
    здесь SQL неподходит, пробуйте готовое речешение (solr, elasticsearch и т.д.)
    Ответ написан
    1 комментарий
  • Селекты из таблицы на 5 млн строк. Если разбить её на 100 таблиц - будет выигрыш в производительности?

    @laxikodeje
    5 миллионов записей для современных СУБД - это ерунда.
    Было бы 5 миллиардов - можно было бы так заморачиваться, как вы хотите.

    Дело в том, что вы не правильно организовали хранение фильтров.
    Это действительно простой метод, но SQL в нормализованной форме не подходит для фильтров товаров по категориям товаров и интернет-магазине.
    Нужна или ДЕНОРМАЛИЗОВАННАЯ форма с дублированием.
    Или вообще БД другого типа. Я лично под такую задачу фильтрации предпочитаю Tarantool, но, полагаю, годится и Solr

    Или, все же самый правильный вариант - это добавить памяти гигабайт до 16 и наслаждаться результатом? :)


    Не-а.
    Не будет толка.
    Кроме того не забывайте - современные требования таковы что было бы весьма хорошо если бы фильтр отрабатывал вообще мгновенно почти, пока пользователь поставил очередную галку - товар по предыдущему фильтру уже загрузился с сервера в браузер.
    Ответ написан
    4 комментария
  • Как объединить авторизацию на нескольких доменах?

    IGHOR
    @IGHOR
    Qt/C++ DEV/CTO
    домен А - авторизационный домен, база одна
    домен Б - сайт
    домен С - еще один сайт

    пользователь заходит на домен Б, пусть регистрируется или авторизируется
    1) домен Б генерирует токен или сессию, передает ее в параметре на домен А
    2) домен А показывает диалог, проходит авторизация или регистрация
    3) домен А генерирует случайный временный токен, передает его в параметре на домен Б, вместе с полученными параметрами от 1.
    4) домен Б получает авторизационные Cookie по временному токену и токен удаляется
    Ответ написан
    Комментировать
  • Движок для системы дистанционного обучения?

    muhamed_kanapiya
    @muhamed_kanapiya
    Автор блога kanapiya.ru
    Много решений, скайп, хангаутс, ютуб. На вордпресс есть специальные темы. Я же просто группу в вк приватную + трансляяция на ютубе делал
    Ответ написан
    Комментировать
  • Как выучить/понять ООП паттерны?

    @MadridianFox
    Web-программист, многостаночник
    Не надо учить паттерны. Надо понимать ООП. Чтобы понимать ООП, надо знать зачем оно нужно. Методология/парадигма - это подход к решению проблемы.
    Значит ООП (а это парадигма) решает проблему.
    Эту проблему необходимо ощутить на себе. Для этого нужна практика.

    Мэт Задстра - отличный выбор для начала. Сам с него начинал.
    Однако перед этим надо набить шишки. Только тогда, то, что описано в книге, будет воспринято как полезная информация.
    Перед тем, как прочитать эту книгу я два года говнокодил.
    Прочитал - зашло, подумал что всё понял.
    Прочитал Фаулера. Ничего не понял.
    Через полгода снова прочитал Фаулера. Подумал что теперь то уж точно всё понял.
    Ан-нет.
    Сейчас придерживаюсь взглядов на ООП Егора Бугаенко. Думаю что теперь то уж точно всё знаю.
    Посмотрим что будет дальше.
    Ответ написан
    2 комментария
  • Как выучить/понять ООП паттерны?

    DevMan
    @DevMan
    теория и практика. и так по кругу.
    только чтение ничего не даст.

    прочитали паттерн -> посмотрели диаграммы -> тут же сели и попробовали реализовать самостоятельно, а не переписывая с книги/инторнетов -> посмотрели готовые реализации -> сделали выводы -> взялись за следующий.

    ну и параллельно постигать что такое ооп вообще. для этого, кстати, можно и нужно читать фундаментальные вещи, без привязки к языку.
    Ответ написан
    2 комментария
  • Как решать конфликты интересов между клиентами фрилансера?

    GeForester
    @GeForester Автор вопроса
    веб-разработчик
    Спасибо всем за ответы! Было интересно читать вашу дискуссию.

    Я нашел интересные рассуждения на этот счет у Артема Горбунова. Процитирую:

    «Дизайнерская работа априори предполагает циркуляцию идей, шаблонов и приёмов между проектами и клиентами. Если отнять круговорот идей, наша профессия перестанет существовать.

    Где граница дозволенного, дизайнеру приходится решать самому. Если ко мне одновременно придут два банка, я не стану предлагать одному банку хитрую систему лояльности, о которой узнал в разговоре с другим. Если я сам придумал эту систему, с удовольствием предложу обоим. Но шаблон решения неизбежно отложится в голове и всплывёт в какой-нибудь другой задаче — так работает мозг. Идею нельзя скрыть, только задержать на время — если ей станет скучно в сундучке, она сама выпрыгнет в чьей-то чужой голове.

    Это накладывает большую ответственность на дизайнера и объясняет клиентские страхи. Возможно, требование НДА означает неприятие клиентом этой реальности, и лучше не работать вместе. Поэтому я честно говорю всё это клиенту, когда заходит разговор о «секретности».

    Мы учимся у клиентов за их счёт. Отблагодарить их мы можем только добросовестной работой и этичным поведением.
    Ответ написан
    Комментировать
  • Как распознать номер на авто?

    BuriK666
    @BuriK666
    Компьютерный псих
    Ответ написан
    Комментировать