программирование
PDF в Safari — картинка
Браузер «Сафари» под «Мак», оказывается, умеет отображать PDF (и TIFF, кстати, тоже) в теге IMG. Т. е. как простую картинку. Поскольку в OSX есть встроенная поддержка PDF, такое поведение браузера, видимо, вытекает из того, что картинки в браузере отображаются через
А вот браузер «Опера», помимо стандартного набора JPEG/PNG/GIF/XBM умеет отображать ещё и ICO. Почему этого не делают остальные браузеры — загадка, ведь им всё равно приходится работать с этим форматом, чтобы отобразить favicon.ico.
Оптимизация MySQL InnoDB
Давно хотел записать, чтобы не потерять. Выдержка из главы «Defragmenting a Table» руководства по MySQL:
It can speed up index scans if you periodically perform a “null” ALTER TABLE operation: ALTER TABLE tbl_name ENGINE=INNODB
That causes MySQL to rebuild the table. Another way to perform a defragmentation operation is to use mysqldump to dump the table to a text file, drop the table, and reload it from the dump file.
Пример скрипта для автоматической дефрагментации — дальше.
mysql_connect('localhost', 'root', 'пароль');
$res = mysql_query('SHOW DATABASES');
while (list($dbname) = mysql_fetch_row($res))
{
mysql_select_db($dbname);
$rec = mysql_query('SHOW TABLE STATUS');
while ($data = mysql_fetch_object($rec))
if ($data->Engine == 'InnoDB')
{
echo 'Processing ', $dbname, '.', $data->Name, ' ... '; flush();
mysql_query("ALTER TABLE {$data->Name} ENGINE=InnoDB");
echo "done.n";
}
mysql_free_result($rec);
}
mysql_free_result($res);
Тег VIDEO в новой «Опере»
Последний экспериментальный билд «Оперы» (ни в коем случае не устанавливайте его поверх вашей рабочей версии — эта версия основана на одной
Плохие новости заключаются в том, что этого тег, в текущей версии, доступен только для Windows, но в будущем обещают поддержку и остальных операционных систем.
Самое простое использование тега VIDEO — указание в атрибуте SRC видеофайла, который он должен проиграть и атрибута controls, который указывает должен ли браузер показывать кнопки управления воспроизведением (или разработчик будет управлять видео через соответствующие

Стандартные элементы управления (на рисунке) меня совершенно не впечатлили, я бы их использовать не стал, впрочем, дизайн ещё может измениться, да и всегда есть возможность сделать свои кнопки через JavaScript. Больше всего меня поразили методы внедрения видео в SVG — на сайте есть очень несложные в реализации примеры отражения шарика, движущегося внутри видео, в поверхности, наложения на видео фильтров (в примерах — trace edges, grayscale) и клиппинга.
P.S. На домашней странице Chris Double есть ссылки на FireFox3.0alpha9, собранный с поддержкой тега VIDEO.
Редирект в ASP.NET
Есть тут специалисты в ASP.NET? Скажите, это единственный способ сделать редирект, используя эту замечательную технологию?
<configuration>
<system.web>
<urlMappings enabled="true">
<add url="~/Article28.aspx" mappedUrl="~/MyNewBestArtile.aspx"/>
<urlMappings>
</system.web>
</configuration>P.S. Александр Семёнов из «ICL» уже подсказал, что есть возможность сделать просто «Response.Redirect», а приведённый выше кусок, по всей видимости, простой аналог «mod_rewrite»
Min-width в IE6 без JavaScript
Для меня оказалось сюрпризом, что
/* min-width для остальных браузеров */
body {margin:0;padding:0;}
.outer {
background-color:red;
margin:0 auto;
min-width:600px
}
/* стили для IE6 */
* html .outer {padding-left:600px}
* html .minwidth {height:0} /* holy hack для IE, что бы включить свойство hasLayout */
* html .container {margin-left:-600px;position:relative; height:0}HTML:
<div class="outer">
<div class="minwidth">
<div class="container">
Блок с min-width 600 пикселей.
</div>
</div>
</div>Первоисточником решения, по всей видимости, является статья Stu Nicholls на сайте CSSPlay.
Перенос и FireFox
Как известно — FireFox последний из браузеров, который не поддерживает мягкий перенос (shy). Explorer, как один из продвинутых браузеров (не надо смеяться, я не шучу), начал его поддерживать самым первым. Мягким переносом верстальщик может указать где в длинном слове, при необходимости, можно сделать перенос, например, если слово не умещается в колонку. Я прочитал несколько статей на эту тему, но нигде эту задачу решить не смогли. Между тем, в FireFox действует нестандартный тег WBR, который позвляет добиться того же самого, но без символа переноса. Что не совсем то. Кстати, CSS применить к WBR нельзя. Как же быть?
Проблему я решил, но, увы, с потерями: придётся подбирать один параметр для каждого вида шрифта, слово разорванно тегом и поисковые машины проиндексируют его по частям, а полный (совместимый с Opera, FF и IE6) вариант довольно громоздок.
С идеей как это всё реализовать, я определился сразу — строка при переносе должна открывать концевой символ. А, если переноса нет, вставать поверх него. Вдоволь помучавшись с перекрытием через «position: absolute», и селектором «:after», я вдруг вспомнил о теге «Q», где можно указать текст перед и после этого тега
Итак, один из минусов — это размер символа переноса в вашем экранном шрифте. Задаётся он в стиле (см. ниже) в параметре
<!-- Soft hyphen emulation in FireFox -->
<style type="text/css">
body { background: white }
var>q { quotes: "" "-"; margin-right: -0.36em }
var { font-style: normal; background: inherit }
</style>
<var><q>оченьдлинноеслово​<var>продолжениеоченьдлинногослова</var></var>Стоит браузеру разорвать слово в месте, где стоит пробел нулевой ширины
Поэтому мы его убираем (кстати, можно попытаться вставить его через атрибут «content» селектором «var>var:before», если текст у нас в Unicode):
<!-- Soft hyphen in FireFox, Opera, IE6 -->
<style type="text/css">
body { background: gray; font-size: 20px; font-family: Tahoma }
var>q { quotes: "" "-"; margin-right: -0.36em }
var { font-style: normal; background: inherit }
* html var b { display: none }
</style>
<var><q>оченьдлинноеслово<b>​</b>­<var>продолжениеоченьдлинногослова</var></var>Неуловимый тег HYPE
Разбирая заметки сайта за 2000—2003 гг. (всё думаю — конвертировать их или не нужно), наткнулся на старую заметку, где я пытался разобраться с недокументированными тегами браузеров. На тот момент актуальными были Internet Explorer и, почивший ныне, Netscape Navigator (другой браузер под тем же именем
Его до сих пор можно найти в исходниках ядра Gecko и, соответсвенно, он работает в браузерах, основанных на этом ядре. Основное его назначение туманно, по всей видимости, он должен выводить
The hype tag is just for fun. It only effects the UNIX version which can affor to have a sound file compiled into the binary. If we have the memory, create a fake image tag to replace the <HYPE> tag and process it.
Легко убедиться, что тег присутствует, если попробовать в FireFox повесить на него любой CSS стиль. Кстати, тег таким же образом «работает» и в Опере, потому что (и это оказалось для меня большим сюрпризом) в Опере можно использовать любое сочетание букв в качестве тега. Самая старая Опера, которая у меня есть на компьютере — 8.02 прекрасно отобразила красный бордюр вокруг свежеизобретённого мной тега «REDBORDER» со стилем «background: 1px solid red».
Я думаю, что тег, возможно, не совсем бесполезен, так как Internet Explorer за тег его не считает. Возможно, таким образом можно применять CSS
Robots.txt для роботов?
На блоге «ODP (DMOZ) неофициально» нашёл ссылку на больше забавное, чем полезное исследование на тему применения файла robots.txt.
Andrew Wooster прошёлся скриптом, написанным на Python, по известнейшему каталогу DMOZ и скачал все robots.txt сайтов, которые там зарегистрированы. Получилась достаточно большая база — 12Гб (около 4,6 миллиона доменов). Бо́льшая часть сайтов (чуть больше 65%) этого файла не имеют, что ожидаемо, вот у меня, например, его тоже нет, у меня нечего запрещать к индексированию.
В остальной части встречались самые разные проблемы — это и нестандартные
Какие выводы? В свете последних дискуссий о том, должен ли поисковик индексировать сайт без явного согласия на то
Фокусы с GIF, прозрачность и hover
Самые внимательные, наверное, заметили, что в прошлых заметках у меня на картинке использовалась эмуляция эффекта наведения на ссылку — посмотрите, если навести на картинку мышку, «ссылка», выделенная синим, на картинке подчеркнётся. И это не JavaScript.
Объяснение очень простое — картинка сделана с прозрачностью, далее при помощи CSS под неё подставлен белый фон, а при наведении (селектор «:hover») фон меняется на голубой. Такой же эффект использован на картинке с пистолетом слева (наведите мышку). Ссылка на картинке обязательна — без неё в Internet Explorer (версии ниже
a.gun:hover img { background: black } /* стиль при наведении мышкой */
a.gun img { margin: 0px; background: white } /* убираем поля в Opera и подкладываем белый фон */HTML, соотвественно:
<a href="#" class="gun"><img src="gun.gif" /></a>Если вам не ясно, почему пистолетик «стреляет» (т. е. почему изображение движется, когда наводишь мышку), то тут всё просто — прозрачная область движется (это animated GIF), на белом фоне этого не видно, когда фон меняется, создаётся эффект движущейся пули.
Ещё интересные эффекты можно получить, если использовать
Сайт на мобильных устройствах: Wall4PHP
Латвийский парень Kaspars Foigts реализовал библиотеку Wall4PHP. Это реализация WALL (Wireless Abstraction Library, оригинальная версия создана Luca Passani на Java) на языке PHP. Библиотека предназначена для поддержки сайтом мобильных устройств и позволяет на специальном языке описывать вёрстку, чтобы потом показывать сайт на том языке, который поддерживается устройством (XHTML, WML, модифицированный HTML
Профиль устройства (что именно им поддерживается) описывается на специальном
Сайты в старых браузерах
Мы тут дискуссию развели в рабочем порядке — на тему того как должен показываться сайт в старых браузерах, в IE5, Opera7, FF1 и так далее. Мне подумалось, что надо подключать стили, который убирают всю разметку так, чтобы сайт показался обычной «колбасой», с навигацией. Осталось только отделить старый браузеры от новых. Пути, как мне видится, три — использовать
Пока запишу себе в TODO попробовать сделать это у себя на блоге.
Layout в IE
На хабре есть крайне полезный, но малоизвестный материал «Изучаем наличие layout»:
Множество несоответствий (стандартам) Internet Explorer’а при визуализации
веб-страниц может быть устранено путем присвоения конкретным элементам свойства layout. John Gallant и Holly Bergevin называют эти несоответствия «пространственными ошибками», подразумевая, что они часто могут быть исправлены, если задать элементу ширину или высоту. Это ведет к справедливому вопросу: каким образом layout может менять визуализацию одного элемента и совместное отображение нескольких?
Что такое layout в Internet Explorer, почему работает «хак» «height: 1%» и тому подобное — в этой статье. Крайне рекомендую к прочтению и пониманию всем, кто так или иначе занимается вёрсткой сайтов.
Вертикальный текст: как?
Недавно возникла задача написания вертикального текста. Причём, именно текстом. В CSS3 есть свойство «
<html>
<head>
<style type="text/css">
html>body .canv { display: none }
.canv { filter: flipv() fliph(); writing-mode: tb-rl; width: 10px; height: 150px;
font-size:12px; font-family: Arial; background-color: white }
html>body .obj { display: block; width: 10px; height: 150px }
.obj { display: none }
</style>
</head>
<body>
<div class="canv">Hello!</div>
<object class="obj" type="image/svg+xml"
data="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'>
<text x='-150' y='10' font-family='Arial' font-size='12' transform='rotate(-90)'>Hello!</text>
</svg>">
</object>
</body>
</html>Замечательно работает во всех соврененных браузерах, но есть недостатки: Safari до сих пор не умеет масштабировать SVG вместе с текстом (а SVG — это вектор!), а FireFox, масштабируя SVG, не увеличивает размеры object. Задание размеров в «pt» ситуацию не исправило.
Тег «object» задан фиксированных размеров, если нужно изменить размер, то параметры «x» и «y» у текста внутри SVG нужно будет исправить (процедура пересчёта значений очевидна,
Конструкция «html>body» позволяет «прятать» CSS от Internet Explorer (включая седьмую версию), свойство
Detect SVG support
Искал код для проверки — поддерживает ли браузер SVG, так и не нашёл ничего подходящего. Написал свой, делюсь:
function DetectSVG()
{
if (navigator.mimeTypes != null && navigator.mimeTypes.length > 0)
return navigator.mimeTypes["image/svg-xml"] != null
var svg = 0
/*@cc_on
@if (@_jscript_version>4)
try { svg = 1; new ActiveXObject("Adobe.SVGCtl") }
catch (e) { return 0 }
@end
@cc_off @*/
return svg
}Первая половина кода проверяет наличие
Трюк с прозрачностью
Ещё интересный трюк с прозрачностью — изменение картинки при наведении на неё мышкой. Трюк в том, что у картинки есть прозрачные области, а при наведении на неё мышкой, у контейнера, где находится картинка, меняется фон. Этот эффект можно использовать для подсвечивания пунктов меню, например, но, впрочем, не буду ограничивать вашу фантазию.
Эффекты для шрифта
Интересная техника изменения шрифта — наложить поверх текста полупрозрачную картинку, что даёт
Причём, такой текст индексируется поисковиками, его можно выделить и скопировать, а возможности его оформления почти безграничны и включают в себя даже анимацию, что может дать интересные эффекты, если применять эту возможность с умом.
TYPE=RANGE
Оказывается, в HTML 3.0 должен был войти тег INPUT TYPE=RANGE, но его,
Как узнать есть ли шрифт
Очень оригинальный JavaScript нашёлся на просторах интернета — JavaScript font detection, т. е. скрипт, который обнаруживает — есть ли у пользователя определённый шрифт или нет.
Принцип прост — скрипт проверяет не является ли имя шрифта, которое запрашивается, шрифтом
Если размеры совпадают, значит шрифта нет.
MHTML
В предыдущей статье я описывал способ для Internet Explorer, позволяющий внедрить картинки
Если подумать, это не сильно меняет дело —
<img src="mhtml:http://sample.com/package1.mht!image.jpg" />
<img src="mhtml:http://sample.com/package1.mht!another_image.gif" />и так далее. Основное достоинство способа — объединение нескольких картинок в одном соединении и его удаётся сохранить.
Сегодня я расскажу как добиться мультибраузерности при помощи SSI. В других скриптовых языках такой проблемы, понятно, не возникает. Я буду рассматривать SSI
Символом «собачки» (@) я буду выделять места, где перевод строки не нужно ставить — просто мне приходится разбивать длинные места на части. Описание, если не интересно, можно и не читать, просто скопировать всё в нужный файл и положить в каталог /images/.
В настройках Apache или .htaccess должна быть включена обработка SSI в файлах .html и .mht:
AddHandler server-parsed .html .mhtПервый файл (или файлы), который понадобится — это файл самой картинки. Он должен начинаться с полного имени картинки, плюс расширение .html. Например, «1.jpg.html», внутри нужно указать
<!--#set var="NAME" value="$QUERY_STRING" -->@
<!--#set var="TYPE" value="image/jpeg" -->@
<!--#include virtual="pict.html" -->@
4AAQSkZJRgABAgAAZABkAAD...код картинки...mJiBFoxCGkShUxyGCMYMRcSwwRiMdRZСледующий файл — img.html. В нём проверяется из какого браузера его вызывают — Internet Explorer или всех остальных (вторым условием убирается Opera, которая иногда притворяется IE) и, в зависимости от этого, выводит, либо ссылку
<!--#if expr="$HTTP_USER_AGENT=/MSIE/ && $HTTP_USER_AGENT!=/Opera/" -->@
mhtml:http://<!--#echo var="HTTP_HOST" -->/images/package1.mht!<!--#echo var="QUERY_STRING" -->@
<!--#else -->@
<!--#include virtual="$QUERY_STRING.html?$QUERY_STRING" -->@
<!--#endif -->Внутри файла package1.mht ссылки на файлы картинок (обратите внимание на параметры вызова в include virtual), в константе BOUND задаётся boundary (разделительная строка), о которой я говорил в прошлый раз. В include надо перечислить (пример показан для двух файлов) все файлы картинок, которые будут входить в этот набор.
<!--#set var="BOUND" value="Next_Section" --><!--
MIME-Version: 1.0
Content-Type: multipart/related; boundary="<!--#echo var="BOUND" -->"
--<!--#echo var="BOUND" -->
Content-Location: index.htm
Content-Transfer-Encoding: base64
Content-Type: text/html
<!--#set var="MHT" value="1" -->
<!--#include virtual="1.jpg.html?1.jpg" -->
<!--#include virtual="2.jpg.html?2.jpg" -->
--<!--#echo var="BOUND" -->-->Последний файл — pict.html. Вызывается он из файлов картинок. Если он вызывается из mht, то выдаёт кусок
<!--#if expr="$MHT" -->--<!--#echo var="BOUND" -->
Content-Location: <!--#echo var="NAME" -->
Content-Transfer-Encoding: base64
Content-Type: <!--#echo var="TYPE" -->
<!--#else -->data://<!--#echo var="TYPE" -->;base64,<!--#endif -->Теперь, как применять эту груду файлов. Всё очень просто — просто вставляем в нужно место следующий тег:
<img src="<!--#include virtual="/images/img.html?2.jpg" -->" />И смотрим на результат. В исходном коде в IE мы должны увидеть ссылку на package1.mht, в остальных браузерах — data URI, во всех браузерах — картинку.
Колдуем с MHTML
Позже, после того, как я уже написал эту статью, мне прислали необходимое уточнение. Я провёл несколько экспериментов, попросил своих друзей и знакомых опросить своих друзей и знакомых и вот что выяснилось:
В некоторых версиях Windows XP, 2000 (закономерность не выявлена, но, видимо, дело в наличии
каких-то Service Pack) и, кажется, во всех 2003, способ не работает, если расширение файла не mht. Это несколько сужает сферу применения данного способа.
Обход этой проблемы читайте в следующей статье. Далее сама статья:
Сегодня немного поколдуем, ок? Тем, кому не интересна кухня, где готовят внутренности сайтов, могут перейти к просмотру
Браузеры всё больше превращаются в комбайны, которые поддерживают десятки схем доступа к данным, от всем известных file, ftp, http, https, до полузабытых gopher, finger, news и так далее. Среди этого списка есть интересная схема — data, который поддерживают уже, кажется, все браузеры, кроме Internet Explorer (включая беты седьмых версий). Для тех, кто незнаком с ним, общий вид строки запроса в этой схеме выглядит так:
смысл в том, что данные (картинки, javascript, другие ресурсы) можно помещать внутрь HTML. Эта схема является частью стандарта HTML 4.0, если я не ошибаюсь, но, в силу того, что она не поддерживается основным игроком на рынке браузеров, используется лишь эпизодически — чаще всего
<img src="data:image/png;base64,iVBORw0KGgoAAAAN...и так далее">Эта схема, кроме возможности помещать различные данные в HTML, имеет и более очевидные преимущества. Обычно, браузер открывает не более
Мы, в нашей студии, обычно стараемся использовать карту ссылок, вместо нескольких мелких кнопок, например, для ускорения загрузки. Я очень много разговаривал с поисковиками Google и Yandex, но они уверены, что в IE внедрение ресурсов в HTML невозможно. Так ли это?
Нет. По крайней мере мне удалось найти минимум один способ сделать это. В интернете я ничего подобного не встретил, так что будет считать, что его изобрёл я. Натолкнула меня на эту мысль одна из кошмарных домашних страниц, которую сверстали в Microsoft Word и сохранили… в формате MHTML.
Этот формат первым начали использовать в браузере от Microsoft (поэтому его иногда расшифровывают как «Microsoft HTML») для того, чтобы можно было сохранять текст со всем содержимым — стилями, изображениями в одном файле, поэтому этот формат ещё называют
MIME HTML сильно отличается от обычного HTML форматом — внутри заголовок, информация об именах и форматах файлов, кодированные файлы изображений и так далее — более всего это похоже на файлы писем с вложениями (посмотрите исходный текст письма в своём почтовом клиенте). Нам было бы интересней, если бы в остальных браузерах показывалось бы
Просматривая
mhtml:http://example.com/file.mht!image.jpg
Причём, оказывается, браузер довольно вольно подходит к формату файла, лишь бы внутри были необходимые секции, что позволяет легко заключить архив внутрь
<!--
Content-Type: multipart/related; boundary="=_NextPart_01C6A9B1.539AB070"
--=_NextPart_01C6A9B1.539AB070
Content-Location: index.htm
Content-Transfer-Encoding: base64
Content-Type: text/html
--=_NextPart_01C6A9B1.539AB070
Content-Location: img.jpg
Content-Transfer-Encoding: base64
Content-Type: image/jpeg
4AAQSkZJRgA....закодированная...base64...картинка...BAgAAZABkAADMdRZ
--=_NextPart_01C6A9B1.539AB070-->
<body>
<img src="mhtml:http://www.test/index.html!img.jpg">
</body>Те, кто знает как устроено обычное электронное письмо изнутри, разберутся и сами, для остальных расскажу. Строка, которую вы видите после слова «boundary», разделяет файл на секции. Секции начинаются с двух минусов и разделяющей строки. Заканчивается
если вы не знаете, что такое base64 и
Я не уверен насчёт четвёртой версии браузера, но 5.0 и выше должны отобразить такой HTML нормально. У этого способа есть преимущество перед схемой data — на файл можно ссылаться несколько раз. Организация вывода разного контента для двух групп браузеров — сейчас довольно простая задача. Лучше всего, конечно, использовать для этого язык на стороне сервера (для JavaScript объёмы данных слишком значительные) — например, SSI или PHP.
Кстати, Opera 9 так же поддерживает
Ещё хотелось бы упомянуть, что Internet Explorer поддерживает ещё одну схему, через которую, вероятно, можно получить доступ к ресурсам