Search
Write a publication
Pull to refresh
4
0
xRay @xRay

Пользователь

Send message

Хранение файлов в MySQL и их быстрая раздача

Reading time3 min
Views98K
Думаю у многих возникала необходимость хранить файлы, связанные с записью в таблице. Это может быть картинка к новости, аватар, загруженный пользователем файл — да все, что угодно. Обычно в этому случае поступают просто — файл ложится в файловую систему, а ссылка на него — в запись БД.
Но у такого классического похода множество недостатков:
  • файлы не удаляются при удалении соответствующей записи БД
  • проблемы при одновременной попытке обновления файла
  • нарушение синхронизации между БД и файловой системой при откате транзакции
  • при резервном копировании и восстановлении информации в БД может возникнуть рассинхронизация с файловой системой
  • файлы не подчиняются ограничениям доступа, наложенным с помощью БД

Больше о проблемах, возникающих при хранении файлов отдельно от БД можно почитать в презентации SQL Antipatterns, раздел Phantom Files, страница 60. Кстати, автор презентации предлагает решение — хранить файлы прямо в БД, в поле типа BLOB. Правда следует замечание, что это должно быть взвешенное решение в каждом конкретном случае. Ведь при таком способе хранения файлов вебсервер должен при каждом запросе вызывать некий скрипт, который будет извлекать файл из БД и отдавать пользователю, что неминуемо отрицательно скажется на производительности.
Для поиска решения данной проблемы был проведен мозговой штурм и придумано несколько вариантов решения проблемы:
Читать дальше →

µTorrent переходит на UDP-протокол

Reading time1 min
Views20K
На форуме разработчиков клиента µTorrent появилось сообщение, что новая альфа-версия этого популярного торрент-клиента µTorrent 1.9 build 13485 поддерживает работу в режиме uTP (UDP torrenting). Более того, такой режим будет стоять по умолчанию. Другими словами, передача файлов в торрент-сетях (а это более 50% мирового трафика) может перейти с протокола TCP на протокол UDP. Для торрентов пинг снижается с 2000 мс до 50-100 мс (результаты тестирования см. в PDF), это хорошо. Но чем это грозит для качества работы VoIP, многопользовательских игр и других приложений, которые используют UDP для передачи данных (и в данный момент потребляют не более 2% мирового трафика) — сложно даже предположить.

В данный момент телекомы эффективно угнетают торрент-трафик, освобождая полосу в пиковые часы. Если торренты перейдёт на UDP, то телекомы не смогут делать это на существующем оборудовании. По крайней мере, существующая практика пакетной атаки типа TCP RST, которую использует Comcast и другие провайдеры, станет полностью бесполезной.

Первые тестеры, которые уже проверили работу новой альфа-версии µTorrent, рапортуют о том, что на них не действует шейпинг в сети провайдера Bell Canada. Использовать эту раннюю версию, однако, не советуем, потому что в ней ещё много серьёзных багов.
Читать дальше →

Тег label

Reading time1 min
Views21K
Когда уже горе-верстальщики научаться использовать этот тег? Повсюду в проекте такие ляпы:

<form ...>
 <input type="checkbox" ..> Поставьте галочку, чтобы стало зае...сь <br>
 ...
</form>


Видя такое, пользователь сначала кликает на надпись, обламывается, кликает на сам чекбокс.
Разве нелья было сразу сделать так?
<form ...>
 <label><input type="checkbox" ..> Поставьте галочку, чтобы стало зае...сь</label><br>
 ...
</form>


Некоторые даже вешают обработчик события OnClick на кусок текста, лишь бы не использовать label… :(

Три первых шага к оптимизации LAMP

Reading time2 min
Views5.5K
Бытует мнение, что связка LAMP (Linux+Apache+Mysql+PHP) не требует особой настройки и работает «из коробки». Это далеко не так. После того, как я долго убеждал товарища установить кеширующий акселератор PHP xcache, я решил провести небольшой эксперимент и попробовать выключить xcache на своём виртуальном сервере, находящемся под небольшой нагрузкой (около хита в секунду). В реальной жизни нагрузка на процессор мала, а вот память загружена сильно, т.к. её немного (256МБайт).

Результаты эксперимента превзошли все ожидания.
Читать дальше →

Javascript: Visual Event

Reading time1 min
Views9K
Отменнейшая JS библиотека, базированная на jQuery. Позволяет простым наведением мыши на объект увидеть все event'ы, которые на него повешены. Запускается через букмарклет.

Подробности на странице автора.

http://www.sprymedia.co.uk/article/Visual+Event

P.S. Я хотел разместить пост-ссылку, но хабру, видимо, не нравится плюс в URL…

PHP, PREG и UTF-8

Reading time6 min
Views16K
В этом посте речь пойдет о работе РНР5 с multibyte строками посредством preg_*() функций.

Заметил интересное положение дел, вобщем-то давным давно описанное в интернете, но актуальное и по сей день (вопрос всплыл всвязи с недавним постом про trim()).
Читать дальше →

Настройка резервного копирования в Ubuntu

Reading time4 min
Views99K

Настройка резервного копирования в Ubuntu за 20 минут.


Для работы над проектами использую svn, который находится на удаленном виртуальном выделенном хосте, под управлением ubuntu 8.04. Со временем объемы данных выросли, как и критичность этих данных. Потеря чего-то снилась в кошмарах. Время от времени копировал репозитории на локальный компьютер. Недавно мне это надоело. И я стал искать возможности автоматизировать это дело. Не буду говорить о поисках и вариантах, расскажу о результатах.

Итак, мы имеем удаленный хост под управлением ubuntu, с некоторым массивом довольно критичных данных. Довольно логичным было бы настроить бэкап прямо на удаленном хосте, с помощью tar по крону, rsyns и т.д. Но, т.к. место на виртуальном выделенном хостинге довольно дорого и использовать его лучше по делу, идеально было бы, чтобы данные автоматически копировались на какую нибудь локальную машину, место на которой хоть отбавляй. В моем случае это файловый сервис в офисе, под управлением все той же Ubuntu.

Итак, приступим

Разворачивание широкой таблицы в столбец (EAV pattern)

Reading time3 min
Views30K

Задача


Есть сущность, которая характеризуется огромным и часто переменным числом параметров. Задача хранить эти сущности да еще и так чтоб поиск тоже можно было вести желательно еще и с построением индекса.
Читать дальше →

widget своими руками

Reading time8 min
Views12K
Привет.

Наверное, многие из вас пользовались стандартными javascript-виджетами, написанными как безвестными разработчиками, так и крепкими профессионалами, так и гуру. Есть великолепные коллекции виджетов, поставляемых в качестве плагинов к известным фреймворкам (вроде jQuery, Prototype JS, YUI), так и целые фреймворки, акцентирующие свое внимание на создании виджетов, вроде Ext JS или qooXdoo.

Но что, если вы не хотите использовать достаточно объемный фреймворк для создания простого диалогового окна, или хотите разобраться в том, как создаются такие виджеты, или даже разрабатываете собственный фреймворк?

Об этом и пойдет речь в сегодняшнем посте — как сделать простейшее диалоговое окно и alert средствами чистого javascript, без применения каких-либо фреймворков.
Поехали?

SimpleModal — простые модальные окна

Reading time3 min
Views41K
Обзор плагина SimpleModal, его глюков, избавление от глючности, позиционирование по центру экрана и прочие удобства. Вообще я публиковал статью в своем блоге:«SimpleModal — простые модальные окна», но подумал что и хабраюзерам может быть интересно про это узнать. А так же советую взглянуть на более новую статью «Модальные окна на jQuery blockUI». Не все же с лайтбоксами играться.
Читать дальше →

USB в VirtualBox

Reading time1 min
Views57K
После установки VirtualBox в Ubuntu не подключаются USB устройства в виртуальных машинах.
Дело в том, что информацию об устройствах VirtualBox берет из файловой системы /proc/bus/usb, которая в Убунте не примонтирована. Чтобы ее смонтировать, пишем в /etc/fstab следующее:
none /proc/bus/usb usbfs devgid=125,devmode=664 0 0
Сохраняем файл, и выполняем в консоли sudo mount /proc/bus/usb
Теперь можно подключать устройства к виртуальным машинам.

nginx: другой аллокатор

Reading time1 min
Views2K
Хочу представить публике небольшой патч, который подменяет аллокатор.

Кратко: после его применения потребления памяти сократилось почти в два раза, а idle вырос на 15%.

Update: учел исправления, добавил jemalloc и опции для выбора с чем собирать. Краткое описание и патч.

Update: провел микро тестирование

ExtJS и хостинг базовых файлов в CDN

Reading time2 min
Views1.9K
Если вы разрабатываете проекты на ExtJS, то наверняка в вашем дереве исходных кодов есть сам дистрибутив библиотеки и вы его подключаете на всех страницах, где используются ее возможности. И храните саму библиотеку также у себя на хостинге. Это, конечно, правильный и простой подход, но имеет свои ограничения. Во-первых, в большинстве случаев именно ExtJS будет самым большим компонентом страницы, ведь его общий объем около 1 Мб, а значит и будет тормозить страницу, пока браузер не загрузит всю библиотеку. Как выход, все рекомендуют настраивать сжатие (например, mod_deflate, хорошо, что браузеров, которые не понимают сжатый контент, теперь почти нет, а у кого есть, тот, как говорится, сам себе злобный буратино), теги кеширования и т.п. Ну и на крайний случай — собирать под свой проект, или даже под каждую страницу, свою версию библиотеки, включая туда необходимые компоненты. Я уже писал о структуре фреймворка и расположенном на сайте конструкторе, который сможет автоматически сформировать вам ваш личный дистрибутив.
Читать дальше →

Встроенному perl'у быть!

Reading time12 min
Views6.8K
Однажды холодной сибирской зимой начальство решило согреть нашу команду горячей начальственной любовью и передало в наши руки еще один проект. С первого же взгляда обнаружилось несколько серьёзных проблем:
  • Это было написано на PHP;
  • Это было написано на таком PHP, что **** **** ***;
  • Захардкожено было всё, и ни о какой расширяемости или настраиваемости речи не шло. А ведь нагрузка росла не по дням.

В общем, как настоящие русские парни, мы решили все сломать к хренам собачьим и построить заново, сделав красиво. Почесав репу решили, что apache+modperl — это для старпёров и не интересно, а fastcgi — путь слабых духом, поэтому все будем делать на nginx + его вечноэкспериментальный встроенный перл.

Позже я почувствовал себя на густозасеянном разного размера глаблями поле…
Читать дальше →

Нормализация Unicode

Reading time2 min
Views22K
Однажды мне пришлось наблюдать, как спамеры очень интересным образом обходят спам-фильтр. Вместо традиционного URL типа «example.com», ссылка выглядела так:
http://example.com
Ссылка с подобной изощрённой точкой работает в IE7, FF3, Opera 9.5, Safari 3, Google Chrome и не работает в IE6.
Читать дальше →

MACRO — гибкий PHP шаблонизатор, с человеческим «лицом»

Reading time3 min
Views2.7K
Раз уж сегодня на хабре день РНР шаблонизаторов, то не могу не рассказать о MACRO — наиболее гибком шаблонизаторе с читаемыми шаблонами, среди известных мне.
я хочу прочитать третье, за день, описание шаблонизатора

jsForms

Reading time18 min
Views770
Добрый вечер, после написания предыдущего поста прошло уже, наверное, более трех недель, с тех пор мое направление немножко изменилось, да MVC хороший паттерн, но сейчас для js он еще слишком громоздкий. Мы стремимся выбрать более прозрачные и тонкие решения, которые бы позволяли видеть как все работает, вот почему мне нравится jQuery, он вводит тот самый минимум, который позволяет абстрагироваться от типа браузера, но при этом он не убирает ощущение того, что ты пишешь именно на js. Вот почему когда стремясь реализовать паттерн Document-View на js, хотелось сделать его как можно более тонким, незаметным и как мне кажется мне удалось добиться тех же легких ощущений, что все таки это тот же js, просто он немножко расширился.
Как и в WinForms, в jsForms все строится на компонентах. Итак приступим.
далее

Routes. The Beginning

Reading time7 min
Views21K
Роуты в рельсах очень важная вещь. Но до поры до времени можно даже не обращать внимание на них. Особенно если вы пользуетесь командой scaffold, которая автоматически все прописывает. Но в какой-то момент появляется необходимость создавать нестандартные роуты. Это значит самое время залезать в файл routes.rb в папке config вашего проекта.

Что такое роуты


Роуты — это система маршрутов (путей, url'ов) на вашем сайте. Благодаря роутам мы можем иметь красивые и ясные для пользователей ссылки. Введя ссылку вроде mysite.ru/articles/2008/november/13 мы получим все статьи за 13 ноября 2008 года, а по ссылке mysite.ru/shop/shoes получим каталог обуви из вашего магазина. При всем при этом, структура каталогов сайта никак не изменяется. В любой момент мы можем изменить роуты не трогая расположение самих файлов. Но чтобы все это работало нам необходимо настроить роуты.
тут есть хабракат

Работа с ветками в SVN. Изменения в версии 1.5.

Reading time2 min
Views12K
Продолжение этой статьи

Долгое время в ветках SVN был один существенный недостаток. Система не помнила мержей, и программисту приходилось самостоятельно заботиться о том, что бы сохранить номер ревизии, когда происходило копирование изменений из транка. Проблема частично решалась добавлением комментариев в лог, но все таки это было чревато ошибками, и целиком ложилось на совесть программиста.
В версии 1.5, наконец-то, программисты Subversion выполнили свое давнее обещание, и добавили несколько полезных фич для работы с ветками.
Итак, в версии 1.5 команда merge обзавелась двумя новыми опциями: --record-only и --reintegrate.
Теперь ответственность за контроль копирования изменений ложится целиком на плечи SVN (merge tracking), а программист может легко, и без боязни выполнять merge так часто, словно это команда update.
Читать дальше →

Multi Theft Auto с открытыми исходниками

Reading time1 min
Views4.5K
После четырёх лет работы создатели игры Multi Theft Auto решили опубликовать исходные коды своей игры под лицензией Open Source.

Multi Theft Auto — это мод для известного хита Grand Theft Auto. Проект действительно очень большой: более 550 000 строк кода на C/C++, 1554 файла, более 11 000 ревизий за четыре года работы, в которой принимал участие 16 программистов.

Теперь, когда исходники открыты для всех, проект Multi Theft Auto может получить новый импульс для своего развития. Собственно, на это и рассчитывают организаторы. Они стремятся сохранить контроль над процессом в своих руках: запустили баг-трекер и будут поддерживать процесс публикации новых билдов каждый день.

Игра основана на ядре MTA Blue, которое, теоретически, может служить основой для любой однопользовательской видеоигры.

Information

Rating
Does not participate
Registered
Activity