Джош Кауфман - Первые 20 часов. Как быстро научиться… чему угодно
Это приложение позволяет серверу посмотреть, что содержится в параметре маршрута «name», и использовать это значение. Команда маршрута представляет собой простую инструкцию — показать параметр «name» пользователю.
Sinatra позволяет вам дать название параметру (например, name), но также имеет «универсальный» параметр (его также называют «решеткой» (splat)), который может содержать все что угодно. Вот как можно использовать его в нашем модифицированном приложении «Hello»:
get '/hello/*' do
"Hello, # {params [: splat]}!"
end
Это очень удобно. С помощью обычных и универсальных параметров можно прописывать самые замысловатые маршруты. Создаваемые вами маршруты определяют работу приложения Sinatra.
Этих сведений достаточно, чтобы понять, как написать программу, которая удовлетворяет моему целевому уровню мастерства. Поскольку Jekyll создает файлы, которые приложение предоставляет по запросам пользователей GET, мне остается лишь написать несколько маршрутов, которые принимают эти запросы, находят в системе нужные файлы и предоставляют их читателю.
Как указывается в документации на Jekyll, программа помещает законченные веб-страницы в папку под названием «site» в корневом каталоге. Маршрут к этой странице автоматически генерируется Jekyll. Если мы хотим, чтобы наша страница About была доступна на http://example.com/about, мы ставим маршрут /about в файлах Jekyll, и программа создаст файл в _site/about/index.html в корневом каталоге нашего сайта.
Это означает, что я должен создать новый маршрут в Sinatra, чтобы прочесть файл в ответ на запрос пользователя GET. Вот как он будет выглядеть:
# Index handler
get '/?' do
## File.read ("_site/index.html")
end
# Post handler
get '/*/?' do
## File.read ("_site/# {params [: splat]} /index.html")
end
Команда File.read (“”) встроена в Ruby. File — это объект, read — метод. Используется она очень просто: содержимое (“”) указывает на расположение файла, который должна прочитать программа, относительно корневого каталога приложения. Легко.
А что если такого файла нет? В этом случае необходимо исключение, и в Sinatra встроены два основных маршрута ошибок: not_found и error. Давайте сделаем так, чтобы оба маршрута вызывали одну и ту же страницу с сообщением об ошибке:
not_found do
## File.read ("_site/error/index.html")
end
error do
File.read ("_site/error/index.html")
end
Все остальное остается таким же. Я не собираюсь вносить изменения в config.ru или Gemfile. Я просто добавляю новые маршруты в программный репозиторий Git, внося изменения, а затем размещаю исправленные программы на Heroku. Готово.
Хотите посмотреть, как работает модифицированная программа? Зайдите на сайт PersonalMBA.com: в настоящее время сайт работает на Jekyll вместо WordPress, используя именно эту программу. При помощи программы нагрузочного тестирования, которая называется seige, мой сайт теперь способен без труда обслуживать две тысячи посетителей одновременно. Большинство запросов страниц обрабатываются за 18–20 миллисекунд, так что мой сайт полностью защищен от падения при большом трафике.
Мое первое рабочее интернет-приложение завершено. Мне потребовалось около часа, чтобы разобраться, что я должен делать, и еще час, чтобы понять, как перенести информацию и дизайн моего сайта с WordPress на Jekyll.
Общее время составило около десяти часов, включая исследования и обзор концепций программирования. Не так плохо!
Приложение № 2: Codex, персональная база данных
Мое первое приложение работает, и работает хорошо. Оно простое, и в данном случае это его главное преимущество. Чем меньше движущихся деталей, тем меньше вероятность поломки — это справедливо и для программы.
Давайте займемся чем-нибудь чуть более сложным.
Помните наш разговор о базе данных? Главные веб-страницы не могут обновляться, а значит, не могут хранить информацию. Мое первое приложение работает только потому, что файлы статичны: они не изменяются. Любые изменения в файлы вносятся посредством Jekyll, отдельной программы. Приложение получилось быстрым и стабильным потому, что не использует базу данных.
А как быть с программами, использующими базы данных? Базы данных обычно являются важной частью большинства приложений, и поэтому я должен понять, как они устроены. А для этого нужно начать работу над проектом, основанным на базе данных.
Одно из приложений, которым я пользуюсь, называется Backpack [33] и разработано компанией 37signals. Основное преимущество Backpack — возможность создавать страницы, содержащие все что угодно: текст, списки, изображения, файлы и так далее. Сохранив информацию о странице в Backpack, впоследствии вы можете получить к ней доступ с любого компьютера, поскольку вся информация хранится в базе данных приложения.
Я спрашиваю себя: могу ли я сам создать нечто подобное? Попробовать стоит… но с чего начать?
Изучая Jekyll, я прочел статью программиста Тома Престона-Вернера, создателя Jekyll, под названием «Начни разработку с Readme» («Readme Driven Development») [34]. Идея статьи заключалась в том, что вопреки волнам увлечения проектным менеджментом, которые каждые несколько лет захлестывают индустрию программного обеспечения, лучший способ создать приложение — начать с написания ознакомительного документа Readme.
Файл Readme программисты включают в корневой каталог приложения вместе с программным кодом. В нем содержится информация по установке, настройке и использованию программы.
Файлы Readme очень важны, поскольку многие программы требуют пояснений. Без этого документа зачастую бывает трудно понять, как пользоваться программой. Самостоятельный просмотр кода не так эффективен, как чтение подробного объяснения, написанного создателем программы.
Том утверждает, что сначала нужно написать файл Readme, а уж затем браться за саму программу. Большинство программистов поступают с точностью до наоборот: сначала пишут программу, а затем (возможно) ознакомительный файл. И упускают благоприятную возможность: разработка документации помогает понять, как именно будет работать программа. Файл Readme может быть не только полезным документом, но и средством разработки.
Такой подход мне нравится. Один из приемов, которые я освоил в процессе работы над «Сам себе MBA», заключался в написании рекламных материалов до, а не после создания коммерческого предложения. Выясняя, что требуется потенциальным покупателям, и включая это в рекламный материал, вы получаете более полное представление о том, каким должен быть продукт, чтобы привлечь внимание клиентов. Разработку самого предложения определяет маркетинговое исследование.
Я взял блокнот и составил список функций, которые я хотел бы иметь в своем приложении, а также характеристик программы.
● Программа представляет собой простое приложение, предназначенное для создания заметок.
● Приложение предназначено для одного пользователя.
● Приложение использует среду Sinatra и базу данных для создания, сохранения, обновления и удаления записей на странице.
● Приложение позволяет пользователю создавать страницы со сложным форматированием, таким как жирный шрифт, курсив, подчеркивание и тому подобное.
● Приложение требует пароль доступа и обеспечивает сохранность базы данных, насколько это возможно.
● У приложения привлекательный внешний вид.
● Приложение может без труда размещаться на Heroku или любом другом ресурсе.
Я собираюсь назвать это приложение «Codex» — в старину так называли книги, — поскольку приложение будет применяться в основном для хранения справочной информации, списков и тому подобное.
В интернет-программировании подобные приложения называются «CRUD» — аббревиатура от английского «создание чтение обновление удаление». Стоит отметить, что эти функции совпадают с командами GET, POST, PUT, DELETE, и поэтому написать такое приложение можно и с использованием маршрутов Sinatra. Разница, причем существенная, заключается в использовании базы данных.
Какие возможности работы с базами данных предоставляет Heroku? Не знаю. Придется вновь заглянуть в документацию.
По умолчанию Heroku использует базу данных под названием Postgres [35]. Каждому новому приложению автоматически назначается маленькая база данных разработки. Мне это подходит, но как ею пользоваться и какими средствами протестировать программу на моем компьютере?
За ответами на эти вопросы я решил обратиться к Stack Overflow. Общее мнение: решение подобных задач значительно облегчает применение базы данных под названием DataMapper [36].
DataMapper относится к классу программ, получивших название «объектно-реляционного отображения», или сокращенно ORM [37]. Метод ORM решает насущную проблему программистов: базы данных зачаcтую используют собственный язык, отличающийся от языка, на котором пишется приложение. В большинстве баз данных используется язык SQL [38], однако существуют и сотни других языков.