webdev

 

Страницы: | 1 | 2 |

Хранение изображений в БД

31 октября 2008 // Хельги

Пять лет прошло, и, однако, ничего не изменилось.

Люди делятся на две категории: нормальные и Верующие в Чудесную Мощь Баз Данных. Первые используют базы данных, когда это удобно, вторые — всегда.

Для того, чтобы написать движок блога, можно воспользоваться БД, а можно обойтись без неё. Кто-то считает, что с базой удобнее работать, кому-то требование иметь БД для работы движка кажется завышенным. Это всё вопросы вкуса.

«Тёплый край» не использует баз данных в первую очередь потому, что когда я начинал его писать, он жил у меня на ноутбуке. Я рассудил, что поднимать тяжеловесные сервисы мне совершенно не надо, и поставил не «Денвер» и не IIS, а маленький лёгкий сервер под названием xitami. И отладочная версия «Индианы», между прочим, до сих пор у меня на ноутбуке именно под xitami и работает.

Между прочим, по этой же причине у меня в «Индиане» нет поддержки mod_rewrite. Зато и требований никаких нет: IIS, xitami, «Апач» — всё сгодится, была бы поддержка CGI.

Так вот, когда Рус говорит: «Когда я начинал писать этот движок, один хороший человек [то есть я — Х.] советовал мне вообще отказаться от MySQL в пользу самописного интерфейса к текстовым файлам», — он, конечно, лукавит. База так база, тем более что вопрос совместимости его мало когда волновал. Но хранить изображения в базе — это уже даже не благородное безумство, а некий способ-делать-всё-через-выхлопную-трубу.

…[Я] недолго заморачивался на способе хранения изображений на сервере, а просто сделал то, что хотел сделать давно: изображения хранятся в базе, а не на ФС.

Весёлые картинки

Если вы поленились сходить по самой первой ссылке, прочитайте прямо так:

When using a normal web server setup, images should be stored as files. That is, store only a file reference in the database. The main reason for this is that a normal web server is much better at caching files than database contents. So it it's much easier to get a fast system if you are using files.

Официальная документация MySQL, «5.2.12 Other Optimisation Tips»

Или, если угодно, из другого источника, по-русски:

Не старайтесь поместить в базы данных всю информацию, которая у вас есть. Например, не нужно хранить там картинки, хоть MySQL это и позволяет. Помещая в базу данных двоичные образы графических файлов, Вы только замедлите работу своего сервера. Прочитать файл с картинкой с диска гораздо проще и, с точки зрения потребляемых ресурсов, экономичнее, нежели соединиться из скрипта к SQL, сделать запрос, получить образ, обработать его и, выдав нужные http-заголовки, показать посетителю веб-сервера. Во втором случае операция выдачи картинки потребует в несколько раз больше ресурсов процессора, памяти и диска. Также стоит помнить о том, что существуют механизмы кэширования веб-документов, которые позволяют пользователю экономить на трафике, а при динамической генерации контента вы фактически лишаете своих посетителей этой удобной возможности.

Оптимальное использование MySQL

Дело не в том, что хранить изображения в базе маменька не велит, нет — дело в том, что организовать хранение не перректально, а обычным способом проще.

И первые грабли, на которые наступил Рус, это подтверждают. Если хранить изображения на диске, last-modified сервер отдаст сам.

Кстати, в проекте, над которым я работаю, есть необходимость хранения больших объёмов двоичных данных. И они — невероятно! — хранятся не в базе, а на диске. В виде файлов.

Тэги: indiana, webdev, мета
Комментарии (2)

Открытие файла из общей папки по ссылке с веб-страницы

27 октября 2008 // Хельги

Google Desktop Search отображает результаты поиска по дискам компьютера при помощи специального сервера, который обслуживает запросы с интерфейса lo. При этом результаты поиска отображаются в виде веб-страницы, на которой есть ссылки на открытие как найденных файлов, так и папок, в которых они лежат. Ясно, что простой ссылкой вида

<a href="d:\documents\plan.doc">plan.doc</a>

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

Я приспособил эту идею вот для чего. У меня дома есть сервер, на котором, во-первых, лежат разные файлы, а, во-вторых, крутится интранет-сайт. Файлы просто находятся в общей папке (\\serv\share), которая подмонтирована к каждому из компьютеров сети как сетевой диск (S:). Таким образом, к файлу plan.doc, лежащему в папке share\docs, можно обратиться с любого компьютера по адресу S:\docs\plan.doc.

Теперь собственно задача. Я хочу иметь возможность поставить с интранет-сайта (доступ к которому есть только изнутри сети) ссылку на этот документ.

Я написал небольшой сценарий на питоне. Этот сценарий запускает сервер (применён BaseHTTPServer) на порту 8080, каковой сервер отвечает на пришедшие запросы, открывая при помощи функции startfile() папку, имя которой было передано в строке запроса:

def browse(path):
    folder = normpath(unquote(path).decode('utf-8'))
    startfile(folder)

Этот сценарий был добавлен в автозагрузку на всех компьютерах сети. Теперь для создания ссылки на share\docs\plan.doc можно использовать такой код:

<a href="http://localhost:8080/s:/docs/plan.doc">plan.doc</a>

Некоторые детали, такие как проверку реферера для защиты от посторонних ссылок, я опустил для краткости.

Редакция от 18 мая 2010
Тэги: python, webdev
Написать комментарий

Фиксированная ширина, по центру

21 октября 2008 // Хельги

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

#content { position: absolute; left: 50%; margin-left: -350px; width: 700px }

А вот зачем Рус внутри всё верстает таблицей — ума не приложу.

Редакция от 22 октября 2008
Тэги: webdev
Комментарии (3)

Кавычки в RSS и идиосинкразии IE

21 сентября 2008 // Хельги

Поиск по блогам «Яндекса», индексируя RSS-ленту, заменяет в ней нормальные кавычки на машинописные. Наверное, это нужно для совместимости, но меня раздражает.

* * *

Женя посоветовал использовать IE Developer Toolbar для отладки веб-страниц. Я предпочитаю инспектор Safari, или Opera Dragonfly, или Firebug, но недавно возникла необходимость отладиться именно в «Интернет эксплорере» (остальные браузеры показывали всё нормально), и «дев-тулбар» пригодился.

* * *

«Интернет эксплорер» неправильно рендерит PNG, искажая цвета. Я пытался с этим бороться, но так ничего и не смог сделать. Пришлось сохранить картинку-логотип как GIF.

23 октября: Вот что пишет об этом эффекте Артемий Ломов:

…случается, что браузер от Microsoft искажает цвета PNG-изображений с индексированной (т. е. жестко заданной!) палитрой. Это происходит, в частности, при сохранении PNG-файлов при помощи Photoshop CS или ImageReady CS, тогда как при отображении картинок, сохраненных, скажем, в ImageReady 1.0, такого эффекта не наблюдается. Означенные искажения незаметны, если картинка стоит особняком на контрастном фоне. Но когда речь заходит о точном совмещении цветов изображения и фона, фальшь становится видна невооруженным глазом. Firefox и Opera, ясное дело, показывают все картинки как положено, так что вина здесь вряд ли лежит на продуктах Adobe.

«Шестёрка» метит в короли

Редакция от 31 марта 2009
Тэги: webdev, браузеры
Комментарии (2)

Зеркала и форканье отвратительны, так как они умножают

8 сентября 2008 // Хельги

Последний раз, когда у меня стояла задача аккуратно, без дураков, сверстать сайт так, чтобы он был совместим со всеми браузерами, их было три: IE6, Firefox, Opera. Ещё где-то на задворках ютился IE5.5 из Windows 2000.

Сейчас браузеров пять. Добавились IE7 и Safari. Конечно, первый похож на своего предшественника, а Safari мало отличается от «оперы» и «файрфокса», но жить стало сложнее.

P.S. «Зеркала и форканье отвратительны, так как они умножают число сущностей» — так читался бы заголовок, если бы я сообразил не делать ограничение на число символов в заголовке записи.

Тэги: webdev
Написать комментарий

Человеческие диффы при редактировании комментариев

2 августа 2008 // Хельги

Всё-таки хранить оригинальный комментарий стóит. Диффы, конечно, не работают — настоящие, версионные диффы — их просто не будут просматривать, это тяжело и неудобно.

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

А дифф между первой и последней версией лучше показывать не по-военному, двумя колонками, а по-редакторски, при помощи тэгов <ins> и <del>.

/users/helgi/diff.png

Прелесть такого подхода в том, что дифф для корректорских правок будет легко читаться, а дифф полностью изменённого комментария — нет. Кроме того, браузеру можно будет скормить размеченную «разницу», а вывод оригинала, диффа или финальной версии переключать посредством клиентского сценария, попросту меняя атрибут style. Скриншот выше получен именно таким способом.

Разумеется, яркую предупреждающую подпись под отредактированным комментарием никто не отменял. Рядом с ней можно расположить и переключатель вида.

Днём позднее: Я сделал «живую» демку диффов, о которых говорил.

Редакция от 9 октября 2008
Тэги: webdev, лучшее
Написать комментарий

Обновлённый дизайн «Тёплого края»

19 февраля 2008 // Хельги

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

Тэги: design, indiana, warmland, webdev
Написать комментарий

Потеря целостности в процессе эволюционирования

17 февраля 2008 // Хельги

В год Г пишется некий сайт. Предположим, личный дневник, он же слово на букву «Б». Туда пишутся заметки. Текстовые преимущественно. Со ссылками — внутренними и внешними. И с иллюстрациями. Все довольны.

Год выдержки, и золотые токи весёлый нрав начнут приобретать сайт подвергается некоторой переработке. Меняется движок. Перерабатывается структура сайта.

Проходит ещё лет пять. К этому времени, как ни печально, большинство внешних ссылок теряют свою актуальность. И, что ещё печальнее, часто ломаются ссылки внутренние. И пропадают иллюстрации. Это особенно обидно.

Тэги: webdev, мета
Комментарии (4)

IIS теперь тоже поддерживается

14 февраля 2008 // Хельги

Для портирования под Internet Information Services в движке пришлось поменять до смешного немного. Более того, самый главный баг вообще бы не вылез, если бы я адаптировал транк, а не ветку 0.5.10/onr. Баг был связан с тем, что IIS, в отличие от apache и xitami, вешается при попытке повторного вызова cgi.FieldStorage() при POST-запросах. На других двух серверах просто возвращается пустая форма. В транке этот баг не вылез бы потому, что там я уже переделал всё ядро, и двойной вызов там убран.

Второй баг связан с тем, как IIS трактует переменную окружения PATH_INFO. Рассмотрим три сервера по порядку.

Xitami

Под xitami все URL’ы выглядят так:

http://example.com/cgi-bin/sitename/?v=abc (GET)
http://example.com/cgi-bin/sitename/index.py (POST)

Соответственно, PATH_INFO == "" (вполне логично).

apache

На warmland.ru я использую mod_rewrite, и адреса переписываются так:

http://example.com/?v=abc
->  http://example.com/cgi-bin/sitename/?v=abc (GET)
http://example.com/index.py
->  http://example.com/cgi-bin/sitename/index.py (POST)

И тут PATH_INFO == "".

IIS

IIS же считает, что все пути, по которым лежат сценарии, виртуальны.

http://example.com/?v=abc (GET)
http://example.com/index.py (POST)
http://example.com/dir/?v=abc (GET)
http://example.com/dir/index.py (POST)

В первых двух примерах PATH_INFO == "index.py". Во вторых двух PATH_INFO == "dir/index.py". То есть IIS не только рассматривает путь как PATH_INFO, но и раскрывает directory default. Почему — неясно. Ясно только, что мои идеи использовать PATH_INFO накрылись медным тазом. Если я хочу поддерживать все три сервера, то надо быть очень конвенциональным — никаких рерайтов, никаких PATH_INFO.

Тэги: indiana, webdev
Написать комментарий

Spam happens

8 февраля 2008 // Хельги

До меня наконец добрались спамеры. Пора делать защиту в комментариях.

Тэги: webdev
Комментарии (2)

Forward compatibility

22 января 2008 // Хельги

В новом выпуске «A List Apart» обсуждается вопрос совместимости вперёд: многие сайты, заточенные под IE6, ломаются под IE7. Того же самого ожидают и при выходе IE8.

Забавно, но у меня ситуация обратная. Например, стиль Complex движка в IE7 отображается нормально, а в IE6 — нет.

Тэги: indiana, webdev
Написать комментарий

SGML Parser vs. Tidy

1 мая 2007 // Хельги

Поставил себе новую версию плагина HTML Validator. Раньше этот плагин прогонял текст страницы через Tidy, а теперь предлагает на выбор: использовать Tidy, SGML Parser (который validator.w3.org) или и то, и другое. Я, как перфекционист, выбрал последний вариант. Узнал много нового об ошибках на своём сайте. Что же, буду править.

Update: Кое-какие ошибки поправил.

Редакция от 10 ноября 2008
Тэги: indiana, webdev
Комментарии (2)

Интересности для web-дизайнеров

16 октября 2006 // Хельги

Марк Ньюхауз делится интересными приёмами вёрстки при помощи CSS в своей статье Practical CSS Layout Tips, Tricks, & Techniques.

Редакция от 16 сентября 2008
Тэги: webdev
Написать комментарий

Страницы: | 1 | 2 |