• Как тестировать горизонтальное масштабирование?

    @rPman
    Одна физическая машина может сымитировать нагрузку миллиона пользователей (на самом деле даже больше но там вопрос на сколько сложная логика у тестов, в общем случае в нагрузочных тестах объем и порядок запросов фиксирован и не включает полный анализ ответов, т.е. это просто список url которые нужно загрузить в сессии) поэтому затраты на это последнее, о чем нужно беспокоиться, они минимальны.

    kubernetes, rabbitMQ, и прочие плюшки - это только инструменты, и кстати их использование не обязательно (хотя идеи используемые в них использовать так или иначе придется), и требования именно для их использования так же минимальны.

    Если говорить про конкретику - kubernetes можно развернуть буквально на одном физическом сервере (на виртуальных машинах) и полноценно изучать все его фишки, кстати будет отлично видны накладные расходы на те 'удобства', которые оно предоставляет, но помним что когда кластер разрастется до нескольких физических машин, это станет уже незаметно.

    p.s. возможность автоматического добавления мощностей, это когда идеология такой возможности заранее закладывается при разработки приложений (это не только само приложение но и организация сервисов, их настройка и порядок и правила управление всем этим), а затем, когда управляющим центром, в автоматическом режиме на основе мониторинга нагрузки, автоматически поднимаются новые машины (сам факт этого тесно переплетается с источником этих машины - физически люди у тебя бегают и железные ящики к проводам подключают или скрипты поднимают новые машины в облачном датацентре) и на них запускаются дополнительные экземпляры сервисов.

    И да, все это можно вообще реализовать без существующих инструментов, написать десяток другой небольших скриптов, собственно так они (большие продукты типа kubernetes) и появились, кому то надоел зоопарк скриптов и разношерстных приложений для этого
    Ответ написан
    Комментировать
  • Как отключить ssl-pinning в приложении, которое написано на React Native?

    vabka
    @vabka
    Токсичный шарпист
    Декомпилируешь apk.
    Затем ищешь место в коде, где включается ssl-pinning и добавляется сертификат - скорее всего там будет фигурировать вызов метода certificatePinner() класса OkHttpClient.
    Тебе нужно вызов этого метода убрать.
    Затем собираешь apk обратно.

    Но это зависит ещё от того, как именно приложение rossgram реализовано - это я описал пример, если оно написано на java/kotlin

    UPD: rossgram написан на React Native. Сейчас ещё немного покопаю, как можно декомпилировать его

    UPD2: для декомпиляции React Native приложений есть https://github.com/numandev1/react-native-decompiler
    Тебе нужно достать из apk файл index.android.bundle - для этого используй apktool

    UPD3: react-native-decompiler не может это декомпилировать
    Ответ написан
    2 комментария
  • Как читать книгу Вирт, Алгоритмы и Структуры данных школьнику?

    Adamos
    @Adamos
    Программирование в начале изучения - навык. Для него достаточно учебника, где простым языком написано, какие есть структуры и алгоритмы и как их использовать. Незачем лезть в издания, для прочтения которых требуется знание матана. Они - для тех, кто хочет разобраться, как оценить оптимальность использования тех или иных алгоритмов и структур.
    Вы же и по методичке без всякой аналитики можете выучить синтаксис и начать практиковаться. Потом, если захочется, полезете глубже. Спойлер: многие и многие программеры до этого этапа не доходят никогда ;)
    Ответ написан
    Комментировать
  • Как запустить puppeteer в хроме с другим пользователем (профилем)?

    Nik_o_lay
    @Nik_o_lay Автор вопроса
    Изучаю фронтенд
    Пока остановился на этом:
    1. Создаем профили в браузере.
    2. Ищем директорию, где они хранятся в файлах.
    3. В папке профиля создаем папку Default.
    4. В папку Default переносим содержимое папки профиля.
    5. В args указываем путь к профилю.

    Пример в Хроме на Убунту:
    const browser = await puppeteer.launch({args:['--user-data-dir=/home/rut/.config/google-chrome/Profile 1']});
    const page = await browser.newPage();
    await page.goto('https://google.ru/');
    await page.screenshot({path: 'google.png'});
    await browser.close();
    Ответ написан
    Комментировать
  • Хорошая ли стратегия разбивать монолит джанго на микросервисы джанго?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Смотри. Уже прошло время когда все пилили монолиты на микросервисы. Щас пошло переосмысление.
    Объективно есть 2 причины пилить. Первое - организационная. Команда по какой-то причине не хочет
    или не может поддерживать приложение. Или там что-то с бизнесом. Слияние. Поглощение. Передача
    проекта другой команде в поддержку. Тогда берут и ставят задачу раздела отвественностей.
    Конвей про это писал еще.

    И второе - это баланс нагрузки и децентрализация. Про failover тут еще даже речи нет. Это
    тяжелая тема и распилить монолит так чтобы его части были отказоустойчивы очень трудно. Более
    того в случае синхронных взаимодействий между частями микросервисов может быть даже падение
    перформанса
    . Да. Теоретики которые там пишут восторженные отзывы - совершенно игнорируют
    накладные на RPC. И не упоминают что в монолите цена RPC была равна нулю. Иногда RPC заменяют
    на MQ - но это новая архитектура и это надо полностью переделывать бизнес.

    И что делать с базой данных? Это тот еще вопрос. Я почти готов спорить что вы базу пилить не будете.
    И что в результате будет? Иммитация микро-сервисов? Где слабая связность?

    Тоесть если у вас нет таких кричащих ситуаций что оргазниация требует или нужно баланс
    нагрузки как-то разнести - то тебе вообще-вообще нет смысла ходить ни в какие микросервисы.

    Но имеет смысл сделать модуляризацию монолита. Например что там...
    application
    - sales
    - hiring
    - userprofiles

    Тоже очень полезно для управления сложностью. И пускай себе будет монолит зато будет сильный
    контроль за изменениями.
    Ответ написан
    6 комментариев
  • Возможно ли найти неоплачиваемую стажировку?

    opium
    @opium
    Просто люблю качественно работать
    Чирканите на почту если не найдете
    Ответ написан
    2 комментария
  • Возможно ли найти неоплачиваемую стажировку?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Попробуйте взглянуть на вопрос с точки зрения бизнеса :)

    Приходит чел, говорит "нихрена не умею, но готов работать бесплатно". Какую работу можно доверить такому челу, чтобы от нее был хоть минимальный толк? Да никакую. Все что он там наваяет - все придется пропускать через ревью специалиста (то есть отвлекать его от основной работы). Так какой смысл в этом? Правильно, никакого.
    Ответ написан
    6 комментариев
  • Как разбить строку через разделитель несколько раз?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $result = preg_replace('~^(.{8})(.{4})(.{4})(.{4})(.*)~', '$1-$2-$3-$4-$5', $str);
    Ответ написан
    Комментировать
  • Как сделать управление сервером, для своего хостинга, как на всех популярных хостингов?

    @Kirill-Gorelov
    С ума с IT
    Ну допустим
    https://www.aapanel.com/new/index.html
    не оно?
    Ответ написан
    Комментировать
  • Какую базу данных использовать для такого проекта?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут подходит любая реляционная SQL БД потому что нет противопоказаний. Реляционку мы выбираем
    уже более 30 лет как default вариант и почти не ошибаемся.

    Когда задача имеет признаки ярко выраженной high-load системы - мы делаем ей частичную денормализацию
    и раскладываем ее в NoSQL Key-Value решение. Но это не про улучшение а это про неизбежность. У нас нет выхода просто.
    Иначе мы клиенту не сможем быстро отдать какой-то резуальтат.

    Когда задача имеет ярко выраженную документную природу (нет спецификации на values) - мы берем MongoDb/CouchDb.

    Когда задача хранит граф и ищет в графе и вообще требует графовых алгоритмов - то мы берем Neo4j или ей подобные.

    Когда задача хранит данные измерений (телеметрия) - то предпочтительно взять InfluxDb или ей подобные. Здесь-же мы предполагаем что у нас - не будет joins а будет только измерения в диапазоне времени.

    Но в данном ТЗ и на картинке обычная SQL БД (MySQL/Postgres) вполне себе нормально справляется.
    Ответ написан
    Комментировать
  • Какую базу данных использовать для такого проекта?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну, на основной вопрос уже ответили, а я освещу отдельную проблему, которая очень часто волнует умы юных падаванов.

    когда лучше реляционную и нереляционную использовать?

    Ответ на этот вопрос очень простой.
    Нереляционная БД - это НЕ база данных.
    А узкоспециализированное хранилище, которое может выполнять какую-то одну определенную функцию лучше, чем база данных. Это может быть кэширующий демон, или поисковый движок, или решение для аналитики, или какое-то подсобное хранилище для всякого мусора.

    Как только осознаёшь этот простой факт, то всё сразу становится на место:
    Если нужна база данных, то и использовать надо базу данных. Реляционную. Какую именно - в вашем случае не принципиально.

    Если вдруг проект пройдет стадию "неясные идеи", и выльется во что-то практическое, и даже появится какая-то нагрузка, то можно будет начать думать про использование одного или нескольких подсобных хранилищ в дополнение к базе данных.
    Ответ написан
    2 комментария
  • Как реализовать диалоговый бот на PHP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    $data = json_decode(file_get_contents('php://input'), TRUE);

    Вот тут в $data у вас не только сообщение, но и много другой информации. В частности, айди юзера.
    я думаю, что этот айди можно использовать в качестве идентификатора сессии, передавая в session_id() перед вызовом session_start()
    Во всяком случае можно попробовать
    если сессия не взлетит, то эмулировать её на любом другом хранилище, используя идентификатор юзера чтобы сохранять состояние бота для него

    Попробовал, сессия через юзер айди не работает потому что идентификатор телеграма не подходит под стандарт идентификатора сессии.
    Если эмулировать (просто добив до нужной длины) то сессия начинает работать.
    Ответ написан
    Комментировать
  • Как puppeteer заставить работать через socks5 прокси?

    Поставьте локальный прокси, который не будет требовать авторизации и пробрасывать на родительский, например в 3proxy конфигурация что-нибудь типа

    auth iponly
    fakeresolve
    internal 127.0.0.1

    allow *
    parent socks5+ proxyhost 8080 user password
    socks -p1080

    и используйте в браузере 127.0.0.1 1080.
    P.S. но вообще в браузерах лучше использовать http/https прокси, в них хендшейк короче.
    Ответ написан
    2 комментария
  • Как замаскировать "безголовый" браузер (PHP,Nesk\Puphpeteer)?

    @JWprogrammer
    Вы можете использовать PuPHPeteer вместе с puppeteer-extra-plugin-stealth.

    1) Установка PuPHPeteer
    composer require nesk/puphpeteer
    
    npm install @nesk/puphpeteer

    2) Установка плагина puppeteer-extra-plugin-stealth
    npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth

    3) Модификация PuPHPeteer для использования плагина
    Изменяем файл vendor/nesk/puphpeteer/src/PuppeteerConnectionDelegate.js

    Строка 3:
    const puppeteer = require('puppeteer'),
    Заменить на:
    const puppeteer = require('puppeteer-extra'),

    Строка 31:
    instruction.setDefaultResource(puppeteer);
    Заменить на:
    puppeteer.use(require('puppeteer-extra-plugin-stealth')())
    instruction.setDefaultResource(puppeteer);


    Вы можете также сделать патч с помощью composer-patches, чтобы не делать каждый раз изменение вручную.

    Источник
    Ответ написан
    Комментировать
  • Как авторизоваться в instagram используя Node.js с подключённым puppeteer?

    @Nc_Soft
    Всё просто (у меня лишь недоумения про наркоманию типа page.$eval и page.click('.Igw0E.IwRSH.eGOV_._4EzTm') )
    const puppeteer = require('puppeteer');
    
    (async () => {
      const browser = await puppeteer.launch({headless: false});
      const page = await browser.newPage();
      await page.goto('https://www.instagram.com/accounts/login/');
      await page.waitFor('input[name="username"]');
      await page.focus('input[name="username"]');
      await page.keyboard.type('login111');
      await page.focus('input[name="password"]');
      await page.keyboard.type('password');
      await page.click('button[type="submit"]');
      await new Promise(r => setTimeout(r, 5000));
    
      await browser.close();
    })();
    Ответ написан
    Комментировать
  • Как сделать так, чтобы в VS Code список новых тегов в html был с новой строки?

    @wibiwa Автор вопроса
    UPD. Нашла решение.
    Если кому-то нужно:

    в файле settings.json прописать следующую команду:

    "emmet.preferences": {
          "output.inlineBreak": 1,
        }

    648ff3cc05dc1740423401.png
    Ответ написан
    Комментировать
  • Как обходят проверку смс-подтверждения при регистрации почты?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Никак не обходят. Есть сервисы, которые за долю малую предоставят в аренду на 5 мин. номер - российский, казахский, американский. Все равно не для себя регишь ведь, так что пофиг к какому номеру он привязан. Причем там наваяны уже скрипты по обходу защит - есть и на mail.ru (причем он самый дешевый) и на вконтактик.
    Ответ написан
    5 комментариев
  • Почему продолжает индексироваться сайт?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    проверка в онлайн сервисах показывает

    это несерьезно

    должны логи "показывать"

    но в целом все верно: робот не ходит "на главную и дальше", робот ходит по сохраненным и с них

    так что, думаю, ничего вы, кроме главной, индексировать не запретили
    Ответ написан
    Комментировать
  • Какой гайд поможет делать авторизацию на сайте golang?

    DollyPapper
    @DollyPapper
    Во первых аутентификацию. Авторизация это про проверку прав.
    Если без REST API, то классика это принимать через POST запрос данные с формы.
    Вот статья
    Если кратко:
    Делаете ручку /signin, которая проверяет пароль присланный пользователем с хешем паролей в базе данных (ну или где вы храните данные)
    Если всё ок, создаете сессию, сохраняете сессию где нибудь в хранилище (опять же это может быть база данных, может быть ин мемори, есть библиотеки для этого, погуглите, да хоть в памяти приложения в мапе храните)
    Далее ID сессии записываете в куки и посылаете ответ пользователю в заголовком Set-Cookie sessid="session_id", где session_id это айди который вы раньше сгенерили.
    А далее пользователь ходит на ваш сайт, и какая нибудь мидлвара берет из запроса куки, берете оттуда id сессии, ищет этот айди в хранилище. Если нашла, то пропускает запрос дальше, если нет - 401 Unauthorized.
    Ну в статье вобщем всё подробно описано.
    Ответ написан
    Комментировать
  • Взаимодействие приложений на разных стэках?

    Stalker_RED
    @Stalker_RED
    В теории если ты пишешь обе стороны которые должны общаться, то ты можешь передавать информацию как тебе удобно или как сам придумаешь. Можно складывать файликами в папочки "входящие-исходящие", отправлять через сокеты, просто записывать в память и передавать другому сервису адрес, отправлять по сети, или через брокеры сообщений.

    В реальности, граздо чаще нужно сконнектить твой софт (твой бек) с каким-то чужим, в исходники которого ты не хочешь (не можешь) лезть, чтобы добавить ему какой-то новый "протокол общения". Или даже нужно сконнектить несколько "чужих" сервисов. Например базу данных, каие-то обработчики, нотификаторы, логгеры, и т.д.
    И тогда ты не можешь выбирать из всего спектра возможностей существующего в природе, а выбираешь как их коннектить исходя из списка того, что эти сервисы поддерживают. И выбираешь по каким-то своим критериям. Для начала, по производительности, например.

    А потом приходит начальник, и говорит. - эээ, мы вообще планировали распараллеливать эту нейронку, у нас будет от 10 до 10500 инстансов в в облаке. Данные давайте сложим вот в монго-кластер, задачи по обработке сбрасываем в очередь в celery, если очередь вырастает больше чем на N, то кубер автоматически поднимает еще несколько инстансов... и так далее, насколько у него фантазия разгуляется.

    И когда у тебя сервисы крутятся не на одном компе, то всякая производительная экзотика, типа общей памяти - отпадает. Остается сеть, очередь, REST. И ты выбираешь не то что популярно на хабре в этом году, а сравниваешь что вообще умеют те сервисы, которые ты хочешь получить. Возможно делаешь несколько вариантов и сравниваешь по той-же производиительности. Возможно добавляешь какие-то дополнительные прослойки-обертки-посредники конвертирующие запросы, уменьшая при этом производительность, ага. :)

    И как-то так получается, что пока у тебя маленький проект на одном сервере - тебе эти накладные расходы "со всем издержками http протокола" погоды не делают. А когда компов много, то может так выйти, что кроме этого протокола и альтернатив не так уж много.

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

    В общем тема большая, и большие коммпании решают ее по разному - структура сервисов фейсбука и алиэкспресса может сильно отличаться, и каждый будет уверен что его подход хорош. Ну или не очень хорош, но менять архитектуру для сотени или тысяч сервисов - дорого. И комания binance основанная 5 лет назад может архитектурно оказаться гораздо современнее и технологичнее какого-нибудь paypal'а основанного в прошлом тысячелетии. И не потому что paypal не шарит, а потому что переделывать большую систему очень дорого.

    А в майкрософте, основанном 50 лет назад, можно вообще очень странные и неэффективные штуки найти, я уверен.

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