Home
Заметки веб-технолога

Реклама

Date: 2007-11-29 22:22
Subject: Мёртвый скроллбар в Опере
Security: Public
Tags:bug, css, opera

Обнаружил в Опере 9.24 ранее неизвестный баг. Следующий код порождает мёртвый горизонтальный скроллбар:

<div style="position: absolute; overflow: auto"><div>Тарам-пам-пам</div></div>

В других браузерах всё нормально.

5 Comments | Post A Comment | в избранное | рассказать другу | ссылка



Date: 2007-10-24 20:40
Subject: Clearing floats
Security: Public
Tags:css

Кто-нибудь может объяснить, почему даже маститые верстальщики до сих пор используют монструозный Easy Clearing, в то время как ещё год назад PPK опубликовал гораздо более лаконичный Clearing floats? Сравните:

Easy Clearing:

.clearfix:after {
    content: "."; 
    display: block; 
    height: 0; 
    clear: both; 
    visibility: hidden;
}

/* MSIE6- */
* html .clearfix {
    height: 1%;
}

/* MSIE7- */
.clearfix {
    zoom: 1;
}

Clearing floats:
.clearfix {
    overflow: auto; width: 100%;
}

Post A Comment | в избранное | рассказать другу | ссылка



Date: 2007-06-18 17:23
Subject: Множественный UPDATE
Security: Public
Tags:mysql

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

UPDATE
	table
SET
	field = ELT(FIELD(id, $sIdList), $sValueList)
WHERE
	id IN ($sIdList)

Плюс: вместо пачки запросов всего один UPDATE.

Минус: MySQL-specific.

Post A Comment | в избранное | рассказать другу | ссылка



Date: 2007-06-18 17:21
Subject: HTML5
Security: Public
Tags:html, web forms

HTML5 differences from HTML4

Молодцы, что позаимствовали часть спецификации Web Forms. Ну и новые элементы тоже порадовали. Посмотрим, во что всё это выльется.

Post A Comment | в избранное | рассказать другу | ссылка



Date: 2007-05-15 12:20
Subject: MSSQL vs MySQL
Security: Public
Tags:google, mssql, mysql

Google рекомендует:

6.32 КБ

1 Comment | Post A Comment | в избранное | рассказать другу | ссылка



Date: 2007-05-04 11:18
Subject: OR vs UNION
Security: Public
Tags:mysql

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

Решение «в лоб»:

SELECT
	object_id AS id,
	...
FROM
	object
WHERE
	thread_id = 123
	OR parent_id = 0

Проблема в том, что такой запрос не сможет использовать индексы.

В документации по MySQL предлагают оптимальное решение: заменить OR на UNION.
SELECT
	object_id AS id,
	...
FROM
	object
WHERE
	thread_id = 123
UNION
	SELECT
		object_id AS id,
		...
	FROM
		object
	WHERE
		parent_id = 0

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

Post A Comment | в избранное | рассказать другу | ссылка



Date: 2007-04-21 08:35
Subject: Еврейский SQL сервер
Security: Public
Tags:смешно

Еврейский SQL сервер отвечает запросом на запрос.

Post A Comment | в избранное | рассказать другу | ссылка



Date: 2007-03-27 04:24
Subject: Формат TIMESTAMP
Security: Public
Tags:mysql, parser

В MySQL есть два похожих типа столбцов: DATETIME и TIMESTAMP. Одно из отличий состоит в том, что DATETIME имеет вид YYYY-MM-DD HH:MM:SS, а TIMESTAMP отображается как YYYYMMDDHHMMSS. С последним и выходит загвоздка: такое представление не поддерживают ни Парсер, ни другие известные мне языки. В MySQL 4.1 это поведение исправлено. Если же доступна только версия 4.0, приходится идти на ухищрения.

Первый способ: сразу приводить дату к необходимому формату средствами MySQL (DATE_FORMAT). Подходит в большинстве случаев и, к тому же, даёт выигрыш в скорости.

Второй способ я обнаружил случайно:

DATE_ADD(dt_update, INTERVAL 0 DAY) AS dt_update

или, в «терминах» класса Sql.p:

^pSQL.dateAdd[dt_update;0] AS dt_update

Применение функции DATE_ADD с нулевым интервалом приводит дату к формату YYYY-MM-DD HH:MM:SS, с которым уже можно работать в Парсере. Способ абсолютно безопасный: когда хостер наконец проапгрейдит MySQL до последней версии, этот код останется работоспособным.

Post A Comment | в избранное | рассказать другу | ссылка



Date: 2007-03-18 00:22
Subject: Класс для RUpay
Security: Public
Tags:parser, rupay

Написал на Парсере класс для работы с системой платежей RUpay. Схема стандартная: заказ формируется на сайте магазина и отправляется на сервер RUpay. Посетитель выбирает способ оплаты и переводит деньги. После получения платежа сервер RUpay посылает уведомление об оплате на сайт магазина. Пара моментов. )

Post A Comment | в избранное | рассказать другу | ссылка



Date: 2006-12-18 03:10
Subject: Долой www
Security: Public
Tags:apache, google, rewrite, seo, яндекс

Сегодня уже не только нет необходимости в использовании приставки www, но даже можно говорить о том, что она вредна, и мешает тем, что приходится прописывать для каждого сайтов два URL-адреса, программистам приходится учитывать два возможных обращения к сайту, а уж как неудобно произносить вслух эти «Вэ-Вэ-Вэ» или «Даблъю-Даблъю-Даблъю»…

Согласен с Русланом Курепиным, автором сайта nowww.ru, в абсолютной бесполезности префикса www. Но избавляться от него следует осторожно, особенно, если Ваш сайт уже проиндексирован поисковыми системами.

С Яндексом всё просто: достаточно добавить в файл robots.txt директиву Host: example.com. Она подскажет Яндексу, что основным зеркалом является домен без www. Это со временем отразится и на ссылках в результатах поиска.

С Гуглом всё немного сложнее. Сначала необходимо завести учётную запись. Затем зайти в Инструменты для веб-мастеров и добавить сайт. Чтобы доказать право управления сайтом, придётся либо либо разместить на сервере специальный файл, либо добавить определённый мета-тэг в код страницы.

Как только сайт будет подтверждён, Вы сможете выбрать для него основное доменное имя. По идее, это должно благотворно повлиять на PageRank, т. к. по умолчанию Гугл считает его отдельно для example.com и www.example.com. Гугловцы обещают (но не гарантируют), что это настройка повлияет на ссылки в результатах поиска.

А как настроить саму переадресацию? Я использую для этой цели mod_rewrite:
RewriteCond %{HTTP_HOST} ^www\.(.+)$
RewriteRule .*           http://%1/$0 [R=301]

HTTP-cтатус 301 означает, что страница переехала навсегда, а не временно.

Post A Comment | в избранное | рассказать другу | ссылка



Date: 2006-10-30 11:06
Subject: Web Forms и серверная валидация
Security: Public
Tags:opera, web forms, xml, идея

Оказывается, в девятой Опере ввели экспериментальную поддержку Web Forms.

Узнал я об этом во время тестирования нового XSLT-шаблона для форм. Атрибут required каким-то образом просочился в HTML, и Опера напрочь отказывалась отправлять форму, требуя заполнить обязательное поле. Никаких перезарузок страницы, никаких скриптов — радость для веб-мастера!

Всё это хорошо, но в других браузерах поддержкой Web Forms и не пахнет (да и сама спецификация находится в состоянии Working Draft). Кроме того, серверную валидацию никто не отменял.

С другой стороны, Web Forms изначально разрабатывались с учётом обратной совместимости, что позволяет уже сейчас использовать расширенный набор элементов и атрибутов как в HTML-, так и в XML-коде для серверной валидации. Например. )

Post A Comment | в избранное | рассказать другу | ссылка



Date: 2006-10-29 01:41
Subject: .masterhost обновился
Security: Public
Tags:masterhost, mysql, unicode

Только я задумался над тем, как хранить в MySQL 4.0 данные на разных языках, как .masterhost обновил программное обеспечение, в частности, поднялся до пятой версии мускуля. Гип-гип-ура! Да здравствует юникод!

Правда, у меня select version() до сих пор показывает 4.0.26. Может быть, обновление ПО ещё не успело коснуться выделенных серверов? Будем ждать…

2 Comments | Post A Comment | в избранное | рассказать другу | ссылка



Date: 2006-10-16 12:30
Subject: Автозаполнение мета-тегов keywords и description
Security: Public
Tags:parser, seo, решение

@getMetaKeywords[sText][tKeyword;hKeyword;tKey]
$sText[^sText.lower[]]
# удаляем тэги
$sText[^sText.match[<.*?>|&.*?^;][g]{ }]
# выбираем все слова длиннее 3-х букв
$tKeyword[^sText.match[([\w\-]{4,})][g]]
# сортируем по длине
^tKeyword.sort(^tKeyword.1.length[])
# собираем уникальные корни слов
$hKeyword[^tKeyword.hash{^tKeyword.1.left(5)}[$.distinct[tables]]]
$tKey[^hKeyword._keys[]]
# сортируем слова по частоте
^tKey.sort($hKeyword.[$tKey.key])[desc]
# отбираем 20 слов из середины списка
$tKey[^table::create[$tKey;$.offset(($tKey-20)\2)$.limit(20)]]
# перечисляем через пробел
$result[^tKey.menu{$hKeyword.[$tKey.key].1}[ ]]

@getMetaDescription[sText][tMatch]
# удаляем тэги
$sText[^sText.match[<.*?>|&.*?^;][g]{ }]
# берём кусок не длиннее 200 знаков
$tMatch[^sText.match[^^(.{1,200}[\.\?!])]]
$result[$tMatch.1]

1 Comment | Post A Comment | в избранное | рассказать другу | ссылка



Реклама

my journal
Ноябрь 2007