• Трагедия общин в реальном мире или купонная лихорадка-2
    +2
    Мда, просто шок от статьи. В юности, когда кончались деньги на Интернете, подменял МАК на соседский, чтобы проверить почту или написать кому-нибудь в аське, тратил обычно килобайт 100 не больше, потом другого соседа. Если бы тогда мне попалась такая халява, то наверное бы настриг себе пачку купонов. Как хорошо, что теперь я вроде бы думаю головой и не делаю таких глупостей, и как хорошо, что мне не попадались такие ситуации, когда я был неразумен.

    Думаю, что большинство сделали это, не задумываясь о том, что же они делают на самом деле. А теперь, когда уже сделано, не позволяют себе задумываться и спирают вину на организатора.
  • JavaScript для чайников. Всё что вы хотели знать о функциях но боялись спросить
    +5
    Не коснулись такой интересной темы как объявление рекурсивных функций. Например, у нас есть тупо факториал, который используется в куче кода:
    var factorial = function (n) {
        return n === 1 ? 1 : factorial(n - 1) * n;
    };
    

    ну или
    function factorial(n) {
        return n === 1 ? 1 : factorial(n - 1) * n;
    };
    

    Потом по каким-то причинам нам нужно
    var realFactorial = factorial;
    factorial = function (n) {
        throw 'please use realFactorial instead';
    };
    

    В итоге получается, что и вызовы factorial(5) и realFactorial(5) вываливают ошибку. Это получается, т.к. рекурсивный вызов factorial использует переменную из родительской области видимости, а там она переопределяется. В этом случае надо определять функцию так:
    var factorial = function factorial (n) {
        return n === 1 ? 1 : factorial(n - 1) * n;
    };
    

    Ну или чтобы не путаться:
    var factorial = function f (n) {
        return n === 1 ? 1 : f(n - 1) * n;
    };
    
  • Магия JavaScript: arguments
    0
    Понял, в чем ваше заблуждение:
    Для каждого неотрицательного числа arg, меньшего значения свойства length создаётся свойство с именем (...)

    Здесь имеется ввиду свойство length созданное на предыдущем шаге. Т.е. не свойство функции, а свойство только что созданного оьъекта arguments. В ES3 описание просто немного более расплывчатое, но, по-моему, все равно вполне однозначное.
  • Магия JavaScript: arguments
    0
    Почитайте тут на странице 60. Ваш псевдокод должен быть:
    for (var i = arguments.length; i--; ) {
        link(arguments[i], formalParameters[i]);
    }
    
  • Магия JavaScript: arguments
    +1
    Здесь немного есть. На русском действительно немного информации.

    На английском статья на developer.mozilla.org
  • Магия JavaScript: arguments
    0
    Да, увидел в посте ссылку на баг в файерфоксе. Во-первых, он давно уже пофиксан, а во-вторых, он совершенно не имеет отношения к вашему коду.
  • Магия JavaScript: arguments
    +2
    К сожалению, из-за бага в трёх популярных браузерах(IE, Fx, Opera) я не смог добиться желаемого эффекта

    О каком баге идет речь? По-моему, наоборот упомянутые браузеры более строго соответствуют спецификациям ECMA.
    function test(a, b) {
        arguments[0] = 100;
        arguments[1] = 101;
        console.log(a,b);
    }
    test(1,2); // => 100, 101
    test(1); // => 100, undefined
    

    Потому как динамическая связь устанавливается только для реально переданных аругментов:
    (...) named data properties of an arguments object whose numeric name values are less than the number of formal parameters of the corresponding function object initially share their values with the corresponding argument bindings in the function’s execution context. This means that changing the property changes the corresponding value of the argument binding and vice-versa. (...)

    До этой фразы идет подробное описание как строить этот объект «arguments» — формальные аргументы не переданные фактически в «arguments» не попадают.
  • Фильтры: смерть регуляркам и правильная валидация
    +2
    Так именно по этой причине и надо соответствовать RFC, а не своим догадкам какой email может быть. Мне уже далеко не раз приходилось доделывать чужую валидацию (email'ов в том числе), потому что предыдущий программист считает, что RFC — это для зануд. Перед ем как работать со стандартами — ВСЕГДА почитай сначала RFC!
  • Помещаем строку меню Firefox 4 в заголовок окна: расширение Personal Titlebar
    0
    Ээээ, у меня такое работает на третьем: screencast.com/t/NTRlOWYwMzA

    Или я что-то не так понял?
  • Авторесайз IFRAME и безопасный способ передачи информации с одного домена на другой
    +1
  • Авторесайз IFRAME и безопасный способ передачи информации с одного домена на другой
    0
    У меня есть хорошее готовое решение для этой проблемы. Есть поддержка переходов по страницам внутри ифрэйма, поддержка динамического изменения высоты. С удовольствием опубликовал бы, но кармы не хватает. Сколько кармы нужно, чтобы опубликовать хотя бы в личный блог?
  • Плагин helpInput (мой велосипед)
    +1
    Ладно согласен — плохой пример в демонстрации хорошего плагина. :)
  • Плагин helpInput (мой велосипед)
    0
    Это смотря как применять.

    Если это страница регистрации, то форма является основным элементом — тут, согласен, экономия места на пояснениях абсолютно ни к чему. Главное, чтобы информация была усвоена на сто процентов.

    Если же страница посвящена чему-то другому, а форма — лишь второстепенный элемент предназначенный для уменьшения кликов, то такая экономия вполне оправдана. Формы авторизации, поиска, подписки и т.п.
  • Плагин helpInput (мой велосипед)
    +1
    Перемотайте эту страницу наверх — вы увидите форму поиска с серенькой надписью.
    Откройте главную страницу Яндекса — форма логина с серыми надписями.
    Откройте новую вкладку в файерфоксе или в сафари — в строке адреса серенькая надпись.

    Они везде, и это уже привычно.
  • Плагин helpInput (мой велосипед)
    0
    Спасибо за проделанную работу. Надеюсь, на этом не остановишься.
    Например, было бы здорово указывать класс контейнера подсказки. Чтобы он искал .next('.help') к примеру, и если такого соседа нету, то оставлять инпут в изначальном состоянии. А то сейчас невозможно добавить такие подсказки выборочно лишь для некоторых инпутов.

    А вообще, если бы я делал для себя, я бы еще запихал в конфиг название евента (или евентов), который бы следовало прослушивать у инпута, и по которому копировать классы. Т.е. если параллельно работает валидатор и он отлавливает ошибку в поле, то делает всю работу по визуализации ошибки, а потом файерит евент «afterInputError». Вот его то и отлавливает наш helpInput и копирует классы у изменившегося инпута… Но это если бы я делал для себя :))) А так классный плагин.

    Ну и, конечно, невнятные ключи конфига — это, как уже писали выше, очень плохо.
  • Интересный подход для кэширования моделей
    +1
    Так вот, порочная практика — это полагаться на здравый ум программиста… Как показывает опыт — это последнее на что можно полагаться, особенно если работаешь не один :))

    Модель-обсервер не будет работать (кто-то хочет оповещать других о получении данных), или модель которая работает с каким-нибудь сингелтоном (тот же Zend_Registry)… Не знаю даже, что еще можно притянуть. :))) Вообщем, при росте проекта можно получить небольшой гемор (а куда без него), а так вполне нормальное решение.
  • Интересный подход для кэширования моделей
    +2
    По мне так, довольно порочная практика. Потому как мы при работе с моделью должны держать в голове специфику ее работы: как она хранит данные, что случается за интерфейсом при вызове метода. Т.е. согласитесть, $model->cached_insert($row) будет работать уже совсем не так, как хотелось бы. Плюс кастомные методы модели, например, $employees->payTo($id)… А что будет если мы вызовем cached_payTo($id)? Т.е. логика работы с данными выносится за рамки класса. Мне кажется, что модель сама должна определять, что можно кэшировать, а что нет. Хотя для мелких проектов с парой-тройкой контроллеров может быть так и удобнее.
  • Zend_Form, русификация сообщений об ошибках
    +4
    Zend_Form::setDefaultTranslator($translator);
  • Эмулятор капчи школьного портала
    +17
    А у тебя XSS :)

    alfsoft.ru/wordgen.php?word=Author+does+not+know+anything+about+%3Ca+href%3Dhttp%3A%2F%2Fen.wikipedia.org%2Fwiki%2FCross-site_scripting%3EXSS%3C%2Fa%3E.+He+is+
  • 40 советов по оптимизации вашего PHP-кода
    0
    Спасибо, теперь понятно, почему мои тесты показывали другие результаты - если убрать буферизацию, то получим бОльшие тормоза за счет бОльшего числа i/o обращений:

    <?php

    $string = 'foobar';
    $s1 = 'echo '.str_repeat('$string,',30).'$string;';
    $s2 = 'echo '.str_repeat('$string.',30).'$string;';

    $start = microtime(true);
    eval($s1);
    $end1 = microtime(true) - $start;

    $start = microtime(true);
    eval($s2);
    $end2 = microtime(true) - $start;

    echo "\n".$end1;
    echo "\n".$end2;
    ?>


    Хотя в вашем примере через запятую все равно будет быстрее, но это специфика примера.
    P.S. Кто-кто, а парсер тут точно не лох :))
  • 40 советов по оптимизации вашего PHP-кода
    0
    Люблю оптимизировать все и вся, даже если эффект мизерный. Уже встречал совет 3 и даже пытался писать так - зачастую жутко неудобно. Решил провести тест и, хоть убейте, не вижу преимущества вывода через запятую - он медленнее в большинстве случаев на порядок.
    Покажите мне реальные результаты, на основании которых даются такие советы.