http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&feed=atom&action=historyLXF89:Нестандартное программирование - История изменений2024-03-28T10:04:50ZИстория изменений этой страницы в викиMediaWiki 1.19.20+dfsg-0+deb7u3http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&diff=9788&oldid=prevYaleks: /* Мысли напоследок */2010-03-01T14:40:47Z<p><span dir="auto"><span class="autocomment">Мысли напоследок</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Предыдущая</td>
<td colspan='2' style="background-color: white; color:black;">Версия 14:40, 1 марта 2010</td>
</tr><tr><td colspan="2" class="diff-lineno">Строка 205:</td>
<td colspan="2" class="diff-lineno">Строка 205:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Вот сервер и готов. Удивительно просто, правда? Конечно, пока он обрабатывает только HTML-файлы — но были бы кости, мясо нарастет. Главное, что это пример применения Ruby в реальной задаче, и по нему видно, что код получается чудесно-простой и легко читаемый.</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Вот сервер и готов. Удивительно просто, правда? Конечно, пока он обрабатывает только HTML-файлы — но были бы кости, мясо нарастет. Главное, что это пример применения Ruby в реальной задаче, и по нему видно, что код получается чудесно-простой и легко читаемый.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>В Ruby еще много чего можно исследовать, и так как Ruby on Rails продолжает набирать популярность, вы об этом языке, несомненно, еще услышите. Ясный и разумный синтаксис Ruby лучше всех прочих поможет разобраться с объектно-ориентированным программированием тем, кто привык к С или Basic. Внизу слева находится врезка «Ссылки», там вы найдете и учебники, и прочую информацию. А напишете нечто крутое — сообщите нам на форум http://<del class="diffchange diffchange-inline">www</del>.<del class="diffchange diffchange-inline">linuxforum.ru</del>. Как знать, может, вашей будущей программы не хватает на нашем DVD…</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div>В Ruby еще много чего можно исследовать, и так как Ruby on Rails продолжает набирать популярность, вы об этом языке, несомненно, еще услышите. Ясный и разумный синтаксис Ruby лучше всех прочих поможет разобраться с объектно-ориентированным программированием тем, кто привык к С или Basic. Внизу слева находится врезка «Ссылки», там вы найдете и учебники, и прочую информацию. А напишете нечто крутое — сообщите нам на форум http://<ins class="diffchange diffchange-inline">unixforum</ins>.<ins class="diffchange diffchange-inline">org/</ins>. Как знать, может, вашей будущей программы не хватает на нашем DVD…</div></td></tr>
</table>Yalekshttp://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&diff=1618&oldid=prevLockal: Ненавижу типографские кавычки… Почему они всегда лезут в исходники?2008-03-13T06:23:52Z<p>Ненавижу типографские кавычки… Почему они всегда лезут в исходники?</p>
<a href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&diff=1618&oldid=1539">Внесённые изменения</a>Lockalhttp://wiki.linuxformat.ru/wiki/index.php?title=LXF89:%D0%9D%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&diff=1539&oldid=prevInterlace: Новая: == Ruby без Rails == ''Вы слыхали о Ruby on Rails – а сейчас '''Майк Сондерс''' расскажет вам о его основе, Ruby, ярком при...2008-03-12T21:26:27Z<p>Новая: == Ruby без Rails == ''Вы слыхали о Ruby on Rails – а сейчас '''Майк Сондерс''' расскажет вам о его основе, Ruby, ярком при...</p>
<p><b>Новая страница</b></p><div>== Ruby без Rails ==<br />
''Вы слыхали о Ruby on Rails – а сейчас '''Майк Сондерс''' расскажет вам о его основе, Ruby, ярком примере современного языка высокого уровня…''<br />
<br />
'''Вот и еще одна статья из цикла об «экзотических» языках программирования. Язык Tcl, с которым мы познакомились месяц назад, очень подходит для разработки оконных приложений с графическим интерфейсом, а сейчас мы займемся Ruby, предназначенным для создания серверных и сетевых приложений. Заскучали? Напрасно. Сейчас объясним, почему.'''<br />
<br />
Мы постараемся не погрязнуть в техноязе: на то есть подробнейшая документация. Вместо этого мы начнем с основ языка, затем напишем простенькое приложение, а в завершение – полноценный web-проект. Вы уже знакомы с азами программирования? Отлично! Читайте дальше, и вы поймете, что Ruby достоин вашего внимания. Многие из нас слышали о Ruby в контексте Ruby on Rails, современного программного каркаса [framework]. На его основе сейчас разрабатываются крупные сайты (например, Basecamp, Jobster или 43 Things), и он поставляется с новой версией OS X, Leopard. На ринг Ruby вышел совсем недавно, и тем удивительнее тот факт, что его разработка ведется с 1993 года!<br />
<br />
Детище Юкихиро Мацумото [Yukihiro Matsumoto] увидело свет в 1995 году. Ключевой особенностью языка стал принцип освобождения программиста от черной работы. Зачем продираться через заковыристый синтаксис, если требуется сделать что-то простое?<br />
<br />
Проработав более двух лет на C++ и найдя, что он все еще сталкивается с неприятными сюрпризами, Мацумото решил создать язык, максимально оправдывающий ожидания – чтобы в нем программы делали именно то, что интуитивно предполагалось, и отсутствовали тупиковые случаи. «Прежде всего надо думать о людях», провозгласил Юкихиро, «о том, как они мыслят о программе и как представляют себе действия машин. Люди – хозяева. А машины – работники».<br />
<br />
С историей – все, теперь о кодировании: Ruby называют «мультипарадигменным» [multiparadigm] языком. Это жутковатое слово означает, что язык включает и объектно ориентированный подход, и процедуры с функциями. Ruby – интерпретирующий язык, и его синтаксис близок к Python и Perl, поэтому он осваивается без труда.<br />
<br />
=== Освоимся ===<br />
Для начала нам понадобятся интерпретатор языка Ruby и интерактивный интерпретатор ''irb'', поставляемые с большинством дистрибутивов. Последнюю версию этих программ вы найдете в разделе '''Разработка''' нашего DVD.<br />
<br />
Вызовем интерпретатор, набрав '''irb''' в командной строке. На экране появится строка приглашения – можно с ходу вводить операторы языка. По традиции полагалось бы вывести “Hello world” – «Здравствуй, мир», но это старо как мир... Будем оригинальны:<br />
<br />
<source lang="ruby"><br />
puts “Goodbye moon!”<br />
</source><br />
<br />
Вроде все ясно: команда '''puts''' просто выводит на экран текстовую строку. Но в Ruby абсолютно все, даже строковые константы, – это объекты. Может, оно и странно, зато позволяет делать штуки вроде<br />
<br />
<source lang="ruby"><br />
“BlaBlaBlaa”.length<br />
</source><br />
<br />
С виду чушь, а на выходе печатается '''10''' – вполне настоящая длина строки. Или, например,<br />
<br />
<source lang="ruby"><br />
“Mmm, donuts”.index(“d”)<br />
</source><br />
<br />
возвращает '''5''', позицию символа '''d''' в заданной строке. (Учтите, нумерация в Ruby начинается с нуля, а не с единицы.)<br />
<br />
Итак, Ruby – страна объектов, где программировать значительно проще. Вдобавок, это еще и язык с динамической типизацией: переменные не нужно объявлять до их использования. Вот пример:<br />
<br />
<source lang="ruby"><br />
puts “Do you love Ruby yet?”<br />
answer = gets<br />
puts “You answered ” + answer<br />
</source><br />
<br />
На экран выводится вопрос, потом объявляется переменная '''answer''', и в нее тут же записывается результат команды '''gets''' (ввод строки с клавиатуры). Наш ответ затем выводится на экран. <br />
<br />
Заодно продемонстрирована операция над переменными: строки можно складывать ('''+''') и даже умножать:<br />
<br />
<source lang="ruby"><br />
mystring = “Some” + “text”<br />
puts mystring<br />
anotherstring = “Wowzers” * 10<br />
puts anotherstring<br />
</source><br />
<br />
Сначала две строки объединяются, и результат выводится на экран. Затем строка '''anotherstring''' заполняется десятью копиями строки '''Wowzers''', и результат также выводится на экран. Именно эффективные функции обработки текста обеспечили Ruby место под солнцем в мире разработчиков сайтов. Неплохо знать и метод '''chomp''' (вы могли встретить его в Perl): он убирает из строки последний символ, перевод строки ('''\n'''), который автоматически добавляется командой '''gets''' при вводе. Метод понадобится в тех случаях, когда нужно преобразовать введенную строку в число, т.е. в «голые цифры»:<br />
<br />
<source lang="ruby"><br />
x = gets.chomp.to_i<br />
</source><br />
<br />
Мы создали переменную '''x''', ввели строку командой '''gets''', откинули у нее символ перевода строки с помощью '''chomp''' и методом '''to_i''' преобразовали ее в числовое значение, которое затем присвоили '''x'''. Тип переменной '''x''' можно проверить:<br />
<br />
<source lang="ruby"><br />
x = gets.chomp.to_i<br />
x.is_a?(Integer)<br />
x.is_a?(String)<br />
</source><br />
<br />
Это показывает, что '''x''' – число, а не строка. Но мы можем немедля использовать '''x''' и как строку, если надо – благодаря динамической типизации. [Вопросительный знак является допустимым символом и часто используется в Ruby в именах методов, которые «отвечают на вопрос», – прим. ред.]<br />
<br />
=== Условия, циклы и функции ===<br />
Разобравшись с переменными и вводом/выводом строк, перейдем к управляющим конструкциям языка. Каждый из приведенных ниже примеров нужно предварительно сохранить в текстовом файле и запускать командой '''ruby <имя_файла>'''. Сохраните следующий пример в файле '''test.rb''' и запустите командой '''ruby test.rb''' – он иллюстрирует использование условного оператора '''if''' и кодовых блоков:<br />
<br />
<source lang="ruby"><br />
puts “How many kittens do you have?”<br />
x = gets.chomp.to_i<br />
if x > 0 # More than zero kittens<br />
puts “You have ” + x.to_s + “ kittens”<br />
else<br />
puts “Aww, you have no kittens!”<br />
end<br />
</source><br />
<br />
Мы запрашиваем у пользователя строку, затем уже известным нам методом '''to_i''' преобразуем ее в число. Далее оператор условия '''if''' сравнивает введенное число с нулем. Если условие в операторе '''if''' истинно, число преобразуется в строку с помощью метода '''to_s''', чтоб вписать его в сообщение, и сообщение выводится его на экран.<br />
<br />
Если же пользователь ввел '''0''', выполняются команды, расположенные после '''else''', то есть выводится другое сообщение. Блок кода завершается командой '''end'''. Между прочим, для лучшей читаемости текста мы применили отступы – можно их вводить клавишей табуляции, а можно и просто пробелами. Все как в других языках!<br />
<br />
Справа от оператора '''if''' помещен комментарий (в языке Ruby они предваряются символом '''#''').<br />
<br />
С циклами тоже проблем нет:<br />
<br />
<source lang="ruby"><br />
10.times do<br />
puts “Ruby rocks”<br />
end<br />
</source><br />
<br />
Все ясно – десять раз выводится строка! Оператор '''while''' ничуть не сложнее:<br />
<br />
<source lang="ruby"><br />
x = 0<br />
while x != 15<br />
puts “Please enter 15”<br />
x = gets.chomp.to_i<br />
end<br />
</source><br />
<br />
Этот код требует у пользователя ввода строки до тех пор, пока не получит число '''15'''. Тогда он покидает блок '''while/end''' и продолжает выполнение кода (правда, в данном случае выполнять уже нечего).<br />
<br />
Программирование на языке высокого уровня обязательно подразумевает модульность, так что займемся процедурами. Как мы уже говорили, Ruby – объектно-ориентированный (ОО) язык, аналогично C++, C# или Python. Но даже если вы знакомы только с обычным C, можете не бояться ОО-сложностей, по крайней мере, на начальном этапе. Рассмотрим использование функций:<br />
<br />
<source lang="ruby"><br />
def doubler(value)<br />
value = value * 2<br />
return value<br />
end<br />
puts “Enter a number”<br />
x = gets.chomp.to_i<br />
y = doubler(x)<br />
puts y.to_s<br />
</source><br />
<br />
Первая половина скрипта – описание функции, она не будет исполняться при запуске. Функция '''doubler''' умножает число '''value''' (аргумент функции) на два и возвращает результат. Из кода видно, как используется функция. (Обратите внимание, что функции должны быть объявлены до их использования, иначе Ruby выдаст ошибку.)<br />
<br />
{{Врезка|<br />
Заголовок=Ссылки|<br />
Содержание=<br />
* http://www.ruby-lang.org Домашняя страница Ruby.<br />
* http://rubyforge.org Библиотеки и программы.<br />
* http://www.rubycentral.com/book Отличный учебный курс по Ruby.<br />
* http://tryruby.hobix.com Онлайн-курс.|<br />
Ширина=50%}}<br />
Выполнение программы начинается с команды '''puts''': у пользователя запрашивают число, и оно передается в качестве параметра функции '''doubler'''. Результат, возвращаемый функцией, записывается в переменную '''y'''. Наконец, значение переменной '''y''' выводится на экран. Создание объектов в Ruby выходит за рамки данной статьи; хотите узнать больше – обратитесь на сайты, указанные во врезке «Ссылки» на этой странице.<br />
<br />
=== Работать чисто ===<br />
Обработка исключительных ситуаций в Ruby блаженно проста, например:<br />
<br />
<source lang="ruby"><br />
puts “Divide 5 by what?”<br />
x = gets.chomp.to_i<br />
begin<br />
y = 10 / x<br />
rescue ZeroDivisionError<br />
puts “Eeep, divide by zero!”<br />
end<br />
puts y.to_s<br />
</source><br />
<br />
Мы берем у пользователя число, потом входим в блок '''begin/end''' с разделом '''rescue''' внутри. Если пользователь, допустим, введет '''5''', в переменную '''y''' записывается частное от деления '''10''' на '''5''' и результат выводится на экран.<br />
<br />
А вдруг он введет ноль? Возникнет ошибка. В таких случаях происходит возврат в командную строку и вывод сообщения, над которым вы и будете ломать голову. Но мы не зря ввели обработчик исключения. Возникшая исключительная ситуация (деление на ноль) будет зафиксирована, и выполнится оператор '''puts''' внутри обработчика исключения, который выведет на экран сообщение об ошибке.<br />
<br />
Обработка исключений исключительно удобна: она спасает вас от ползания по коду в поисках проблемы и вставки проверок куда ни попадя. Ваш опрятный и компактный код отловит множество видов ошибок при исполнении, открытии файла и т.д.<br />
<br />
=== Создаем web-сервер ===<br />
Применим полученные знания и напишем собственный… web-сервер! Экстрим? Да нет, в Ruby это совсем несложно, благодаря библиотеке socket. Конечно, для ''Apache'' наш сервер конкурентом пока не станет, но зато продемонстрирует возможности Ruby. И вообще, зачем устанавливать и настраивать мощный сервер, если вам всего-то нужно хранить пару web-страничек для доступа к ним по локальной сети? Вы напишете собственный сервер на Ruby быстрее, чем произнесете “/etc/apache/httpd.conf”!<br />
<br />
Сохраните следующий код в файле '''webserver.rb''' в вашем домашнем каталоге. (Если вам лень набирать, возьмите его из раздела '''Magazine/Ruby''' нашего DVD.) Затем создайте в этом же каталоге две HTML-странички: '''index.html''' и '''test.html''', с произвольным содержимым, лишь бы выводилось в браузере.<br />
<br />
<source lang="ruby"><br />
require ‘socket’<br />
webserver = TCPServer.new(‘127.0.0.1’, 7125)<br />
while (session = webserver.accept)<br />
session.print “HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n”<br />
request = session.gets<br />
trimmedrequest = request.gsub(/GET\ \//, ‘’).gsub(/\ HTTP.*/, ‘’)<br />
filename = trimmedrequest.chomp<br />
if filename == “”<br />
filename = “index.html”<br />
end<br />
begin<br />
displayfile = File.open(filename, ‘r’)<br />
content = displayfile.read()<br />
session.print content<br />
rescue Errno::ENOENT<br />
session.print “File not found”<br />
end<br />
session.close<br />
end<br />
</source><br />
<br />
Запустите программу командой '''ruby webserver.rb''' и проверьте, как она работает. Для этого в адресной строке браузера введите '''<nowiki>http://127.0.0.1:7125</nowiki>'''. Если все нормально, вы должны увидеть содержимое странички '''index.html'''! Соответственно, набрав '''<nowiki>http://127.0.0.1:7125/test.html</nowiki>''', вы увидите содержимое странички '''test.html'''. Код говорит сам за себя, но мы все равно разберем его подробно.<br />
<br />
{{Врезка|<br />
Заголовок=Модные модули|<br />
Содержание=<br />
Ruby поставляется с набором модулей, расширяющих возможности языка, подобно библиотекам C модулям Python. В зависимости от используемого дистрибутива и версии Ruby их расположение может различаться, например, в Ubuntu 6.06, они расположены в каталоге '''/usr/lib/ruby/1.8/i486-linux/'''. В стандартную поставку входят модули для разработки сетевых приложений, сжатия данных с использованием ''zlib'', консольных приложений на базе ''Ncurses'' и многие другие. Их функциональность добавляется в программу строкой '''require''', как в нашем примере с сервером.<br />
<br />
Дополнительные модули можно загрузить через систему RubyGems, аналогичную CPAN для Perl. Разработаны модули для взаимодействия с базой данных MySQL, разработки приложений для Gnome и KDE и т.д. Похоже, недолго ждать времени, когда на Ruby можно будет сделать почти любое приложение рабочего стола. За дополнительной информацией обращайтесь на сайт [http://rubyforge.org RubyForge] (см. врезку «Ссылки»).|<br />
Ширина=40%}}<br />
Начинается код с команды '''require''', подключающей внешние библиотеки. В данном случае мы используем библиотеку '''socket''' – это набор процедур, сильно упрощающий сетевое программирование (см. врезку «Модные модули» справа). Следующая строка создает объект сервера на локальном IP-адресе '''127.0.0.1''' и порте '''7125'''. Номер порта может быть любым, но для использования портов до тысячного (например, '''80''') потребуются права администратора системы.<br />
<br />
У нас получился сервер локальной сети; а мы хотим, чтоб с ним могли работать web-браузеры. Цикл '''while''' обрабатывает запросы к серверу, пока в окне терминала не нажать клавиши '''Ctrl+C'''. Внутри этого цикла сервер принимает запрос клиента и посылает браузеру стандартный ответ из двух строк: сообщение, что запрос принят, и HTML-заголовок. Символы '''\r''' и '''\n''' означают «возврат каретки» и «перевод строки» соответственно.<br />
<br />
Затем обрабатывается запрос, полученный от браузера. Обычно он выглядит примерно так: '''GET /filename.html HTTP/1.1'''. Нам нужно определить в нем имя запрошенного файла. Сохраним строку запроса в переменной '''request''' и извлечем оттуда имя файла методом '''gsub''': он отделит от строки части GET и HTTP/1.1 при помощи регулярных выражений. '''Gsub''' напоминает командную утилиту '''sed''' – быстрый способ заместить или отделить части строковой переменной.<br />
<br />
От полученного имени файла с помощью метода '''chomp''' отделяется последний символ перевода строки, после чего результат сохраняется в переменной '''filename'''.<br />
<br />
Большинство web-серверов, если имя файла не указано, по умолчанию загружают '''index.html'''. Блок '''if''' так и делает: если строка с именем файла пуста, переменной '''filename''' присваивается '''index.html'''. Можно, конечно, использовать и другой файл.<br />
<br />
После этого (внутри блока '''begin/end''') мы открываем полученный файл на чтение и записываем в переменную '''content''' его содержимое, прочитанное с помощью функции '''read()'''. Содержимое файла отсылается браузеру, методом '''session.print'''. А вдруг такого файла не найдется? Тогда '''rescue''' отправит браузеру сообщение об ошибке.<br />
<br />
=== Мысли напоследок ===<br />
Вот сервер и готов. Удивительно просто, правда? Конечно, пока он обрабатывает только HTML-файлы – но были бы кости, мясо нарастет. Главное, что это пример применения Ruby в реальной задаче, и по нему видно, что код получается чудесно-простой и легко читаемый.<br />
<br />
В Ruby еще много чего можно исследовать, и так как Ruby on Rails продолжает набирать популярность, вы об этом языке, несомненно, еще услышите. Ясный и разумный синтаксис Ruby лучше всех прочих поможет разобраться с объектно-ориентированным программированием тем, кто привык к С или Basic. Внизу слева находится врезка «Ссылки», там вы найдете и учебники, и прочую информацию. А напишете нечто крутое – сообщите нам на форум http://www.linuxforum.ru. Как знать, может, вашей будущей программы не хватает на нашем DVD...</div>Interlace