Задать вопрос
  • Как заставить PhpStorm 7.0 сохранять документы в UTF-8 без BOM?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) а в других файлах есть ?> в конце? Сомневаюсь что именно это является причиной, но все же... Да и просто это плохая практика.

    2) по умолчанию шторм должен создавать файлы без bom. вообще все это настраивается. помниться в 5-ой версии если вы открываете файл в utf8 с bom то была кнопочка позволяющая убрать это дело.

    вообще странно, обычно жалуются что шторм наоборот убирает bom.
    Ответ написан
    3 комментария
  • Простейший модуль + контроллер на Angularjs, или что не так с этим кодом?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    проблема в том что директика ng-app отрабатывает раньше, причем значительно, чем отрабатывает onLoad.

    http://jsfiddle.net/cqL5A/1/

    для web я обычно использую require.js и просто вызываю вручную boostrap, когда все модули загрузятся. А до этого можно показывать красивый прелоадер и т.д.
    Ответ написан
  • Какую CMS использовать для лёгкого сайта-визитки?

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

    Для визиток мне нравится piecrust. Контент оформляется как вариант в markdown и потом просто по шаблонам генерится статическая версия сайта. Все работает очень быстро, достаточно гибко.

    Есть так же bolt. Тоже штука довольно интересная, простая, уже не просто на файлах а на sqlite/mysql с админкой. контент так же вроде бы через markdown.

    Есть еще pico cms. Тоже забавная мини-cms на файлах.
    Ответ написан
    3 комментария
  • Какую выбрать версию Symfony2 для разработки?

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    при правке кода используйте другую точку входа (app_dev.php).
    чистка кэша производится из консоли:
    app/console cache:clear
    для продакшена нужно указать окружение добавив параметр --env=prod. ПО умолчанию все консольные команды запускаются в dev окружении.
    Итоговая команда будет
    app/console cache:clear -e=prod.

    Еще один маленький бонус - вы можете писать названия команд не до конца. Например
    app/console cach/cl - главное что бы написанного хватало что бы выбрать нужную команду.
    Ответ написан
    5 комментариев
  • Насколько конкурентоспособны приложения под Android, созданные с помощью HTML/CSS/JS?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    простые приложения на html5+css3+js писать более чем нормально. Главное понимать, что простое в плане бизнес логики приложение не всегдя является таковым в плане ui. скажем, если у вас там должны быть анимации перехода по скринам, или еще какая анимация, то что бы хоть как-то это нормально выглядело нужно нехило оптимизировать все это дело.

    Есть правда вариант использовать steroids.js, для таких вот вещей оно подходит хорошо, и по сути никаких проблем не будет в плане "ui тормозит".

    Другой вопрос что для одной платформы толку мало.

    Игры же - это другое. Тут применять html5+js уже неоправданно. Ни капельки не дешевле, да и лучше уж взять нормальный кросплатформенный движок и не париться.
    Ответ написан
    Комментировать
  • Задача для верстальщиков. Выравнивание по вертикали

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    padding-top считается по ширине (если задан в относительных еденицах) так же как padding-left по высоте. Это к слову единственный способ сделать резиновые примитивы (квадраты, круги, прямоугольники).
    Ответ написан
  • Почему появляется ошибка при использовании функции preg_replace_callback()?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) функция приватна
    2) почитайте про колбэки, они задаются для статических функций так: ['Compressor', 'minifyJS']
    3) вы не думаете что preg_replace_callback передаст для minifyJS не строку а массив?
    4) используйте лучше уж анонимные функции сто бы обойти 2 и 3 пункт.

    $result = preg_replace_callback($regexp, function ($matches) {
        // за вот это место не ручаюсь, тут уж сами
        return str_replace($matches[2]. Compressor::minifyJS($matches[2]), $matches[0]);
    }, $text)


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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вы стали свидетелем одной из оптимизаций современных браузеров.

    http://jsbin.com/OBaMoqe/1 - в комментариях пометил основную суть, но повторюсь

    когда вам нужно выполнить что-то жирное, вы непременно должны вынести это дело из общего контекста выполнения (через setTimeout или предпочтительнее webworkers), иначе остальной код и все события по перерисовке будут ожидать окончания работы этой жирной логики.

    js - асинхронный язык. Вся соль языка в том, что все тяжелые вычисления можно и нужно проводить паралельно.
    Ответ написан
    2 комментария
  • Comet(Long polling) - php + jquery?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    js создает соединение (в опциях для ajax запроса выставляется таймаут побольше)
    php принимает его и смотри что можно послать. И ждет... ждет пока не появятся данные которые можно послать.
    Как только данные появляются (скажем скрипт с какой-то задержкой читает данные из базы или из очереди) то он отправляет эти данные и обрывает соединение.
    js скрипт принимает данные, отдает данные на обработку и создает новое соединение.... и так до бесконечности.

    По сути просто вместо того что бы опрашивать сервер раз в секунду, создается соединение, живущее только до получения данных. После получения данных соединение закрывается. После закрытия соединения (не важно пришли данные или произошла ошибка/разрыв по таймаут) так же создается новое. На практике таймаут выставляют секунд в 20-30 что бы избежать возможных проблем.
    Ответ написан
    5 комментариев
  • Какой есть способ проверки полного вхождения одного массива в другой на JavaScript без использования двойного цикла?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Обычно делаю такие проверки через пересечения массивов (или же вам привели функцию diff). Без вложенных циклов никак не выйдет, ибо по сути и indexOf и array.filter это циклы. Разве что вы можете прервать выполнение цикла как только найдется элемент, не попадающий в другой массив.
    function isSame(a, b) {
        if (a.length > b.length) {
             b = [a, a = b][0]; //swap
        }
    
        for(var i = 0, length = a.length;i<length;i++) {
             if (-1 === b.indexOf(a[i])) {
                  return false;
             }
        }
        
        return true;
    }


    что-то типа такого. Но мне больше нравится вариант с diff.
    Ответ написан
    Комментировать
  • На чём зарабатывают владельцы jquery.com?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    https://jquery.org/donate/ - подозреваю что исключительно на этом + энтузиазм. Опять же энтузиазм не на пустом месте - библиотеку то используют. Скажем, если я в библиотеке, которую использую, хочу какую-то фичу/нашел баг, я сообщаю об этом в трекере. Если же я пофиксил или добавил фичу - мне не жалко выложить ее в виде pull-запроса.
    Ответ написан
    Комментировать
  • Пример Javascript запроса ("PUT") к API Яндекс.Диска?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Если вы хотите через ajax отправить файл, у вас не выйдет это сделать просто сеарилизовав форму (что и происходит по вашему коду).

    // обработчик вешается на файловый инпут
    document.getElementById('upload').addEventListener('change', function(e) {
                var file = this.files[0];
                var xhr = new XMLHttpRequest();
                xhr.file = file; // not necessary if you create scopes like this
                xhr.addEventListener('progress', function(e) {
                    var done = e.position || e.loaded, total = e.totalSize || e.total;
                    console.log('xhr progress: ' + (Math.floor(done/total*1000)/10) + '%');
                }, false);
                if ( xhr.upload ) {
                    xhr.upload.onprogress = function(e) {
                        var done = e.position || e.loaded, total = e.totalSize || e.total;
                        console.log('xhr.upload progress: ' + done + ' / ' + total + ' = ' + (Math.floor(done/total*1000)/10) + '%');
                    };
                }
                xhr.onreadystatechange = function(e) {
                    if ( 4 == this.readyState ) {
                        console.log(['xhr upload complete', e]);
                    }
                };
                xhr.open('put', url, true);
                xhr.setRequestHeader("Content-Type","multipart/form-data");
                xhr.send(file);
            }, false);
    Ответ написан
    2 комментария
  • Стоит ли выгружать старые элементы при бесконечном скролле?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)

    Разработчики linkedIn как-то публиковали описание подходов по оптимизации бесконечных скролов, которые они у себя применяли:
    http://engineering.linkedin.com/linkedin-ipad-5-techniques-smooth-infinite-scrolling-html5

    а фэйсбук не самый хороший пример оптимизации фронтэнда.

    p.s. по поводу ангуляра и делигированных событий, у меня в некоторых частях проекта используется всплытие ивентов вместо непосредственной привязки к элементу. Делается это у меня через 2 директивы (fsDelegate, и далее всякие обработчики ивентов аля fsTap и т.д). Причем fsDelegate вешает обработчики на элемент списка, fsTap регистрируется у fsDelegate (если конечно оно там будет, связь между ними через контроллер fsDelegate и параметр require: '^?fsDelegate'). Опять же при отлове события определяется какой именно элемент отработал, берется его скоуп и выполняется выражение заключенное в fsTap.

    Ответ написан
    1 комментарий
  • В чём преимущество асинхронных серверов перед PHP/nginx?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)

    Все сервера предназначенные для больших нагрузок являются асинхронными. То есть обработка новых входящих соединений происходит раньше, чем закончат работу текущие соединения.
    Преимущество готовых асинхронных серверов в том, что они готовы. Вы можете точно так же написать асинхронный сервер на php (socket + select), но это не настолько эффективно как в python и тем более в node.js, где этот функционал идет из коробки.

    Стандартный кейс применения node.js/Python twisted и любых других реализаций - обработка либо сырых tcp-соединений (например push уведомления) или же keep-alive для тех же целей. При обработке же коротких http запросов профит уже не так велик. Во всяком случае между php и python. node.js будет пошустрее, но и памяти он будет кушать чуточку больше.

    Ответ написан
    1 комментарий
  • Работа с websockets + $_SESSION + $_SERVER

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    $_SESSION и $_SERVER нужны для работы поверх http, а у вас голые (почти) tcp сокеты. Вот и думайте.
    Обычно при установке соединения проводится аунтефикацию и все. По сути алгоритм простой

    Сервер слушает входящие соединения
    Клиент соединяется с сервером
    Клиент отправляет данные (токен скажем)
    Сервер проверят токен и определяет какому пользователю соответствует данное соединение.

    Ну а дальше просто. Если нужно какому-то пользователю послать данные, находим все соответсвующие соединения и шлем данные.
    $_SESSION и $_SERVER для этих целей вообще ненужны.
    Ответ написан
    2 комментария
  • Как вы организуете devel окружение?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нууу как это сделано у большинства:
    у разработчика есть локальная копия репозитория (иначе зачем вам git), и он пишет все у себя локально. Локально интегрирует код других девелоперов со своим ну и т.д. То бишь разработка исключительно локально.

    Сервер только один, выкатывать туда можно либо на прямую из git (скажем в gitlab можно добавить доступ по ssh только на чтение) и пулить туда мастер. По сути на сервере всегда должна быть стабильная версия кода, мол с уже заимплеменченными фичами. ну или можно собирать билд в ci по пушу и автоматически разворачивать его.
    Ответ написан
    9 комментариев
  • Какие существуют способы оптимизации часто идуших MySQL запросов на выборку?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Давайте по порядку.
    У вас есть посещаемый ресурс, где пользователям должны в режиме реального времени приходить уведомления о чем-то. Ну мол например о непрочитанных сообщениях. Для этого я так понимаю вы ежеминутно опрашиваете сервер, и оттуда и появляются кучи одинаковых запросов. Поидее если mySQL настроен нормально, то все эти запросы он будет пытаться кешировать сам. У вас точно есть проблемы с производительностью БД в этом ключе?

    С другой стороны, самый оптимальный способ решить эту задачу: WebSockets/long pooling. Реализовать простенький сервер на каком node.js + scocket.io. Как шину данных поставить какой rabbitmq или чего подобное. В случае сообщений, при отправлении сообщения другому пользователю, в очередь отправляется сообщение. Оно принимается push-сервером и, если у нас есть соединение с нужным пользователем, отправляем ему уведомление. При таком подходе мы имеем: данные уходят с минимальными задержками. Уменьшается нагрузка на сервер за счет уменьшения количества запросов (push сервер просто держит соединение и работает только с небольшим количеством за раз). Ну и последнее — масштабируемость за счет rabbitmq: из основного приложения всего лишь отправляются в очередь небольшие сообщения. А то как оно паралелит сообщения и их обработка вынесены в rabbitmq. Меньшая связанность систем. Да и готовых реализации хватает.
    Ответ написан
    2 комментария
  • Виртуальные машины и SSD-диск: как безопаснее и как быстрее?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    зачем покупать ssd и не использовать его? Сама виртуалка вам ничего плохого не сделает с ssd, а операционную систему можно чуть поднастроить при желании. И да, прирост есть (у меня две виртуалки подняты, обе на debian, одна на ssd другая на hdd. Разница ощутима),
    Ответ написан
    1 комментарий