• Странные боты с включенным javascript

    dm9
    @dm9
    Да, у себя тоже похожее замечал.
    Часть роботов смог вырубить, используя вот этот сервис: www.stopforumspam.com
    Пример обращения к API: www.stopforumspam.com/api?f=json&unix&confidence&ip=8.8.8.8
    Правда, там ограничение до 20000 запросов в сутки. Если использовать массовые запросы, можно проверить до 100000 IP в сутки. Мне хватает :)
    Из недостатков — они работают именно с отдельными IP. Когда просматриваю логи «руками», достаточно очевидно, что некоторые запросы идут из той же подсети, и формируются теми же роботами. Но сервис этого не учитывает. Допилить это, анализируя подсети, руки не дошли пока…
    Ответ написан
    2 комментария
  • Редактор для вёрстки html+css?

    Urvin
    @Urvin
    Netbeans
    PhpStorm
    Ответ написан
    Комментировать
  • Качественные наушники

    KEKSOV
    @KEKSOV
    В свое время, я влюбился в продукцию фирмы Sennheiser и с тех пор ей не изменяю ;) Вот список закрытых мониторных наушников на я.маркете
    Ответ написан
    Комментировать
  • VK API: Captcha needed?

    Имел дело, выхода нет. Капчу просит только тогда, когда пользователь и сервер с которого пробуете использовать токен из разных стран/регионов. Проверено более чем на 50к аккаунтах.
    Пример:
    Пользователь давший права из украины + сервер получающий данные по токену тоже в украине = капчу не просит.
    … из украины + сервер получающий данные по токену тоже в украине = капчу не просит.
    … не из украины + сервер в украине = капчу просит даже при первом запросе.
    … из россии + сервер в украине = капчу просит даже при первом запросе.
    … из россии + сервер в россии = капчу не просит.
    … из россии (Сибирь) + сервер в россии (МСК) = капчу просит.

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

    Если Вам нужно делать запросы когда пользователь оффлайн, можно перекинуть эту работу на пользователей которые онлайн :). Смотря какое у Вас приложение.
    Ответ написан
    2 комментария
  • Достойная замена Реформалу?

    rmaksim
    @rmaksim
    Проблема с уведомлениями решена и мы приносим свои извинения за сложившиеся временные неудобства.
    В настоящее время мы работаем над полным обновлением Реформала, в связи с чем очень надеемся на ваше понимание и поддержку.
    Ответ написан
    2 комментария
  • Использовать ли ActiveRecord в высоконагруженных проектах?

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

    Если возникают проблемы с производительностью:

    1) Во всех проектах используем:CProfileLogRoute с настройкой CDbConnection.enableProfiling=true
    Расскажет много полезного.

    2) Если видим lazy Loading — не забываем добавлять в with("") нужных релейшинов, используем together() принудительно где нужно.

    3) Если используем findAll() на большом количестве записей — используйте CDbCriteria.select и перечисляйте только необходимые колонки, это поможет значительно повысить производительность.

    Рекомендую детально изучить изнутри — как работает CActiveRecord, CActiveFinder
    Используйте расширения типа XDebug для детального профайлинга проекта.
    Основные потери производительности происходят внутри метода
    CActiveRecord.populateRecord — посмотрите — что происходит внутри.

    4) Все редкообновляемые данные очень легко кэшировать связкой:
    CTimestampBehavior + CDbCacheDependency('SELECT MAX(update_time) .... where...');
    Если таблица редко обновляется, то и этот запрос будет отрабатывать мгновенно. Mysql тоже сам кэширует результаты таких запросов.

    В результате — мест, где приходится отказываться от ActiveRecord остается очень мало.
    Скорость отдачи страниц держим на уровне не более 0.1 с.

    Если у Вас будут действительно высокие нагрузки, Вас врятли спасет один только отказ от ActiveRecord:
    Посмотрите:
    Yii: устройство ActiveRecord и Шардинг
    Шардинг MySQL на Yii Framework

    Также задумываем для одного проекта попробывать www.yiiframework.com/extension/yiimongodbsuite/ с auto-sharding
    Ответ написан
    Комментировать
  • Какой HTML/CSS-редактор под Windows актуален?

    delmot
    @delmot
    Советую WebStorm. В 5-й версии ожидается необходимая вам функциональность: www.youtube.com/watch?v=TnnVl3ydIB0
    Ответ написан
    Комментировать
  • Нужна помошь с yii?

    @hijaq
    В первом случае в $dataPosts получается массив моделей постов, следовательно $dataPosts->comments и не должен возвращать что-то, потому что надо сначала получить конкретную модель поста и уже из неё дергать комментарии. Что, собственно, и делается в третьем варианте. Почитайте внимательнее в чем различие возвращаемого результата у findAll() и findByPk()
    Ответ написан
    1 комментарий
  • Свободный график в IT компании. Насколько он продуктивен?

    @Piskov
    Лучший совет: перестаньте вообще считать часы. Смотрите, сколько работы выполнено по итогу в месяц. Если среднюю норму выполнил, все ок. Если куча хвостов, поговорить и в случае отсутствия вменяемых причин — уволнять. А где и когда человек работает — неважно; оттого что он просидит 8 часов в офисе с 9 до 6 работа не сделается — может у него пьянка была ночью и ему именно сегодня лучше придти к 2, поработав до поздней ночи.
    Ответ написан
    Комментировать
  • Передать 0 в POST-запросе

    @IngvarrT
    Применение этого метода неоправданно в вашем случае, но, для общего развития:

    file_get_contents( 'php://input' )

    — вернёт весь POST как он есть. Если POST содержит данные формы, то далее можно воспользоваться parse_str().

    Но, отвечая на ваш вопрос, я присоединяюсь к мнению, что проблема создана не PHP, а вами. :)
    Ответ написан
    Комментировать
  • Правильное написание: html-coder либо html coder?

    Vas3K
    @Vas3K
    Frontend developer. И пафосно и без вопросов.
    Ответ написан
    3 комментария
  • Mysql. Как объеденить две формы нормализации?

    @edogs
    select * from company left join brands on company.id=brands.firm_id left join towns on company.id=towns.firm_id
    where brands.brend_id in (нужный бренд или несколько) and towns.town_id in (нужный город или несколько)
    group by company.id
    Ответ написан
    Комментировать
  • Каковы возможные оптимизации нагрузки простейшего скрипта?

    ertaquo
    @ertaquo
    Тут скорее проблема в HTTP-сервере. Попробуйте реализовать то же самое на node.js или перевести под nginx+php-fpm, если используете Apache.
    Ответ написан
    3 комментария
  • Надоел текущий проект. Что делать?

    simbiod
    @simbiod
    image
    Ответ написан
    Комментировать
  • Нужны ли статьи о Yii?

    Только если они будут не для новичков.
    Все предложенные статьи сводиться к парочке строк кода, это не интересно тем более они описаны в документации и неплохо разжеваны.
    Вот если бы что то из серии:
    • Модели для динамических форм и их валидация.
    • Права доступа на основе списков к объектам (ACL).
    • Обертка над jqGrid которая будет принимать CDataProvider, а интерфейс как у CGridView.
    • Единая авторизация для Yii с поддержкой нескольких сервисов.
    Ответ написан
    3 комментария
  • Белый экран при переходах между страницами — от чего зависит?

    sajgak
    @sajgak
    От скорости передачи данных (как сервера с сайтом, так и клиента с браузером), загруженности машин клиента и сайта.
    Ответ написан
    3 комментария
  • JS. Централизованная обработка ошибок

    alienator
    @alienator
    Никто за вас не решит, что лучше.

    Конечно, можно и нужно иметь try/catch на самом верхнем уровне. И дать ему какое-то полезное поведение — записать в лог, вывести красивое окошко и т.п., чтобы не пугать пользователя системными сообщениями.

    Это необходимый минимум.

    А дальше смотрите глубже. Что вам даст функция-обработчик внутри объекта исключения? Во многих случаях она уже бесполезна; она слишком далеко от точки возникновения ошибки, чтобы попробовать ее исправить (например, вызвать код повторно со значением по умолчанию, подождать освобождения ресурса и т.п., короче, какой-нибудь while/try).

    Перед каждым вызовом функции, которая может выбросить исключение, перед каждым входом в компонент у вас есть три пути:

    • обработать какие-то (или все) исключения здесь
    • обработать и передать выше (повторный throw)
    • ничего не делать (передать сразу наверх)


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

    И вот там, поглубже, внутри компонента, уже действует ряд разумных рекомендаций:

    1. Не ловить всё подряд. Обрабатывать только те исключения, с которыми известно, что делать. Если не совсем известно, делать re-throw.

    2. re-throw делать аккуратно. Не надо, опять же, хватать больше от жадности, а потом пропускать исключения ненужных классов. Для ява-скрипта это выражается вот в чем:

    Нехорошо:
    try {
         // ...
    } catch (e) {
         if (! e instanceof MyError) {
              throw e;
         }
        // ...
    }
    


    Хорошо:
    try {
         // ...
    } catch (e if e instanceof MyError) {
        // ...
    }
    


    3. То, что вы делаете в finally, важнее, чем то, что делаете в catch. Есть что подчистить — надо подчистить.

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

    Ну, что хотел сказать, то сказал. Удачи.
    Ответ написан
    3 комментария
  • В чём принципальная разница при определении методов у прототипа объекта в JS для двух вариантов?

    taliban
    @taliban
    php программист
    Показываю наглядно:
    
    function q(){}
    q.prototype.w = 2;
    console.log(new q().w); // 2
    q.prototype = {
        e : 3
    }
    console.log(new q().w); // undefined
    console.log(new q().e); // 3
    
    Ответ написан
    1 комментарий