• Для чего реально можно использовать AWS Lamda функции на реальном проекте?

    Viji
    @Viji
    Associate DevOps Engineer
    1. 80% - это api запросы (через api gateway), получил, сходил в базу, изменил/прочитал, ответил. Вкл relational и dynamodb. На мой взгляд гораздо меньше хлопот, чем с кубером и в основном дешевле. Особенно, если писать на Golang или хотя бы на node.js

    2. 5-10% для передачи сообщений из/в event bus, sns, sqs... в общем, в составе event driven architecture. Супер вещь. Только желательно редчайшие случаи недоставки предусматривать

    3. 5-10% Сервисные функции... например работа по cron, каждую ночь перемещает сообщения из cloudwatch на s3, или trigger какого-то backup и множество других. Я иногда сохранял предыдущее состояние, если время работы более 15 мин и вызывал лямбду еще раз.

    4. Остальное - например получение данных из kinesis stream - если с big data работаешь, но тут уже надо по цене смотреть.
    Ответ написан
    2 комментария
  • Насколько опасно использование заголовка X-Frame-Options: SAMEORIGIN?

    vabka
    @vabka
    Токсичный шарпист

    X-Frame-Options
    The X-Frame-Options HTTP response header can be used to indicate whether or not a browser should be allowed to render a page in a <frame>, <iframe>, <embed> or <object>. Sites can use this to avoid click-jacking attacks, by ensuring that their content is not embedded into other sites.

    The added security is provided only if the user accessing the document is using a browser that supports X-Frame-Options.


    Тоесть если этого заголовка нет вообще - значит браузеру разрешается всё.
    Если заголовок идёт со значением SAMEORIGIN - значит разрешается встраивать iframe только если совпадает урл сайта.
    Если заголовок идёт со значением DENY - значит браузеру вообще запрещается рендерить сайт в frame / iframe / embed / object.

    Вывод: если указать значение SAMEORIGIN, то источником click-jack attack может быть только твой собственный сайт.
    Получается, ты будешь уязвим, только если вдруг злоумышленник встроит такую атаку на твой сайт, что возможно только если твой сайт подвержен атакам html-injection или js-injection.

    Если тебе не нужно встраивать нигде на твоём сайте iframe с твоим же сайтом - используй значение DENY чтобы уменьшить возможную площадь для атаки.
    Ответ написан
    Комментировать
  • Из каких источников Kibana читает логи?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    кибана читает из Elastic Search
    собственно Elastic это и есть база данных, а кибана - визуализатор.

    А данные в эластик могут попадать разными способами, но один из популярных - это через логстеш.
    Логстеш может либо читать файлы, либо в логстеш логи могут слать приложения напрямую, либо в логстеш могут логи пересылать специализированные агенты (filebeat, fluentd и др)
    Ответ написан
    4 комментария
  • Поддерживает ли PHP асинхронность на уровне ядра языка программрования?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Чтобы сделать пример асинхронки на коленке, не вдаваясь в детали, нужно завернуть действие в генератор и перед каждой строкой кода писать "yield <строка кода>", чтобы код останавливался и передавал управление наружу. В этом случае собрав пачку генераторов и используя форич чтобы в КАЖДОМ ШАГЕ двигать КАЖДЫЙ ГЕНЕРАТОР на один шаг вперед - можно получить асинхронное выполнение.

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

    Но оно не будет параллельное в полном смысле (одновременно делаться не будет, просто будет более грамотное управление простоями).

    А вот блокирующие функции, например, функция sleep() она по умолчанию блокирующая, то есть вызвав её мы будем висеть сколько-то секунд. Она блокирующая не потому, что она "родилась такой", а потому что в ней внутри не сделаны передача управления наружу в каждом тике. Поэтому пишут так как еще в яваскрипте показывали - ставят таймер на 1 секунду к примеру (а лучше на так называемое "время тика"), и в каждом шаге проверяют - "столько-то секунд с момента запуска таймера прошло уже?" и если прошло то двигают генератор дальше, если нет - продолжают ждать.

    Это создает некую иллюзию асинхронного кода, но это не совсем то же самое что сделать pcntl_fork(), который в конечном итоге будет делать действительно в двух разных процессах (программах) и ему будет люто наплевать что делается в соседней. А затем родитель, породивший все форки просто вешает ожидалку всех детей до состояния "пока закончилось", тем самым получается нечто вроде Promise.all(tasks).

    Как итог pcntl_fork() - это переброс ответственности за опрос потомков на саму прогу php и на железо компьютера вместо кода, написанного на php, где каждая команда под капотом будет выполнять множество машинных вызовов, протупливать и так далее. Когда железо следит за этим получается НАМНОГО быстрее, задействуется больше ресурсов компьютера и т.д. Но в действительности там тоже нет прям вот "одновременного" с точки зрения момента времени, но есть "пока есть свободный исполнитель возьми это на себя", что действительно является одновременностью с точки зрения промежутка времени.

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

    ====

    Немножко практики - "когда без асинхронки не обойтись". Еще пару лет назад я был уверен что в пхп асинхронка не нужна вообще. Ну дескать - язык такой, нет здесь асинхронных задач.
    А вот и нет. Просто асинхронность у пхп разработчиков берет на себя Nginx + PHP-FPM или Апач. Это его задача на каждый запрос подымать процесс и делать его отдельно.
    Когда система ТЯЖЕЛЕЕТ и не может справляться с поставленными задачами потому что Nginx имеет время ожидания, и скрипты запущенные из апача висящие в браузере (например) часами - это ересь и бред, или когда буквально не хватает ресурсов одного компьютера и всё глючит, а нагрузка шкалит под 90%, задаешься тем, что нужно МАСШТАБИРОВАТЬ приложение. Это значит что операции требующие много времени нужно выбросить на другую машину. Сразу такой "как же это сделать". Начинаешь читать про БРОКЕРЫ СООБЩЕНИЙ. Редисы (rpush, lmove), Раббиты (ampq, тормознутый как старое пердало), Кафки (event sourcing из коробки на компах с 384гб оперативы - у вас такого нет), Натсы (к которым не найдешь пхпшной обертки нормальной). И тут выясняется следующее. Что когда из пыхи ты стрельнул сообщением в брокер, а кто-то, кто на него подписался сообщение получил, то он делает его СИНХРОННО, одно за другим. И нет там апача который заботливо на каждое сообщение подымает для тебя новый процесс. И вот тут ты задумываешься как же сделать так, чтобы пришедшие сообщения делались не одно за одним, а сразу десяток. И понимаешь - как хорошо, когда асинхронка уже есть, приручаешь pcntl_fork() и делаешь ручками. В этот момент происходит отсев разработчиков на "пыха дерьмо" и "пыха может всё". Вот первые уходят в GoLang или долбятся с NodeJs и прикручивают, а другие понимают что в пыхе есть другие преимущества, потерять которые - дороже.

    Кое-что про Pthreads и почему его "забыли". Его не забыли. Просто pthreads подымал разные задачи от начала до конца. То есть в каждом процессе требовалось произвести инициализацию того же фреймворка например. Это дорого и тяжело. В отличие от форка, который в нужный момент просто отпочковывается в другую задачу сохраняя всё, что уже было сделано. Это лучше, чем стартовать целые скрипты заново.
    Ответ написан
    1 комментарий
  • Какая сложность алгоритма из блоков switch?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    O(1). У вас линейный код, циклов в нём нет.
    Ответ написан
    Комментировать
  • Как правильно называть тесты, есть ли общее правило для именования тестовых методов?

    vabka
    @vabka
    Токсичный шарпист
    Название теста должно отвечать на вопросы:
    1. Что тестируется?
    2. В какой ситуации?
    3. Что должно произойти?
    Например "Калькулятор при Умножении любого числа на ноль должен вернуть ноль"

    Ещё можно в BDD-стиле: Given-When-Then
    Ответ написан
    Комментировать
  • Как получить данные из полей many to many в Symfony и как это реализовать?

    @tukreb
    Сначала сделайте так
    https://gist.github.com/Ocramius/3121916
    Потом через обычный foreach обращаетесь к нужным элементам к свойству с ManyToMany.
    Ответ написан
    Комментировать
  • Где лучше разместить JsonResponse в сервисе или в контроллере и почему?

    @tukreb
    https://translate.google.com/?sl=en&tl=ru&text=Res...
    Очевидно же что в контроллере.
    Ответ написан
    Комментировать
  • Стоит ли размещать private метод сразу после public метода при условии того этот метод реализует часть логики public метода?

    DevMan
    @DevMan
    компьютеру совершенно безразлично, где именно метод записан в файле.

    это исключительно собственные представления о прекрасном и/или принятые соглашения в команде, если они есть.
    Ответ написан
    Комментировать
  • Стоит ли размещать private метод сразу после public метода при условии того этот метод реализует часть логики public метода?

    Adamos
    @Adamos
    Код не зря сравнивают с беллетристикой - и то, и другое должно быть комфортно читать.
    Вопрос в общем случае не имеет правильного ответа, важны частности - что у вас за код, что это за метод.
    Если у вас аккуратная архитектура и публичные методы читаются наискосок, реализуя высокий уровень абстракции, а в приватные методы вынесена низкоуровневая возня, в которой никто не будет разбираться, пока она работает - зачем же ломать контекст и подсовывать читающему эти ненужные длинноты? В эпилог их, понадобятся - найдет.
    Ответ написан
    Комментировать
  • Нужен погодный виджет, который отображает информацию по lat/long?

    dyuriev
    @dyuriev
    A posteriori
    https://yandex.ru/dev/weather/doc/dg/concepts/fore...

    https://openweathermap.org/current#geo

    https://www.weather.gov/documentation/services-web-api (тут для кастомных координат в два запроса - сначала получить ссылку на квадрат по координатам, потом погоду для этого квадрата. шаг квадрата - 2.5км):

    запрашиваем инфу по координатам:
    https://api.weather.gov/points/59.3132,-135.7245
    забираем ссылку properties->forecast
    и по ней забираем погоду:
    https://api.weather.gov/gridpoints/AJK/160,194/forecast
    Ответ написан
    4 комментария
  • Как правильно писать модульные тесты в Symfony 3 с учетом зависимостей в конструкторе?

    bitniks
    @bitniks
    Go/PHP/Symfony developer
    В unit-тесте тестируется только сам модуль, зависимости не тестируются. Поэтому вместо зависимостей нужно передать Mock объекты. Экземпляр класса создается напрямую
    $service = new Service($mock1, $mock2, ...);

    Как создавать Mock объекты при тестировании phpunit можно почитать здесь https://phpunit.readthedocs.io/ru/latest/test-doub...
    Ответ написан
    5 комментариев