Что такое массив

October 14th, 2010 No Comments »

Давайте разберёмся, что такое массив.

Массив (или массив данных) – это набор однородных элементов, к которым можно достучаться (обратиться) по их порядковому номеру (индексу).

Ваш список студентов в группе (ФИО) можно представить в виде массива.

У массива есть элементы, из которых он состоит.
Каждый элемент имеет индекс (свой порядковый номер. Ещё это можно рассматривать как адрес элемента в массиве) и значение.

Порядковый номер в журнале группы – это индекс. Если твоя фамилия “Аксёнов”, то в массиве учеников у тебя индекс “1” или “2” (в начале в общем).

Твоё “значение” разумеется – “Аксёнов А.Б.”

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

Значением может быть любой скаляр (число, строка, булево значение) либо другой массив. На счёт можно ли в массиве хранить объекты в качестве элементов — не скажу на счёт Си, в РНР можно.

Жильцы в подъезде — тоже массив. Индексом служит номер квартиры. Каждый элемент – другой массив, массив жильцов данной квартиры. В квартире №1 — 5 жильцов, в квартире №2 никто не живёт, в квартире №3 одинокая бабулька — получается что это можно выразить или как

  • [5, 0, 1] – одномерный массив (каждый элемент – скалярное значение)
  • или [ [1,1,1,1,1], [], [1]] – двумерный массив
  • или [ [‘мама’, ‘папа’, ‘сын’, ‘дочка’, ‘бабушка’], [], [ ‘бабушка’]] – тоже двумерный массив

Массив можно выразить в виде таблички.
Одномерный массив – это “вырожденная” табличка, состоящая из одной строчки или столбца: [1,1,2,3,5,8]
Двумерный массив – это одна обычная таблица (например, Пифагора)

[[2,2,4],
[2,3,6],
[2,4,8]]

Вот почитай ещё это — Индексный_массив


От задумки до готового сайта: HTML-верстка

September 24th, 2010 No Comments »

Современный веб-сайт – это сложная структура. Каждая страница состоит из программного кода и графических элементов, которые собираются в единое целое и отображаются браузером. Верстка – связующее звено в процессе превращения графического дизайна сайта в программный код. Возможно, это не самый захватывающий процесс, но без верстки, нарисованный дизайнером макет не сможет превратится в HTML-код, понятный браузеру.

Процесс

Заказчик или начальник или директор, одним словом Босс, желая создать веб-сайт, обычно руководствуется своим представлением о веб-дизайне. Босс может посмотреть на похожие сайты, чтобы “сделать как у них”, может изложить пару идей и найти десяток картинок или фотографий, которые “обязательно должны быть на сайте”. Крайне редко Босс может структурно изложить свои мысли в виде письменного документа.

Получив от Босса наброски сайта “на салфетке”, картинки и ссылки на похожие сайты, Дизайнер открывает Photoshop и начинает создавать макет. В макете Дизайнер не только подбирает цвета, шрифты и стиль, но также разрабатывает элементы управления (кнопки, меню, таблицы).

С первой версией макета Дизайнер идет к Боссу. После фразы “мне все нравится, но давай переделаем несколько вещей” Босс обычно не оставляет камня на камне от разработанного дизайна. Не слишком довольный Дизайнер возвращается за свой Photoshop исправлять дизайн согласно пожеланиям Босса. Затем уже с исправленным дизайном, Дизайнер снова идет к Боссу. Этот процесс может повторятся не один и не два раза. На встречи с Боссом полезно взять Программиста, которому придется писать функциональность сайта. За каждой формой ведь стоит база данных, за каждой кнопкой логина стоит целая система аутентификации и контроля доступа. Программист должен соотносить программные компоненты с нарисованым интерфейсом и участвовать в процессе разработки дизайна.

Когда дизайн основных страниц сайта более-менее утрясен, Дизайнер передает результат своей работы (чаще всего – PSD-файлы, реже PNG) и заметки Верстальщику. Верстальщик, так же как и Дизайнер, открывает Photoshop (или Fireworks, если предпочитает PNG) и начинает прикидывать, как будет лучше расположить элементы HTML, чтобы нарисованый дизайн корректно отображался. Файл PSD “нарезается” на мелкие картинки, фоны, для текстов подбираются шрифты. Конечным результатом работы Верстальщика будет HTML и CSS код, а также мелкие картинки, файлы шрифтов и др. HTML-код описывает какие элементы будут располагаться на экране, а CSS-код будет описывать их взаимное положение, цвета, стили, шрифты текстов и так далее.

Нарезка

Процесс “нарезки” картинки верстальщиком в какой-то мере творческий, неформализуемый. С другой стороны, грамотный дизайнер позаботится о правильном расположении элементов по слоям в PSD/PNG, чтобы верстальщику не пришлось слишком потеть, вычленяя нужный элемент из общего рисунка. Например лого, или маленькая иконка в списке или менюшке – дизайнер с большой вероятностью вынесет их на отдельный слой и их будет легко подхватить верстальщику. Многие картинки придется вырезать с точностью до пикселя, чтобы избежать “мохнатых” кнопок, или чтобы заставить элементы правильно сопрягатся друг с другом. Вероятно иногда придется вырезать кусочек фона или длинные полоски толщиной в 1 пиксель – для различных фоновых градиентов или “распорок”.

Кодирование

В зависимости от выбранной стратегии, верстальщик может верстать либо “табличной” версткой, либо “блочной”. Табличная верстка сейчас применяется реже, и можно сказать, что она устарела, однако у нее есть свои положительные черты. Главное – это то, что каждый элемент можно легко позиционировать относительно верхнего левого угла ячейки таблицы, и он оттуда уже никуда не денется. На табличной верстке легче сделать “резиновый” дизайн, размеры которого изменяются в зависимости от ширины окна браузера. Разные браузеры более-менее одинаково отрисовывают таблицы, т.е. проблем с отображением сайта на разных платформах и браузерах будет меньше. Если не планируется переделывать дизайн в дальнейшем, то таблица может быть более удачным выбором.

Блочная верстка хороша при необходимости быстро сменить дизайн сайта или подстроить его под отображение скажем на мобильном устройстве. Блочная структура легче поддается распознаванию не-визуальными браузерами и “ботами” поисковых систем. В блочной верстке важно установить иерархию блоков (кто чей контейнер) и затем уже накладывать CSS-стили. Пример:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Untitled Document</title>
</head>
<body>
  <div id="header">
    <div id="logo">
    </div>
    <div id="tagline">
    </div>
  </div>
  <div id="menu">
  </div>
  <div id="content">
  </div>
  <div id="sidebar">
  </div>
  </body>
</html>

Движок Federated в MySQL – симлинк в базе данных

March 12th, 2010 1 Comment »

Знаете ли вы, что в MySQL, помимо MyISAM и InnoDB, есть движок под названием Federated?

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

Её можно использоваться для следующих целей:

  1. Каждый раз при собирании БД большого проекта приходится ждать по 15-20 минут, пока загрузится какая-то большая справочная таблица, например, города мира, список аэропортов мира или БД мест развлечений и отдыха. При использовании Federated вам нужно только задать CREATE TABLE — и данные будут сразу доступны из другой базы данных;
  2. Эти справочные таблицы могут использоваться несколькими окружениями вашего проекта — например, на тестовом сайте и на продакш-версии.

Чтобы узнать, поддерживает ли ваш сервер данный движок, воспользуйтесь простейшим PHPMyAdmin — нажмите ссылку Домой (с домиком), затем “Типы таблиц”.

Если он недоступен, то зайдите в ваш my.ini файл, найдите блок “[mysqld]” и вставьте строку “federated” сразу после:

[mysqld]
federated

P.S. Если вы ошиблись в структуре созданной таблицы, PHPMyAdmin покажет вашу БД как пустую 😉 Чтобы исправить это, дропните эту таблицу SQL-запросом — и пересоздайте правильно.

Базы данных в реальном мире

January 13th, 2010 No Comments »

Что будет если студенту дать спроектировать базу данных интернет-магазина ? Пусть студент будет сферический в вакууме, дабы никого не обидеть, но пример абсолютно жизненный.

Студент будучи хорошим учеником, спроектирует что-то вроде такой схемы:

products (id, name, price, quantity) -- для хранения товаров и остатков
users (id, name) -- для хранения пользователей
orders (id, date, sum) -- для хранения заказов

Потом студент свяжет эти таблицы, и будет прав, теория на его стороне:

users_orders (id_user, id_order)
orders_products (id_order, id_product)

Если студент был не просто хорош, а очень хорош, он навесит индексы, и foreign-keys.

Магазин начал работу, товары вносятся в базу, появились клиенты, пошл продажи. Все хорошо, убрали позиции старого ассортимента, добавили новые, пара клиентов забыли свои пароли и создали новые аккаунты. Тут начались чудеса – звонит клиент и просит найти старый заказ, а его нет. А если есть заказ, он оказывается пуст… В чем же ошибка ?

Ошибка в том что в эту сферически-вакуумную базу не были внесены некоторые неидеальности, чтобы учесть неидеальность реальности.

Заказ в интернет-магазине – это не просто список, это факт. Это – снимок реальности в каком то моменте времени. Поэтому таблица должна была выглядеть так:
orders_products (id_order, product_name, product_price, quantity, sum)

Да, можно сказать что в базе появляется избыточность, денормализация. Но это – правильная денормализация. Система теперь отражает реальность правильно – когда и почем был продан конкретный товар. Имея только ссылку на товар, невозможно восстановить события в прошлом – например удаление товара из каталога, переоценка товара и прочие изменения.

С foreign keys и каскадным удалением тоже шутить не надо – удаление плохого пользователя из таблицы users не должно удалять его заказы. Заказ – это факт свершенный, отрицать его или выкинуть ради красоты теории будет неверным.

Анимированные алгоритмы сортировки

April 24th, 2009 No Comments »

Для лучшего понимания алгоритмов сортировки можно посмотреть анимацию их работыдиваниdistributed raman amplifier — нужно только кликнуть на нужный вид.