Mar 12

Возникла потребность в примитивном фильтровщике ввода в текстовое поле, без учета вставки из буффера..
<input type=”text” onkeypress=”valueFilter(event, [0,1,2,3,4,5,6,7,8,9])” />

пример в действии (допустимы только числовые сиволы):

Сорцы внутри. Continue reading »

Mar 11

ie achtung!Пытался дибажить пару дней странное “Не удалось открыть узел, операция прервана” от IE во время запуска примитивного js скрипта.. Оказывается IE не переваривает добавление элементов на лету, пока DOM до конца не сформирован и тупо клозит, указывая на стену.. Причем любит клозить на SCRIPT и IFRAME тегах больше, чем в остальных случаях :) В итоге меня устроил вариант с document.write(..).

Из альтернатив window.onload( function() {..} ), но обламывает ждать полную загрузку страницы с картинками, либо
setTimeout(function () { document.body.appendChild(el); }, 0);, тут уже вставка произойдет без дожидания загрузки всех дополнительных элементов страницы.. Также есть готовые решения проверки загруженности DOM’a в популярных фреймворках типа Prototype и jQuery..

Mar 02

Накидал простенькую ф-ию для сортировки хешей (associative arrays)  по значению. Все примитивно и тюнится под свои нужды :)

<script>
    function asort(arr) {
        var numArr = new Array; // values
        var map = new Array;    // index => values array
        var out = new Array;

        for(k in arr) {
            numArr[numArr.length] = arr[k];
            if(map[arr[k]] == undefined) map[arr[k]] = new Array;
            map[arr[k]].push(k);
        }
        numArr.sort( function(a, b) { return (b-a); } ); //desc

        for(var i=0; i<numArr.length; i++) {
            for(var j=0; j<map[numArr[i]].length; j++) {
                out[map[numArr[i]][j]] = numArr[i];
            }
        }
        return out;
    }
</script>
Mar 02

Натолкнулся на данные ворнинги, после продолжительных тестов и эксперментов пришел к выводу, что на это влияет следующий за Апдейтом MySQL запрос с DELETE IN(…) .

Апдейты и делеты в цикле. Есть делет запрос - есть ворнинги :)
max_children=0 так же решает проблему при одновременно использовании MySQL..

Актуально для sphinx-0.9.8-svn-r1112 и r1173

Feb 16

Столкнулся с проблемой, при попытке заапдейтить большой массив айдишек. Searchd ругается на 8кб с копейками запрос и клозит соединение.. Решение - разбить массив айди на несколько частей :)

Например вот так:

/*................................*/
            if(count($id) > 500) {
                $id = array_chunk($id, 500, true);
                foreach($id as $v)
                    $cl->UpdateAttributes('shop', array($this->table), $v);
            } else
                $cl->UpdateAttributes('shop', array($this->table), $id);
/*................................*/
Feb 12
<?php
$key = explode(' ', 'testword');
foreach($key as &$v) $v = trim($v);

foreach(array('store', 'brand') as $v){
    /*.......*/
}
print_r($key);
?>

Как может показаться в массиве $key должно быть ‘testword’ :) но это не так. Проблему решает только unset($v) после первого foreach’a.

Feb 10

Почему-то при изучении и работе с пхп в мане нираз не видел упоминаний про работу с большими файлами (2гб+), хотя оно там есть :) и по ошибке, выдаваемой интерпретатором (File size limit exceeded), этот ман не гуглится ;)

Для работы с большими файлами требуется пересобрать PHP с флагами CFLAGS=”-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64″

CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" \
./configure .....

Ахтунг, если поддержка нужна для веба, необходимо также пересобрать апач и мод_ссл с теми же флагами. Для консоли сойдет пересобрать пхп в другое место :)

Интересный факт, что после сборки PHP с такими флагами, время работы с файлами увеличилось ровно в 2 раза, по сравнению со сборкой без флагов. Добавляем -O2 или -O3 к флагам и радуемся результату :) при -O3 работает чуть-чуть быстрей дефолтной сборки (gcc 4.1.1).

Feb 10

Перенапрягся в тренажерном зале так, что не мог уснуть 3 ночи. Чугунная бошка+антибиотики сделали свое дело, неделя пролетела без работы.. :(

Вот к чему приводит сранная безвылазная сидячка за компом.

Feb 04

Прочитал тут недавно у одного адепта, что не имеет смысла оптмизировать строки и писать в ординарных кавычках, что лучше строить боинги :) которые видимо развалятся не взелетев с таким подходом :D ПОХАПЕ сам по себе гавноязык, который нужно оптимизровать везде насколько можно, если нужна максимальаня производительность, что особо сказывается на крупных проектах. Слово крупный тут не значит использование всевозможных фреймворков и больших денег за работу, слово крупный тут имеет смысл большой нагрузки, где каждый выигранный % производительности на счету.

Не поленился написать нубоскрипт, вот результаты:

# vars    time with "       time with '       performance
1         3.6974380016327   2.5139710903168   147.08%
2         6.0501251220703   5.0527441501617   119.74%
3         8.2543439865112   7.8380331993103   105.31%
4         10.672549962997   10.420034885406   102.42%
total     28.674457073212   25.824783325195   111.03%  

Отсюда видно, что максимальный отрыв наблюдается при подстановке 1ой переменной :) и даже при падении скорости при подстановке 4х переменных, общая производительность выше. Поэтому не ленитесь и пишите все строки сразу с 1ой кавычкой, тем более если нужно подставить всего 1ну переменную.
Continue reading »

Feb 02

Очень полезная и чесно пизженная функция с каментов на php.net с минимальными изменениями, помогает для отлова узких мест в скрипте и настройки производительности функций/методов

<?php
function debug() {
   static $start_time = NULL;
   static $start_code_line = 0;

   $call_info = array_shift( debug_backtrace() );
   $code_line = $call_info['line'];
   $file = array_pop( explode('/', $call_info['file']));

   if( $start_time === NULL ) {
       print 'debug '.$file.'> initialize'."\n";
       $start_time = time() + microtime();
       $start_code_line = $code_line;
       return 0;
   }

   printf('debug %s> code-lines: %d-%d time: %.4f mem: %d/%d KB'."\n", $file, $start_code_line, $code_line, (time() + microtime() - $start_time), ceil(memory_get_usage()/1024), ceil(memory_get_usage(1)/1024));
   $start_time = time() + microtime();
   $start_code_line = $code_line;
}
?>

Continue reading »