• Защита сессии от воровства?

    copist
    @copist
    Empower people to give
    Обычно в куках хранится идентификатор сессии с ключом вида PHPSESSID
    Но можно сделать так, чтобы само имя куки было менее предсказуемым, например md5(идентификатор-сервиса)
    Ответ написан
    3 комментария
  • Что означают эти логи и как эти действия предотвратить?

    copist
    @copist
    Empower people to give
    Это прощупывание твоего сайта на уязвимость.
    Можно попробовать удалить со страниц твоего сайта упоминание про версию CMS (
    <meta name="generator" content="WordPress 4.4.2" />
    ). Также посмотри как отключить служебные HTTP заголовки типа "X-Powered-By:PHP/5.3.28". Как скрыть специфические директории /wp-content/ и /upload/. Как скрыть специфические файлы wp-login.php и другие. В общем, не дай сторонним сайтам узнать, что у тебя за CMS.
    Есть специальные сервисы, через которые можно проверить - удалось ли скрыться (1, 2, 3)
    Количество запросов уменьшится

    По поводу
    Сервер не выдерживает нагрузки.

    Посмотри error.log - на каких страницах обычно падает по 500 или 501 ошибкам

    Установи nginx+php-fpm вместо apache+mod_php и включи php-fpm slow log, выясни что там у тебя вызывает ошибки 502 request timeout (на тостере)

    Через htaccess апача или конфиги nginx пропиши правила для ответа 404 Not Found на такой список URL

    В nginx установи кэширование ответов с кодом 404 на час или больше, чтобы до PHP даже не добиралось.
    Ответ написан
    4 комментария
  • Как это сделано, вращающиеся очки на сайте?

    copist
    @copist
    Empower people to give
    Через панель отладки в браузере тщательно просмотреть всё, что загрузилось при обновлении страницы без кэша
    В разделе"Media" нашёл видео
    6c53bf68269c4451896012b262078c1d.png
    Ссылку уже указал MaxKorz
    Ответ написан
    Комментировать
  • Как повесить обработчик события на изменение css-свойства?

    copist
    @copist
    Empower people to give
    Я бы порекомендовал пойти в обратную сторону.
    Чтобы поведение страницы реагировало на изменение какой-нибудь переменной в объекте.

    Речь идёт о концепции MVVM и библиотеках Angular, Aurelia.

    Или React, который обеспечивает рендеринг страницы и его можно привязать к модели в JS
    Ответ написан
    Комментировать
  • Как получить реальный опыт разработки без устройства в штат?

    copist
    @copist
    Empower people to give
    Соглашусь с Владислав Копылов
    Набить портфолио тестовыми заданиям - вариант хороший
    Во-первых - сделаешь сам. Может быть даже расскажут в чём косяки, если не понравится. Может быть даже дадут второй шанс на решение, если показать интерес и настоять.

    После тестового задания действительно могут дать задачи и это будут реальные задачи. Кроме того, можно подать своё резюме в несколько компаний и друг за другом пройти 3-4 собеседования с тестовыми заданиями. Пара месяцев работы и 4 задачи в портфолио есть.

    А вообще работодатель ожидает, что кандидат придёт с каким-нибудь набором практических навыков, а не с книжными знаниями. И, бывает, приходят и с отсутствием даже теории - "пусть меня научат". Работодателю нужно, чтобы ты выполнял работу, а не учился её выполнять. Есть компании, которые вкладываются в стажировку новичков и в обучение уже устроенных сотрудников, но при трудоустройстве смотрят именно на то, что уже умеешь делать и как интенсивно ты обучаешься самостоятельно.

    Пиши свой личный учебный проект, ищи союзников для написания мини-проекта в команде, участвуй в OpenSorce проектах
    Ответ написан
    Комментировать
  • Как делаются песочницы для кода в браузере?

    copist
    @copist
    Empower people to give
    Первый вариант предпочтительнее. Он покажет реальный результат выполнения.
    Данные из текстовой области отправляются на сервер через AJAX или web-socket, сервер выполняет в виртуальной машине в нативной среде в изолированной области памяти с огромным количеством ограничений по памяти, времени, с минимумом подключенных библиотек.

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

    ... возникает вопрос с количество одновременных подключений и лицензиями 1С, у ним с этим всё строго

    Значит надо делать исполнение через очередь с небольшим количеством параллельных процессов
    Ответ написан
    Комментировать
  • Что значит оборачивание функции в скобки (function() { ... })?

    copist
    @copist
    Empower people to give
    Короткий ответ
    (function() { ... })()
    Это определение анонимной функции без параметров и непосредственный вызов её, так же, без параметров

    Длинный ответ
    Зачем оборачивать значение в круглые скобки?

    Оборачивание функции в скобки, так же как и оборачивание константы в скобки - это просто способ показать интерпретатору, что это значение внутри скобок может быть использовано как возвращаемое значение.
    var var_a = 5
    (var_a) /* или */ (5) // не является ошибкой, возвращает значение переменной или выражения
    function func_b() { }
    (func_b) /* или */ (function func_b() { }) // не является ошибкой, возвращает ссылку на функцию
    var var_c = { key: "val" }
    (var_c) /* или */ ({ key: "val" }) // не является ошибкой, возвращает объект
    var var_d = [ "one", "two" ]
    (var_d) /* или */ ([ "one", "two" ]) // не является ошибкой, возвращает массив


    Ну а раз (func_b) - это ссылка на функцию func_b, то значит её можно сразу же вызвать.
    A если (var_c) - это объект, то значит можно сразу же использовать его
    Аналогично (var_d) - это массив, то значит можно сразу же использовать его

    (func_b)() или (function func_b() { })() вызвать функцию
    (var_c).key или ({ "key": "val" }).key использовать объект
    (var_d)[0] или ([ "one", "two" ])[0] использовать массив

    Синтаксической ошибкой было бы использование функции, массива, объекта без скобок ( )
    function func_b() { }() ошибка "Unexpected token )"

    Хотя нет ошибки, по крайней мере в Google Chrome
    { key: "val" }["key"]
    ["one", "two"][0]

    Для чего вообще придумали самовызывающиеся функции?
    Для того, чтобы изолировать переменные и функции, чтобы они не попадали в глобальную область видимости.

    Сравни
    var a = "test"
    alert(a)

    по завершении этого блока переменная a болтается в глобальной области видимости

    и
    (function(){
        var a = "test"
    })()
    
    alert(a) // недоступно, потому что она была локальной переменной внутри анонимной функции


    Почему скобки ( ) пустые?
    В данном случае у функции function() { ... }нет формальных параметров, значит и вызывать можно без параметров.

    Но вообще в самовызывающуюся функцию можно передавать параметры. Это общая практика передачи ссылок на глобальные объекты:

    (function (w, d, $) {
       // некоторым нравится сокращать код путём использования коротких имён переменных
       w['fizz'] = "buzz" // вот так можно принудительно зарегистрировать
                           // глобальную переменную fizz
       $('body').css({background: 'red'}) // вот так можно работать с jQuery через привычную $
                           // даже если библиотека была загружена в режиме noСonflict
    }(window, document, jQuery))


    Некоторым не нравится длинный вариант проверки на undefined и они специально предусматривают лишний параметр, который не инициализируют

    (function (message1, message2, empty) {
        // это и есть проверка на undefined
        if (message1 === empty)
            alert('message1 is undefined')
        else
            alert('message1 = ' + message1)
    
        if (message2 === empty)
            alert('message2 is undefined')
        else
            alert('message2 = ' + message2)
    })("test") // вызвана только с одним параметром, значит второй по имени message2
    //  будет пустой, а третий empty специально ввели в качестве образца
    //  данных с типом "undefined", для служебного использования

    Зачем функция анонимная?
    Аналогично - чтобы не регистрировать её имя в глобальной области видимости, если она нужна один раз.
    Ответ написан
    7 комментариев
  • Можно ли написать балансировщик на PHP?

    copist
    @copist
    Empower people to give
    Я правильно понимаю, что вы планируете использовать несколько серверов с приложениями на PHP для upload файлов?

    В этом случае балансировка для POST запросов аналогичная той же, как и для GET запросов, но каждый из серверов будет сохранять файлы в своей временной директории для загруженных файлов. Если пользователю вернуть URL на такой файл, то может случиться ошибка при отображении файла, когда при повторном прохождении через балансировщик будет выбран другой сервер.

    Три варианта решения:
    1. Возвращать пользователю ссылку на конкретный файловый сервер, чтобы раздавать обратно в обход балансировщика
    2. Использовать центральное сетевое файловое хранилище, чтобы раздавать файлы с него
    3. Использовать распределённое облачное хранилище, возможно с использованием CDN

    Немного шевелящихся картинок :) https://www.dropbox.com/s/eiwhngo66fzq6hi/shared_u...
    Ответ написан
    Комментировать
  • Как наработать портфолио php программисту и стартовать в профессии?

    copist
    @copist
    Empower people to give
    Про веб-портфолио, в том числе для новичков copist.ru/blog/2016/02/19/web-portfolio
    Про учебные проекты copist.ru/blog/2016/02/11/pet-project-ideas
    Ответ написан
    Комментировать
  • Как в jquery выполнять действия если на странцие после перезагрузки появился элемент?

    copist
    @copist
    Empower people to give
    Тут ошибка в коде. Неисправимая, потому что нарушена логика.

    $(window).load( ... - это назначение обработчика на событие, которое срабатывает при загрузке страницы

    $("body").load("load", "#notify" , ... - такого нет

    Тебе надо вставить такой вариант:
    $(function(){ // вызовётся когда страница загрузится (почти то же самое как и $(window).load(...)
        if ($('#notify').length) { // если найден элемент #notify
            console.log('asd'); // что-то сделать
        }
    });
    Ответ написан
    1 комментарий
  • Редирект без передачи REFERER?

    copist
    @copist
    Empower people to give
    1. проксирование с помощью proxy_pass в nginx с подавлением заголовка HTTP_REFERRER
    2. запрос целевой страницы через с помощью curl/file_get_contents в PHP без указания HTTP_REFERRER
    Ответ написан
    Комментировать
  • Почему первый запрос выполняется долго?

    copist
    @copist
    Empower people to give
    Active Record пытается прочесть данные о таблицах, наверное.
    Пройдись по пунктам статьи по оптимизации для Yii2 www.yiiframework.com/doc-2.0/guide-tutorial-perfor... в частности кэширование схем данных и запросов.

    Для Yii1 не могу найти такой же. Был раньше, но в гуглопоиске покрылся пылью.

    Кэширование схемы данных для ActiveRecord
    return array(
        …
        'components'=>array(
            …
            'cache'=>array( // ... компонента для работы с кэшем
                'class'=>'CDbCache',
            ),
            'db'=>array( // ... компонента для работы с БД
                // ... настройки компоненты
                'schemaCachingDuration'=>3600, // <-- кэшировать схему данных для ActiveRecord на 1 час
            ),
        ),
    );


    Ещё есть вариант, используя кэширование, подавить создание коннектов к БД, если они вообще не нужны: copist.ru/blog/2014/09/29/high-speed-yii-database
    Ответ написан
    Комментировать
  • Какие туториалы можно почитать о создании социального сервиса?

    copist
    @copist
    Empower people to give
    Можно взять и изучить социальные сервисы OpenSource на базе фреймворков, например https://www.humhub.org/en на базе Yii2 или https://elgg.org/ который сам по себе, на компонентной основе.

    Для себя надо найти ответ на вопрос: Чем простой сервис типа блога отличается от социального сервиса?

    Будем считать блогом сервис, где один автор публикует записи, а другие регистрируются, чтобы оставить комментарии к записям.
    Ключевым отличием соц сервиса является многопользовательский режим, всякие "дружилки" и группы по интересам.
    Обычно групп много, но иногда программисты решают сделать свой соц сервис по одной группе интересов, чем значительно сужают целевую аудиторию.

    Вот несколько отличий в формате утверждений "User Story":
    1. Как пользователь соц сервиса (далее ПСС для краткости, тут ограничение на длину ответа) я хочу публиковать свои записи и фотографии (далее КОНТЕНТ)
    2. Как ПСС я хочу изменять или удалять свой КОНТЕНТ
    3. Как ПСС я хочу, чтобы другие не могли менять свой КОНТЕНТ
    4. Как ПСС я хочу читать КОНТЕНТ других отдельных ПСС
    5. Как ПСС я хочу добавить в избранное (like, fork, pin, retwit, repost) КОНТЕНТ других отдельных ПСС с возможностью добавления своего описания или изменения оригинального, но с сохранением ссылки на оригинальную запись/фото
    6. Как ПСС я хочу добавить другого ПСС в избранное (friend, follow, watch)
    7. Как ПСС я хочу видеть список всех других ПСС, которых *я* куда то там навыбирал в п.6
    8. Как ПСС я хочу видеть список всех других ПСС, которые *меня* куда-то там навыбирали в п.6
    9. Как ПСС я хочу отправить сообщение другому ПСС
    10. Как ПСС я хочу видеть сообщения других ПСС, желательно instant, то есть в реальном времени
    11. Как ПСС я хочу комментировать свой и чужой КОНТЕНТ
    12. Как ПСС я хочу видеть напоминания о полученных сообщениях от других ПСС, которые я не получил в реальном времени (например, дайджест комментариев по электронной почте), а также о том, что кто-то меня зафрендил или лайкнул мой КОНТЕНТ, или прокомментировал мой КОНТЕНТ, или упомянул меня в комментариях где-либо
    13. Как ПСС я хочу запретить комментирование своего КОНТЕНТа другими ПСС
    14. Как ПСС я хочу создать сообщество по интересам (социальная группа, далее СГ) и стать её владельцем
    14. Как владелец СГ, я хочу пригласить других друзей (см п.6) и других пользователей (см. п.9) в СГ
    15. Как владелей СГ я хочу дать или забрать права модератора в СГ любому ПСС
    16. Как владелей СГ я хочу передать владение СГ любому другому ПСС
    17. Как ПСС я хочу видеть списки СГ и вступить (join, follow) в них, искать группы по заданным правилам, например, по ключевым интересам или хотя бы по названию
    18. Как владелей СГ я хочу сам исключить СГ из общих списков групп (скрытые группы)
    19. Как владелей СГ я хочу иметь возможность одобрять включение ПСС в СГ (приватные группы с ограничением на вступление)
    20. Как участник СГ я хочу публиковать свои записи и фотографии (далее КОНТЕНТ) в СГ
    21. Как модератор СГ я хочу менять/удалять записи участников СГ, опубликованные в СГ
    22. Как ПСС я хочу пожаловаться на другого ПСС или отдельный КОНТЕНТ
    23. Как глобальный модератор сервиса я хочу видеть жалобы от ПСС
    24. Как глобальный модератор сервиса я хочу забанить/разбанить любого ПСС
    25. Как глобальный модератор сервиса я хочу видеть КОНТЕНТ любого ПСС без ограничений
    26. Как глобальный модератор сервиса я хочу видеть все СГ без ограничений
    27. Как глобальный модератор сервиса я хочу отправить сообщение любому ПСС без ограничений

    Дейтинг, как во вКонтакте, и карму, как в Хабре, я не стал упоминать.

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

    За кадром остаётся финансовый вопрос: как обеспечить стабильный доход для поддержания работы соц сервиса.

    Надеюсь, ответ поможет составить картину мира социальных сетей :)
    Ответ написан
    3 комментария
  • Как переслать полученные СМС автоматически на указанные номера в сообщения?

    copist
    @copist
    Empower people to give
    Через SMS гейты (в гугле "HTTP SMS gate")

    Например, smsglobal.com/http-api/#Sending_a_SMS
    curl "http://www.smsglobal.com/http-api.php?action=sendsms&user=<логин>&password=<пароль>&from=<номер_от_кого>&to=<номер_кому>&text=<текст SMS сообщения>"

    curl "http://www.smsglobal.com/http-api.php?action=sendsms&user=testuser&password=secret&&from=Test&to=61447100250&text=Hello%20world"


    Update: Я дал ответ, но он неправильный. Я думал речь про отправку SMS в ответ на сообщение с сайта. Типа обратный звонок. Если нужно автоматически обработать SMS, то нужно использовать программу, которая будет работать непосредственно с телефоном, подключенным через порт USB.

    Читать из телефона приходящие SMS, анализировать текст и выполнять отправку через тот же телефон или через сторонние сервисы.

    Старая статья про утилиту gnokii для работы с телефоном:
    www.nixp.ru/articles/80.html
    https://www.opennet.ru/tips/2510_gnokii_sms_gatewa...

    Дальше я бессилен. Этот уровень сна мне неподвластен.
    Ответ написан
    2 комментария
  • Как вычислить координаты многоугольного объекта и как с ними работать?

    copist
    @copist
    Empower people to give
    В твоём случае, как мне кажется, камень изображён в изометрии, то есть мы видим его фронтальную, боковую и верхнюю грань. Исходя из этого столкновение произойдёт не тогда, когда границы точно пересекутся, а при небольшом наложении.

    Как то вот так:
    de058d5c19fa45bcba3be363600056aa.png4c91b5b1e4844574b4ee940c10709f4f.png

    Границы можно вычислять условно, упрощённо. Например, через параллелепипеды, а ещё проще через прямоугольники. Я бы сохранил координаты двух прямоугольников - который описывает фигуру снаружи и внутри и исходя из них делал вычисление пересечений.

    Вот пример видео для иллюстрации пересечений объектов https://www.dropbox.com/s/so1j4p12f3awodd/rock_hit...
    Ответ написан
    3 комментария
  • Как узнать какой именно php скрипт приводит к ошибке или работает медленно?

    copist
    @copist
    Empower people to give
    Если есть возможность, замените Apache на PHP FPM SAPI, прилагающийся к PHP. При этом можно включить PHP slow log. В специальном логе будут появляться стек-трейсы процессов, которые работали больше заданного количества секунд именно в этот самый момент, то есть например, в 30ую секунду от запуска процесса.

    В случае проблем рекомендуется делать slow log на все запросы, которые работают больше 1-2 секунд. Возможно дьявол кроется не в длинных процессах, а в огромном количестве мелких.

    Также к PHP FPM прилагается встроенная система мониторинга. Можно посмотреть, сколько сейчас порождено процессов. Иногда их чрезвычайно много.

    Если заменить Apache на PHP FPM невозможно, то путь исследования более длинный: нужно в настройках Apache настроить CustomLog с замером времени на выполнение. см. ответ на serverfault. Затем исследовать логи (там будут только URL запросов, без стрек-трейсов) и самостоятельно определять, что именно могло вызвать тормоза.

    Можно подключить профилировщики XDebug + Webgrind или XHprof. Замеры можно делать на выборочных запросах, например только для пользователя с определённого IP или при наличии определённой куки. Отчёты будут очень детальные и будут включать замеры по всем внутренним вызовам от начала до завершения процесса, а не только в 30ую секунду, как делает php slow log.
    Ответ написан
    Комментировать
  • Как правильно передать заголовки в curl?

    copist
    @copist
    Empower people to give
    $headers = array("Authorization: Bearer <ACCESS_TOKEN>",
                     "Content-Type: application/json");
    
    $ch = curl_init('https://api.dropboxapi.com/2/users/get_space_usage');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "null");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    
    curl_close($ch);
    echo $response;


    Скопировал из stackoverflow и проверил. Вернуло:
    {"used": 5195012629, "allocation": {".tag": "individual", "allocated": 5771362304}}


    Если указать неверный токен, то будет такая ошибка:
    Error in call to API function "users/get_space_usage": The given OAuth 2 access token is malformed.
    Ответ написан
  • Что не так с onblur?

    copist
    @copist
    Empower people to give
    onchange или onkeyup наверное будет надёжнее
    Ответ написан
  • Чем связать php и java?

    copist
    @copist
    Empower people to give
    Ответ написан
    Комментировать