Вы находитесь на странице: 1из 37

МОСКОВСКИЙ ЭЛЕКТРОННО-ТЕХНОЛОГИЧЕСКИЙ ТЕХНИКУМ

ГОСУДАРСТВЕННОЙ АКАДЕМИИ ИННОВАЦИЙ

Отчет
о прохождении стажировки по профилю специальности

Место стажировки Индивидуальный предприниматель Иванова Татьяна


Владимировна
Срок прохождения стажировки с 13.04.2009 по 01.06.2009

Студент Иванов Евгений Станиславович


Специальность «Программное обеспечение вычислительной техники и
автоматизированных систем» (230105)

Курс 4 группа П-408

Руководитель стажировки Шипиев Роман Николаевич

Москва
2008/2009 уч.год.
МОСКОВСКИЙ ЭЛЕКТРОННО-ТЕХНОЛОГИЧЕСКИЙ ТЕХНИКУМ
ГОСУДАРСТВЕННОЙ АКАДЕМИИ ИННОВАЦИЙ

Утверждаю
Зам. Директора по УПР
В.П. Сандул
« » 2009г.

ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ
на период стажировки
студента гр. П-408 специальности 230105
Иванова Евгения Станиславовича

ТЕМА ЗАДАНИЯ
Разработка электронной аудио-библиотеки

Вопросы, подлежащие изучению:


1. Разработать алгоритмы, необходимые для работы электронной аудио-
библиотеки
2. Спроектировать базу данных для работы электронной аудио-библиотеки
3. Реализовать электронную аудио-библиотеку в виде программного кода
4. Привести контрольный пример работы с электронной аудио-библиотекой

Указания по выполнению задания.


Отчет о выполнении индивидуального задания оформляется записью в
дневнике стажировки. Чертежи и схемы даются в приложении к отчету.

Руководители стажировки:
от предприятия Иванова Татьяна Владимировна (подпись)
от техникума Шипиев Роман Николаевич (подпись)
Индивидуальное задание рассмотрено на цикловой комиссии специальности
«Программное обеспечение ВТ и АС» (230105)

протокол № от 2008/2009 уч.год.


Председатель цикловой комиссии Одиноченко О.В. (подпись)
Дневник
Дата Наименование выполняемой работы Подпись
руководителя
13.04.2009 Изучение и поиск материалов,
18.04.2009 необходимых для реализации электронной
аудио-библиотеки
20.04.2009 Разработка алгоритмов и схем,
25.04.2009 необходимых для реализации электронной
аудио-библиотеки
27.04.2009 Проектирование базы данных электронной
02.05.2009 аудио-библиотеки
04.05.2009 Разработка электронной аудио-библиотеки
09.05.2009
11.05.2009 Тестирование и отладка электронной
16.05.2009 аудио-библиотеки
18.05.2009 Написание отчета о стажировке
23.05.2009
25.05.2009 Получение отзыва о стажировке
26.05.2009 Оформление отчета и дневника по
28.05.2009 стажировке
29.05.2009 Сдача отчета
30.05.2009
ОГЛАВЛЕНИЕ
Введение.......................................................................................................................5
1 Описание алгоритма.................................................................................................6
1.1 Схемы алгоритма...............................................................................................6
1.2 Описание работы программы...........................................................................9
2 Текст программы....................................................................................................15
2.1 Схема базы данных (файл db/schema.rb).......................................................15
2.2 Контроллеры системы ....................................................................................16
2.3 Модели системы..............................................................................................21
3 Инструкция на выполнение программы...............................................................24
3.1 Общие сведения...............................................................................................24
3.2 Вызов и загрузка..............................................................................................24
3.3 Входные данные...............................................................................................25
3.4 Выходные данные............................................................................................25
3.5 Сообщения программы...................................................................................25
3.6 Техника безопасности при работе на компьютере.......................................26
4 Описание процесса отладки программы..............................................................28
4.1 Методы отладки...............................................................................................28
4.2 Тестирование....................................................................................................29
4.3 Контрольный пример......................................................................................32
Заключение.................................................................................................................36
5

ВВЕДЕНИЕ
В данном отчете предоставлены все сведения, алгоритмы и схемы,
используемые для разработки электронной аудио-библиотеки, а также приведён
код программы и контрольный пример работы с программой.

Полное название программы: электронная аудио-библиотека.

Краткое название программы: система, библиотека.


6

1 ОПИСАНИЕ АЛГОРИТМА

1.1 Схемы алгоритма

1.1.1 Структурная схема системы


7

1.1.2 Схема алгоритма администрирования системы


8

1.1.3 Схема алгоритма добавления аудио-файла


9

1.1.4 Структурная схема базы данных

1.2 Описание работы программы

1.2.1 Описание структурной схемы системы

Система реализована с помощью трехуровневой архитектуры MVC


(Модель-Представление-Контроллер), в которой модель данных приложения,
пользовательский интерфейс и управляющая логика разделены на три
отдельных компонента, так, что модификация одного из компонентов оказывает
минимальное воздействие на другие компоненты [1].

1.2.2 Описание моделей

Модели — это состояние приложения, но это больше, чем просто данные;


10

в ней прописаны все бизнес-правила, применяемые к этим данным [2].

Система реализована в виде следующих моделей:

1) Модель Audio реализует работу с аудио-файлами. Предоставляет


доступ к таблице audios базы данных.

2) Модель Category реализует работу с категориями аудио-файлов.


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

3) Модель Comment реализует работу с комментариями к аудио-


файлам. Предоставляет доступ к таблице comments базы данных.

4) Модель User реализует работу с пользователями системы.


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

5) Модель Vote реализует работу с рейтингом к аудио-файлам.


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

1.2.3 Описание контроллеров и представлений

Контроллеры организуют работу приложения [2]. Они воспринимают


события внешнего мира (обычно ввод данных пользователем), взаимодействуют
с моделью и отображают соответствующее представление для пользователя.

Система реализована в виде следующих контроллеров:

1) Контроллер Audios занимается обработкой данных для работы с


аудио-файлами. Взаимодействует с моделями Audio, Category,
Comment, User и Vote.

2) Контроллер Categories занимается обработкой данных для работы с


категориями аудио-файлов. Взаимодействует с моделями Category,
Audio и User.

3) Контроллер Search занимается обработкой данных для поиска по


аудио-файлам. Взаимодействует с моделью Audio.

4) Контроллер Sessions занимается обработкой данных для


11

аутентификации и авторизации пользователей. Взаимодействует с


моделью User.

5) Контроллер Users занимается обработкой данных для работы с


пользователями системы. Взаимодействует с моделью User.

1.2.4 Описание алгоритма администрирования системы

1) Производится запрос данных для аутентификации (логин и пароль).


Если пароль неверный или не введен — доступ к процессу
администрирования системы не предоставляется.

2) Происходит ожидания события, инициируемого пользователем.


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

3) При возникновении события «управлять аудио-файлами»


вызывается подпрограмма управления аудио-файлами.

4) При возникновении события «управление пользователями»


вызывается подпрограмма управления учетными записями
пользователей.

5) При возникновении события «управление категориями» вызывается


подпрограмма управления категориями.

1.2.5 Описание алгоритма администрирования системы

1) Производится запрос данных для аутентификации (логин и пароль).


Если пароль неверный или не введен — доступ к процессу
добавления и работы с аудио-файлами системы не предоставляется.

2) Производится запрос данных на добавление нового аудио-файла


12

(«Файл», «Название», «Категория» и «Описание»).

3) Происходит загрузка аудио-файла.

4) По окончанию загрузки файла производится добавление данных о


новом аудио-файле в БД.

1.2.6 Описание структурной схемы базы данных

База данных системы состоит из пяти таблиц: audios, categories, comments,


users и votes.

1.2.6.1 Описание таблицы audios

1) Поле id – уникальный идентификатор записи в таблице. Имеет тип


integer. Присваивается автоматически при добавлении записи в базу.

2) Поле name – отображаемое имя аудио-файла. Имеет тип string.

3) Поле user_id – внешний ключ, ссылающийся на запись в таблице


users. Имеет тип integer.

4) Поле description – описание аудио-файла. Имеет тип text.

5) Поле category_id – внешний ключ, ссылающийся на запись в таблице


categories. Имеет тип integer.

6) Поле content_type – формат аудио-файла. Имеет тип string.

7) Поле filename – оригинальное имя аудио-файла. Имеет тип string.

8) Поле comments_count – количество комментариев к аудио-файлу.


Имеет тип integer.

9) Поле rating – текущий рейтинг аудио-файла. Имеет тип integer.

10) Поле created_at – дата и время создания записи. Имеет тип datetime.

11) Поле updated_at – дата и время обновления записи. Имеет тип


datetime.
13

1.2.6.2 Описание таблицы categories

1) Поле id – уникальный идентификатор записи в таблице. Имеет тип


integer. Присваивается автоматически при добавлении записи в базу.

2) Поле name – отображаемое имя категории. Имеет тип string.

3) Поле audios_count – количество аудио-файлов в категории. Имеет


тип integer.

4) Поле created_at – дата и время создания записи. Имеет тип datetime.

5) Поле updated_at – дата и время обновления записи. Имеет тип


datetime.

1.2.6.3 Описание таблицы comments

1) Поле id – уникальный идентификатор записи в таблице. Имеет тип


integer. Присваивается автоматически при добавлении записи в базу.

2) Поле audio_id – внешний ключ, ссылающийся на запись в таблице


audios. Имеет тип integer.

3) Поле user_id – внешний ключ, ссылающийся на запись в таблице


users. Имеет тип integer.

4) Поле text – содержание комментария. Имеет тип text.

5) Поле created_at – дата и время создания записи. Имеет тип datetime.

6) Поле updated_at – дата и время обновления записи. Имеет тип


datetime.

1.2.6.4 Описание таблицы users

1) Поле id – уникальный идентификатор записи в таблице. Имеет тип


integer. Присваивается автоматически при добавлении записи в базу.

2) Поле login – логин пользователя. Имеет тип string.

3) Поле email – адрес электронной почты пользователя. Имеет тип


14

string.

4) Поле crypted_password – зашифрованный пароль. Имеет тип string.

5) Поле salt – шифр, необходимый для большей сохранности пароля.


Имеет тип string.

6) Поле role – права доступа пользователя в системе. Имеет тип string.

7) Поле remember_token – шифр, необходимый для запоминания


пользователя в системе. Имеет тип string.

8) Поле remember_token_expires_at – дата и время окончания


запоминания пользователя в системе. Имеет тип datetime.

9) Поле created_at – дата и время создания записи. Имеет тип datetime.

10) Поле updated_at – дата и время обновления записи. Имеет тип


datetime.

1.2.6.5 Описание таблицы votes

1) Поле id – уникальный идентификатор записи в таблице. Имеет тип


integer. Присваивается автоматически при добавлении записи в базу.

2) Поле user_id – внешний ключ, ссылающийся на запись в таблице


users. Имеет тип integer.

3) Поле audio_id – внешний ключ, ссылающийся на запись в таблице


audios. Имеет тип integer.

4) Поле voted – оценка («+» или «-») голоса. Имеет тип string.

5) Поле created_at – дата и время создания записи. Имеет тип datetime.

6) Поле updated_at – дата и время обновления записи. Имеет тип


datetime.
15

2 ТЕКСТ ПРОГРАММЫ

2.1 Схема базы данных (файл db/schema.rb)

ActiveRecord::Schema.define(:version => 20080914100036) do

create_table "audios", :force => true do |t|


t.string "name", :default => "", :null => false
t.integer "user_id", :limit => 11, :default => 0, :null => false
t.text "description", :null => false
t.integer "category_id", :limit => 11, :default => 0, :null => false
t.string "content_type"
t.string "filename"
t.integer "comments_count", :limit => 4, :default => 0, :null => false
t.integer "rating", :limit => 11, :default => 0, :null => false
t.datetime "created_at"
t.datetime "updated_at"
end

create_table "categories", :force => true do |t|


t.string "name", :default => "", :null => false
t.integer "audios_count", :limit => 11, :default => 0, :null => false
t.datetime "created_at"
t.datetime "updated_at"
end

create_table "comments", :force => true do |t|


t.integer "audio_id", :limit => 11, :default => 0, :null => false
t.integer "user_id", :limit => 11, :default => 0, :null => false
t.text "text", :null => false
t.datetime "created_at"
t.datetime "updated_at"
end

create_table "users", :force => true do |t|


t.string "login", :limit => 20, :default => "", :null => false
t.string "email", :default => "", :null => false
t.string "crypted_password", :limit => 40, :default => "", :null => false
t.string "salt", :limit => 40, :default => "", :null => false
t.string "role", :default => "user", :null => false
t.string "remember_token"
t.datetime "remember_token_expires_at"
t.datetime "created_at"
t.datetime "updated_at"
end

create_table "votes", :force => true do |t|


t.integer "user_id", :limit => 11, :default => 0, :null => false
t.integer "audio_id", :limit => 11, :default => 0, :null => false
16

t.string "voted", :default => "x", :null => false


t.datetime "created_at"
t.datetime "updated_at"
end

end

2.2 Контроллеры системы

2.2.1 Контроллер Audios (файл app/controllers/audios_controller.rb)

class AudiosController < ApplicationController

layout 'main', :except => [ :rss ]


before_filter :login_required, :except => [ :index, :show, :popular ]

def index
@audios = Audio.find(:all, :order => "created_at DESC", :limit => 6)
@random_audio = Audio.find(:all)[rand(@audios.size)]

@popular_audios = Audio.popular(3)
end

def show
@audio = Audio.find(params[:id])
@popular_audios = Audio.popular(3)
end

def popular
@audios = Audio.paginate(:all, :order => "rating DESC",
:page => params[:page])
end

def new
@audio = Audio.new
end

def edit
@audio = Audio.find(params[:id])
end

def create
@audio = Audio.new(params[:audio])
@audio.user_id = current_user.id
@audio.save ? redirect_to(@audio) : render(:action => 'new')
end

def update
@audio = Audio.find(params[:id])
@audio.update_attributes(params[:audio]) ? redirect_to(@audio) : render(:action => 'edit')
17

end

def destroy
@audio = Audio.find(params[:id])
@audio.destroy
redirect_to audios_url
end

def add_comment
@comment = Comment.new(params[:comment])
@audio = Audio.find(params[:id])

@comment.audio_id, @comment.user_id = @audio.id, current_user.id

flash[:notice] = 'Комментарий усешно добавлен!' if @comment.save


redirect_to @audio
end

def vote_positive
@audio = Audio.find(params[:id])
@voted_user = giveme_voted_user(@audio.id)

if (@voted_user == nil)
@vote = Vote.create!(:user_id => current_user.id, :audio_id => @audio.id, :voted => '+')
@audio.update_attribute(:rating, @audio.rating+1)
end
redirect_to(@audio)
end

def vote_negative
@audio = Audio.find(params[:id])
@voted_user = giveme_voted_user

if (@voted_user == nil)
@vote = Vote.create!(:user_id => current_user.id, :audio_id => @audio.id, :voted => '-')
@audio.update_attribute(:rating, @audio.rating-1)
end
redirect_to(@audio)
end

protected #----------

def giveme_voted_user(ided)
Vote.find_by_audio_id(ided, :conditions => ["user_id = ?", current_user.id])
end
end
18

2.2.2 Контроллер Categories (файл app/controller/categories_controller.rb)

class CategoriesController < ApplicationController

layout 'main'
before_filter :check_administrator_role, :except => [ :show ]

def index
@categories = Category.find(:all)
end

def show
@category = Category.find(params[:id])
end

def edit
@category = Category.find(params[:id])
end

def create
@category = Category.new(params[:category])
flash[:notice] = 'Категория успешно добавлена' if @category.save
redirect_to categories_path
end

def update
@category = Category.find(params[:id])
if @category.update_attributes(params[:category])
flash[:notice] = "Категория \"#{@category.name}\" изменена!"
redirect_to categories_path
else
render :action => 'edit'
end
end

def destroy
@category = Category.find(params[:id])
@category.destroy
redirect_to categories_path
end
end

2.2.3 Контроллер Search (файл app/controllers/search_controller.rb)

class SearchController < ApplicationController


layout 'main'

def index
if params[:q]
per_page = 9
19

query = params[:q]
@audios = Audio.find_with_ferret(query, :page => params[:page], :per_page => per_page)
end
end
end

2.2.4 Контроллер Sessions (файл app/controllers/sessions_controller.rb)

class SessionsController < ApplicationController

layout 'main'

def new
end

def create
self.current_user = User.authenticate(params[:login], params[:password])
if logged_in?
if params[:remember_me] == "1"
current_user.remember_me unless current_user.remember_token?
cookies[:auth_token] = { :value => self.current_user.remember_token , :expires =>
self.current_user.remember_token_expires_at }
end
redirect_back_or_default('/')
flash[:notice] = "Вы успешно авторизованы!"
else
render :action => 'new'
end
end

def destroy
self.current_user.forget_me if logged_in?
cookies.delete :auth_token
reset_session
flash[:notice] = "Вы вышли из системы!"
redirect_back_or_default('/')
end
end

2.2.5 Контроллер Users (файл app/controllers/users_controller.rb)

class UsersController < ApplicationController


layout 'main'
before_filter :check_administrator_role, :only => [ :destroy ]

def index
@users = User.paginate(:all, :order => 'created_at', :page => params[:page])
end

def new
end
20

def show
@user = User.find(params[:id])
end

def create
cookies.delete :auth_token
@user = User.new(params[:user])
@user.save
if @user.errors.empty?
self.current_user = @user
redirect_back_or_default('/')
flash[:notice] = "Вы зарегистрированы!"
else
render :action => 'new'
end
end

def edit
@user = current_user
end

def update
@user = User.find(current_user)
if @user.update_attributes(params[:user])
flash[:notice] = "Данные успешно изменены!"
redirect_to :action => 'show', :id => current_user.id
else
render :action => 'edit'
end
end

def destroy
@user = User.find(params[:id])
if @user.update_attribute(:enabled, false)
flash[:notice] = "Пользователь заблокирован!"
else
flash[:error] = "Ошибка!"
end
redirect_to :action => 'index'
end
end
21

2.3 Модели системы

2.3.1 Модель Audio (файл app/models/audio.rb)

class Audio < ActiveRecord::Base


acts_as_ferret :fields => [ :name, :description ]

cattr_reader :per_page
@@per_page = 9

has_attachment :content_type => 'application/mp3', :storage => :file_system, :max_size =>


100.megabytes, :path_prefix => 'public/files/audios'

validates_presence_of :name, :description


validates_length_of :name, :within => 5..100
validates_length_of :description, :within => 3..400

belongs_to :user
belongs_to :category, :counter_cache => true
has_many :comments, :order => 'created_at'
has_many :votes

named_scope :popular, lambda {|limit|


if limit
{:order => 'rating DESC', :limit => limit.to_i}
else
{:order => 'rating DESC'}
end
}

end

2.3.2 Модель Category (файл app/models/category.rb)

class Category < ActiveRecord::Base


validates_uniqueness_of :name, :case_sensitive => false
has_many :audios

named_scope :recent, :order => 'created_at DESC'

def self.select_list
Category.recent.map{|n| [n.name, n.id]}
end

end
22

2.3.3 Модель Comment (файл app/models/comment.rb)

class Comment < ActiveRecord::Base


belongs_to :audio, :counter_cache => true
belongs_to :user

validates_presence_of :text
validates_length_of :text, :within => 3..350

end

2.3.4 Модель User (файл app/models/user.rb)

require 'digest/sha1'
class User < ActiveRecord::Base
attr_accessor :password

cattr_reader :per_page
@@per_page = 15

validates_presence_of :login, :email


validates_presence_of :password, :if => :password_required?
validates_presence_of :password_confirmation, :if => :password_required?
validates_length_of :password, :within => 4..40, :if => :password_required?
validates_confirmation_of :password, :if => :password_required?
validates_length_of :login, :within => 3..40
validates_length_of :email, :within => 3..100
validates_uniqueness_of :login, :email, :case_sensitive => false
validates_format_of :email, :with => /(^([^@\s]+)@((?:[-_a-z0-9]+\.)+[a-z]{2,})$)|(^$)/i
before_save :encrypt_password

attr_accessible :login, :email, :password, :password_confirmation

def self.authenticate(login, password)


u = find_by_login(login)
u && u.authenticated?(password) ? u : nil
end

def self.encrypt(password, salt)


Digest::SHA1.hexdigest("--#{salt}--#{password}--")
end

def encrypt(password)
self.class.encrypt(password, salt)
end

def authenticated?(password)
crypted_password == encrypt(password)
end

def remember_token?
23

remember_token_expires_at && Time.now.utc < remember_token_expires_at


end

def remember_me
remember_me_for 2.weeks
end

def remember_me_for(time)
remember_me_until time.from_now.utc
end

def remember_me_until(time)
self.remember_token_expires_at = time
self.remember_token = encrypt("#{email}--#{remember_token_expires_at}")
save(false)
end

def forget_me
self.remember_token_expires_at = nil
self.remember_token = nil
save(false)
end

def has_role?(rolename)
self.role == rolename ? true : false
end

protected
def encrypt_password
return if password.blank?
self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--") if new_record?
self.crypted_password = encrypt(password)
end

def password_required?
crypted_password.blank? || !password.blank?
end
end

2.3.5 Модель Vote (файл app/models/vote.rb)

class Vote < ActiveRecord::Base


belongs_to :audio
belongs_to :user

def self.voted_user(user, audio)


Vote.find_by_user_id(user, :conditions => ['audio_id=?', audio])
end
end
24

3 ИНСТРУКЦИЯ НА ВЫПОЛНЕНИЕ ПРОГРАММЫ

3.1 Общие сведения

Логика системы написана на языке программирования Ruby. Несмотря на


то, что Ruby – относительно новый объектно-ориентированный язык,
позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и
других, язык активно развивается и применяется в самых разных областях: от
системного администрирования до разработки сложных динамических сайтов
[3].

Система реализована с использованием программного каркаса Ruby on


Rails и представляет из себя трехуровневое клиент-серверное приложение [4]. В
качестве сервера выступает сама система, а в качестве клиента — веб-
обозреватель (веб-браузер) пользователя.

Для базы данных может быть использована любая СУБД, поддерживаемая


программным каркасом Ruby on Rails. Желательно — MySQL или PostgreSQL.

3.2 Вызов и загрузка

Для запуска системы необходимо выполнить следующие действия:

1) В файле config/environment.rb указать в значении переменной


APP_DOMAIN адрес веб-сервера.

2) В файле config/database.yml в нужном режиме работы системы


(development или production) указать следующие параметры БД:

adapter: [используемая_база_данных]

encoding: [кодировка_бд]

database: [имя_бд]

username: [логин]
25

password: [пароль]

host: [адрес_хостинга_бд].

3) Запустить веб-сервер следующей командой:

ruby script/server [-p номер_порта].

Для работы с системой со стороны клиента необходимо выполнить


следующие действия:

1) Открыть веб-обозреватель.

2) В адресной строке браузера набрать адрес сервера/доменное имя.

3.3 Входные данные

Входными данными системы являются:

1) Аудио-файлы.

2) Комментарии.

3.4 Выходные данные

Выходными данными системы являются:

1) Аудио-файлы, разделенные по категориям, с flash-плеером и


описанием.

2) Комментарии к аудио-файлам.

3) Данные о пользователях.

3.5 Сообщения программы

Во время выполнения система выводит следующие сообщения:

1) «Вы успешно авторизованы!» выводится в случае авторизации


пользователя.

2) «Вы вышли из системы!» выводится, когда пользователь вышел из


26

системы.

3) «Вы зарегистрированы!» выводится в случае успешной регистрации


пользователя.

4) «Пользователь заблокирован!» выводится в случае блокировки


пользователя администратором.

5) «Комментарий успешно добавлен!» выводится, когда пользователь


добавил комментарий к аудио-файлу.

6) «Категория успешно добавлена!» выводится, когда администратор


добавил новую категорию.

7) «Категория [имя_категории] изменена!» выводится при успешном


изменении данных категории.

8) «Ошибка» выводится в случае непредвиденной ошибки.

3.6 Техника безопасности при работе на компьютере

Во многих населенных пунктах напряжение в сети может сильно


колебаться. Для компьютера такие изменения напряжения являются
нежелательными, поэтому лучше подключать компьютеры через
стабилизаторы. Наиболее надежную защиту от неприятностей, связанных с
нестабильностью электропитания, осуществляют специальные устройства
непрерывного питания (UPS), которые не только обеспечивают строго
постоянное напряжение питания, но и дают возможность работы компьютеров
при полном отключении электропитания в течение от 5 минут до нескольких
часов. За это время можно полностью завершить ведущиеся на компьютере
работы, чтобы при выключении не произошло потери информации. Для
серверов локальных сетей и компьютеров, обрабатывающих ценную
информацию применение устройств непрерывного питания является
практически обязательным.

Перед первым включением компьютера следует проверить, соответствует


27

ли напряжение в сети тому, на которое рассчитан компьютер.

Системный блок компьютера желательно поставить в таком месте, чтобы


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

К современному производственному освещению, в том числе освещению


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

Рекомендуемая освещенность для работы с экраном дисплея составляет


200 лк, а при работе с экраном в сочетании с работой над документацией 400
лк. Рекомендуемые яркости в поле зрения операторов должны лежать в
пределах 1:5 – 1:10.
28

4 ОПИСАНИЕ ПРОЦЕССА ОТЛАДКИ ПРОГРАММЫ

4.1 Методы отладки

В процессе создания новой программы программисту приходится


сталкиваться с несколькими видами ошибок.

Во-первых, это синтаксические ошибки, связанные с неправильным


употреблением различных элементов и конструкций языка. Причиной
возникновения таких ошибок обычно являются недостаточно хорошее знание
языка программирования и опечатки при наборе текста программы. Такие
ошибки определяются уже на этапе компиляции и серьезной опасности не
представляют (если не считать потерянного на их исправление времени).

Второй вид ошибок доставляет программисту гораздо больше


неприятностей. Это ошибки при выполнении программы.

Ну и, наконец, наиболее тяжелые ошибки бывают связаны с


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

Процесс поиска и исправления ошибок в программе, когда факт их


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

Отладка производится в два этапа:

1) Определение природы и местонахождения возможной ошибки в


программе.

2) Исправление найденной ошибки.

Схема выполнения программы-отладчика обычно следующая:

1) Запуск в режиме отладки всех виртуальных машин,


предназначенных для выполнения на них параллельной программы,
29

и затем запуск самой параллельной программы.

2) Управление выполнением параллельной программы с помощью


обработки сообщений, поступающих от машин, на которых
выполняется параллельная программа.

4.1.1 Расстановка отладочной печати во всей программе

Для удобства работы отладочные операторы должны быть оформлены


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

4.1.2 Отладка с использованием встроенных средств языка


программирования

Суть данного метода сводится к установке большого набора точек


прерывания или пошаговому исполнению программы.

4.1.3 Методы индукции

Считается, что большинство ошибок может быть обнаружено по


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

4.2 Тестирование

Процесс выполнения программы с целью обнаружения ошибок


называется тестированием.

Тестирование осуществляется по средствам выполнения текстовых


примеров. В систему поступают входные данные, называемые текстами, а
реакция программы фиксируется для последующего анализа. Также в качестве
30

входных данных в программу вводятся критические точки, это максимально и


минимально возможные значения различных параметров.

Процесс тестирования включает в себя:

— тестирование отдельных модулей;

— тестирование связей между модулями;

— тестирование системы в целом.

Тестирование модуля включает в себя следующие этапы:

— тестирование в нормальных условиях предполагает, что в


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

— тестирование в экстремальных условиях предполагает проверку


граничных ситуаций: для цифровых данных (min и max), для
символьных (строк) проверка работы с пустой строкой и строкой
max длины;

— тестирование в исключительных условиях – предполагает проверку


работы программы при вводе неправильных данных.

Также проводят тестирование по методу сверху вниз, стремясь к


минимальному числу контрольных примеров.

Сначала используют трансляцию – специальную программу, которая


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

И в конечном итоге выполнение - если в результате выполнения


программы и анализа результата ее работы на тестовых наборах данных,
обнаружены ошибки, то весь процесс разработки повторяется с этапа
31

редактирования.

Значит, мы поначалу проверим работу каждого модуля и устраним


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

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


которые ранее решались пользователем и у нас имеется опыт их реализации.

Существуют следующие методики тестирования:

— тестирование методом «Черного ящика»;

— тестирование методом «Белого ящика»;

— тестирование эргономичности;

— тестирование нарастающей интеграции.

4.2.1 Тестирование методом "Белого ящика"

Тестирование методом "белого ящика" предполагает обработку системы


как "прозрачного объекта" и позволяет заглянуть внутрь, фокусируя внимание
на использовании знаний о конкретном программном обеспечении для
правильного подбора тестовых данных. Синонимами понятия метода "Белого
ящика" являются: структурное тестирование, метод прозрачного ящика, метод
стеклянного ящика. В отличие от метода "Черного ящика" данный метод
основан на использовании определенных знаний программного кода,
необходимых для контроля корректности данных на выходе. Тест является
правильным только в том случае, когда тестировщик знает, что конкретно
должна делать программа. Таким образом, тестировщик может контролировать
ожидаемый результат. Тестирование методом "Белого ящика" не обрабатывает
случайные ошибки, но наряду с этим весь видимый код должен быть
удобочитаемым.
32

4.2.2 Тестирование эргономичности

Тестирование эргономичности является частью процесса создания


необходимых условий для "удобства пользователя". Этот тип тестирования
включает набор методов, которые позволяют пользователям (тестировщикам)
проверить систему. Типичный тест на эргономичность заключается в том, что
пользователи выполняют с прототипом (или другой системой) ряд операций, в
то время как наблюдатели документируют все, что они делают и говорят. Такое
тестирование проводится одновременно с одним или несколькими
пользователями работающими вместе. Тестирование может включать сбор
информации о последовательности действий, совершаемых пользователем в
процессе выполнения задачи; ошибок, которые они делают; когда и чем они
недовольны; насколько быстро они выполняют операции; преуспевают ли они в
выполнении этих операций, а так же насколько они удовлетворены. Цель
большинства тестов на эргономичность состоит в том, чтобы обнаружить
любые проблемы, с которыми может столкнуться пользователь и устранить их.

4.2.3 Тестирование нарастающей интеграции

Это непрерывное испытание "применимости" новых функциональных


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

4.3 Контрольный пример

В качестве контрольного примера рассмотрим процесс добавления нового


аудио-файла в библиотеку системы, так как этот процесс является наиболее
используемым и важным в работе системы.

Для начала, выполнив все пункты настройки (см. пункт 3.2 «Вызов и
загрузка»), запустим серверную часть системы.
33

После того, как серверная часть системы запущена, запустим веб-


обозреватель. В качестве веб-обозревателя использовался Mozilla Firefox версии
3.0.10.

После запуска веб-обозревателя необходимо набрать в его адресной


строке адрес сервера (в нашем случае — http://localhost:3000/). Если при
обращении к серверу происходит ошибка, то необходимо в первую очередь
проверить правильность набранного адреса и удостовериться в том, что
серверная часть системы функционирует.

В случае, если никаких ошибок не случилось, должна появиться главная


веб-страница системы (Рисунок 1).

Рисунок 1

На этой (главной) странице отображается вся информация аудио-


библиотеки: «Случайное аудио» (произвольный аудио-файл), «Последнее
34

аудио» (последние, добавленные в библиотеку, аудио-файлы) и «Популярные


аудио» (аудио-файлы в порядке убывания рейтинга). Также на главной странице
отображается форма поиска по аудио-файлам и категории аудио-файлов. Для
каждого аудио-файла отображается следующая информация:

— Название аудио-файла;

— Пользователь, добавивший аудио-файл;

— Дата добавления;

— Категория;

— Рейтинг аудио-файла в системе;

— Количество комментариев.

При нажатии на ссылку «Загрузить аудио!», открывается веб-страница


добавления нового аудио-файла (Рисунок 2) с необходимыми для заполнения
полями.

Рисунок 2
35

После загрузки аудио-файла, открывается веб-страница с загруженным


аудио-файлом (Рисунок 3), на которой находятся данные о файле и flash-плеер
для прослушивания аудио через веб-обозреватель, а также блок с голосованием
(+/-) и полями с кодом/ссылкой на аудио-файл (для отображения плеера на
других ресурсах). Также внизу страницы находятся комментарии пользователей
и форма для отправки нового комментария.

Рисунок 3
36

ЗАКЛЮЧЕНИЕ
За время прохождения стажировки была реализована программа
«Электронная аудио-библиотека»: разработаны необходимые алгоритмы и
схемы, спроектирована база данных, написан программный код и приведён
контрольный пример работы с программой. Все сведения предоставлены в
отчете.
37

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ


1. Сообщество Wikipedia, Model-View-Controller,
http://ru.wikipedia.org/wiki/Model-View-Controller, 2009
2. Д. Томас, Д. Х. Хэнсон, Гибкая разработка веб-приложений в среде Rails,
2008
3. Хэл Фултон, Программирования на языке Ruby, 2007
4. Брюс А. Тейт, Курт Ниббс, Ruby on Rails. Быстрая веб-разработка, 2008

Оценить