• Обновился Yii2 плагин для PhpStorm
    0

    В плагине для Симфони есть поддержка Твига, можно посмотреть как там сделано.

  • В гостях у Сбертеха: всё для работы, всё для роста. Мы чуть не остались жить
    +5

    Я там сидел несколько лет назад :)


    Я говорю: Москва, а ты на последнюю букву – Астрахань, а ты, Вася, значит, на «Н» – Новгород. Теперь ты, Федя.
    – А что я?
    – Говори на «Д».
    – Воркута.
    – Почему Воркута?
    – А я там сидел.

  • ClickHouse: очень быстро и очень удобно
    0

    Не All up, а OLAP.

  • Вышел Drupal 8 — критический взгляд
    +2
    Мда… если производительность восьмерки действительно в три раза хуже семерки, то это полная *опа. Из моей практики, значительная часть времени при разработке Друпал-проекта уходила не на реализацию фич, а на то, чтобы продумать стратегию того как-бы похитрее закешировать данные, а потом вовремя инвалидировать кеш. С восьмеркой, видимо, это время только возрастет.
  • Разделяй и властвуй: как мы реализовывали разделение сессий на портале Mail.Ru
    0
    Спасибо большое за ответ. Еще один вопрос.

    Центр авторизации аутентифицирует его по наличию куки .auth.mail.ru, генерирует одноразовый токен и перенаправляет на страницу проекта.

    Я правильно понимаю, что токен передается просто GET-параметром на какой-то стндартный для проекта redirect url (примерно также сделано в oAuth2)? То есть схема выглядит так:
    * юзер зашел на project.mail.ru, при этом он уже залогинен на одном из других проектов Mail.ru,
    * его редиректит (с кодом 302) на auth.mail.ru,
    * так как в auth.mail.ru есть его авторизационная кука его редиректит на, например, project.mail.ru/redirect?token=123456,
    * project.mail.ru берет токен и передает его обратно на auth.mail.ru и в ответ получает сообщение, что все ок, токен валиден,
    * после этого project.mail.ru выставляет свою авторизационную куку.

    Верно я понял или нет?
  • Разделяй и властвуй: как мы реализовывали разделение сессий на портале Mail.Ru
    0
    Спасибо. Уточните, пожалуйста, еще один момент.

    Когда пользователь заходит на сайт проекта, для которого у него еще нет авторизации, его запрос перенаправляется в центр авторизации.


    Где определяется, что пользователь не авторизован? В браузере или на сервере?

    Если речь о редиректе на уровне веб-сервера, то какой код для редиректа используется? 305, 307? Или авторизационная кука sdc-кука проверяется джаваскриптом (она ведь не httponly?) в браузере и им же делается редирект?
  • Разделяй и властвуй: как мы реализовывали разделение сессий на портале Mail.Ru
    0
    Расскажите, пожалуйста, подробнее вот про это:
    Когда пользователь заходит на сайт проекта, для которого у него еще нет авторизации, его запрос перенаправляется в центр авторизации. Центр авторизации аутентифицирует его по наличию куки .auth.mail.ru, генерирует одноразовый токен и перенаправляет на страницу проекта. Токен проксируется проектом в центр авторизации, который по нему генерирует уже проектную куку для .project.mail.ru.


    Не очень понял логику. Зачем «Токен проксируется проектом в центр авторизации, который по нему генерирует уже проектную куку для .project.mail.ru»? Токен проксируется обратно на auth.mail.ru для того чтобы убедиться, что это валидный токен, верно? Но почему куку генерирует центр авторизации, а не сам project.mail.ru? Ведь, насколько я понял, задача в том, чтобы выставить sdc-куку именно на уровне проекта. И если кука генерируется на уровне центра авторизации, то как она передается на сайт проекта? Грубо говоря: проект curl-ом соединяется с центром авторизации, а центр авторизации возвращает некторое значение, которое проект должен использовать для sdc-куки?

    И еще вопрос: как запрос проекта «проксируется» в центр авторизации? Это curl-запрос не выходящий за рамки локальной сети, в которой работают все проекты или нет?
  • Изучаем PHP изнутри. Zval
    –2
    Я согласен с тем, что программируя на PHP можно обойтись без знания о том что такое zval. Но если вы хотите разобраться почему именно в приведенном примере функции f1 и f2 ведут себя по разному, то понимать структуру zval и zvalue_value нужно.

    Отличие между этими двумя функциями на уровне zval-ов заключается в том, что первая меняет lval и type переданного объекта, что вызывает copy-on-write. Вторая не трогает lval и type, а работает только с zend_object_value.

    Как бы вы объяснили разницу в работе этих функций без упоминания zval-ов?
  • Изучаем PHP изнутри. Zval
    +1
    Кстати rrromka приведённый в начале пример не имеет никакого отношения к Zval.

    Почему? Я этим примером хотел показать, что функция f1 меняет тип переданного zval-а, по этому внутри неё срабатывает copy-on-write и объект снаружи функции остается без изменения. Функция f2 тип не меняет, по этому копироания-при-записи нет и меняется zval снаружи функции.
  • Изучаем PHP изнутри. Zval
    +1
  • Изучаем PHP изнутри. Zval
    +3
    Непонятная логика. Следуя ей статьи про Java, C++, Haskell и другие языки тоже не нужно в этот хаб вешать.
  • Изучаем PHP изнутри. Zval
    +4
    +1. Кстати, именно этот доклад побудил меня перевести эту книгу. Я слушал этот доклад и в зале слышал комментарии типа: «о чем это?», «ничего непонятно». То есть не все PHP-разработчики задумываются о том как работает PHP, а это знание может быть полезным.
  • Самолёт, HD FPV, линк 600 км по 4G
    +1
    Я говорю, в первую очередь, не о интернете, а о доступности железа, на основе которого можно собрать подобную систему.
  • Самолёт, HD FPV, линк 600 км по 4G
    +1
    Ребята, это очень круто! Еще несколько лет назад подобный результат казался фантастикой! Вы молодцы!
  • Вангеры были переизданы на Steam
    0
    Бибураты ждут тебя, герой Фострала!
  • Great Permutator — опыт участия в бандлах и не только
    0
    А чем обусловлен выбор DirectX? При портировании всё равно ведь пришлось от него отказываться. Не думали написать игру на чем-нибудь кросс-платформенном и запуститься в том числе и на мобильных устройствах? Игра, судя по геймплейным видео, отлично бы игралась на планшетах и больших телефонах.
  • Видеопроигрыватель для сайтов обучающих иностранным языкам
    0
    Какими алгоритмами вы выделяли предложения

    Предложения не выделяются автоматически, а берутся из файла титров (*.srt). Автоматическое распознавание речи задачка, конечно, интересная, но опыт того же Youtube показывает, что очень велика вероятность ошибок, а для обучающего проекта это неприемлемо.

    И еще, видна пикселизация в контролах Play, Next, Prev, Volume.

    Да, с графикой я пока не заморачивался: стандартные контролы проигрывателя были слишком маленькими и я просто увеличил картинки в графическом редакторе.
  • Обзор бесплатных сервисов для веб-разработки
    +90
    Альтернативы github существуют, (например bitbucket) но они не кошерны :)

    Почему некошерны? На битбакете можно бесплатно создавать приватные репозитории, а на гитхабе — нет.
  • Пример разработки блога на Zend Framework 2. Часть 2. Модуль MyBlog
    +1
    Вообще, цель статьи не в том, чтобы сравнить Zend с другими фреймворками, а в том, чтобы дать разработчикам, начинающим работать с фреймворком, ответы на вопросы: что такое ServiceManager, как работать с формами, БД и т.п. Соглашусь, читать лучше на свежую голову, но текста примерно с такой структурой мне не хватало когда я начал свое знакомство с этим фреймворком.
  • Пример разработки блога на Zend Framework 2. Часть 2. Модуль MyBlog
    0
    Привет, Антон :)

    Проверил, вот такая конструкция в Твиг шаблоне работает:
    {% for flashMessage in flashMessenger().getMessages() %}
      <div class="flash-notice"> {{ flashMessage }} </div>
    {% endfor %}
    


    Но вариант с view-плагином мне все же нравится больше:
    {{ showMessages() }}
    
  • Пример разработки блога на Zend Framework 2. Часть 2. Модуль MyBlog
    0
    Николай, я правильно из вашего комментария понял, что в Zend'е при помощи классов Zend\Config\Reader можно не только читать настройки своих кастомных модулей, но и прикрутить как замену application.config.php, *global.php, *local.php и конфигов модулей?
  • Пример разработки блога на Zend Framework 2. Часть 2. Модуль MyBlog
    0
    1) Зачем в каждом экшене делать?.. В зенд же есть хуки перед вызовом экшена?
    3) Разве это нельзя сделать в хуках доктрины prePersist?


    Не готов ответить на вопросы, попробую изучить его и переделать этот кусок.

    2) Почему в мире php не принято следовать REST? Ведь очень некрасиво выглядят эти постоянные проверки на то, что запрос POST?

    Наверняка это возможно, изучу этот вопрос и переделаю этот кусок кода.

    4) что это за магия?

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

    7) Что за магическая 1?

    Это статус. 0 — не опубликовано, 1 — опубликовано. У вас есть предложение как убрать эту магическую константу?
  • Пример разработки блога на Zend Framework 2. Часть 2. Модуль MyBlog
    +1
    Это вы о конкретно этом примере или о Zend-фреймворке в целом?
  • Пример разработки блога на Zend Framework 2. Часть 1. ZendSkeletonApplication
    0
    Кирилл, а вы можете привести практический пример использования DI в этом контексте? Честно говоря, дальше доки, в которой класс А зависит от класса Б я пока не продвинулся.
  • Пример разработки блога на Zend Framework 2. Часть 1. ZendSkeletonApplication
    +1
    Вот плюсы, которые выделяю для себя я:
    1. я точно уверен, что верстальщик не поломает PHP-код внутри шаблона,
    2. я точно уверен что ленивый программист не перенесет часть логики в шаблон (встречал я и запросы к БД в шаблонах),
    3. по мне, код Twig-шаблонов получается более компактным и читабельным.

    Да, против первых двух пунктов есть тестирование и код ревью, но мне удобнее недопустить появления этих проблем.
  • Quickpong — разработка сетевой игры на основе фреймворка Twisted
    0
    Хех, хороший вопрос :) Это наследие одного из предыдущих алгоритмов, когда мне нужно было сравнивать состояния игровых миров двух пользователей. Логично, что сравнивать надо было два дата-фрейма с одинаковыми номерами. В текущем рабочем алгоритме информация о номере дата-фрейма не нужна.
  • Quickpong — разработка сетевой игры на основе фреймворка Twisted
    +2
    что используется в качестве транспорта? голый TCP?

    Да, голый TCP.

    как осуществляется фрагментация сообщений?

    Каждый дата-фрейм это преобразованный в JSON-массив с данными, описание массива в соседнем комментарии.

    было бы разумно использовать какие-нибудь WebSockets + JSON для этого

    Согласен, но сейчас у меня нет возможности допилить еще и HTML5-клиент. Для того и выложил на гитхабе, чтобы желающие смогли усовешенствовать клиент :)
  • Quickpong — разработка сетевой игры на основе фреймворка Twisted
    +3
    Формат обмена данными

    Серевер клиенту при инициализации (первый пакет)

    При инициализации игры сервер передает клиенту массив с данными:
    0 'left or right'
    1 координаты шарика по оси Х;
    2 координаты шарика по оси У;
    3 дельта шарика по оси Х по отношению к предыдущему дата фрейму;
    4 дельта шарика по оси Y по отношению к предыдущему дата фрейму;
    5 счет левого игрока;
    6 счет правого игрока;
    7 координата У левой доски;
    8 координата У правой доски;
    9 дельта У левой доски;
    10 дельта У правой доски;
    11 номер «дата фрейма» (не номер отрендеренного флешом кадра, а номер передачи данных);
    12 клиент добавляет к этому массиву время, за которое кадр должен быть отрендерен (1 / число дата фреймов в секунду)

    Серевер клиенту во время игрового процесса

    При игре сервер передает клиенту аналогичные данные, для сохранения совместимости с данными инициализации первый элемент передается пустым:
    0 ''
    1 координаты шарика по оси Х;
    2 координаты шарика по оси У;
    3 дельта шарика по оси Х по отношению к предыдущему дата фрейму;
    4 дельта шарика по оси Y по отношению к предыдущему дата фрейму;
    5 счет левого игрока;
    6 счет правого игрока;
    7 координата У левой доски;
    8 координата У правой доски;
    9 дельта У левой доски;
    10 дельта У правой доски;
    11 номер «дата фрейма» (не номер отрендеренного флешом кадра, а номер передачи данных);
    12 клиент добавляет к этому массиву время, за которое кадр должен быть отрендерен (1 / число дата фреймов в секунду)

    Клиент серверу во время игры

    0 'left or right'
    1 изменение положения своей доски
    2 номер отправленного фрейма. Нужен чтобы сервер не обрабатывал дважды один и тот же фрейм.

    Перед отправкой данных и клиент, и сервер конвертируют их в JSON и в таком виде передают. Вот тут код отвечающий за передачу данных сервером:
    github.com/romka/quickpong/blob/master/quickpong/quickpong.py#L179
    github.com/romka/quickpong/blob/master/quickpong/protocol.py#L72
  • Quickpong — разработка сетевой игры на основе фреймворка Twisted
    0
    Статистика обновляется раз в минуту. Попробуйте Ctrl+R нажать, возможно в браузере картинка закешировалась.
  • Quickpong — разработка сетевой игры на основе фреймворка Twisted
    +1
    Да, клиент несовершенен. Если нажать тильду, то можно будет увидеть отладочную информацию и положение доски, там где она должна находиться по мнению клиента. Эта доска двигается плавно. При желании можно допилить клиента так, чтобы движения досок были более плавными.
  • Комментарий из публикации, перенесённой в черновики.
  • Комментарий из публикации, перенесённой в черновики.
  • 10 миллионов хитов в день с WordPress на сервере за $15
    0
    Собственно, мы ровно так и используем: на фронтенде Нжинкс, отдающий статику (js, css, картинки), на бэкенде Варниш + Апач (от него в нашем приложении отказаться сложно) + PHP-приложение. Архитектура не окончательная и, честно говоря, одно из двух: Варниш или Нжинкс, мне в ней кажется лишним, по-этому подумываю об эксперименте, в котором хочу попробовать отказаться от сначала от Нжинкса (то есть оставить только Варниш + Апач), потом от Варниша (Нжинкс + Апач) и сравнить что же работает быстрее.
  • 10 миллионов хитов в день с WordPress на сервере за $15
    0
    Хмм… то есть это означает, что класть данные в кеш и чистить кеш должно приложение. Выходит, в этом плане использовать Варниш проще.
  • 10 миллионов хитов в день с WordPress на сервере за $15
    0
    и всегда есть возможность работы с memcached.

    Значит ли это что Нжинкс сам может класть кеш в Мемкеш? Если нет, то значит кеш будет отдаваться с использованием бэкенда, а этого хотелось бы избежать.
  • 10 миллионов хитов в день с WordPress на сервере за $15
    +4
    Использую Варниш в относительно высоконагруженном проекте (до 2 млн. хитов в сутки, несколько десятков тысяч статей), очень доволен его работой (раньше использовали файловый кеш). Вопросы не ради холивара, а из любопытства (Nginx в таком режиме не использовал):
    • можно ли Nginx настроить так, чтобы он для одних юзеров отдавал данные из своего кеша, а для других нет? Различать юзеров нужно по наличию/отсутствию куки.
    • Может ли Nginx хранить кеш в RAM?
    • Можно ли с Nginx'ом организовать «прозрачное» кеширование. «Прозрачное» кеширование, в моем понимании, — это такое в кеширование в котором приложение и не подозревает (а значит не требует доработки) о наличии кеширующего сервера перед ним, то есть приложение при запросе отдает данные, а кеширующий прокси уже сам, руководствуясь конфигом, решает класть их в кеш или нет, кому этот кеш отдавать, а кому нет и когда этот кеш нужно удалить.
    • Может ли Nginx проверять доступен ли бэкенд, и если недоступен отдавать всем пользователям свой кеш без попыток передать запрос бэкенду?
    • Можно ли в Nginx по внешнему запросу очистить кеш страницы с определенным УРЛом?

    Варниш умеет все выше перечисленное.
  • Комментарий из публикации, перенесённой в черновики.
  • Appiny – не для «блондинок»!
    0
    А скидка одноразовая или постоянная? То есть если проплатить акк на Дропбоксе с 80% скидкой, то через год платить придется по полной или тоже с 80% скидкой?
  • Визуализация DOM-дерева в 3D (расширение Firefox)
    0
    Шикарно! Осталось добавить правку модели мышкой и генерацию соответствующего html + css.
  • Интересный прогресс-бар
    0
    Возможно глючит флэшовый аплоадер. На боевой версии можно сделать проверку на тип браузера и для Хрома в качестве аплоадера использовать не флэш, а хтмл5.