программирование
Вышла Opera 10.0 alpha1
Вышла Opera 10.0 alpha 1, из важных обновлений движка:
- полностью проходит тест ACID3
- новый движок регулярный выражений с улучшеной производительностью
- улучшена производительность CSS
- изменён вывод «голого» XML
- поддержка подгружаемых шрифтов (web fonts)
- поддержка RGBA и HSLA (цвет с указанием прозрачности)
- поддержа Selector API (который сейчас уже поддерживает Safari и IE8)
Из других интересных особенностей: встроенная проверка орфографии, автообновление билдов.
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».
JavaScript: преобразование в integer
Читая исходники плагина autocomplete для jQuery (документация описывает не всю функциональность плагина), нашёл замечательный небольшой паттерн. Обычный короткий способ преобразовать объект другого типа в число — прибавить к нему ноль или умножить на 1. Но есть способ лучше, оцените:
var extraParams = {
timestamp: +new Date()
}Просто добавляем знак перед объектом. Просто и изящно.
«Обычное PHP-приложение»
Читаю Django Book (книга
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.
Может мне
В итоге «обычные» (т. е. «встречающееся чаще других»)
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 ?).
Акын: блоки
Я тут, если помните, принялся описывать свой шаблонизатор «Акын», многие просили. Сейчас попробую продолжить. Итак, часть вторая: блоки.
Частые паттерны — скрыть целый блок разметки или повторить его несколько раз, решается в «Акыне» одной конструкцией: описанием блока. Что именно будет происходить с блоком, шаблон «не знает». Блок идентифицируется своим именем и описывается следующим образом:
<:имя>
Значение переменной: <b>{$var}</b><br />
</:имя>В API шаблонизатора есть два
Пусть блок, описанный выше, нужно повторить три раза, заменяя «var» каждый раз на определённый текст, вот как это выглядит в коде:
$t = rt::t('template');
for ($i = 0; $i<3; $i++) {
$t->var = $i;
$t->iterate('имя');
}
echo $t;Чтобы просто показать содержимое этого блока можно вызвать
В предыдущей части я забыл упонянуть ещё одну важную конструкцию, позволяющую включать один шаблон в другой. Выглядит она, на мой взгляд, очень логично:
<$+шаблон>
<$+шаблон секция>Конструкция предпроцессорная (обрабатывается первым проходом), т. е. все блоки, переменные и прочее будут включены в шаблон из которого она вызвана.
В следующий раз опишу actions, а так же дальнейшие планы. На этом описательная часть закончится, если по этой части не потребуются разъяснения.
Blok и комментарии: часть IV
Взята последняя высота: теперь я беру юзерпики в том числе и из микроформата hCard, в итоге мой движок в комментариях понимает:
Забытый тег: 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» тега).
Сервер, получив сертификат, готовит специальный файл подписывает его и отсылает назад браузеру с заголовоком
После чего
Position: fixed и IE
Но то, что в этом режиме простое обращение к document.body.filters волшебным образом прекращает дрожание (как
background-position:fixed в рецепте от студии Лебедева) — похоже, открытие. Больше того, по моим наскоро проведенным опытам, аналогичный эффект дает и такая бессмысленная (как и вышеприведенный скрипт!) запись в CSS:body { _filter: true; }
Способ
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 может быть сколько угодно, нумерация начинается с нуля, значения выбираются по номеру (для тех кто в теме — и по модулю длины выбираемой последовательности). Пустое значение считается
Частный случай такой конструкции — конструкция {$!var}, которая на значение эквивалентное false вернёт пусто (не null), а на значение эквивалентное true — null.
Эта условная конструкция полезна шаблону тем, что позволяет сосредоточить максимум данных о шаблоне в самом шаблоне, например, в циклических конструкциях туда можно поместить имена стилей, которые должны применяться. Отрицание полезно в случаях подобных этому:
<{$hide}b><{$!hide}i>Текст<{$!hide>/i><{$hide}/b>тут, в зависимости от состояния переменной hide, появится либо тег «b», либо «i».
Переменные подставляются в момент выполнения шаблона, так что иметь значение будет последнее выставленное значение.
В следующий раз я рассмотрю циклическую конструкцию, конструкцию управления видимостью блока, а после этого — API и выложу исходный код.
WebKit == IE8?
Как сегодня пишет AppleInsider, глава компании Microsoft Стив Балмер не отрицает возможности использования движка для рендеринга
веб-страниц WebKit в одной из следующих версий браузера Internet Explorer.
Цитата из статьи на Macspoon. OMFG!
Blok: akyn
Шаблонизатор называется (у Бирмана каждая строчка кода носит
CSS и Internet Explorer
На сайте MSDN нашёл полезную страницу, где очень понятно, по разделам описывается что из CSS умеют различные версии Internet Explorer (5.0, 5.5, 6.0, 7.0, 8.0beta1, 8.0beta2, 8.0).
IE7/IE8 CSS hack: bolk minus hack
Нашёл
-, body { background: gray; }Основан на баге парсера браузера, который был введён для того, чтобы обрабатывать стили, начинающиеся
CSS-хак для Сафари
Век живи, век учись. Оказывается, конструкцию
/* Первая конструкция — против 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, то вполне сносный язык, для… для… для чего же? Не знаю, может быть поднять персональные сервисы на нём, ту же Wiki, как пример. Не такая уж плохая идея, жаль только, что ничего готового под него не пойдёт: поддержки MySQL нет (но есть SQLite3!), список функций неполный. Но авторы всё равно молодцы и делают интерпретатор, кажется, для собственного удовольствия.
По сути, список поддерживаемых функций давно таков, что новые можно писать уже на самом HPH и включать как библиотеку, тем более, что реализации некоторых, самых важных, есть в PEAR модуле PHP_Compat.
Geolocation API
Google добавил отличнейшую штуку в Google Gears: определение географических координат пользователя по различным сетям
Фокус в том, что эту информацию можно запросить прямо
Способ использования до смешного прост: на страницу подключается gears_ini.js, а далее координаты доступны как свойства latitude и longitude объекта, который попадает
Документация небольшая и полна понятных примеров.
Врёт API пока сильно (я на Таганке, меня показало на Охотном ряду) и под FF (хм…) у меня не заработало, пробовал под 3.0.3 и 3.1beta1.
Как я был лаборантом (про программирование)
В разделе «обо мне» написано, что я работал лаборантом при кафедре ВМК. Иногда меня спрашивают — чем же я там занимался. Отвечаю: в основном, программно решал возникающие задачи, программировал я тогда, по большей части, на ассемблере x86. Поясню на примере.
В зоне отвественности кафедры было тогда
Первая проблема приводила к тому, что дисковое место быстро исчерповалось (а определить куда студент положил свою россыпь файлов и не стереть лишнего — та ещё задача), второя — к тому, что в середине дня приходилось (с дискет!) переставлять, например, TurboPascal
Вот такую проблему требовалось решить.
В DOS было (и есть) API — множество фукнций, вызываемых через так называемое прерывание №21 (были и другие прерывания, обслуживаемые DOS, но это — основное). Когда программы под DOS работали с файлами они использовали это API.
Придумал я, в итоге, следующее. Винт форматируется, туда ставится DOS, Norton Commander и другое типовое ПО. Все файлы этого ПО помечаются атрибутом ReadOnly (это стандартный атрибут). Я написал программу, которая подменяет собой функции DOS для работы с файлом, которая запрещает модифицировать этот атрибут и делать
Свою программу я добавил в autoexec.bat, запретил остановку загрузки DOS (клавиши F5, F8), boot с дискеты и поставил пароль на BIOS.
В результате первая проблема решается так: после окончания занятия студентов лаборант запускает стирание всех файлов на винте, защищённые не удаляются, вторая проблема так же решается: защищенные файлы модифицировать, в итоге, не получается.
Для специалистов: int 25/26/13 я никак не подменял, но квалификации студентов тогда не хватало, чтобы обойти защиту.
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.
noindex в поисковике Sphinx
В замечательном поисковике Sphinx (кстати, очень рекомендую, есть биндинги в Ruby, Python, PHP, Perl), как известно, нет поддержки тега NOINDEX. Я два дня был на конференции РИТ: высокие нагрузки, ради доклада по Sphinx (доклад читал автор) встал в восемь часов, зато узнал, общаясь с автором в кулуарах, несколько полезных трюков.
Один из них — как сделать NOINDEX, простой и очевидный, но я не успел до него догадаться. У Sphinx есть опция html_remove_elements, которая позволяет указывать содержимое каких
P.S. Dizzy57, привет!