9 января 2009 в 04:03

Покорим Ruby вместе! Капля вторая

Продолжаем изучать Ruby? Так точно!

В первой части мы получили обзорные знания о Руби и Рельсах и, надеюсь, решили, нужно ли нам это, или нет. Так как мы взялись за язык основательно необходимо обустроить рабочее учебное место. Нам нужны: сам интерпретатор Ruby, фрэймворк Rails, база данных (MySQL, думаю, будет лучшим выбором) и непосредственно среда разработки, которая должна сделать процесс программирования приятным, удобным и увлекательным ;)



Среда для разработки


Как и в других интерпретируемых языках создавать готовые программы можно и в Блокноте, однако же мы всерьёз схватились за Руби ;) Стоило бы, наверное, погуглить IDE для языка, провести какое-то тестирования производительности и функциональности. Но мы же непрофессионалы, так что ищем наиболее универсальное, надежное, качественное, проверенное решение. И оно есть: это Ruby in Steel для Microsoft Visual Studio 2005/2008. Да, это сугубо коммерческий, закрытый продукт только для Windows. Но, во-первых, это знакомая IDE, которая верно будет вам служить в будущем, во-вторых она не базируется на Java, что положительно отражается на скорости работы (это важно для слабых компов, вроде моего), в-третьих, полнофункциональная trial-версия работает 60 дней, чего, я надеюсь, нам будет достаточно для нашего курса.

Если же вы отдаете предпочтение другим ОС, то несомненно стоит взглянуть на свободный кроссплатформенный NetBeans IDE 6.0 Ruby.

Выбранная вами среда разработки в дальнейшем особого значения не имеет, однако процесс установки компонентов я буду освещать для Ruby in Steel — он достаточно прост, так как вы можете скачать All-in-One Installer — готовый пакет с бесплатным Visual Studio 2008 и всем необходимым для нашего учебного места.

После загрузки распакуйте архив и запустите Setup. Отметьте нужные пакеты (в большинстве случаев стоит оставить все по умолчанию), нажмите Install и только успевайте нажимать Next и Finish в появляющихся окнах установщиков. В процессе установки будут загружены и установлены последние Rails, поэтому консольные окна не закрываем и ждем, когда появится «Press any key to continue...». Для MySQL можем задать запуск в виде сервиса Windows и установить пароль рута.

Никакой дополнительной конфигурации не требуется — просто запускаем свежеустановленный Visual Studio.

Первый проект


Проект в Ruby in Steel создаем как обычно в VS: File — New — Project — Ruby In Steel (слева) — Ruby Project (справа) — Name (задаем имя проекта) — OK.

Стоит уделить внимание иерархии организации работы с кодом — проект (Project) содержит в себе один или несколько файлов в одной или нескольких папках, в то же время Solution (решение) может содержать несколько проектов.

После создания проекта он уже содержит в себе один пустой файл rubyfile.rb, новые файлы добавляются через контекстное меню проекта. Двойной щелчок по имени файла открывает его в редакторе. Дальнейший код будем писать прямо в rubyfile.rb — это наш тестовый файл.

Первая программа


Традиционно это Hello World:

puts "Hello World!"

Упс, это всё… Ctrl+F5 в среде — и результат, так сказать, налицо!

Игры со строками


puts "Hello World!\nPrivet Mir!"

Как вы заметили прямо в строках работают управляющие последовательности (Escape Sequences), в т.ч. \n (новая строка), \t (табуляция), \s (пробел) и др.

puts 'Hello World!\nPrivet Mir!'

А вот строка, заключенная в апострофы «глупая» — она не понимает ES, поэтому в большинстве случаев используем именно кавычки. Однако если заранее известно, что ES в строке не нужны, то апострофы позволяют выиграть в производительности приложения.

puts 'It\'s Ruby'

Хотя нет, «глупая» строка понимает \' и больше ничего.

print "Hello World!"
print "Hello World!"


В отличие от оператора puts print не делает перенос строки после вывода переменной.

puts "2 x 2 = #{2*2}"

Замечательная возможность Ruby — регулярное выражение в переменной — вы можете вставлять кусочки кода Ruby прямо в строки используя конструкцию #{code}.

puts "#{"Ruby! "*4}"

«Умножаем» строку на четыре и получаем слова песни Kaiser Chiefs ;) Причем делаем все это в одной строке кода!

puts "\n\t#{(1 + 2) * 3}\nGoodbye"

Попробуйте представить, что выведет этот код и проверьте ваше догадки :)

Эпилог


За два «занятия» мы узнали что такое Ruby и Rails, узнали их преимущества, настроили учебное место, установили IDE, написали Hello World и даже немного познакомились с работой со строковыми переменными в Руби, обойдясь при этом без ООП.

Думаю, что мы и дальше будем познавать нативный, «чистый» Руби, отставив Rails в кладовку на будущее. Заранее прошу прощения за это перед теми, кто рассчитывал сразу штамповать сайты. Далее мы познакомимся с числовыми переменными, методами, локальными и глобальными переменными. Теперь будет меньше текста, больше кода

PS: При написании записи использовались известные бесплатные пособия HUMBLE LITTLE RUBY BOOK от Jeremy McAnally и THE BOOK OF RUBY от Huw Collingbourne, особая благодарность Google и Яндексу. Как всегда, наверное, в тексте есть ошибки, неточности — сообщайте о них в комментариях. Если вам известны какие-нибудь оригинальные учебные пособия по Ruby (можно на английском), доступные для загрузки — также жду вас в комментариях.

Третья капля уже здесь
Макс Креминский @MaxElc
карма
101,7
рейтинг 0,0

Комментарии (94)

  • +2
    Пора переносить в Ruby. Спасибо!
    • 0
      Да как-то стесняюсь :))
      • +2
        Да я вам завидую! Проходил тот же путь, а описать не могу :(
        Срочно в Ruby!
        • +1
          Перенос на вашей совести!!! :))))
          Спасибо за тёплые слова!
          • +1
            Совесть пропил. Кармы нет. Нечего терять :)
            • +3
              Впервые добавляю кому-то карму — так приятно, оказывается ;)
  • +3
    не прошло или суток:)
    Надеюсь что получится полный каплями стакан-главное не останавливаться.
    Спасибо, очень увлекательно:)
  • 0
    Спасибо. С таким ненавязчивым и толковым объяснением, начинаю опасатся, что упаду все таки, в объятья Руби
  • 0
    ru.wikibooks.org/wiki/Ruby
    по моему для начала самое оно.
    • +1
      «Массив лучше всего вообразить как гусеницу или поезд с лапками-запятыми вместо колёс. Ползёт он всегда влево, на левом же конце его локомотив — первый элемент.»

      Убило.
      Дальше решил читать
      Programming Ruby The Pragmatic Programmer's Guide
      • 0
        Правильный путь паддаван :)
      • 0
        Pickaxe для начинающих самая лучшая книжка!:)
        Да и не только для начинающих, например глава про сишные расширения.
      • 0
        вот если бы перевод еще
  • +1
    Кстати, про IDE: тем, кому люб OS X, очень рекомендую взглянуть на TextMate. Ядрёная штука!
    • +4
      это не IDE, а текстовый редактор
    • 0
      Для ОсХ конечно это круто, но у большинства людей не маки

      Windows/Linux IDE:

      Мой выбор Aptana with a RadRails plugin. Плагин тот же что и

      texteditors like TextMate:

      e-editor ( платный, но удобств столько как и textmate )
      gedit ( проплагинить и будет как textmate )
      • 0
        забыл дописать

        *Плагин тот же что и для eclipse
      • +1
        VIM
        Emacs
        на кой ещё что-то платить?)
    • +1
  • +5
    > регулярное выражение в переменной (expression interpolation)

    Expression interpolation это скорее «интерполяция выражений». Regex'ы из совсем другой оперы. :)
    • 0
      Ввело в заблуждение пособие:
      Double quoted strings also offer another interesting feature: expression interpolation. As fancy as that sounds, it simply means this: you can insert the value of pieces of Ruby code into strings directly.
      Исправляю.
  • –2
    Почему каждому новому языку каждый раз придумывают новый синтаксис…
    Вот почему я убил Луа, вот почему не смотрю в строну Руби
    • –1
      О да, надо писать в только синтаксисе ассемблера.
      • –1
        Почему С и Java имеют схожий синтаксис.
        Почему ПХП тоже имеет похожий синтаксис.
        Почему даже паскаль особо далеко не ушол от этого синтаксиса…

        Хотя конечно по сравнению с луа — руби сказка :)
        • 0
          А когда-то кто ругался на Си и «потомков» после фортрана и бейсика :) Почему нет номеров строк, как перейти куда хочу :)
        • +3
          >Почему ПХП тоже имеет похожий синтаксис.
          Если синтаксис пхп на что-то и похож, то разве что на исковерканый синтаксис перла из которого выбросили за недомыслием причину префиксов перед переменными, но оставив зачем-то эти самые префиксы, которые в отсутствии причины стали совершенно лишними и уродливыми до тошноты. Ну, а нынешние добавлятели всякой всячины в пхп явно идут по явскому пути словестного поноса :). Скоро уже станет необходимым писать:
          public static final function void main() :) :) :)
          >Почему даже паскаль особо далеко не ушол от этого синтаксиса…
          Паскакаль имеет синтаксис унаследованый от алгола-60, на сишный он даже издали похож крайне слабо :).

          А чего такого непохожего в рубишном синтаксисе? По-моему, он даже ближе к сишному, чем пхп-шный.
          • –1
            Наверное годы параллельной работы на С и ПХП притупили мой взор и посеяли предвзятое отношение к другим языкам.
          • 0
            После моей первой и последней попытки написать «hello, world!» для интернета на C (в конце 90-х) я понял, что надо изучать другой язык, после небольшого анализа понял, что выбирать нужно между perl и php. Взял с пяток скриптов (госетвухи, счетчики и т. п.) на том, и другом, скачал мануалы и засек время, которое понадобится чтобы написать простейший скрипт, как сейчас говорят, фотохостинга. На PHP понадобилось часа 3, синтаксис после C прозрачен был, с Perl часов за 15 так и не разобрался. И на мой неразобравшийся до сих пор в Perl'е (хотя изучал регулярки по книге, где 90% кода было на нем) взгляд PHP и C (да и Java туда же) практически один язык по сравнению с Perl'ом. Хотя, конечно, тому, кто владеет одинаоков хорошо всеми тремя, виднее :)
            • 0
              Я на перле, конечно, уже несколько лет ничего не писал, но, по памяти, из перла легко выделить небольшое подмножество, которое будет практически полностью совпадать с пхп по синтаксису (с совсем небольшим отличиями) и легко писать на нём в «стиле пхп» :). Я ни в коем случае не призываю так делать :), но, всё-таки, пхп — это донельзя упрощённый перл (основы, основы — нововведения весьма отличны уже). И на перл он, на мой взляд, похож больше, чем на си. Хотя, конечно, если исходить из того, что синтаксис самого перла имеет сишную природу, пхп, несомненно, c-like язык, синтаксически :).
              • 0
                Не буду спорить, но точно помню свои впечателния от первых взглядов на два аналогичных (функционально, вроде валидация формы и запись ее БД) листинга на php и perl. PHP — да это ж си практически, только $ ставить перед переменными и function писать (потом, конечно, больше различий нашел), Perl — хм… а это с какого конца читать вообще надо
                • +1
                  Да не о том я. На перле можно написать функциональный аналог почти текстуально совпадающий с таковым на пхп. Ещё и регэкспы будут человечьими, а не это пхп-шное уродство с безумным размножение палок.
                  Но можно написать и короче. Удобнее. Красивее. Если не поленился изучить как это делать, конечно. Если знаешь язык, запись будет понятна. Если не знаешь… Ну, зная только какой-нибудь кобол, с пхп будут ровно те же затрудния :).
                  Тут, главное, в ряду «короче-удобнее-красивее» вовремя остановиться, поскольку выразтельные возможности перла позволяют впасть в состояние крайней степени тяжести и писать write-only код :). Ну, это расплата за мощнось…
    • +1
      затем что это другой язык, и синтаксис в языке играют немаловажную роль
      • –1
        Синтаксис силен в перле, скажем так — он краегольный камень языка…
        А тут хмм — мелочи, да не приятно
        • +1
          почитайте получше описание синтаксиса руби и вы поймете что данный синтаксис дает нам много-много сахара… и возможностей для этого сахара… что в свою очередь очень сильно влияет на сам язык в целом и конструирует его.
          • –3
            Руби я конечно же узучал. Для сайтов полезнее быть написаными на Руби…
            Но есть такая чтука — спинной мозг. Очень сложно заставить его писать в другом синтаксисе.
            Он сам будет вбивать так как привык.
            Переучивать его — это время и нервы.
            Время — деньги.
            • +3
              а вы пишите программы не спинным мозгом а головным;) оно как-то полезнее
              • –2
                пускай головные мозги программируют, а спинные кодят.
                Я свои как-то за 15 лет приучил :)
            • 0
              А вы попробуйте воспринимать это не как затраты, а как инвестиции.
              • –1
                Одна фигня :)
                Если захочу убить время и сделать что-то эдакое — начну писать сайты на Сях :)
                Опыт и фреймворк есть…
                Если решу какнить сменить свою сексуальную ориентацию — так и сделаю :)
    • +1
      Потому что иначе это будет не новый язык. Вот почему я не смотрю на новые языки, пишу в двоичном коде. 0110101101010011111одинодинодин
  • +1
    > во-вторых она не базируется на Java, что положительно отражается на скорости работы
    Я, конечно не говорю, что GUI-софт на джаве быстрый, но все же… сравни eclipse/idea/netbeans с VS2008 по производительности )
    По крайней мере у меня джавовские быстрее работают.
    • +4
      А у меня медленнее.
  • 0
    вот спасибо… то, что доктор прописал. параллельно начал изучать.
    в избранное…
  • 0
    Жду третью каплю и все последующие!
  • +1
    А кому не надо IDE, можно так
    Windows:
    Сам руби — fhttp://rubyforge.org/projects/rubyinstaller/
    Rails — gem install rails

    Debian based
    sudo apt-get install ruby1.8 ruby1.8-dev ri1.8 rdoc1.8 irb1.8
    sudo gem install rails

    Что бы быстро посмотреть на руби, можно использовать интерактивный интерпретатор — irb (аналог питоновского)
    Например получить все ссылки на статьи с главной хабра:
    ivs@debian:~$ irb
    irb(main):001:0> require 'open-uri'
    => true
    irb(main):002:0> open(«habrahabr.ru/»).read.scan(/href="([^"]*)" rel=«bookmark» class=«topic»/)
    => [[«habrahabr.ru/blogs/google_chrome/48638/»],…
    • 0
      Смотрю список пакетов с 'ruby' в репе убунту вижу версии 1.9 уже, а метапакеты ставят 1.8, причем с 1.8 на 1.9 обновляться не хотят, только ручками. Просто недоработка мейнтейнеров или есть что-то в 1.9 плохое?

      P.S. может кому пригодится из начинающих юнксоидов, я минут 15 разбирался:
      запускать в шелле .rb файлы можно командой ruby hello.rb, а можно ./hello.rb если дать права на выполнение и написать в первой строке .rb файла #!/usr/bin/ruby
      • +2
        1.9 это эксперементальная ветка, 1.8.6(уже 1.8.7, но там были баги, хотя профиксили уже вроде) — стабильная.
        По-этому они на два пакета разделены. На 1.9 новые идеи обкатываются, которые потом в 2.0 появяться.
        Хотя 1.9 быстрее, так как там уже добавили YARV — виртуальную машину.
        Для обучения впринципе безразлично, только что в 1.9 новые фичи есть, еоторых в 1.8 нет.
        А для продакшена практически всегда используют 1.8.6

        >из начинающих юнксоидов
        Для начинающих тогда уж полностью расписать:)
        Первая строка в файле #!/usr/bin/ruby или #!/usr/bin/env ruby
        Потом в терминале
        $ chmod u+x test.rb — делаем файл исполняемым, нужно сделать только один раз
        $ ./test.rb — запускаем

        Или же просто без всех этих махинаций(а в windows только так)
        $ ruby test.rb
        • 0
          спасибо, значит пока оставим 1.8
  • +3
    NetBeans уже 6.5 вышел www.netbeans.org/downloads/index.html

    Жаль, конечно, что не что-нибудь открытое и кроссплатформенное в качестве среды для «капель» выбрали.
    • –1
      Если есть необходимость, то я могу написать и о NetBeans. Там еще проще — после установки среды не нужно загружать ни руби, ни рельсы, ничего. Сразу создаем проект, следим, чтобы путь к проекту на содержал кириллицы, в качестве Ruby Platform выбираем встроенный JRuby. Так как мы отложили рельсы, до этого пока будет достаточно
      • 0
        ну насчет необходимости не знаю, лично я уже разобрался почти, так, может пару абзацев для тех, кому точные пункты меню нужны :)
      • 0
        действительно, бОльшой необходимости нет, но было бы неплохо (и даже хорошо) «капать» и в свободном ПО ;)
      • 0
        тока писал о NetBeans 6.5 для Ruby, мега весч paxer.habrahabr.ru/blog/48515/
  • 0
    Друзья, я думаю, можно очень долго холиварить на тему: использовать ли IDE для Ruby. Только вот я вчера свою сборку Aptana променял на gedit.
    И, да, чего же все под vim и emacs сидят? :) от вселенской глупости? попробуйте…

    Спасибо за топик :)
    • 0
      Я тоже фанат gedit'a :). Все хочу приобщится к vim или emacs, но что то как то не выходит пока.
    • 0
      ну холиварить пока не начинали, мне так не с руки, только что первую строчку на руби написал, в gedit, кстати, который сегодня променял на netbeans (правда не знаю надолго ли, уже один баг отправил на багзиллу, если так и дальше пойдет, то наверное придется вернуться :( )

      А под vim и e-macs, имхо, сидят те, у кого либо выбора не было когда-то, либо было много свободного времени и энтузиазма на изучение хотя бы основ их, или я такой тупой, что мне часа не хватило на то, чтобы понять как элементарные операции (открыть/создать файл, закрыть/сохранить, набивать текст, перемещаться по нему, редактировать, копи-пастить и т. п.) выполнять.

      P.S. Вот только что еще раз попробовал, 5 минут слушал пиканье, потом все-таки зашел в хелп где написано, что хелпа нет, и еще 5 минут оттуда выходил, а потмо две минуты опять назад в шелл выходил… видать совсем тупой я, раз мне проще через cp /dev/stdin file.txt набить если уж nano хотя бы не будет :)
      • +2
        vim осиливается с потом, а рассаёшься с ним со слезами
      • 0
        Ну в принципе человек глазом то учится управлять пару лет, так что несколько дней на освоение инструмента — это нормально.
        И странная ситуация с хелпом у вас, на емаксе туториал на русском в поставке идет, а у вима вимтутор есть.
        • 0
          набрал vim, появился «сплэш» с надписями типа
          type :help iccf to help children in Uganda
          type :help for help
          type :q to exit
          f1 нажал (и то не сразу, уж очень дети уганды заинтерсовали :) ), в хелп попал, потом долго соображал как выйти из него, потом из редактора (надо еще! в конце поставить), в общем нельзя все-таки такие длинные каникулы делать :))))
          оказывается надо двоеточие нажимать, это не знак пунктуации, а часть команды, причем нажимать его с шифтом надо, то есть смотрит не нажатую клавишу, а ascii код, и вообще интерфейс основан на командной строке похоже. В общем сложно вникнуть во что-то абсолютно отличающиеся от того к чему привык за 20 лет, даже в дос в edit, не говоря уж о лексиконе примерно те же принципы интерфейса, что и в каком-нибудь ворде 2007

          ну а в самом хелпе надпись что vim online help not installed on this system, оказывается у меня стоял vim-tiny без хелпа, сейчас поставил vim-runtime, но что-то все равно не верится, что даже через неделю исходники скажем на том же php буду набирать и править быстрее чем даже в gedit, не говоря уж о netbeans или eclipse

          • 0
            vimtutor запустите.
    • +1
      Ну какие «все», считаные единицы особо бородатых одминов под ними сидят… :)

      Сам сейчас занимаюсь насильным пересаживанием себя за emacs, никаких практических причин для этого у меня нет, а чисто в порядке самоистязания, чтобы сила духа окрепла… Запретил себе писать код в чём-либо кроме емакса, уже недели три держусь, возможно, и вообще останусь… Думаю, может, статью какую-нибудь накатать, не туториал, а скорее хронику перехода и обзор того, что приобретаешь, переходя на emacs с типичных Windows GUI IDE. А то обычно если кого спросишь об этом — он либо еще не знает, либо уже не помнит :)
      • 0
        Поверьте, гигов хватает :) там не только и не столько бородатые дядьки. половина Merb и Rubinius команды О_о
        • 0
          > гигов хватает

          ЩИТО? :)
          • 0
            О_о гиков, пардон.
  • 0
    Кстати, насчет Ruby IDE.
    Есть еще RubyMine www.jetbrains.com/ruby/index.html
    Притом еще и бесплатная(пока).
    Любителям IDE думаю стоит посмотреть, т.к. она от того же разработчика что и IntelliJ IDEA, одной из лучших Java IDE.
    • 0
      Приятная RubyMine заставила мой комп буксовать. В то же время даже более способный NetBeans работает намного быстрее
      • 0
        Хм, когда писал на Java, использовал только InelliJ IDEA, нк тормозило и норм работало.
        А RubyMine я даже не смотрел, меня вполне gedit устраивает:)
        Но очень странно что у RubyMine такой регресс по сравнению с IDEA…
  • +1
    А еще в викиучебнике, есть отличный учебник по раби ru.wikibooks.org/wiki/Ruby
    • 0
      он Руби а не Раби:)
      • 0
        Да :) они называют его именно руби. подкасты / скринкасты тому подтверждение )
        • 0
          Да и вообще, «u» как «а» читается только в закрытом слоге, например bus.
          А тут открытый слог, так что Руби!:)
          На подкасты/скринкасты тоже полагаться нельзя, их не всегда англоязычные люди читают.
          Слушал доклад японца с rubyconf2008, дак там вообще ужас с произношением:)
          • 0
            да какая разница как мы называем, есть важнее вещи
          • 0
            Само собой :) Там индусы и японцы в перемешку))) По акценту же сразу слышно, native english это, или подстава :)
          • 0
            Японец не Матц случаем?
  • 0
  • 0
    насчет «глупых» строк — в большинстве книг, которые я читал (и по Руби, и по PHP, и по чему-либо еще) они назывались «lazy» («ленивые»)
    • 0
      А у меня в книгах они называются «silly» :)
      • +1
        ну и бог с ними, суть ясна. статья кстати хорошая, тоже все собираюсь заняться Руби, книжек почитал, а рабочей идеи которую стоило бы начать реализовывать никак не придумаю
        • 0
          Мне бы ваши проблемы :) Идей много, а вот с реализацией все затруднительно
  • 0
    Хотя нет, «глупая» строка понимает \' и больше ничего.


    Неправда :) Она понимает еще \\ :)
    ЗЫ: Удачи в дальнейшем освоении. И не забывайте про "инлайны в строках #{2+3}" :)
    • 0
      Ой, а подскажите, что такое инлайны :-[
      • 0
        Ну то что я написал выше в строке. Очень удобно во всякого рода выводах при форматировании строк. Ну скажем один и тот же пример на 3х языках:

        Паскаль (делфи):
        ShowMessage('2 + 3 = ' + IntToStr(2+3));

        С/С++:
        printf(«2 + 3 = %d», 2 + 3);

        Руби:
        puts(«2 + 3 = #{2+3}»)

        То есть, выражение втыкается прямо в строку. Естественно, инлайнов может быть сколько угодно и они даже могут быть один внутри другого.

        puts(«координаты цели (#{myobj.x}, #{myobj.y})»)

        В общем случае строку с инлайном можно развернуть в выражение:
        «foo #{X} bar» эквивалентно «foo » + (X) + " bar"
        • 0
          Блин, редактор преобразовал кавычки =) Ну в общем надеюсь понятно
          • 0
            Спасибо — действительно понятно :)
  • 0
    NetBeans 6.5 весьма советую.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    The Book Of Ruby by Huw Collingbourne
    www.sapphiresteel.com/The-Book-Of-Ruby

    А про IDE их много. Но мое мнение то, что во время изучения языка лучше использовать текстовой редактор.
  • +1
    Покурим Ruby вместе! Капля вторая
  • +1
    Why's (Poignant) Guide to Ruby
    Очень интересная книга.
  • 0
    .., и даже немного познакомились с работой со строковыми переменными в Руби, обойдясь при этом без ООП.

    Позанудствую, но вам никак бы не удалось обойтись без ООП. В Руби же все есть объект. =)
    • 0
      Об этом я написал в третьей части ;)
  • 0
    Третья каплЯ уже здесь :-)
  • +1
    Так начало не плохое хочу больше

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.