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

Вышла Opera 10.0 alpha1

Вышла Opera 10.0 alpha 1, из важных обновлений движка:

  • полностью проходит тест ACID3
  • новый движок регулярный выражений с улучшеной производительностью
  • улучшена производительность CSS
  • изменён вывод «голого» XML
  • поддержка подгружаемых шрифтов (web fonts)
  • поддержка RGBA и HSLA (цвет с указанием прозрачности)
  • поддержа Selector API (который сейчас уже поддерживает Safari и IE8)
    Из других интересных особенностей: встроенная проверка орфографии, автообновление билдов.

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

JavaScript: баг с замыканием в FireFox

Какой alert должен показать следующий JavaScript в браузере?

<html>
<head>
<script>
/* When are functions defined? */
function really() { alert("Original"); }
if (0) {
    alert("No");
    function really() { alert("Yes, really"); }
}
really();
</script>
</head>
<body>Really</body>
</html>

Поведение тут зависит от браузера, FF выведет «Original», а остальные браузеры — «Yes, really».

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

JavaScript: преобразование в integer

Читая исходники плагина autocomplete для jQuery (документация описывает не всю функциональность плагина), нашёл замечательный небольшой паттерн. Обычный короткий способ преобразовать объект другого типа в число — прибавить к нему ноль или умножить на 1. Но есть способ лучше, оцените:

var extraParams = {
    timestamp: +new Date()
}

Просто добавляем знак перед объектом. Просто и изящно.

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

«Обычное PHP-приложение»

Читаю Django Book (книга о Python-фреймворке Django):

In contrast, other Web development platforms couple the URL to the program. In typical PHP (https://www.php.net//) applications, for example, the URL of your application is designated by where you place the code on your filesystem.

Может мне кто-то расскажет что такое «обычное PHP-приложение», в котором «URL вашего приложения определён местом,где размещён код в вашей файловой системы»? Даже веб-мастера блогами забытых сайтов знают о существовании mod_rewrite (если говорить про Apache), а интернет уже много лет содержит тысячи (если не сотни тысяч) рецептов по работе с ним, а так же альтернативные способы.

В итоге «обычные» (т. е. «встречающееся чаще других») «PHP-приложение» это, напротив, то, что отвечает принципам ЧПУ (это в России так REST называется, впрочем REST придуман по другому поводу).

P.S. ещё лингвисизм по отношению к PHP из той же книги:

If you’re experienced in another Web development platform, such as PHP or Java, you may be thinking, “Hey, let’s use a query string parameter!”, something like /time/plus?hours=3, in which the hours would be designated by the hours parameter in the URL’s query string (the part after the ?).

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

Акын: блоки

Я тут, если помните, принялся описывать свой шаблонизатор «Акын», многие просили. Сейчас попробую продолжить. Итак, часть вторая: блоки.

Частые паттерны — скрыть целый блок разметки или повторить его несколько раз, решается в «Акыне» одной конструкцией: описанием блока. Что именно будет происходить с блоком, шаблон «не знает». Блок идентифицируется своим именем и описывается следующим образом:

<:имя>
Значение переменной: <b>{$var}</b><br />
</:имя>

В API шаблонизатора есть два метода-алиаса с именами iterate и show, которые в реальности полностью взаимозаменяемы и разделены только для наглядности (и, возможно, последующей оптимизации двух этих операций). На вход каждый метод принимает имя блока, с которым он будет работать. Важно помнить, что если к блоку не применить show или iterate, то его содержимое показано не будет.

Пусть блок, описанный выше, нужно повторить три раза, заменяя «var» каждый раз на определённый текст, вот как это выглядит в коде:

$t = rt::t('template');

for ($i = 0; $i<3; $i++) {
    $t->var = $i;
    $t->iterate('имя');
}
echo $t;

Чтобы просто показать содержимое этого блока можно вызвать $t->show(’имя’). Вложенные секции работают точно так же: нужно сначала проитерировать вложенную секцию, потом внешнюю. Уровень вложенности неограничен.

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

<$+шаблон>
<$+шаблон секция>

Конструкция предпроцессорная (обрабатывается первым проходом), т. е. все блоки, переменные и прочее будут включены в шаблон из которого она вызвана.

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

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

Blok и комментарии: часть IV

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

  • Gravatar — централизованный сервис юзерпиков
  • favatar — использование favicon сайта в качестве аватара
  • pavatar — формат для аватара сайта
  • аватары из «Ярушки»
  • аватары из «ЖЖ»
  • аватары, указанные в hCard
    Надо бы до конца «Акын» описать что ли…

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

Забытый тег: KEYGEN

Реализация парсеров HTML различных браузеров содержит массу забытых тегов, о существовании которых помнят единицы, да и тем уже незачем их использовать. Один из таких тегов — KEYGEN, придуман, если не ошибаюсь, компанией Netscape для своего браузера (ещё до того как Netscape стал использовать Mozilla), содержит два атрибута — name и challenge и используется в составе форм (FORM).

Под Windows тег поддерживается всеми основными браузерами (с разным успехом) и не поддерживается альтернативным (вплоть по версии 8.0 beta2). В настоящий момент тег почти не используется. Прошло много лет и члены комитета WHATWG (основное детище который — куча браузеров и стандарт HTML5) вспомнили об этом теге.

Использование вкратце:

<form>
   <keygen name="pubkey" challenge="случайная строка">
   <input type="submit" value="Сгенерировать">
 </form>

Если ваш браузер поддерживает тег KEYGEN, вы увидите список из нескольких элементов, содержимое его зависит от браузера, но сводится к одному — длине ключа. При нажатии на кпопку отправки формы браузер сгенерирует пару ключей, публичный ключ (в формате SPKAC) будет отправлен на сервер (в поле, указанном в атрибуте «name» тега).

Сервер, получив сертификат, готовит специальный файл подписывает его и отсылает назад браузеру с заголовоком «application/x-x509-user-cert», вся процедура подробно описана в соответствующем письме из рассылки WHATWG.

После чего веб-сервер, настроенный соответствующим образом, может авторизовывать пользователя по клиентскому сертификату.

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

Position: fixed и IE

Но то, что в этом режиме простое обращение к document.body.filters волшебным образом прекращает дрожание (как background-position:fixed в рецепте от студии Лебедева) — похоже, открытие. Больше того, по моим наскоро проведенным опытам, аналогичный эффект дает и такая бессмысленная (как и вышеприведенный скрипт!) запись в CSS:

body { _filter: true; }

Способ «background-position: fixed» знают многие, а вот такие трюки с filter — что-то новенькое.

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

Akyn: синтаксис (переменные)

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

Идея, которую я считаю хорошей несколько последних лет — шаблон должен содержать минимум логики и весь HTML должен содержаться в шаблонах. Тут она одна из центральных.

Шаблонизатор работает с файлами (у меня на сайте всё работает на файлах), в простейшем случае файл содержит одни шаблон, в более сложном — несколько секций шаблона. Секции записываются между двумя тегами комментария с именем секции внутри (обратите внимание на закрывающий тег):

<!--имя секции-->
HTML-код секции
<!--/имя секции-->

Самое простое, что есть в шаблоне — переменные. Они записываются как {$name}. Переменная уникальна в своей секции или шаблоне (если шаблон без секций). Установить переменную можно присвоив шаблону свойство с её именем. У меня открытие шаблона сделано в глобальном toolkit и всё описанное выглядит вот так:

$t = rt::t('menu', 'меню сверху');
$t->link = '/';
echo $t;

В данном примере в секции «меню сверху» шаблона «menu» переменной link я присвоил значение ’/’. Шаблон выполнится при любом преобразовании объекта в string (например, когда я сделаю echo). Если переменной присвоить null, то атрибут тега, в котором она находится пропадёт. А если переменная входит в тег, то удалится сам тег. В следующем шаблоне, если я присвою переменной «hide» null, пропадёт тег «b» и атрибут title тега «a»:

<a href="/" title="{$hide}"><{$hide}b>текст<{$hide}/b>

Минимальная логика, которая есть в шаблоне на данный момент — возможность подстановки значения переменных из списка и отрицание переменной. Выглядит это вот так: {$var?value1?value2?value3}, значений valueN может быть сколько угодно, нумерация начинается с нуля, значения выбираются по номеру (для тех кто в теме — и по модулю длины выбираемой последовательности). Пустое значение считается null-значением, со всеми его свойствами, которые я рассмотрел выше.

Частный случай такой конструкции — конструкция {$!var}, которая на значение эквивалентное false вернёт пусто (не null), а на значение эквивалентное true — null.

Эта условная конструкция полезна шаблону тем, что позволяет сосредоточить максимум данных о шаблоне в самом шаблоне, например, в циклических конструкциях туда можно поместить имена стилей, которые должны применяться. Отрицание полезно в случаях подобных этому:

<{$hide}b><{$!hide}i>Текст<{$!hide>/i><{$hide}/b>

тут, в зависимости от состояния переменной hide, появится либо тег «b», либо «i».

Переменные подставляются в момент выполнения шаблона, так что иметь значение будет последнее выставленное значение.

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

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

WebKit == IE8?

Как сегодня пишет AppleInsider, глава компании Microsoft Стив Балмер не отрицает возможности использования движка для рендеринга веб-страниц WebKit в одной из следующих версий браузера Internet Explorer.

Цитата из статьи на Macspoon. OMFG!

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

Blok: akyn

Как-то проснулся в 4 ночи от того, что придумал неплохой шаблонизатор. Я его запрограммировал, он полежал две недели, а сегодня решил его прикрутить к своему блогу. Движок получился в два раза быстрее предыдущего (что, правда, всё равно не спасает от «провалов» у моего хостера, когда время генерации страницы поднимается с нормальных сотых или десятых до целых секунд) и обходится без разбора HTML. Что ещё хорошо — понятно куда его оптимизировать, есть запас.

Шаблонизатор называется (у Бирмана каждая строчка кода носит какое-то красивое название, чем я хуже?) «Акын», ибо, натурально, «что видит, то поёт». Плохо, что API пришлось серьёзно поменять, так что если что-то отвалится — пишите.

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

CSS и Internet Explorer

На сайте MSDN нашёл полезную страницу, где очень понятно, по разделам описывается что из CSS умеют различные версии Internet Explorer (5.0, 5.5, 6.0, 7.0, 8.0beta1, 8.0beta2, 8.0).

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

IE7/IE8 CSS hack: bolk minus hack

Нашёл CSS-хак для Internet Explorer 7.0 и 8.0:

-, body { background: gray; }

Основан на баге парсера браузера, который был введён для того, чтобы обрабатывать стили, начинающиеся с «-» (в IE7 появился первый стиль с префиксом «-ms-»).

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

CSS-хак для Сафари

Век живи, век учись. Оказывается, конструкцию «-webkit-min-device-pixel-ratio:0» понимает Opera 9.2x. Какое безобразие. На «Хабре» появилась статья, где описаны популярные хаки для браузеров и, в частности, есть решение этой проблемы:

/* Первая конструкция — против Opera 9.5, которая понимает вторую, а вторая — против Opera 9.2, которая
понимает первую. Верх извратства :) Вобщем-то безопасная конструкция, т. к. 9.2 уже не будет
эволюционировать и явно не сможет обработать :first-of-type, а -webkit- — проприетарное свойство и 
обрабатывается Opera 9.2 скорее по ошибке, что следует из отсутсвия поддержки в 9.5 */

/* Safari понимает обе, поэтому хак работает */
@media all and (-webkit-min-device-pixel-ratio:0) {
   
   body:first-of-type #lightSF3 { display: block }
   /* вместо :first-of-type можно еще использовать :nth-of-type(1) — он для Safari 3.1 */
   
}

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

PHP для Windows Mobile

Немного посмотрел HPH, диалект PHP для Windows Mobile. Я о нём писал пару лет назад, а вот теперь посмотрел, коль скоро у меня устройство с WM6.1.

Что сказать? Это не PHP. Это какой-то язык отдалённо напоминающий PHP. Всюда натыкаешься на странное с точки зрения программиста PHP поведение: то HPH не нравится, что в конце нет «?>», то конструктор класса должен называться в том же регистре, что и сам класс и так далее. Кстати, о классах — ООП от PHP4, что удручает. На сайте сказано, что объекты передаются по ссылке, за это спасибо, массивы почему-то — тоже (в PHP не так).

Если не называть это PHP, то вполне сносный язык, для… для… для чего же? Не знаю, может быть поднять персональные сервисы на нём, ту же Wiki, как пример. Не такая уж плохая идея, жаль только, что ничего готового под него не пойдёт: поддержки MySQL нет (но есть SQLite3!), список функций неполный. Но авторы всё равно молодцы и делают интерпретатор, кажется, для собственного удовольствия.

По сути, список поддерживаемых функций давно таков, что новые можно писать уже на самом HPH и включать как библиотеку, тем более, что реализации некоторых, самых важных, есть в PEAR модуле PHP_Compat.

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

Geolocation API

Google добавил отличнейшую штуку в Google Gears: определение географических координат пользователя по различным сетям (wi-fi, сотовые сети, GPS, что доступно). Например, на ноуте будет использованы идентификаторы wi-fi сетей, которые есть вокруг.

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

Способ использования до смешного прост: на страницу подключается gears_ini.js, а далее координаты доступны как свойства latitude и longitude объекта, который попадает в callback-функцию обновления координат.

Документация небольшая и полна понятных примеров.

Врёт API пока сильно (я на Таганке, меня показало на Охотном ряду) и под FF (хм…) у меня не заработало, пробовал под 3.0.3 и 3.1beta1.

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

Как я был лаборантом (про программирование)

В разделе «обо мне» написано, что я работал лаборантом при кафедре ВМК. Иногда меня спрашивают — чем же я там занимался. Отвечаю: в основном, программно решал возникающие задачи, программировал я тогда, по большей части, на ассемблере x86. Поясню на примере.

В зоне отвественности кафедры было тогда (1996-97 гг.) четыре комьютерных класса. Везде, в основном, DOS. Типовое ПО (MS-DOS 6.22, Norton Commander, TurboC, TurboPascal и т. п.), непрерывный поток студентов. Из этого проистекают две проблемы: во-первых, студенты пишут файлы на диск, во-вторых, студенты удаляют и модифицируют уже существующие на диске файлы.

Первая проблема приводила к тому, что дисковое место быстро исчерповалось (а определить куда студент положил свою россыпь файлов и не стереть лишнего — та ещё задача), второя — к тому, что в середине дня приходилось (с дискет!) переставлять, например, TurboPascal или что-то даже ещё более тяжёлое (типа матстатистики).

Вот такую проблему требовалось решить.

В DOS было (и есть) API — множество фукнций, вызываемых через так называемое прерывание №21 (были и другие прерывания, обслуживаемые DOS, но это — основное). Когда программы под DOS работали с файлами они использовали это API.

Придумал я, в итоге, следующее. Винт форматируется, туда ставится DOS, Norton Commander и другое типовое ПО. Все файлы этого ПО помечаются атрибутом ReadOnly (это стандартный атрибут). Я написал программу, которая подменяет собой функции DOS для работы с файлом, которая запрещает модифицировать этот атрибут и делать что-то с этим файлом (точнее, в этом случае я возвращал код успешного завершения, но с файлом ничего не делал).

Свою программу я добавил в autoexec.bat, запретил остановку загрузки DOS (клавиши F5, F8), boot с дискеты и поставил пароль на BIOS.

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

Для специалистов: int 25/26/13 я никак не подменял, но квалификации студентов тогда не хватало, чтобы обойти защиту.

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

A Quick Look at MySQL 6.0’s New Backup

На сайте для разработчиков под MySQL появилась интересная статья «A Quick Look at MySQL 6.0’s New Backup», о том что есть в MySQL 6.0 для резервного копирования данных. Вообще в MySQL это было больное место, особенно на нагруженных проектах — как сделать резервное копирование без остановки проекта, наконец что-то делается в этом направлении.

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

Синтетический JS-тест

Есть у меня такой любимый синтетический тест браузеров — запускать на своём древнем интерпретаторе языка Brainfuck вычисление числа Пи (программа есть на том же сайте).

Для интереса запустил его на браузерах, которые нашлись у меня на машине. Итог:

FireFox 3.1b1pre — 693 + JIT (410) = 1103 Opera 9.60 — 1141 + JIT (828) = 1969 Safari 3.1 — 1719 + JIT (547) = 2266 IE8 beta 2  — 2422 + JIT (843) = 3265 Chrome 0.2.149.30 — 7731 + JIT (950) = 8681

«1719 + JIT (547) = 2266» означает, что браузер проработал чуть больше двух секунд, из них полсекунды заняла внутренняя оптимизация кода на Brainfuck, которую делает мой интерпретатор, а 1.7 секунды выполнялся код на Brainfuck.

Как видно у Chrome не всё хорошо с JavaScript.

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

noindex в поисковике Sphinx

В замечательном поисковике Sphinx (кстати, очень рекомендую, есть биндинги в Ruby, Python, PHP, Perl), как известно, нет поддержки тега NOINDEX. Я два дня был на конференции РИТ: высокие нагрузки, ради доклада по Sphinx (доклад читал автор) встал в восемь часов, зато узнал, общаясь с автором в кулуарах, несколько полезных трюков.

Один из них — как сделать NOINDEX, простой и очевидный, но я не успел до него догадаться. У Sphinx есть опция html_remove_elements, которая позволяет указывать содержимое каких HTML-тегов следует игнорировать. Обычно там указаны SСRIPT и STYLE, добавляем туда NOINDEX и результат достигнут.

P.S. Dizzy57, привет!

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

← 1 54 55 56 57 58 67 →