программирование

HTML5 VIDEO: кто первый? А так же 3D CANVAS

Вышел браузер «Сафари» версии 3.1, в пресс-релизе написано, что «Сафари» — первый браузер, поддерживающий новые теги video и audio из HTML5:

Safari 3.1 is the first browser to support the new video and audio tags in HTML 5 and the first to support CSS Animations. Safari also supports CSS Web Fonts, giving designers limitless choices of fonts to create stunning new web sites

Что касается тега AUDIO — чистая правда, а с VIDEO — вышла накладка. Специальный билд «Оперы», поддерживающий этот тег, вышел 8-го ноября 2007-го года, тогда как Webkit (на движке которого сделан «Сафари») — 12-го ноября, на четыре дня позже.

Кстати, самое интересное, что появилось в том билде «Оперы», это не тег VIDEO, а 3D Canvas — до этого момента тег CANVAS позволял работать только с примитивами на плоскости (отрезками, прямоугольниками, кругами и так далее), знаменитая игра «Canvascape», сделанная с применением этого тега (требует для работы любой браузер, поддерживающий CANVAS), просчитывае 3D-графику самостоятельно, из-за чего игра на средних компьютерах заметно притормаживает.

Для 3D CANVAS задача вращения куба с текстурой, например — тривиальная. Примеров работы с этим новшеством пока немного, в оригинально статье упомянута Snake («змейка») в 3D, написанная Mathieu ’p01’ HENRI.

5 комментариев

CSS только для Mozilla (в том числе — FireFox)

У верстальщиков до сих пор возникает задача — подключить стили только для определённого браузера. Для IE проблема решаема — всё меньше верстальщиков не знают что такое conditional comments. Но исчезающе малое количество народу знает что такое per-site user stylesheet rules. Интересны они тем, что Mozilla FireFox поддерживет их через собственное правило — «@-moz-document».

Вообще, это правило позволяет подключать стили в зависимости от домена, URL или его префикса. Для нас важно, что эти правила увидит только FireFox.

Простой пример использования, из которого становится понятен общий принцип:

<style type="text/css">
body { background: white; color: black }

@-moz-document url-prefix()
{
    body { background: grey; color: white }
}
</style>
<body>White in FireFox</body>

Принципы фильтрации по URL и доменам так же могут оказаться полезными, о них можно почитать в архиве W3C.

15 комментариев

NOWDOC в PHP 5.3.0

В PHP 5.3.0 появилась новая синтаксическая конструкция: «NOWDOC». Сильно похожа на «heredoc», но с тем различием, что в «nowdoc» нет интерполяции переменных:

Следующий пример выведет в точности тот текст, который находится внутри nowdoc:

echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': x41
EOT;

Второе отличие от heredoc, что nowdoc можно использовать в любом статическом контексте, например так:

class foo {
    public $bar = <<<'EOT'
bar
EOT;
}

5 комментариев

Чем быстрее всего отрезать строку в кодировке UTF-8

Решил протестировать — чем быстрее всего можно отрезать строку в кодировке UTF-8. В PHP для этой цели (помимо использования извращений, типа SQL-запроса) можно использовать: mb_substr из модуля «Multibyte string function», iconv_substr из модуля iconv, preg_replace в режиме UTF-8 из Perl-Compatible regular expression function и собственную реализацию прохода по UTF-8 строке.

Я взял строку в 700 UTF-8-символов и отрезал от неё 500 разными функциями. Вот что получилось (PHP 5.2.4 без акселераторов):

  • хуже всех справилась реализация на чистом PHP — 0.34 сек
  • получше — iconv_substr. 0.063 сек
  • ещё лучше — mb_substr. 0.0175 сек
  • лучше всех — preg_replace. 0.005 сек
    Если кому интересно, вот моя функция по проходу по строке в кодировке UTF-8:
$len = strlen($text);
    for ($pos = $cutted = 0; $cutted < $cut && $pos < $len; ++$cutted)
    {
            $ch = ord($text[$pos]);

            // multibyte char
            if (0x80 & $ch)
            {
                    for (; $ch & 0x80; ++$pos, $ch <<= 1);
            }
            else
            {
                    $pos++;
            }
    }

Итак, лучший способ отрезать первые $N символов UTF-8 таков:

preg_replace('/^(.{'.$N.'}).*$/uSs', '$1', $text)

17 комментариев

Клуб нелюбителей C++

В своё время я посмотрел массу языков программирования (и продожаю смотреть), на некоторых — что-то писал, хотя бы реализацию известной американской считалочки. И мне всегда казалось, что C++ — самый уродливый, нелогичный и жуткий из всех языков. Оказалось — не казалось. Очень хорошая статья «За что я не люблю C++» Алексея Борескова — лишнее тому доказательство.

31 комментарий

Internet Explorer 8.0 beta 1: можно скачать

Вышла первая бета Internet Explorer 8. Уже можно качать и пробовать, доступны версии для Windows XP, Vista, Server 2003. Проходит 17% теста ACID3 (IE7 проходил 13% теста), тест ACID2 — проходит полностью, CSS3 selector test — 335 тестов из 578 пройдено (Opera 9.50b, к примеру, проходит этот тест полностью).

После установки IE8 спрашивает не желаете ли вы его сделать браузером по-умолчанию (я не возжелал), а так же спрашивает не нужно ли импортировать откуда-либо закладки, например, из браузера  «Опера», который обнаружен не моей машине.

То, что видно навскидку — режим эмуляции IE7, подсвечивание домена в строке URL, корректная работа с favicon (или это уже в седьмой версии было?), открытие окна в фоновой закладке кликом мышиным колесом, как в остальных браузерах, и встроенные инструменты для разработчика (просмотр DOM, CSS, отладка JavaScript и так далее), а после подения он спрашивает восстанавливать ли закладки.

Появилась технология Web Slices, (между прочим — это микроформат) комментировать которую пока не берусь, но выглядит забавно, очень интересная вещь Activities, обязательно посмотрите ролик, даже если не понимаете английский.

Теперь версия IE на моей машине выглядит так: 8.0.6001.17184. Некоторые глюки, кстати, видны невооружённым глазом — кое-где что-то подвисает, иногда в окно нельзя переключиться и так далее.

Оставить комментарий

Чудесный Lua

Язык программирования Lua (переводится с португальского как «луна»), в целом, мне нравится — очень гибкий, красивый, целостный. Программировать на нём приятно, а модель, заложенная в основу, настолько гибкая, что позволяет создавать ООП-конструкции без нативной поддержки их языком.

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

mt = {}

function mt.__add (a,b) 
    return { x = a.x + b.x, y = a.y + b.y }
end

Задаётся метатаблица (mt) у которой ключ __add (функция, отвечающая за сложение) определена как функция сложения вектора с двумя координатами. Например, в следующем примере (все примеры взяты из статьи «Язык Lua и использование скриптов на нём в программах на Си++») я устанавливаю заданную метатаблицу «mt» для переменной «u», причём сложение «u» и «v» работает правильно — поскольку Lua ищет обработчик сложения сначала у второго оператора, в случае неудачи — у следующего.

u = { x = 1, y = 2 }
v = { x = 0, y = 1 }

setmetatable ( u, mt )   -- установить для таблицы u метатаблицу

w = u + v                -- осуществить сложение таблиц
print ( w.x, w.y )

Самое интересное — дальше. Тут мой мозг не ломается, но без руководства я бы не догадался. Дело в том, что метатаблица «mt», точнее её операция «__add» определена некорректно. Сложение пройдёт великолепно, но у переменной «w» новой операции сложения не будет — метатаблица «mt» для этой переменной не установлена. Правильный способ определения вот такой:

function mt.__add (a,b) 
    return setmetatable ( { x = a.x + b.x, y = a.y + b.y }, mt )
end

Т. е. таблица устанавливается ещё и для получившегося выражения.

Для тех, кто уже ничего не понимает, но знает PHP. Запись { x = a.x + b.x, y = a.y + b.y } на PHP выглядела бы как array('x'=>$a['x']+$b['x'], 'y'=>$a['y']+$b['y']).

9 комментариев

sgn(x) на ассемблере

Давненько я не брал в руки ассемблер. Лет так 8, наверное (речь идёт об ассемблере под 80x86, это, кстати, 3-й ассемблер, который я учил). Всякие там MMX и SSE уже и не знаю, о программировании на ассемблере в защищённом режиме — тоже, но остальное сидит крепко. У Анатолия Воробья в журнале увидел интересный код — самая быстрая реализация функции знака на ассемблере 80x86:

cwd
neg ax
adc dx, dx

Вот объяснение как это работает:

Здесь начальный аргумент лежит в ax, значение помещается в dx. Работает следующим образом: сначала cwd расширяет знак ax в dx, после чего в dx лежит -1, если аргумент отрицательный, а иначе 0. neg ax меняет знак ax, но это на самом деле неважно, а важно то, что эта инструкция помещает в флаг carry единицу, только если аргумент был ненулевой.

Наконец adc dx, dx складывает dx с самим собой, добавляет carry от второй инструкции, и помещает результат в dx. В результате выходит:

— если ax<0, то dx вначале -1, carry равен 1, результат равен -1*2+1 = -1 (во как!) — если аx=0, то dx вначале 0, carry равен 0, результат 0*2+0=0 — если ax>0, то dx вначале 0, carry равен 1, результат 0*2+1=1

1 комментарий

Программисты на PHP — новые чукчи?

Мне кажется, про программистов на PHP скоро будут складывать анекдоты, как про чукчей. Посмотрите какой чудесный перл из конференции ru_php в ЖЖ:

Пытаюсь сконвертировать .doc файл в .txt , но php не понимает команды без точного объяснения:

$wf=fopen(«myfile.txt»,«w»); $i=0; $f=file(«laplap.doc»); while($i<10) { fwrite($wf,$f[$i]); $i++; } fclose($wf);

может есть другой способ? спасибо

Я очень боюсь поверить, что человек это пишет всерьёз.

11 комментариев

PHP 5.3.0: Прощай .htaccess

Я уже достаточно давно работаю в конфигурации nginx + FastCGI PHP (без Apache в качестве backend). Это более эффективно — экономит память и система, в целом, более устойчива, производительна, легче в управлении (приходится конфигурировать один сервер, а не два). Единственное, чего нехватало — настройки PHP для определённого хоста (так называемые «Local Value» в phpinfo).

Так вот, в PHP 5.3.0 ситуация изменится:

— Improved php.ini handling: (Jani)
. Added «.htaccess» style user-defined php.ini files support for CGI/FastCGI
. Added support for special [PATH=/opt/httpd/www.example.com/] and [HOST=www.example.com] sections. Directives set in these sections can not be overridden by user-defined ini-files or during runtime.

Этого мне нехватало куда больше, чем пространств имён и «?:», который там тоже появятся. По правде говоря, там есть ещё более значительное для меня изменение — Late Static Binding вкупе с __callstatic и $foo:myFunc(). Или даже «Improved PHP runtime speed and memory usage: Added garbage collector».

12 комментариев

Safari: 80%. ACID3

Как я говорил, Safari (точнее WebKit) движется к прохождению теста ACID3 семимильными шагами. И вот пожалуйста: вчерашняя ночная сборка r30123 проходит 80% (!) процентов теста. Кстати, оказывается многие этого не знают — если кликнуть на букве «A» в слове «ACID3» после прохождения теста, то можно увидеть какие тесты браузер не прошёл.

9 комментариев

Safari готовится пройти ACID3?

Вероятнее всего, Safari будет первым браузером, который пройдёт тест ACID3. 30 января, когда я делал замеры прохождения этого теста различными браузерами Safari лидировал, это положение дел сохраняется до сих пор, причём Apple идёт к финишу семимильными шагами.

Ночная сборка «Сафари» на 30 января справлялась с 66% теста, за пять дней эта цифра поднялась до 73%, тогда как «Опера» за неделю поднялась всего на два пункта. Я думаю, «Сафари» справится с тестом ещё до релиза — очень хорошая реклама для браузера, который только-только начинает завоёвывать рынок.

10 комментариев

CSS3 ::selection

::selection (33.81КиБ)

В CSS3 есть замечательный селектор ::selection. Позволяет указать цвет выделения текста мышкой для определённого тега. В исходной статье, например, три абзаца выделяются каждый своим цветом — красным, голубым и розовым.

Фокус прост, в таблице стилей пишем:

p.red::selection { background: #ffb7b7 }      /* Safari, Opera */
p.red::-moz-selection { background: #ffb7b7 } /* FireFox */

всё привычно — для тега «P» с классом «red» указывается цвет выделения. Для FireFox при помощи селектора «::-moz-selection», для Safari и Opera — при помощи «::selection». Opera поддерживает указание цвета для «::selection» начиная с версии 9.50 build 9770.

P.S. Если у вас FireFox, Safari или Opera 9.50 build 9770, попробуйте выделить этот текст, можно заметить, что в «Опере» цвет выделения наследуется, а в Safari и FireFox — нет.

10 комментариев

Мегафон: PHP inside

Даже не знаю что красноречивее показывает, что сайт «Мегафон-Поволжье» написан на PHP — то, что в конце URL можно встретить .php или URL по которому у них показывается CAPTCHA на странице отправки сообщений. Зацените:

http://mgsm.ru/includes/sms_code.php?%3C?=doubleval(microtime());?%3E

(тут тонкий юмор о среднем уровне программистов на PHP)

8 комментариев

ACID 3 вышел

Вышел ACID3 — тест, проверяющий, в основном, поддержку браузером DOM и JavaScript. Итак, как проходят тест Acid3 последние версии браузеров:

Safari nightly build r29953 — 73/100
Opera 9.50b build 4634 Mac, build 9770 Win — 63/100
FireFox 3.0b3pre — 61/100
FireFox 2.0.0.11 — 50/100
Opera 9.25 — 47/100
Safari 3.0.4 (под iPhone в том числе) — 40/100
Internet Explorer 7.0+ — 13/100
Internet Explorer 6.0 SP2 — 12/100

Как видно, из существующих браузеров лидирует FireFox, из бета- и альфа-версий — Safari, из браузеров, которые выходят в ближайшем обозримом будущем — Opera.

24 комментария

UnSnow

Не знаю как вас, а меня уже достали сайты с падающими снежинками. В канун Нового года это ещё как-то объяснимо, но кое-где снег продолжает падать до сих пор. Я изготовил userjs для Opera (кажется в FireFox тоже есть плагин, позволяющий подключать UserJS), который останавливает снег на любых сайтах. Принцип несложен и понятен из кода. Side effects могут быть — например, если кто-то по неизвестным причинам будет использовать в своей функции, за снег не отвечающей, слово «snow», но проблемы буду решать по мере их появления.

// ==UserScript==
// @name        UnSnow - Turn off stupid snow
// @author      Evgeny Stepanischev aka Bolk
// @version     1.01
// @namespace   /files/unsnow.js
// @modified    2008-01-29
// ==/UserScript==

document.addEventListener
(
    'load',
    function () {
        if (window) for (var v in window)
        if (/snow|sneg|^fall$/i.test(v) && typeof window[v] == 'function')
        window[v] = function () {}
    },
    false
)

7 комментариев

HTML 5 draft

Странно, но группа W3C анонсировала первый публичный черновой вариант спецификации HTML5. Предрекали, что черновая версия выйдет через пару лет, а сам стандарт — лет через 15. Видимо, счастье наступит раньше. Кстати, читая стандарт HTML5 понимаешь, что «семантическая вёрска» в HTML4 — фикция (к слову, чтобы два раза не вставать, вёрстка «дивами» в текущем состоянии — хак на хаке и такое же гуано как вёрстка таблицами, но сложнее и дороже). Надо будет как-нибудь написать что-то развёрнутое по этому поводу.

14 комментариев

Sun MySQL

Уже все интересующиеся в курсе, что Sun купила MySQL AB? Сумма сделки — 800 миллионов долларов США и 200 миллионов в качестве опциона. Людям особенно интересно что будет с InnoDB, который принадлежит Oracle и, по сути, является единственным нормальным движком в MySQL. Конечно, MySQL разрабатывали очень хороший storage Falcon, но до его завершения ещё далеко.

13 комментариев

256 байт спирали

Нижеприведённый JavaScript в 256 байт выводит вращающуюся спираль (говорят в IE не работает, попробуйте Opera 9.50 или свежий FireFox). Подробный разбор принципа действия есть у Анатолия Воробья в ЖЖ. Никакого чуда (хотя поначалу выглядит именно так) — немного математики и чуть изобретательности.

p01<i id=d><script>setInterval('for(x=_="in solid #",E=Math,o=99,--O;o--;x+=
"<hr style='width:0;margin:auto;border-right:"+E.abs(q?p:P)+_+(9-q)*36+
";border-left:"+E.abs(q?P:p)+_+(8+q)*36+"'>")q=0>(p=E.cos(O+=22))*(P=E.sin(O));
d.innerHTML=x',O=9)</script>

11 комментариев

← 1 58 59 60 61 62 67 →