• Сбор статистики MTProto Proxy
    +2

    У меня в Erlang реализации тоже метрики собираются. Преимущество собственной реализации — можно метрики сделать какие угодно:
    image
    image
    image

  • Релиз Node.js 10.5: мультипоточность из коробки
    +7

    В Эрланге копирование всегда, но с важной оговоркой: бинарные данные размером больше 64 байт не копируются, а хранятся в общей куче и управляются по счётчику ссылок. А в виде бинарных данных в Эрланге принято обрабатывать почти все "данные". Для примера посмотрел на своем приложении:


    • binary: 709Мб
    • process: 124Мб
    • ets (ещё один способ шарить данные между процессами): 118Мб

    Т.е. из 1Гб памяти потенциально может быть скопировано при передаче между процессами только 124Мб.


    Ну и для копирования данных в Erlang под капотом используется memcpy а не сериализация в строку / json. Плюс собственная сложная система аллокаторов памяти заточенная на такое обращение.
    Сокеты между erlang процессами можно передавать, но нужно для этого использовать отдельное API либо "обернуть" сокет в процесс. Тогда вообще никаких ограничений.

  • Релиз неофициального MTProto прокси на Python, особенности протокола
    0

    Не понял вопрос.
    Если вы про python mtprotoproxy, то чем больше вы секретов для одного порта назначите, тем больше будет нагрузка на CPU на установление подключения. Максимальная нагрузка будет если кто-то подключится и отправит 64 байта данных, к которым не один ключ не подойдёт, потому что сервер будет вынужден перепробовать их все.

  • Релиз неофициального MTProto прокси на Python, особенности протокола
    0

    А что под потоками подразумевается? Трелы ОС в python версии не запускаются вообще, всё однопоточное (asyncio).
    Важное различие между официальным прокси и всеми остальными, что официальный мультиплексирует много коннектов клиент-прокси в небольшое количество коннектов прокси-сервер телеграм.
    Другие реализации всегда создают пару сокетов.

  • Релиз неофициального MTProto прокси на Python, особенности протокола
    +2

    Когда клиент подключается к mtproto серверу, то он присылает 64байта — данные сессии, зашифрованные этим вот секретом. Если расшифровать эти 64 байта правильным секретом, то там в расшифрованном пакете определённой позиции будет проверочная сумма. Если она не совпала, то нужно пробовать расшифровать следующим ключом. Т.е. в худшем случае придётся много раз расшифровывать, перебирая ключ.

  • Релиз неофициального MTProto прокси на Python, особенности протокола
    0

    А чего вы опасаетесь? Если боитесь, что перехватят пароль от вашего сервиса прослушивая трафик SOCKS, генерируйте вашим пользователям отдельные пароли для SOCKS, отличные от паролей от сервиса.

  • Релиз неофициального MTProto прокси на Python, особенности протокола
    0

    https://github.com/alexbers/mtprotoproxy/issues/20 тут это обсуждается

  • Релиз неофициального MTProto прокси на Python, особенности протокола
    0

    Ну так и первый способ с proxy_bind это какое-то совсем шаманство, а второе proxy_protocol, как я и сказал, потребует для mtproto proxy дописывать ещё поддержку PROXY protocol.

  • Релиз неофициального MTProto прокси на Python, особенности протокола
    0

    Нужно как-то передавать по всей цепочке IP адрес клиента (если мы не хотим врать телеграму про IP адреса пользователей). При простой TCP балансировке это невозможно, нужно какой-то протокол изобретать.

  • Релиз неофициального MTProto прокси на Python, особенности протокола
    +3

    Erlang версия умеет по ядрам расползаться. Другой вопрос, что из за того как активно прокси блокируют, удобнее иметь 10 одноядерных виртуалок с 10 IP адресами, чем одну на 12 ядер с одним адресом. (Если есть возможность иметь одну с 10 IP адресами то это, конечно, приобретает смысл.)


    Плюс к этому в статье умпоянуто, что обычно узкое место это не CPU, а память.

  • Telegram MTPROTO Proxy — всё что мы знаем о нём
    0

    Добавил поддержку promoted channels. Это было жостко! Не понимаю зачем было настолько усложнять..

  • Telegram MTPROTO Proxy — всё что мы знаем о нём
    +1

    Написал на Erlang https://github.com/seriyps/mtproto_proxy. Тестовый прокси поднял, есть в README.

  • Блокировка Telegram — готовимся к худшему?
    0

    Поправил на веб-страничке. В боте, наверное, пока что не буду. Все клиенты что я пробовал с ними справляются и преобразуют автоматически.
    Спасибо!

  • Блокировка Telegram — готовимся к худшему?
    0

    Насчет ссылки которую присылает бот — я пробовал изначально присылать tg://socks и мне при клике на такую выдавало ошибку. Попробуйте сами себе прислать такую. Но может я че напутал, не уверен.
    На сайте да, пожалуй пора уже менять. Когда его делал ещё блокировки не было.
    Спасибо!

  • Блокировка Telegram — готовимся к худшему?
    0

    Откроб секрет — под любым логином можно зайти с любым паролем.


    Зачем так вообще делаю? Просто начали появляться сайты которые выкладывали ссылки на этот прокси под видом своих. С одной стороны конечно и хрен бы с ними, а сдругой обидно...

  • Telegram заблокирован, но вроде работает. Почему?
    0
    Я ещё t.me/socksy_bot запустил и tg.seriyps.ru если уже заблочили
  • Блокировка Telegram — готовимся к худшему?
    +2

    Кстати, поднял сервис для обхода http://tg.seriyps.ru/


    На Erlang написан. Попозже постараюсь статью нпбросать.

  • Блокировка Telegram — готовимся к худшему?
    0

    Ну, телеграм один а VPN-ов много. По сигнатурам протокола VPN сложно и дорого фильтровать, так чт осмысл всё-же имеет.

  • Инструкция по обходу блокировки Telegram. Как активировать SOCKS 5
    –1
    Я сервис вот поднял для обхода блокировок tg.seriyps.ru
    На Erlang написан. Возможно позже статью состряпаю
  • Каркас для Telegram-бота на Erlang
    0

    Если интересно, у меня есть реализация обёртки над telegram API, но используется long-pooling а не веб-хуки https://github.com/seriyps/pe4kin

  • Готовим рабочее окружение для Erlang проекта
    0
    работать с ets полностью через него

    Имеете в виду работать с приватной таблицей через gen_server:call или работать с публичной таблицей через ets:*, но завернуть их в API-функции?

  • Готовим рабочее окружение для Erlang проекта
    0

    Я почему-то подумал, что вы предлагали создавать ETS не в процессе application controller, а в процессе корневого супервизора приложения. Ну тогда этот аргумент, пожалуй, не сработает.
    Но я бы в любом случае 10 раз подумал бы прежде чем пристёгивать ETS к "системному" процессу. Часто потом возникает необходимость вокруг этой ETS наворачивать дополнительную логику, периодические всякие таски…
    Опять же, всегда имеет смысл заворачивать ETS в модуль с API функциями вместо прямого обращения через ets:*, а для этого имеет смысл создать отдельный модуль. А если уже модуль создал, то конвертнуть его в gen_server это 10 строк.

  • Готовим рабочее окружение для Erlang проекта
    0

    Ну проще оно может и проще, но правильнее — вряд-ли по множеству причин. Например если понадобится эту ets-ку привязать к супервизору второго уровня типа


    top_level_sup
    -- some_worker
    -- sub_sup + ets
    ---- some_sub_workers

    То сделав потом во время работы приложения supervisor:terminate_child(top_level_sup, sub_sup) мы грохнем ets-ку не сделав дамп.

  • Готовим рабочее окружение для Erlang проекта
    +2

    Спасибо за статью.
    Небольшой код-ревью сделаю, если уместно:



    Насчет того что вам советуют создавать ETS прямо из супервизора — плохой совет. Для быстрых хаков ещё куда ни шло, но для реальных проектов и обучающих статей — плохая практика. Во первых ваши dump/restore не получилось бы тогда реализовать корректно, во вторых если захочется добавить какие-то периодические операции типа "удалять устаревшие ключи раз в 10 минут", то всё равно аккуратнее всего это будет смотреться внутри одного модуля с gen_server.

  • Шпаргалка по OTP (Erlang)
    +2

    Спасибо, полезно. Единственное что — terminate лучше бы подробнее расписать. Возможно даже 2 диаграммы понадобится: одна когда включен trap_exit и одна когда нет.

  • Сервис оповещения миллиона пользователей с помощью RabbitMQ
    +1

    Спасибо, интересно было почитать.


    Последний вопрос: какую структуру нам нужно использовать, чтобы уметь проверять существование обменника в списке, удалять его оттуда, а также искать уже просроченные обменники с наименьшими затратами?

    Раз уж вы всё равно запускаете erlang процесс, то наиболее разумно было бы использовать для этого ETS-таблицу. Для контейнеров с более чем 100-200 элементов как правило удобнее её использовать. А в случае ordered_set вы сможете её и для сортировки по таймстемпу использовать.


    gb_tree, хорош для нахождения минимального значения (обменника с наименьшим временем истечения срока годности, которое сравниваем с текущим временем), в качестве ключа структура {ExpireTime, Exchange}, а значение равно 0 (не используется).

    Если знгачение не используется, то лучше использовать gb_sets

  • Подделываем письма от крупнейших российских банков
    0

    Такой ещё сервис есть https://www.mail-tester.com/

  • Erlang в Wargaming
    0
    В Wargaming используется микросервисная архитектура, где разные сервисы взаимодействуют между собой как по HTTP-протоколу, так и по AMQP.

    Веб тоже разный бывает. Бывает в монолитном виде "отвалидировать форму, сходить в БД, что-то посчитать, провернуть какие-то бизнес-операции, выплюнуть HTML-ку с данными и менюшками". Обычно так на ранних стадиях проекта работает.
    А когда к проекту начинают прикручивать платёжную систему, рассылку нотификаций на различные устройства, множество методов авторизации, мобильную версию, API, мобильные приложения и пр, то эти задачи реализовываются уже в отдельных приложениях-микросервисах, которые принимают на вход JSON, возвращают JSON и всё. После этого "веб" превращается в тонкую прослойку — пользовательский интерфейс, который хоть на PHP можно писать. Валидатор форм и шаблонизатор.
    Вся остальная "мякота" именно в этих микросервисах.
  • Erlang в Wargaming
    +1
    Можно, наверное, запускать с запасом, а в рантайме менять erlang:system_flag(schedulers_online, N).

    нельзя указать на каком пуле ниток запускать этот драйвер

    Так там всего один пул. Точнее, пул планировщиков и пул IO и dirty schedulers, но драйверы (если ниче не путаю) всегда на пуле планировщиков исполняются (явно скидывая IO в пул IO). Или что имеется в виду?
  • Erlang в Wargaming
    +2
    Похоже она всё же есть
    https://github.com/erlang/otp/blob/maint/erts/emulator/beam/bif.c#L2105

    Если покопаться, то видно, что у процесса списывается редукций 4 * количество сообщений в мейлбоксе получателя.
  • MyHTML — HTML парсер на «голом» Си с поддержкой POSIX Threads
    0
    Можно к этому бенчмарку добавить https://habrahabr.ru/post/163979/
  • Нечто «крадет» место на диске?
    +1
    В Ubuntu вроде даже по умолчанию Baobab установлен image
  • Чему мы научились, разрабатывая backend
    +1
    Если в твоём языке есть удобный тип данных с поддержкой арифметики, конверсией таймзон, форматированного вывода, то почему нужно его игнорировать?
    С unix timestamp быстро надоест «руками» высчитывать сколько это будет «сейчас плюс один год и три месяца».
  • Поиск с помощью регулярных выражений может быть простым и быстрым
    +1
    По ссылке используется GIN индекс для поиска по произвольному регулярному выражению. Индекс делаешь один раз на колонку, а потом можешь по нему любыми регулярками искать.
  • Чему мы научились, разрабатывая backend
    –2
    Пока для хранения и обработки дат можно использовать unix timestamp, лучше использовать unix timestamp.

    Сомнительный совет как по мне.
  • Пудра для мозга или как сделать порошок для посудомойки в 9,7 раз дешевле
    0
    Не советую прокаливать соду в алюминиевой посуде. Может разъесть.
  • Девушку, сделавшую обнаженное селфи, осудили за распространение детского порно
  • Наш доклад на «Стачке»: «Как избавиться от persistent database зависимости»
    0
    Насчет того, что Erlang «достаточно честно использует память» это совсем неправда. У Erlang довольно сложный многослойный аллокатор памяти, так что фрагментация может съедать до 50%.
    Например у меня сейчас запущено приложение, работает около 15 дней, в HTOP отображается 153Мб, изнутри же
    1> memory(total).
    61631088
    

    Т.е. 56Мб всего «полезной нагрузки». Это всё конечно можно подтюнить, но верным ваше утверждение от этого не станет.
  • Главное преимущество Go
  • Главное преимущество Go
    +1
    Насчёт строчек странное замечание. Можно и так написать, если сильно захотеть

    match File::open(&Path::new("foo.txt")) { Ok(f) => {
            // здесь код, который может работать с файлом с помощью переменной f, к переменной e в этой ветке доступа нет
        } Err(e) => {
            // здесь можно вывести сообщение об ошибке ипользуя переменную e, к переменной f в этой ветке доступа нет
        }
    }
    

    Если пробрасывать ошибку на уровень выше, то ещё короче (обычно так и делают)
    let file = try!(File::open(&Path::new("foo.txt")));
    let line = try!(file.read_line());