вторник, 29 сентября 2009 г.

Устанавливаем кодировку при подключении к базе данных в ORM Doctrine

Всего то делов :

$conn = Doctrine_Manager::connection(...);
$conn->setCharset("cp1251");

пятница, 28 августа 2009 г.

Краткое описание процесса проектирования реляционной базы данных

оригинальная публикация

[19-01-2004] Джо

Краткое описание процесса проектирования реляционной базы данных

MySQL -система управления реляционными базами данных. Реляционная база данных представляет из себя набор таблиц данных, связанных между собой. Relatio (лат) - отношение, порядок расположения ячеек таблицы, одинаковый для всех ее строк, задает отношение между данными строки таблицы. Пример реляционной таблицы:


Магазин снаряжения
МагазинАдресМетроТелефонАссортимент
Терра у ГорьковскойКронверкский пр, 31Горьковская2336303туристическая одежда, обувь,палатки, рюкзаки, спальники
Терра у ЛеснойПарголовская ул, 7Лесная2451290обвязки, веревки, туристическая одежда, треккинговая обувь, палатки, рюкзаки, спальники
СнаряжениеМарата ул, 12Маяковская3110760обвязки, веревки, туристическая одежда, треккинговая обувь, палатки, рюкзаки, спальники
СнаряжениеПерекупной пер, 7/9Площадь Александра Невского1107993NULL

NULL означает, что значение не внесено.

Таблицу называют сущностью, заголовки столбцов таблицы ( наименования полей ) - атрибутами, строку таблицы (запись) - экземпляром сущности, ячейки таблицы ( поля ) - значениями атрибутов.

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

Правила нормализации

1. Значение атрибута для экземпляра сущности должно быть единственным ( 1-я нормальная форма (НФ) сущности );

2. для сущности, уже находящейся в 1НФ, значение каждого неидентифицирующего атрибута должно полностью зависеть от всего уникального идентификатора сущности ( 2-я нормальная форма (НФ) сущности );

3. для сущности, уже находящейся в 2НФ, значение каждого неидентифицирующего атрибута не должно зависеть от значения другого неидентифицирующего атрибута ( 3-я нормальная форма (НФ) сущности );


Попробуем применить эти правила к сущности Магазин снаряжения. Для начала - об идентифицирующих атрибутах. Чтобы избежать путаницы, каждый экземпляр сущности должен иметь идентифицирующий атрибут ( составной идентифицирующий атрибут, состоящий из нескольких неидентифицирующих ). На практике это означает, что в таблице должен присутствовать столбец, все значения в ячейках которого уникальны, не равны NULL и не меняются. В нашей таблице нет ни одного столбца, значения которого были бы уникальны. Самый простой выход - добавить столбец Код, в котором перенумеровать строки по порядку. Первому правилу нормализации явно не удовлетворяет атрибут Ассортимент - в одной ячейке - несколько значений. Чтобы разрешить эту ситуацию необходимо создать новую сущность Вид снаряжения.


Магазин снаряжения
Код магазинаМагазинАдресМетроТелефон
1Терра у ГорьковскойКронверкский пр, 31Горьковская2336303
2Терра у ЛеснойПарголовская ул, 7Лесная2451290
3СнаряжениеМарата ул, 12Маяковская3110760
4СнаряжениеПерекупной пер, 7/9Площадь Александра Невского1107993

Вид снаряжения
Код вида снаряженияНаименование вида снаряжения
1туристическая одежда
2треккинговая обувь
3палатки
4рюкзаки
5спальники
6обвязки
7веревки

При такой организации нет дублирования данных - каждый вид снаряжения вводится только один раз. Очевидно, что между двумя сущностями есть связь. Связи между сущностями обычно бывают 2 типов - "один ко многим" или "многие ко многим". В рассматриваемом примере - связь "многие ко многим" - в каждом магазине несколько видов снаряжения, один и тот же вид снаряжения может быть в нескольких магазинах. Типичный пример связи "один ко многим" - ситуация сотрудник - предприятие (если пренебречь совместительствами) или ситуация отец - дети ( если мать точно знает, кто отец ). Если между сущностями связь "один к одному" - значит одна сущность лишняя.


2-е правило нормализации означает, что мы должны что-то что-то сделать с названиями магазинов Снаряжение. В этом случае атрибут Магазин не полностью зависит от идентифицирующего атрибута Код Магазина. Т. е. в экземплярах сущности с Кодом магазина 3 и 4 содержатся одинаковые значения атрибута Магазин. Но советовать фирме Снаряжение переименовать свои магазины для того, чтобы уложиться в схему нормализации - как-то неправильно, а городить новые сущности для частного случая - только усложнять структуру базы данных. В данном конкретном случае, если все же нормализацию доводить до победного конца, нужно создать еще сущность Название магазина с атрибутами Код магазина и Название.


3-е правило нормализации можно проиллюстрировать так. Допустим, нам надо в описание магазина добавить еще Город и Телефонный код города - два неидентифицирующих атрибута. Но Телефонный код зависит от Города, стало быть, надо создать новую сущность Город с атрибутами - Код ( идентифицирующий ), Название города, Телефонный Код и связать ее с сущностью Магазин снаряжения.

Теперь нужно организовать связь между сущностями Магазин снаряжения и Вид снаряжения. Для этого создаем сущность-связь Магазин >-< Вид снаряжения :


Магазин >-< Вид снаряжения
КодКод магазинаКод вида снаряжения
111
212
321
422

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

Теперь, чтобы узнать, например, какие виды снаряжения есть в магазине Ирбис на Фонтанке, нужно сделать запрос к базе данных. Но это уже совсем другая история.

И напоследок правило ( "бритва" ) Оккама:

Не создавайте сущности без необходимости.

четверг, 30 июля 2009 г.

Ubuntu 8.04 Hardy, графический адаптер Intel и Direct Rendering.

# Проверим, что у нас Intel-видеоадаптер
В ответ на команду

lspci | grep Intel | grep VGA

мы должны увидеть что-то вроде

00:02.0 VGA compatible controller: Intel Corporation Mobile 945GME Express Integrated Graphics Controller (rev 03)
# Проверим, что стандартные драйверы DRI не обеспечивают
В ответ на команду

glxinfo | grep render

мы должны увидеть что-то вроде

direct rendering: No (If you want to find out why, try setting LIBGL_DEBUG=verbose)
OpenGL renderer string: Mesa GLX Indirect
# Установим необходимые пакеты и получим свежую версию драйверов

У меня ядро серверное, поэтому нужон linux-headers-server

sudo apt-get install git-core linux-headers-server automake autoconf libtool
git clone git://anongit.freedesktop.org/git/mesa/drm
# Собираем и устанавливаем libdrm

cd drm
./autogen.sh

вот тут вывалилась ошибка

./configure: line 21249: syntax error near unexpected token `PTHREADSTUBS,'
./configure: line 21249: `PKG_CHECK_MODULES(PTHREADSTUBS, pthread-stubs)'

Наш ответ был : sudo apt-get install pthread-stubs0

Но этого оказалось мало ....


checking for PTHREADSTUBS... configure: error: Package requirements (pthread-stubs) were not met:

No package 'pthread-stubs' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables PTHREADSTUBS_CFLAGS
and PTHREADSTUBS_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more detail


Цитата : "В общем случае, когда configure говорит, что не может найти какой-то пакет, чаще всего это значит, что нет заголовчных файлов для него. Заголовочные файлы обычно находятся в пакете <имя-библиотеки>-dev"

$ sudo apt-get install pthread-stubs0-dev

Наконец можно сделать :

$ make
$ sudo make install

# Собираем и устанавливаем модули

cd linux-core
make LINUXDIR=/lib/modules/`uname -r`/build DRM_MODULES=i810
sudo cp *.ko /lib/modules/`uname -r`/kernel/drivers/char/drm/
sudo depmod -ae


# Перезагружаемся


Если мы всё сделали правильно, glxinfo покажет нам что-то вроде

direct rendering: Yes
OpenGL renderer string: Mesa DRI Intel(R) 945GM 20080517 x86/MMX/SSE2

воскресенье, 26 июля 2009 г.

Форматирование Flash накопителей в Linux.

Обычно флешки имеют файловую систему FAT16. Такое форматирование выбранно для кросплатформности, чтобы их можно было прочитать как под Windows так и под другие OS, в том числе мобильные устройства типа Palm и д.р.

В симействе *nix подобных система существует утилита mkdosfs.
В GNU/Linux Debian она содержиться в пакете dosfstools.
Если у вас он еще не установлен то:

$ sudo aptitude install dosfstools

Для быстрого форматирования:

mkdosfs -F 16 _имя_устройства_

поскольку флешки представляються в системе как SCSI устройства и у вас не IDE винчестеры, то скорее всего они будут представлены как sdbX поетому:

mkdosfs -F 16 /dev/sdb1

Если хочеться воочию убедиться в целостности физичесих секторов, то команда будет выглядеть так

mkdosfs -cvF 16 _имя_устройства_

Debian --- управление системными службами.

Только одно и надо :

$ apt-get install sysv-rc-conf
$ sysv-rc-conf