Oct 14

Давайте обсудим, что такое стек, а также где он применяется.

Что такое стек

Когда я начинал знакомиться с информатикой, компьютера у меня не было, и я читал книжки. Так и наткнулся на это новое для меня слово. В книжке говорилось, что английское слово “stack” означает стопку — как правило, стопку тарелок. Поскольку это слово я прочитал, а не услышал, то было трудно понять, как именно его произносить — “стэк”, “стек” или вообще “стёк” (с тарелок же стекала вода при сушке). Логично. Только годы спустя оказалось, что правильно говорить — “стэк”.

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

Непонятно, что такое однородные элементы и структура данных? Посмотрите на рисунок.

Стопка тарелок

Здесь однороднные элементы — это, конечно, тарелки. Запихнув их в такой деревянный стек, мы можем рассматривать всю кучу тарелок как единый предмет, как единую структуру данных. Так о ней проще говорить и думать (“принеси стек, пожалуйста“), так её проще обрабатывать.

Обратите внимание, что в это специальное тарелочное устройство можно положить и вынуть тарелку только сверху. Если в стопке 4 тарелки, и вы поместили сверху пятую, то вынуть можно сначала только её. Это и есть принцип работы стека.

Очевидно, что у стека есть всего три операции: добавить тарелку (так называемая операция “push“), вытащить (“pop“) и прочитать значение верхнего элемента (посмотреть, остались тарелки или уже пусто).

Где применяется стек

Магазин с обоймой патронов — самый настоящий стек.
Магазин патронов

Когда врач на приёме говорит вам “Подождите пока что за дверью“, вы выходите, но не становитесь в в конец очереди пациентов, а становитесь как бы самым первым (“сказали подождать!“) — отодвигая назад, в толпу того, кто был уже вот-вот у заветной двери, омрачая его счастье. Поздравляю: теперь вы — вершина стека.

Вы применяете стек, когда начинаете бросать одни дела ради более срочных — “потом доделаю!”. Из-за того, что на хранение элементов стека расходуется память, вы устаёте сильно быстрее, чем если бы заканчивали каждую задачу до того, как хвататься за следующую.

Лоток принтера с бумагой, игра “Ханойские башни” — простые примеры стека.

Ханойские башни

Более изощрённые примеры применения стека — любая рекурсивная задача (“так, старую итерацию пока отложу в стопку, а сейчас надо обрабатывать новую итерацию!“), например, перебор маршрутов исследовательского робота в пещере неизвестной конфигурации.

Самые первые калькуляторы были напрямую сделаны как стеки. Вместо “2+2″ нужно было ввводить “2 2 +”. Первые два элемента (“операнды”) клались в стек, пока не будет введён плюс (“оператор”).
Калькулятор

Удачи, и следите, чтобы ваш стек не переполнялся!

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

Oct 14

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

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

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

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

Порядковый номер в журнале группы – это индекс. Если твоя фамилия “Аксёнов”, то в массиве учеников у тебя индекс “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]]

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

Sep 24

Современный веб-сайт – это сложная структура. Каждая страница состоит из программного кода и графических элементов, которые собираются в единое целое и отображаются браузером. Верстка – связующее звено в процессе превращения графического дизайна сайта в программный код. Возможно, это не самый захватывающий процесс, но без верстки, нарисованный дизайнером макет не сможет превратится в 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>
Mar 12

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

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

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

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

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

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

[mysqld]
federated

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

Jan 13

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

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

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 не должно удалять его заказы. Заказ – это факт свершенный, отрицать его или выкинуть ради красоты теории будет неверным.


[ автокраны Liebherr аренда автокрана круглосуточная работа . Мебель для ванной мебель для ванной комнаты два водолея . Ремонт принтера HP . Stabils majaslapas hostings. ]