Дополнительные модули языка Ruby

Для работы веб-приложения были необходимы дополнительные модули такие, как «mechanize» и «sinatra».

Mechanize – библиотека, реализующая доступ к сайтам с сохранением состояния – в первую очередь куков, как браузер. Эта библиотека позволяет парсить (доставать) сайт с помощью css и xpath селекторов [7].

Sinatra – бесплатный и открытый программный каркас написанный на языке Ruby, предназначенный для разработки веб-приложений. Он является альтернативой таким популярным фреймворкам на Ruby как Ruby on Rails и Merb [8].

Фреймворк был спроектирован и разработан Блейком Мизерани. Sinatra представляет собой небольшое и гибкое приложение, которое, однако, не следует типичному паттерну Model-View-Controller (модель-представление-контроллер), который часто применяется в веб-фреймворках, как например в Ruby on Rails. Вместо этого Sinatra фокусируется на идее быстрого создания веб-приложений на Руби с минимальными усилиями [8].

 

Практическая часть

Постановка задачи

 

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

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

Разработка веб-приложения

Чтобы веб-приложение заработало в соответствии с заданными функциями необходимо организовать http сервер.

Этот сервер будет организован с помощью ruby-модуля «Sinatra».

Рассмотрим данный код.

# coding: utf-8

require 'mechanize' //подключаем модуль «mechanize»

require 'sinatra' //подключаем модуль «sinatra»

require './my' //подключаем модуль «my» из локальной директории

require 'json' //подключаем модуль «json» для работы с json

enable :static //разрешение для использования статичного содержимого

set :server, 'webrick' //настройка того, какой модуль будет обслуживать низкоуровневые http запросы

get '/' do //обработка запроса к корневой директории сервера(localhost:8080/)

haml :index //передаём на обработку шаблонному движку haml страницу index.haml

end

 

get '/find' do //обработка директории localhost:8080/find

@param=params[:q]

@f=func(@param,params[:y1],'2013')

 

haml :find

end

В Ruby функциональные блоки кода (if,def,for …) выделяются отступами. Например, описание функции выглядит так:

def doSomething(a,b)

if(a>b)

return True

else

return False

end

end

Когда пользователь обращается к корневой директории сервера / - север возвращает страницу index.haml, прошедшую через haml-движок, который выдаёт браузеру готовый валидный html- код.

В Haml и Sass так же, как и в Ruby выделение основных частей осуществляется с помощью отступов. То есть там, где в html открывается новый тег, в haml создаётся новый уровень вложенности.

На нашем сервере следующая иерархия директорий и файлов:

/

views

find.haml

index.haml

footer.haml

form.haml

public

style.sass

script.coffee

style.css

Основным файлом здесь является файл index.haml. Данный файл содержит в себе форму задачи критериев поиска. Ниже дано содержание файла index.haml

%html

%head

%link{rel:'stylesheet',href:'style.css'}

 

%body

%center

.container

.header

=haml :form

Все теги начинаются с символа «%», а код на Ruby вставляется с помощью символа «=». Этот код определяет такую структуру веб-документа:

Документ

Центрирование нижележащих элементов

Блок с классом «container».Это основной блок

Шапка документа

Форма поиска(файл form.haml)

Файл формы поиска будет немного объёмистее и сложнее:

 

%form{method:'GET',action:'find'}

%table.form

%tr

%td.right

%label{for:'q'} Что искать:

%td

%input.q{type:'text',name:'q'}

%tr{align:'right'}

%td.right

%label{for:'y',align:'right'} Год издания до:

%td

%select.y{name:'y1'}

%option 2000

%option 2001

%option 2002

%option 2003

%option 2004

%option 2005

%option 2006

%option 2007

%option 2008

%option 2009

%option 2010

%option 2011

%option 2012

%option 2013

%option 2014

%option 2015

%option 2016

%option 2017

%option 2018

%option 2019

%option 2020

%option 2021

%option 2022

%tr{align:'center'}

%td.center{colspan:'2'}

%br

%input.submit{type:'submit',value:'Искать'}

Это «.center» обозначает класс «center» какого-либо элемента, а «#id» - id. Свойства тегов задаются в фигурных скобках. К index.haml подключены стили style.css, которые были скомпилированы из файла style.sass:

@mixin border-radius($radius: 1px) //миксин или некая функция

-webkit-border-radius: $radius

-moz-border-radius: $radius

border-radius: $radius

.main

width: 1000px

height: auto

background-color: black

#item

width: 100%

height: auto

text-align: left

@include border-radius(5px)

background-color: lighten(#545657,20)

margin-top: 5px

margin-down: 5px

 

.container

width: 1000px

height: auto

body

background-color: white

margin: 0px

td.left

text-align: left

td.right

text-align: right

td.center

text-align: center

 

select

width: 100%

input.submit

width: 300px

 

table.form

width: 400px

 

input.q

width: 100%

 

.header

width: 100%

height: 100px

background-color: grey

Специальная программа отслеживает изменения в файле style.sass, чтобы скомпилировать этот файл в style.css.

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

%html

%head

%link{rel:'stylesheet',href:'style.css'}

%script{src:'script.js'}

%body

%center

=haml :form

.main

%center

-for i in @f do

#item

%strong Библиографическая ссылка:

%br

="   &nbsp"+i[0].to_s

%p

%strong Рейтинг:

%br

="   &nbsp"+i[1].to_s

Синтаксис Haml'а позволяет использование циклов, условий и перечислений.

Так «-for i in @f do» является итерацией по всем объектам, входящих в переменную @f. Эта особенность в разы сокращает время и усилия на написание веб-приложение. Haml и Sass являются «фасадом» приложения. А логика ж его определяется программным кодом, написанном на языке программирования Ruby, то есть кодом из файлов init.rb и my.rb. Код файла init.rb уже был описан выше, поэтому здесь приводится текст my.rb.

 

# coding: utf-8

require 'mechanize'

def mark(m,n)

i=n*m/(n+30)

j=7.2453*n/(n+30)

return i+j

end

def func(q,y1,y2)

m=Mechanize.new

link="http://window.edu.ru/catalog/resources?p_str=#{q}&p_year1=#{y1}&p_year2=#{y2}&p_sort=5&p_frubr=3.52.5"

link=link+"&p_page=1"

page=m.get link

links=[]

links<<link

page.search('table.pager').search('td').search('a').each do |i|

links<<'http://window.edu.ru'+i['href']

end

u=[]

links.each do |l|

o=m.get l

n=0

o.search('div.res_l').search("a.restitle").each do |i|

 

href='http://window.edu.ru'+i['href']

k='http://open.dapper.net/transform.php?dappName=diploma&transformer=HTML&extraArg_microFormat=1&applyToUrl='+href

j=m.get k

mark=j.search('span.mark')

mark=mark.text.to_f

biblio=j.search('span.biblio').text

num=j.search('span.num')

num=num.text.to_f

ma=mark(mark,num)

if ma>1

dl=''

if j.search('span.link')

dl=j.search('span.link').search('a')[0]['href']

u<<[biblio,ma,dl]

 

end

end

if u.size>=5

return u

end

 

end

end

return u

 

end

Этот программный код используется для поиска и извлечения информации. В качестве дополнительного инструмента используется сайт http://open.dapper.net. Этот сайт именно в этой работе даёт возможность извлечения библиографической информации нужной учебной литературы.

 


 

Отладка веб-приложения

Чтобы приложение заработало, надо запустить его как http сервер.

Делается это командой «ruby init.rb».Вывод команды при запуске:

 

 

Сервер запущен. В системе процесс сервера имеет pid=3853. Http-порт сервера -

4567.

Теперь необходимо перейти в браузере по ссылке localhost:4567 и появится страница index.haml

Для поиска нужно ввести название пособия в первое поле и год во второе.

В качестве примера были найдены учебные пособия по базам данных до 2000 года издания.

После подтверждения формы сервер немного «думает» и выдаёт ответ, в виде страницы find.haml

 

На следующем изображении показана активность сервера

 

 

На запрос по «химии» до 2000 года издания сервер выдаёт

 

Вывод сервера

frame-col-ypos:0,141667in; bot-style:none; xpos:0,000694in; wrap-mode:wrapped-both; frame-type:image; ypos:0,141667in; top-style:none; frame-height:0,968056in; frame-pref-page:24; left-style:none; position-to:block-above-text; frame-col-xpos:0,000694in; right-style:none; frame-width:6,691667in


 

Заключение

В результате данной работы было создано веб-приложение, извлекающая и структурирующая информацию из интернета. В ходе данной работы мною был изучен язык программирования Ruby и в дальнейшем применён в качестве основного языка программирования для написания приложения. Ruby обладает большим числом сторонних модулей и библиотек, часть из которых была использована в работе. Для создания внешнего вида приложения были использованы вспомогательные технологии такие, как Haml,Sass и CoffeeScript. Для их использования был изучен синтаксис этих язык. На основе этих технологий был создан макет приложения. Приложение было отлажено и проверено на соответствие поставленным целям. Выводы приложения представлены выше по тексту данной работы. В ходе работы все поставленные задачи были осуществлены. Основные цели достигнуты.

 

В ходе выполнения дипломной работы было сделано:

1. Была собрана теория для дальнейшей работы

2. Был изучен инструментарий(Ruby,Haml,Sass,CoffeeScript)

3. Было разработано приложение для поиска в WWW сети

4. Была произведена отладка этого приложения


 

 

 

Список литературы

1. Поисковая система. URL: http://ru.wikipedia.org/wiki/Поисковая_система

2. Поиск в Интернете — внутри и снаружи. URL: http://www.shipbottle.ru/projects/txt/internet_2_1998/index.shtml

4. Ruby/Основные свойства Ruby. URL: http://ru.wikibooks.org/wiki/Ruby/Основные_свойства_Ruby

5. Haml. URL: http://ru.wikipedia.org/wiki/Haml

6. Sass. URL: http://ru.wikipedia.org/wiki/Sass

7. Друзья друзей Вконтакте на Ruby. URL: http://leonid.shevtsov.me/ru/druzya-druzej-vkontakte-na-ruby

8. Sinatra. URL: http://ru.wikipedia.org/wiki/Sinatra