Rubinius - виртуальная машина и компилятор для Руби.
Большинство реализаций Руби, такие как JRuby, XRuby, Gardens Point Ruby.NET, IronRuby, написаны на С. Rubinius использует идею, взятую из архитектуры Smalltalk-80 VM - он написан на языке-подмножестве самого себя. Этот язык называется Garnet. Evan Phoenix объясняет это так:It's still something I plan on doing sooner rather than later. There ended up being a lot of issues we wanted to tackle first, and we haven't get got back to working on Garnet (the new name for Cuby). There were no particular problems yet, but I'm sure well find some.
Garnet looks like ruby at first glance, but the semantics of what things mean have been rewired.
For example, in garnet code 'd = c.to_ref' appears to call a method called to_ref on c, but garnet will translate that into 'd = &c', which is C code. One way to think about it is as a really advanced C preprocessor. It tries to map as much as it can to C constructs. The idea is something that looks like ruby, but behaves like C.
Поподробнее о Rubinius можно почитать тут:
The Rubinius Project
All content and news on InfoQ about Rubinius
evan.musing << current
четверг, 27 сентября 2007 г.
Rubinius - Ruby VM написанная на Ruby
Автор: sash_ko на 21:17 0 коммент.
Ярлыки: Программизм, Ruby
Чешская мечта (Польша, Краков)
...продолжение описания тура "Чешская мечта" в Чехию через Польшу...
В 7 часов утра выехали автобусом изо Львова в направлении польской границы. Всего 5 часов на границе и мы в Польше.
Сразу заметно, что мы выехали за границу - на бигбордах практически исчезли надписи на родном языке. Хотя загадочное слово "гуртовня" встречалось еще много километров от границы. Вообще, приграничные районы у "нас" и у "них" похожи как две капли воды - сплошные торговые точки и "гуртовни". Но совсем другие дороги! Чем дальше родина, тем больше необычного. И вот первое впечатление: "А де картоха? Де огороды вокруг домов??"
По обочинам - аккуратные разноцветные домики с черепичными крышами, вокруг них - лужайки с качелями, креслами, цветам, вокруг лужаек - небольшые декоративные заборчики. Во многих поселках вдоль дорог стоят шумопоглатители - высокие пластиковые (наверно даже не пластиковые) высокие заборы, в некоторых случаях даже прозрачные. У-у-у-у буржуи! Проехали всего ничего, а уже такие отличия!
При въезде в Польшу я не оценил качество дорог, только на обратном пути, когда въехали во Львовскую область и вдруг автобус начал скакать. Встечались и платные участки дорог. Но не все так хорошо - машин на дорогах было ощутимо больше, чем на Украине. Как мне показалось, поляки предпочитают жить подальше от города, туда ездят только работать.
Уже начало темнеть, когда мы приехали в Краков. Высадившись в Старом Городе, недалеко от Вавеля, отправились на первую экскурсию по вечернему городу.
Старый Город - сплошные старинные здания и костелы. Так как это была моя первая поездка в еропейский город, я непереставал удивляться. Здания в хорошем состоянии, везде чисто, освещено и никто не пьет пиво на улицах. Именно здесь, я оценил запрет на распитие пива на улицах.
Выйдя на Рыночную площадь, я понял, что именно так я представлял себе Европу. Булыжник вместо асфальта, бесчисленные кафаны, уличные музыканты, все это окружено старинными зданиями, освещено многочисленными фонарями, а посреди площади - старое здание Ратуши. Даже люди казались не такими, более "европейскими". Ни в Киеве, ни в Москве такого ощущение у меня небыло. И я подумал, а что же тогда в Праге, разве может быть красивее и "европейскее"?? Забылась даже усталось от более чем десяти часовой поездки в автобусе.
Но времени на прогулку у нас было не много, до 11 часов вечера нашу группу надо было поселить в гостинице (гостиница Artur на окраине города, намного лучше гостиницы в которой мы жили в Праге).
На утро по программе у нас была запланированна поездка в аквапарк, что существенно сокращало время на экскурсию по Кракову (для клиентов гостиницы в аквапарке должы были предоставляться скидки, но руководитель группы об этом не обмолвилась и словом). Поэтому мы отказались от аквапарка и рано утром отправились в город.
Старый город не такой уж и большой, но очень насыщенный достопремечательностями. В Вавель, краковский кремль, мы должны были отправиться с гидом, большая часть группы вернется из аквапарка. Поэтому у нас было достаточно времени что бы посмотреть то, что не входило в программу и самим дополнительно погулять по Вавелю. Оказалось, что не стоит ити туда с гидом, предоставляемым тур фирмой. Там намного интереснее побродить самому - можно увидеть больше и не нужно постоянно бежать за кем-то. Либо самому взять одного из многочисленных гидов уже там, на месте.
После Вавеля у нас осталось часа полтора до отъезда в Прагу. За это время мы успели попробовать польское пиво, пообедать в кафане (цены и размеры порций нас приятно удивили), купить сувениров и решить, что групповой тур на самом деле не подходит, если хочешь не только посмотреть страну, но и прочувствовать ее. В отзывах других туристов об этом туре, я читал восторженные отзывы о гидах, создавали такую атмосферу, когда чувствуеш себя как будто в своей стране. Но мы не за этим туда ехали. Имхо, какой бы небыл хороший гид и какой юы нибыла хорошей программа, тур расчитан на то, что бы максимально заработать на туристах. То что сама путевка стоит не так уж дорого - еще не говорит, что сама по себе поездка обойдется дешево. "Один раз живем" - так думают туристы... и так зарабатывают тур агенства. Нет, все было очень хорошо, просто не так, как мы хотели. Групповой тур не очень удобен для индивидуального отдыха.
И вот в 14 часов мы выехали из Кракова в Прагу...
Здесь можно посмотреть некоторые краковские фотки
Автор: sash_ko на 14:27 1 коммент.
Ярлыки: Путешествия
среда, 26 сентября 2007 г.
How to swap two variables in Ruby?
Yeah, It's really simple to do! You must write only one string:
Ruby provides parallel assignment - they can be preformed in parallel. So it's normal code for Ruby:
Moreover, Ruby provides nested assignment:
Автор: sash_ko на 21:34 0 коммент.
Ярлыки: Программизм, Ruby
Особенности изменяемых атрибутов (writable attributes) в Ruby
Изменяемые атрибуты (writable attributes) - атрибуты объекта, которые могут быть изменены сторонними объектами. Для этих атрибутов должен быть определен метод присвоения или или ему должно быть разрешено изменение (attr_writer, attr_accessor), что бы этот метод сгенерился автоматически :
Ruby позволяет создавать виртуальные атрибуты - реально переменной объекта не существует, но есть методы, имитирующие доступ к ней:
Все понятно. Не понятно только почему в методе reset доступ к hour осуществляется через self, а в методе dump - без self. Оказывается, что в случае отсутствия self при записи значения hour интерпритируется как локальная переменная метода reset. Поэтому нужно явно указывать что вызывается метод класса, а не выполняется инициализация локальной переменной. Это существенно только для записи значения. При чтении self не обязателен. Если забыть об этом, можно получить не очевидную ошибку.
Автор: sash_ko на 20:07 0 коммент.
Ярлыки: Программизм, Ruby
ГрОб в Киеве
Что-то Летов зачастил в Киев. Совсем недавно, год назад ГрОб приежал со своим очередным новым альбомом. И снова новый альбом "Зачем сняться сны".
Вообще, мнения о последних альбомах расходятся координально, начиная от "Летов опопсел, списался, спелся, спился и т.д... гавно..." и заканчивая "Наконец-то Летов начал писать нормальную музыку... видать бросил пить... курить...". "Зачем сняться сны" я еще не слушал, поэтому не буду о нем судить. Имхо последние альбомы начиная со "Звездопада" действительно писал не тот Летов, которому "насрать на свое лицо", но этому не делает их ни хуже, ни лучше.
На предыдуший концерт, 26 ноября 2006 года, я шол со некоторым страхом разочарования. Да и альбом предыдущий прослушал только незадолго до самого концерта... Но Летов показал, что до старого пердунства ему еще далеко! Пестни из нового альбома были жирно разбавлены "хитами 80-х и 90-х".
Кто здесь самый лютый судья? Кто здесь самый удалой Господь?
Автор: sash_ko на 15:12 2 коммент.
Ярлыки: Events
вторник, 25 сентября 2007 г.
DSL (domain-specific language)
DSLs(domain-specific language, DSL) - языки программировая, позволяющие решать строго определённые задачи. Часто DSL-программа не компилируется в байт код или исполняемый код. Результат "компиляции" такой программы - объект предметной области.
Возьмем для примера парсеры, которые применяются повсеместно (компиляторы, браузеры, текстовые редакторы и т.д.) Был разработан стандарт генератора парсера для Unix систем, который называется Yacc (Yet Another Compiler Compiler). Релизация этого стандарта (Berkley Yacc, Yaxx, Yecc) служит только для одной цели - генерация парсеров. Yacc генерирует код парсера на языке С основываясь на группе правил (аналитической граматике). Это один из примеров DSL.
Любую задачу предметной области лучше всего описывать языком, специально созданным для этого. Это отличает DSL от объектно-ориентированных языков, таких как например С++, Java и т.д. ОО язык позволяет создавать любые конструкции, DSL оперирует только понятиями предметной области. Поэтому последний имеет очень ограниченный синтаксис, не позволяющий ничего лишнего (например создание потоков, чтение файлов и т.д.)
Самая идея языков предметной области не нова. Уже давно используются макросы, shell-скрипты (grep, awk, yacc), язык для работы с базами данных SQL.
Мартин Фаулер в своей статье Языковой инструментарий: новая жизнь языков предметной области выделяет 2 типа языков предметной области: внешние и внутренние.Внешними я называю те DSL, которые написаны на языке, отличном от основного языка программного приложения - как две последние формы в нашем несложном примере. Примерами DSL такого типа могут служить "малые языки" Unix и конфигурационные XML файлы...
Что касается внутренних DSL, то они превращают в DSL сам основной язык приложения. Лучшим примером такого языка служит Lisp.
Если нужен язык для решения спецефических задач, а чего нет, то его можно реализовать. В реализации нового внешнего DSL нет ничего хитрого. Просто нужно определиться с терминами, которым оперирует предметная область и отобразить их в синтаксисе. Здесь можно посмотреть пример разработки нового DSL на Java. А здесь - разработка нового DSL на Ruby.
DSL DLS'ем, но возникает вполне резонный вопрос. А не дорого ли каждый раз разрабатывать DSL. Т.е. сама по себе разработка - это еще пол дела. Ведь в дальнейшем нужен супорт, редактор по красивше, обучение синтаксису пользователя, да еще и отладку не плохо было бы иметь. В этом и заключаются минусы языков предметной области.
Сейчас развивает новый тип программного обеспеченя - языковой инструментарий (language workbenches). Это полноценные среды для создания DSL. Например, Meta Programming System (MPS) компании JetBrains, Майкрософтовский Software Factories. О разработке и проектировани DSL с использованием MPS можно почитать здесь.
Автор: sash_ko на 17:45 1 коммент.
Ярлыки: Программизм
Гардарика. Битва за Київ.
Нещодавно у місті Бровари пройшов фестиваль історичної реконструкції Гардарика. Гардарикою називаються земелі Київської Русі в скандинавській літературі.
Фестиваль складався з двох частин: театральне дійство (битва за фортецю, змагання стрільців) и виступ 5-ти музичних гуртів. Перша частина починалась о 14-й годині, друга - о 18-й.
Хоча людей було не досить багато, мешканці Броварів намагалися підтримати всіх кто, приїхав на фестиваль словами:
Слыш волосатый, подстричься не хо?
Василь, а ну вийди покажи цим як нада битись!
Слыш, дай из лука пострелять
На этом фестивале собрались одни долбо...бы
Взагалі, перша частина була досить цікава, але доволі млява. Всім сподобався турнір на кращого бійця, коли один з бійців переміг спочатку одного іншого, потім одночасно двох. Битва за фортецю була цікава великою кількістю бійців. Але коли розпочалося змагання стрільців, люди почали розходитися. Мешенями для стрільців були 3 лицаря.
Деякі зі стрільців використовівали навіть бойові стріли.
Потім почалась музична частина. Перша з виступаючих груп майже не сприймалась слухачами. Але чи далі, тим меньше залишалося пива в магазині через дорогу і тим більше людей починало рухатись. Шалений успіх мали тільки Holy Blood та Тінь Сонця. Хоча їм чомусь досить сильно скоротили час виступу.
Взагалі фестиваль не був вражаючим, але і не таким, з якого зразу захотілось піти.
Автор: sash_ko на 14:43 1 коммент.
Ярлыки: Events
пятница, 21 сентября 2007 г.
double как параметр шаблона
Прочитав пару статей о мета программировании в С++, решил наваять что-то более существенное чем вычисление факториала в процессе компиляции. Задача для опыта нашлась быстро: численное решение дифференциального уравнения - то, с чем пришлось часто иметь дело в учась в универе. Вроде бы все не предвиделось никаких препятствий пока не попробовал скомпилить код, содержащий что-то вроде этого:
Этот код очень не понравился компилятору: "error ?double? is not a valid type for a template constant parameter". Вот так вот. Оказывает в стандарте четко указанно, что может быть параметром шаблона (section 14.3.2 paragraph 1 of the C++ specification):
A template-argument for a non-type, non-template template-parameter shall be one of:
— an integral constant-expression of integral or enumeration type; or
— the name of a non-type template-parameter; or
— the address of an object or function with external linkage, including function templates and function template-ids but excluding non-static class members, expressed as & id-expression where the & is optional if the name refers to a function or array, or if the corresponding template-parameter is a reference; or
— a pointer to member expressed as described in 5.3.1 .
Придется искать другой способ...
Автор: sash_ko на 20:38 0 коммент.
Ярлыки: Программизм, C++
четверг, 20 сентября 2007 г.
Пару слов об изучении Ruby
Learning Ruby - пост, в котором автор делится опытом в изучении Руби. Статья интересна тем, что указаны источники рубийных знаний и коментарии к ним. Например, о той книге, которую я взял за основу:
On the first day of learning ruby the first document I came across was the Programming Ruby: The Pragmatic Programmer’s Guide. It is more than just an introduction, it is quite comprehensive in its coverage. But it does not explain underlying philosophy of Ruby.
Причем выбирал я восновном из двух источников и оказалось, что немного промазал. Вот что он сказал о том, который я оставил на потом:
The next document I came across was Ruby User’s Guide and I wish I had read this earlier. It provides practical applications right from the beginning which demonstrate how Ruby can make a difference. It answers some of the questions that a programmer with experience in other languages has.
На мой взгляд, большинство юзергайдов не очень подходят для изучения того, что они описывают. Не смотря на то, что книга Programming Ruby: The Pragmatic Programmer’s Guide, по словам автора поста, не объясняет философию лежащую в основе Руби, она подготавливает читателя к более безболезненному принятию этой философии... Я так думаю...
Кроме источников информации о Руби из статьи узнал о существовании Duck typing - фундаментальной части кодирования на Руби и других языках с динамической типизацией.
Автор: sash_ko на 19:43 0 коммент.
Ярлыки: Программизм, Ruby
SyntaxHighlighter
С самого первого поста, в котором я использовал куски кода, хотелось выделить код на фоне остального текст. До недавнего времени я ограничивался выделением кода курсивом. Но пришло время изменить такой подход. Немного погуглив нашел кучу различных хайлайтеров. Не особо выясняя какой лучше, выбрал тот, что показался красивше - SyntaxHighlighter. Теперь код выглядит намного нагляднее.
Всё, что нужно для того, чтобы подсветка заработала - добавить в код шаблона блога:
А сам код обрамлять тагом:
Автор: sash_ko на 16:41 2 коммент.
Ярлыки: Программизм, blog
пятница, 14 сентября 2007 г.
Ruby's blocks and iterators
Что такое блок в Руби? Это кусок кода, огранченный скобками {} или do end. Блок ассоциируется с методом и является чем-то, что похоже на колбек. Обращение к этому коду происходит через вызов yield:
def blockCall
yield # здесь вызывается
yield # блок
end
blockCall {pust "I'm block"} # здесь блок ассоциируется с функицей
При вызове метода blockCall будет дважды выведено "I'm block".
В блок можно передавать параметры:
def blockCall
val = 1
yield val
val = 2
yield val
end
blockCall { |val| puts "I'm block "+val.to_s }
При выполнении этого метода, будет выведено
"I'm block 1"
"I'm block 2"
Какая же ценность этих блоков? Механиз блоков применяется для итераторов. Итератор в Руби - это всего лишь функция, которая ассоциируется с некоторым блоком и внутри которой есть yield. Не нужны дополнительные классы как в С++. Например, итератор Array#each просто перебирает все элементы массива. Для того, что бы вывести списов элементов, можно просто написать:
class Array
def each
for i in 0...size
yield i
end
end
end
aArray = [1,2,4,8]
aArray.each { |i| puts i } #-> 1 2 4 8
Как пример можно рассмотреть так же метод Array#find:
class Array
def find
for i in 0...size
value = self[i]
return value if yield(value)
end
return nil
end
end
Теперь, если мы хотим найти элемента массива, квадрат которого больше 30:
Еще одно удобное применение блоков - выполнение транзакций. Код транзакиции помещается в блок, конект к источнику данных и дисконект выполняется в функции:
class File
def File.openAndProcess(*args)
f = File.open(*args)
yield f
f.close()
end
end
File.openAndProcess("testfile", "r") do |aFile|
print while aFile.gets
end
Пользователя этого класса не заботит открытие и закрытие файла, его интересует только сама чтение файла (запись или другое действие с файлом).
Есть еще один способ использовать блок с методом - если последний параметр метода содержит префикс &, то ассоциированный блок конвертируется в объект Proc и передается как параметр метода:
lass TaxCalculator
def initialize(name, &block)
@name, @block = name, block
end
def getTax(amount)
"#@name on #{amount} = #{ @block.call(amount) }"
end
end
tc = TaxCalculator.new("Sales tax") { |amt| amt * 0.075 }
tc.getTax(100) #-> "Sales tax on 100 = 7.5"
tc.getTax(250) #-> "Sales tax on 250 = 18.75"
Автор: sash_ko на 17:14 0 коммент.
Ярлыки: Программизм, Ruby
Clipmarks
Наткнулся сегодня на Clipmarks - сервис, позволяющий сохранять любые куски веб-страниц. Работает очень просто, утанавливаеш расширение для Firefox'a (или другого браузера), создаеш себе аккаунт на сайте Clipmarks для хранения выделенного, выделяеш нужный кусок текста или картинку, нажимаеш clip, а после всех clip'ов - Save. Все. Посмотреть, то что было выделено можно на сайте.
Попробовал - вроде работает и даже показалось полезным. Но есть пару неудобств: работает что-то не очень шустро и для сохранения надо выполнить слишком много манипуляций.
Автор: sash_ko на 15:43 1 коммент.
Ярлыки: Firefox
Изучая Ruby...
Изучая Ruby, в который раз вспомнил выражение "всё новое - хорошо забытое старое". Чаще даже не забытое, а просто неизвестное.
Сейчас освновным и, пожалуй, единственным языком программирования которым я владею является С++. Немного знаю JScript, когдато давно некоторое время писал на perl, еще раньше на паскале, а начиналось все с бейсика. Не густо. Именно поэтому так многое удивляет в Ruby. Очень удивило, что здесь все переменные - ссылки на объекты, и очень понравился фокус со строками:
str1 = "Даша"
str2 = str1
str2[0] = "М"
puts str1 #-> "Маша"
Оказывается, что ново это только для меня. На самом деле, механизм, когда переменная - это только ссылка на объект, уже давно исползовался в других языках программирования (Java, Python). И подобных механизмов, которые уже где-то используются еще много. Например, переменная self используется и в Python'e, а не только аналогична C++'овскому this. Вызов методов, через посылку объекту сообщения используется в Smaltalk'e. И так далее.
Это похоже на путешествие: ты посетил одну страну, страна понравилась, получил массу впечатлений, казалось бы, что может быть лучше... но потом ты едеш в другую страну и видиш, что там есть вещи не хуже, а то и лучше чем в первой и тебе уже интересно, а что же есть еще и в чем разница.
Величина моего удивления, обратно пропорциональна моему незнанию механизмов, используемых в различных языках программирования. Это ведет к пониманию того, что незнание многих, широко применяемых механизмов, не позволяет судить о каком либо языке как о самом что нинаесть лучшем. Это я к тому, что до сих относился с некоторым пренебрежением к остальным языкам, особенно к скриптовым, основываясь восновном на убежнении, что С++ - это круто и сложно. Похоже пришло время менять убеждения. Вокруг столько интересного, что зацикливаясь на чем-то - лишаешь себя многого.
Автор: sash_ko на 12:22 1 коммент.
Ярлыки: Программизм, Ruby
среда, 12 сентября 2007 г.
Классы и объекты в Ruby ч.2
Наследование в Руби.
Руби не поддерживает множественного наследование. Но если необходимо использовать функциональность нескольких классов предлагается компромисное решение - смеси.
Для указания наследования одного класса другим используется символ "<":
class Base
def method
puts "Base::method"
end
end
class Derived < Base
def method
puts "Derived::method"
end
end
b = Base.new
b.method #-> "Base::method"
d = Derived.new
d.method #-> "Derived::method"
Если классу посылается сообщение с именем метода, который необходимо вызвать, но такой метод не найден в описании класса, поиск выполняется в описании класс предка и.д. Если метод не найден - вызывается метод Object#method_missing и выдается ошибка. Но этот метод можно переопределить.
При переопределении метода можно использовать метод родительского класса:
class Derived < Base
def method
super + "Derived"
end
end
super вызывает метод базового класса с таким же именем как и метод, в из которого вызывается super. Точно так же super используется для метода initialize.
Права доступа.
В Руби есть 3 типа прав доступа:
- public - метод может вызываться кем угодно, устанавливается по умолчанию
- private - метод может вызываться наследниками, но только в контексте одного объекта
- protected - метод может вызываться наследниками не только в контексте одного объекта
Указание типа аксессора можно выполнять двумя способами:
class Test
private
def method
end
protected
def method2
end
end
class Test2
def method
end
def method2
end
private :method
protected :method2
end
Попробуем сотворить какую нибудь иерархию классов, что бы посмотреть как все это работает. Допустим есть канва, на которой рисуются объекты, причем сначала рисуются объекты большей площади.
#!/usr/bin/ruby -w
##################
# Canvas
class Canvas
def idraw(shape)
puts "draw: " + shape.name
end
def draw(shape)
idraw(shape)
end
def draw_circle(shape)
idraw(shape)
end
def draw_rectangle(shape)
idraw(shape)
end
end
##################
# base Shape
class Shape
def draw(canvas)
canvas.draw(self)
end
def greater_area(shape)
return @area>shape.area
end
attr_reader :name, :area
protected :area
end
##################
# Shape implementation
class Circle < Shape
def initialize(area)
@name = "Circle"
@area = area
end
end
class Rectangle < Shape
def initialize(area)
@name = "Rectangle"
@area = area
end
end
##################
canvas = Canvas.new
shape1 = Circle.new(10)
shape2 = Rectangle.new(20)
if shape1.greater_area(shape2)
shape1.draw(canvas) #-> "draw: Circle"
shape2.draw(canvas) #-> "draw: Rectangle"
else
shape2.draw(canvas) #-> "draw: Rectangle"
shape1.draw(canvas) #-> "draw: Circle"
end
Если в Shape area будет объявлена как private, то в процессе выполнения получим ошибку: in 'greater_area': private method 'area' called for #<>, так как area доступна только в контексте одного объекта.
Автор: sash_ko на 20:12 0 коммент.
Ярлыки: Программизм, Ruby
Чешская мечта
"Чешская мечта" - так называется 10 дневный автобусный тур в Чехию с оставновкой в Польше (Краков) по пути в Чехию и обратно. Хочу вкраце поделиться своими впечатлениями.
Организация тура.
Тур был организован туристической компанией Альянс. Автобус - обычный среднестатистический Neoplan с туалетом, которым пользоваться нельзя (дабы пассажиры не задохнулись) и чаем/кофе только на остановках. Туристов сопровождал руководитель группы (Елена Васильевна). В Кракове и Праге группу водили русскоязычные гиды (Ирина и Виталий). Из организации больше всего понравилось, что всем была выдана карта Праги :).
Программа тура.
Как видно из программы первый и последний день практически целиком к самой программе не относится и время самого тура сокращается до 8 дней.
2-й день.
Выезд со Львова и прибытие на границу. Прохождение границы у нас заняло около 5 часов, из которых на украинскую границу выпало от полу часа до часа. По словам руководителя тура это ещё не так долго... Но в задержке на польской грацице виноваты сами украинцы, т.к. жители приграничных районов мешками тащат и провозят контробадные сигареты и спирт и таможеникам приходится очень чшательно досматривать каждый автобус. Возможно такое положение дел изменится после вступления Польши в Шенген.
Пока автобус дожидался своей проверки, можно было понаблюдать как контрабандисты проносят сигареты через границу. Очень забавное зрелище :)
По территории Польши автобус ехал очень медленно. С одной стороны, виной этому были постоянные пробки и ремонтные работы на дорогах, с другой стороны, по словам руководителя группы, очень жесткие ограничения по скорости. В итоге, в Краков мы прибыли когда уже стемнело, около 9 часов вечера (или около того, чтоно не помню), при том, что в отель нам надо было попасть к 11 часам. Поэтому аквапарк мы не посещали и галопом пробежались по основным достопримечательностям.
3-й день.
С самого утра большая часть группы отправилась на час в аквапарк (к 8 утра), остальных высадили недалеко от Вавеля. У тех, кто не поехал в аквапарк была реальная возможность посмотреть центр Кракова и Вавель. Остальная группа прибила из аквапарка после 10 часов и, объединившись с остальными, галопом понеслась по Вавелю и посмотрела далеко не все. Потом было немного свободного времени и в 14 часов мы отправились в сторону Праги, куда прибыли поздно вечером.
4-й день.
Наконецто мы увидели Прагу. Сначала была обзорная экскурсия с гидом с 9 до 13 часов. Сразу же после этого, всем желающим было придложено покататься на теплоходе по Влтаве (с 13 до 15), а в 18 часов сходить в абсент бар (на 2 часа, 20 евро). Дальнейшая программа в этот день не известна, так как после обзорной экскурсии я со своей второй половиной поехал посмотреть крепость Карлштейн.
5-й день.
Поездка в Карловы Вары с посещением всяких там заводов. Дабы не терять время на посещения всяких заводов, мы поехали туда самостоятельно на рейсовом автобусе, что оказалось дешевле в 4 раза и позволило провести там больше времени.
6-й день.
Экскурсия по Пражскому граду (с 9 до 13). Отказавшись от экскурсии мы поехали сначала в пражский зоопарк (потрясающий зоопарк), замок Троя, а уже потом посмотрели Карлов мост и Пражский град (в это время людей там было уже не так много).
7-й день.
Поездка в Чешский Крумлов с заездом в крепость Глубока над Влтавой. Посещение Глубоки над Влтавой заняло час или полтора. В Крумлове посещение туристического ресторана. В Прагу вернулись около 9 часов вечера...
8-й день.
Выселение из гостиницы. Выезд в направлении Кракова. По пути на час заезд в Чешский Штернберг и на пару часов в Кутну Гору. Посещение Костницы заняло минут 20. В Кутной Горе обед в туристическом ресторане, с немного завышенными ценами. Позно вечером приезд в Краков.
9-й день.
Выселение из гостиницы и поездка в Величку. 2 часа экскурсии в шахте и пол часа на покупку сувениров. После успешного прохождения всех границ, прибытие во Львов в 8 часов вечера.
На 10-й день Чешская мечта у нас закончилась и начались 2 дня Львовской мечты :)
Итого:
2 полных дня в Праге
2.5 дней в других городах Чехии
0.5 дня в Кракове
2.5 часа в Величке
2 дня во Львове (самостоятельное дополнение к туру :)
Впечатления от тура в следующем посте...
Автор: sash_ko на 15:16 1 коммент.
Ярлыки: Путешествия
Классы и объекты в Ruby ч.1
Классы в Ruby обозначаются словом class. Причем имя класса должно начинаться с большой буквы (а методы с маленькой); иначе получена ошибка: class/module name must be CONSTANT.
class Test
def initialize(name)
@name = name
end
def get_name
@name
end
end
Объект класса создаётся посылкой сообщения new (в Руби методы класса вызываются путем посылки сообщения с именем метода объекты класса). Когда создаётся объект, в описании класса ищется метод initialize и вызывается:
val = Test.new("class Test")
puts val.get_name #-> class Test
Переменные экземпляра класса имеют имена, начинающиеся с символа @. Для различных объектов одного и того же класса эти переменные могут быть различны. К этим переменным нет доступа снаружи объекта (ни на чтение ни на запись), только через методы объекта. По умолчанию эти переменных инициализируются nil. Декларировать эти переменные не нужно, они добавляются к объекты при первой ссылке на них. Добавить методы доступа к переменным достаточно просто:
class Device
def issue
@issue
end
def price=(new_price)
@price = new_price
end
attr_reader :vendor
attr_writer :model
end
Здесь @issue и @vendor доступны для чтения, @model и @price - для записи.
В Руби существует особая переменная self которая ссылается на вызывающий метод объект (по аналогии с this C++).
Помимо переменных экземпляра класса есть переменные класса (статические переменные в С++). Эти перменные обозначаются с приставкой @@. Значение такой переменной одинаково для всех экземпляров одного и того же класса.
Так же в класс можно добавлять константы, которые именуютс с большой буквы:
class Test
ConstVal=100
def dump
puts "class constant: "+ConstVal
end
end
Так же как и переменные методы тоже делятся на два типа: методы класса (статические в С++) и методы экземпляра класса. При объявлении методов класса указывается имя класса:
class Test
def inst_method # метод экземпляра класса
end
def Test.class_method # метод класса
end
end
Все классы, для которых не указан предок, автоматически наследуются от Object, поэтому имеют минимальный общий набор методов, например, clone, id, inspects, to_s и т.д.
Автор: sash_ko на 14:12 2 коммент.
Ярлыки: Программизм, Ruby