• Свой PUSH сервер для Android без node.js, есть ли решения?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    bash + curl, и проблем нету.

    https://packagist.org/packages/endroid/gcm - я это использую на некоторых проектах. На java есть официальный клиент.
    Ответ написан
  • Symfony - данные доступные всегда, как?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Лучше ложить такое добро в реддис и устанавливать время жизни для данных (если у вас сессии не в в пямяти валяются конечно). Скажем можно в ивент листенере это делать используя doctrine/cache или еще лучше - реализовать кеширование в сервисе провайдере данных, а он уже может либо сам ложить куда кеш либо доктрину просить... И никаких листенеров не нужно.

    А вообще, у вас это реально узкое место или вам просто захотелось пооптимизировать что-то?
    Ответ написан
  • Какой аналог Python функции chr() в Golang?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    type  result struct {
        p uint16
    }


    никаких pack-ов не нужно, так как мы уже имеем дело с бинарными структурами.
    Ответ написан
    Комментировать
  • Парсинг строки на c#. Как реализовать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    самый простой вариант - распарсить в мэпу и брать значение по ключу. А так - регулярками.
    Ответ написан
    Комментировать
  • AngularJS. Хорошо ли использовать $timeout?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для того что бы не нужно было делать проверку фазы ($apply, $digest) норм. В остальных случаях зависит от кейса.

    Если вы таким образом чего-то ждете - то следует думать в сторону промисов.

    Если нужно подождать reflow/paint или что-то в этом духе - скорее всего норм хотя может можно было бы и обычным setTimeout обойтись не вызывая $digest.

    Некоторые еще через $timeout промисы создают, что бы и $apply вручную не дергать и $q не инджектить.
    Ответ написан
    2 комментария
  • Как сделать скриншот на PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    exec (или очередь задач) + phantom.js
    Ответ написан
    Комментировать
  • Zf2 где правильнее определить helper?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    есть пара контроллеров из которых нужно отправлять практически одинаковые письма


    Этого не должно быть в контроллерах. Для этого придумали сервисы.

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вообще вики можно для начала, а потом уже углубляться в литературу. Вот вам кратенькое описание, цель которого больше предоставить ключевые слова для поиска.

    Модульные, они же юнит тесты, предназначены для тестирования отдельных модулей/классов. Суть их в том, что мы тестируем поведение только одного класса за раз. Если класс ссылается на инстансы других классов - мы их мокаем. То есть подсовываем им фэйковый класс, который имеет тот же интерфейс, но внутри не реализациа методов, а проверка, вызывали ли метод, с каким аргументами, сколько раз вызывали и т.д. Так же методы мока могут возвращать стабы (заглушки), какие-то захардкоженные под какой-то кейс данные. То есть если мы пишем класс по работе с базой данных, сокет-сервер и т.д., нам стоит соединение с базой, сокеты и т.д. оборачивать в классы, что бы можно было потом подменить на моки это добро. Если у вас в юнит тестах идет реальная работа с файловой системой или что-либо в этом духе, то это уже попахивает интеграционными тестами. Подробнее можно почитать в документации к phpunit. Так же есть такая методология разработки как TDD, советую почитать "Экстримальное программирование" Кента Бэка в этом ключе.

    Сразу хочу отметить что юнит тесты это хорошо, но вот только рядовой разработчик на PHP редко пишет что-то, что стоит покрывать юнит тестами. Времени на их поддержку нужно не мало, а требования у заказчиков частенько меняются. В итоге тесты начинают комментить и толку от них становится ноль. А вот если вы пишите компонент/библиотеку, то тут юнит тесты обязательны (ну... не то что бы, но желательны). Так что я бы на вашем месте сконцентрировал внимание на первом этапе на интеграционных и приемочных тестах.

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

    Функциональное тестирование - это тестирования всего приложения в сборе. Если это REST API, то у нас через curl дергаются реальные методы, отправляются более менее реальные запросы и валидируются ответы. Если web-страничка, то это UI тесты с силениумом/phantom.js/zombi.js или, если нам не нужно еще и js тестить, просто curl + какой виртуальный браузер на том же php. Вообще по хорошему функциональные тесты не допускают никаких моков и т.д. но опять же если очень хочется то можно (опять же обращение к сторонним сервисам, контроля за которыми у нас нету).

    Но реалии таковы, что UI тестами покрывать проект не слишком удобно. Вопервых UI может меняться, а поддерживать их так же нужно. Во вторых это скучно. В третьих тесты могут просто падать... вот взяли и упали. И потом начинается, так, тесты опять упали... что там упало? А, не страшно, можно релизить. Так же на больших проектах UI тесты отрабатывают долго, очень долго, некоторых их просто ночью гоняют. Толку от тестов при таком подходе не слишком много, ибо разработчику стоит знать о том что что-то сломалось как можно быстрее. А так он приходит, видит что тесты опять красные, чинит эти красные тесты, и запускает... ждет... проходит пол часа к примеру, и где-то в другом месте отвалилось... Короче сами понимаете.

    Приемочное тестирование - по сути те же функциональные тесты, но подаются в контексте фича-спеков. Если вы работали когда-нибудь с QA отделом, то возможно слышали про такие штуки как acceptance criteria. То есть это тот чек лист, который должен проверить тестировщик что бы удостовериться что все хорошо. На основе этого чек листа можно написать функциональные тесты. Так же есть инструменты вроде Cucumber/Behat, которые позволяют писать спецификации в виде стэпов. В этом случае спецификации для этих инструментов могут писать QA а вы просто имплементите для них степы. То есть уменьшается прослойка между "acceptance criteria" и готовыми к выполнению тестов. Более того, стэпы можно реюзать, комбинировать, масса стэпов есть готовых, вам же необходимо только предоставить стэпы подготвалливающие систему (загрузка/генерация фикстур и т.д.). Короче лепота и удобно. Но медленнее интеграционных, зато не такие жесткие как функциональные, за счет этого их проще поддерживать. QA пишут спеку, реализуем тесты под эту спеку, пишем код под тесты, тесты зеленые - функционал готов.

    Ну и есть еще всякие термины типа пирамида тестов и т.д. Мол лучше много юнит тестов, чуть поменьше интеграционных и мало функциональных. Тогда тесты выполняются быстрее, а покрывать все и вся функциональными тестами обычно перебор.

    Ну и опять же, есть такая вещь как здравый смысл. Некоторые вещи скажем можно вообще забить и не покрывать тестами, некоторые стоит покрыть. Некоторые не полностью, некоторые с как можно большим покрытием.... Скажем тестить UI (именно как выглядит, где какой элемент) вообще бессмысленно. На это нужно куча ресурсов. Хотя может и есть проекты где это оправдано.

    Короче почитайте про TDD и ATDD (можно и BDD затронуть, но тут не только от программиста зависит, менеджеры, заказчик или продукт-оунер тоже должны быть вовлечены, по сути этот подход хорошо работает в рамках продукта какого-то, на фрилансе и в аутсорсе редко можно встретить) , Continious Integration и Continious Delivery.
    Ответ написан
    Комментировать
  • Как получить свойство родителя?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    нет. Передавайте в аргументах.
    Ответ написан
    Комментировать
  • Информатика для программиста, что надо знать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Не информатика, а дискретная математика нужна. Причем большинству просто нужно знать о том что существуют другие системы счисления, как данные представлены в памяти компьютера, булева алгебра и т.д. То есть углубляться во всякие теории графов полезно но не обязательно по началу.
    Ответ написан
    3 комментария
  • Как исправить ошибку с array?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как улучшить код for? - вы начали аккаунты уже к вопросам создавать?
    Ответ написан
    2 комментария
  • Почему File_get_contents работает слишком медленно?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    curl и multy_curl.

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Правильно ли ответить и закрыть подключение

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

    Как только соединение создано, оно только занимает один дискриптор сокета. И все. У вас могут просто сокеты закончиться свободные, но это решаемая проблема. И все. Больше ресурсов оно не потребляет. А при помощи epoll можно выбирать соединения из общей пачки которые содержат данные на чтение или запись, или которые отвалились... правда я не уверен в контексте libevent, мне казалось что оно это само разруливает.

    Так же можно сделать один поток, который принимает соединения и раскидывает их по процессам воркерам. А те уже их обслуживают. Например в nginx каждый процесс-воркер обслуживает свои пачки соединений и разруливает все внутри процесса через тот же epoll. То есть не соединение = процесс, а много соединений = процесс.
    Ответ написан
    Комментировать
  • Как переписать код с PHP на Python?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) так как в python есть система модулей, автозагрузка не нужна. Просто импортируете нужные модули. Каждый файл - модуль. Если в директории есть файл __init__.py, то вся директория - пакет модулей, по сути тот же модуль который содержит другие модули...

    2) https://docs.python.org/3.4/tutorial/classes.html - классы в python

    3) stackoverflow.com/questions/8258819/comparing-phps... - разьяснение по поводу магического __get в php и аналогия для python. Точнее объяснение различий в объектной модели (к слову почитайте в документации).

    4) https://docs.python.org/3.3/library/re.html - регулярки

    ну и т.д. Так же все интанцируемые классы должны быть импортированы перед использованием.
    Ответ написан
    8 комментариев
  • Почему такая конструкция не допустима?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    ну типа да, нужно бы прогнать через strip_tags/htmlentities хотя бы при выводе. Фильтровать нужно не только пользовательский ввод, но и то вывод пользовательских данных. Пользователям, знаете ли, нельзя доверять.
    Ответ написан
    Комментировать
  • AngularJS. Как реализовать ожидание завершения promis-ов?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я может не правильно понимаю суть проблемы, но мне кажется что вы хотите что бы вьюшка отображалась только после подгрузки данных. В этом случае можно применить ресолвы контроллера (если у вас используется ngRoute/uiRouter).

    Так же не понятно почему используете $q.all когда там один промис всего. Ну мол $q.all ожидает массив и в аргументы будет передавать массив

    Auth.currentUser().then(function(currentUser) {
        self.currentUser = currentUser;
    });
    Ответ написан
  • Как развернуть сервер на nodejs под убунту и привязать домен?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    используй гугл, Люк

    www.hongkiat.com/blog/node-js-server-side-javascript
    Ответ написан
    Комментировать