<rmcreative>

RSS
  1. Прячем флаги в замыкания

    23 июня 2015

    window.addEventListener('click', function () {
        var i = 0;
        return function () {
            window.alert('You\'ve clicked it ' + (++i) + ' time(s).');
        };
    }());

    Благодаря замыканиям JavaScript позволяет не выносить флаги за функцию-обработчик и тем самым не засорять области видимости уровнями выше.

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

    Кстати, я выкладываю этот и другие интересные кусочки кода на gostash.ru

    4 комментария
  2. Вызвать private метод класса в PHP без Reflection

    10 июня 2015

    В комментариях к заметке о вызове private метода через Reflection Roman верно подметил, что можно использовать вместо Reflection анонимные функции. Вот только его вариант работает с PHP7.

    Оказывается, можно проделать такое чуть иначе и в PHP 5.4:

    class PrivacyViolator
    {
        private $caller;
     
        function __construct()
        {
            $this->caller = function ($method, $args) {
                return call_user_func_array([$this, $method], $args);
            };
        }
     
        function callPrivateMethod($object, $method, $args)
        {
            return $this->caller->bindTo($object, $object)->__invoke($method, $args);
        }
    }
     
    $myObject = new MyClass();
    $privacyViolator = new PrivacyViolator();
    $privacyViolator->callPrivateMethod($myObject, 'hello', ['world']);
    16 комментариев
  3. Видео с DevConf 2014: собачники против

    27 мая 2015

    В этом году я на DevConf, к сожалению, не попадаю, но организаторы порадовали видео с прошлого раза.

    Доклад рассказывали сразу три человека: Иван Матвеев, Григорий Кочанов и я. Тема холиварная, про оператор @.

    Посмотреть можно на сайте DevConf

    2 комментария
  4. Копируем в буфер обмена без Flash

    26 мая 2015

    Trello уже довольно продолжительное время позволяет нажать CTRL + C при наведённом на карточку курсоре мыши и получить в буфер обмена ссылку на эту карточку. Удобно, но вроде ничего необычного, я такое уже делал в Stay.com при помощи Flash.

    Trello не использует Flash и это заметили пользователи StackOverflow. Через какое-то время подтянулся автор кода и рассказал, как это работает.

    На самом деле с буфером обмена Trello не работает. При нажатии CTRL текст пишется в создаваемый <textarea> и туда ставится фокус. То есть когда мы нажимаем C текст копируется. Когда CTRL отпускается, <textarea> скрывается.

    Код приведён там же в вопросе на StackOverflow.

    14 комментариев
  5. Вызвать private метод класса в PHP

    25 мая 2015

    Бывает, не хочется портить API ради тестирования, но нужно как-то добраться до private метода. Сделать это можно вот так:

    function callPrivateMethod($object, $method, $args)
    {
        $classReflection = new \ReflectionClass(get_class($object));
        $methodReflection = $classReflection->getMethod($method);
        $methodReflection->setAccessible(true);
        $result = $methodReflection->invokeArgs($object, $args);
        $methodReflection->setAccessible(false);
        return $result;
    }
     
    $myObject = new MyClass();
    callPrivateMethod($myObject, 'hello', ['world']);

    UPD: вариант без Reflection

    13 комментариев
  6. Highload++ Junior 2015, отчёт

    24 мая 2015

    Вернулся из Москвы с конференции по нагрузкам, прошедшей в рамках РИТ++. Свой доклад, слайды которого можно полистать стрелочками на http://slides.rmcreative.ru/2015/horizontal-scaling-highload/, рассказал в первый день с самого утра. Получилось хорошо. Вопросы и обсуждения не прекращались все два дня.

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

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

    2 комментария
  7. Перестаньте использовать mcrypt

    13 мая 2015

    Сегодня в очередной раз всплыла статья об распространённых ошибках при реализации шифрования. Сама по себе она ничего так, но местами учит плохому. А именно, использовать mcrypt.

    Почему его не стоит использовать

    mcrypt не обновлялся более десяти лет и не планирует. Авторы его забросили. В нём есть серьёзные недоработки.

    И что делать?

    Мы в Yii от него ушли в сторону OpenSSL, чего и вам советую. Реализовал переход, в основном, Tom Worster. У него есть серия интересных постов на тему.

    8 комментариев
  8. Yii 2.0.4

    11 мая 2015

    Релизнули. Написал анонс на хабр. Он не очень подробный, так что буду рад раскрытию CHANGELOG с примерами там в комментариях.

    Комментировать
  9. Highload++ Junior

    7 мая 2015

    21 и 22 мая пройдёт конференция Highload++ Junior. Задумка её очень интересная — рассказать не очень подготовленным слушателям о том, как справиться с нагрузками. То есть от и до. Я буду рассказывать про горизонтальное масштабирование PHP приложений и всё, что с этим связано.

    10 комментариев
  10. Yii 2.0 HP Fortify WebInspect SQL Injection: Blind

    10 апреля 2015

    Знакомые попросили проверить отчёт сканирования приложения Yii 2.0 на безопасность. Среди прочего HP Fortify WebInspect нашёл "SQL Injection: Blind" по URL:

    http://example.com/post/view?id=10%27%09and%091%09%3d%09if(5%3d5%2c%09sleep(200)%2c%090)%09and%09%271%27%3d%271
    

    что расшифровывается как

    `10'    and 1   =   if(5=5, sleep(2000),    0)  and '1'='1`
    

    То есть классически закрыли кавычку и т.д.

    Сделал тестовое приложение, запустил, получил страницу с постом с id = 10. То есть сканер среагировал на то, что нет ошибки или 404. Возможно, что SQL injection прошёл успешно.

    Полез в код, там ничего особенного:

    public function actionView($id)
    {
        $model = News::findOne($id);
        if (!$model) {
            throw new HttpException(404);
        }
        return $this->render('index', ['model' => $model]);
    }

    Полез глубже и убедился, что параметр не вставляется в SQL. Используется prepared statement, всё как положено. Задумался.

    Выполнил в консольке MySQL вот такое:

    select * from post WHERE id = '10lalalallala';

    Получил запись с id = 10 и вспомнил, что MySQL приводит строки к int-у почти как PHP. То есть, что бы мы не вставили после 10, MySQL переварит и не поперхнётся.

    В итоге:

    • С Yii всё хорошо.
    • HP Fortify нашёл то, чего нет, и пометил как критическое.
    7 комментариев