Ruby & Rails

Все, кто знает язык или хочет познакомиться с ним поближе. Примеры применения в повседневной жизни и на работе. Всемирную известность Ruby получил благодаря появлению Ruby on Rails - гибкого современного фреймворка для построения веб-приложений. См. rubyonrails.org



Правила конференции





 

Олег Андреев

пише?20 января 2007 в 13:46

Как-то я решил сделать библиотеку для процессинга естественных английских команд в Руби-коде. Что-то типа того:

put an apple on the table to the right of me

Т.е. не парсер строки, а прямо вот так вот в тексте программы. Да, это законный синтаксис. Да, это язык внутри языка :)

Выяснилась интересная вещь: я понял зачем функционально нужны определенные/неопределенные артикли; почему тупая структура английских предложений на удивление удобна.

Кроме того, такой язык позволяет сделать отложенное выполнение, реализовать структурно нечеткую логику (а не просто непрерывные булевы числа), обучать систему.

Развитие идеи - у Джея Филдса: http://jayfields.blogspot.com/2006/10/bnl-introducti...

Олег Андреев

пише?27 января 2007 в 14:22

В Руби есть оператор ===. Как и многие операторы, это метод объекта: a === b эквивалентно a.===(b). По-умолчанию, для класса Object, "===" == "==" (надеюсь, вы понимаете, о чем я :). Другие классы могут переопределять оператор под свои нужды. И что же в нем интересного, спросите вы?

А вот что. Оператор case/when (switch/case в Си) использует вызов оператора === при сравнении тестового объекта с вариантами в блоках when:

case num
when 1
do_something # никакой break не нужен
else
do_something_else
end

Этот код эквивалентен следующему:

if 1.===(num)
do_something
else
do_something_else
end

Догадываетесь, в чем сокрыта вся радость? Смотрите примеры:

1) Проверка значений (String#===, Regexp#===):

case input_line
when "debug"
dumpDebugInfo
dumpSymbols
when /p\s+(\w+)/
dumpVariable($1)
when "quit", "exit"
exit
else
print "Illegal command: #{input_line}"
end

2) Интервалы (Range#===):

kind = case year
when 1850..1889 then "Blues"
when 1890..1909 then "Ragtime"
when 1910..1929 then "New Orleans Jazz"
when 1930..1939 then "Swing"
when 1940..1950 then "Bebop"
else "Jazz"
end

3) Тип объекта (знаю, знаю, нужно использовать полиморфизм :)

case shape
when Square, Rectangle
# ...
when Circle
# ...
when Triangle
# ...
else
# ...
end

Нетрудно понять, что для регулярных выражений === означает =~, для классов - проверку принадлежности аргумента к классу или его детям, для интервалов - принадлежность к интервалу, а для вашего собственного объекта - что-то еще.

Олег Андреев

пише?28 января 2007 в 4:18

На вопрос к гуглу "Ruby sucks" лучше всего отвечает Матц:
http://www.rubyist.net/~matz/slides/rc2003/

Он же и рассказывает, как это исправлять (он же и автор этого языка).

К слову сказать, Расмус Лердорф не отличается проницательностью, свойственной более северному его соседу - Страуструпу. На вопрос: "почему я должен детектировать magic_quotes_gpc чтобы бороться с автоматическими слэшами?" он ответил так "the worst that would happen is that someone would see an extra \ on the screen when they output the data directly instead of sticking it into the database." Непостижимое легкомыслие для опекуна general-purpose language.

Олег Андреев

пише?4 февраля 2007 в 13:39

В PHP вот этого вот не хватало:

(начальные точки - для отступов, в реальном коде их быть не должно)
class Array
. def w; self[0]; end # без всяких левых классов Point
. def h; self[1]; end # там, где они не нужны

. alias x w
. alias y h

. def fit_to(max_size)
. . if (w > h)
. . . [max_size, (max_size*h.to_f/w).round]
. . else
. . . [(max_size*w.to_f/h).round, max_size]
. . end
. end
end

Как использовать:

wh = [@img.columns, @img.rows].fit_to(size)
pic = @img.thumbnail(*wh)

Оператора * тоже не хватало. Он разворачивает массив в перечисление аргументов метода. Если у вас есть координаты [w, h], а вам нужно передать их в scale(w, h), то не нужно писать:

scale(wh[0], wh[1])

достаточно развернуть массив:

scale(*wh)

PS. В объявлении аргументов метода "*", наоборот, сворачивает аргументы в массив:

def method(a, b, *other)
return other
end

method(1,2,3,4,5,6) # => [3,4,5,6]

Михаил Голуб

пише?4 февраля 2007 в 18:40

алиасы для переменных резко не понравились.. (в груви убрали :))
меня бы они только путали..

Олег Андреев

пише?5 февраля 2007 в 0:07

Здесь не для переменных, а для методов. А что тебя так пугает в алиасах?

Олег Андреев

пише?5 февраля 2007 в 0:16

Кстати, аргументы методов - отдельная песня.

def no_arguments_method
end

def simple(a,b,c)
end

def variable_arguments(a, b, *other_args)
end


# переданный блок превращается
# в объект Proc под названием block
# можно использовать yield, а можно - block.call(<args>)

def with_explicit_block(*args, &block)
end

Каждому методу может быть передан один специальный аргумент - блок кода. Вот так:

[1,2,3].each do |elem| # начало блока и список аргументов |...|
# код, который будет вызываться методом Array#each
end

Или вот так (другой приоритет по сравнению с do/end):

[1,2,3].each { |elem| puts elem; }

Последний вариант можно использовать при составлении длинной записи без промежуточных переменных:

Photo.find(:all).collect{|p| [p.id, p.clone.save]}.delete_if{|a| a[1]}

Олег Андреев

пише?5 февраля 2007 в 0:23

Как превратить блок кода в объект?

p = Proc.new {|<args>| <body> }
p = proc {|<args>| <body> }
p = lambda {|<args>| <body> }

Так, методу можно передать сколько угодно блоков:

method(proc { }, proc { }, proc { })

Олег Андреев

пише?5 февраля 2007 в 0:27

Как вызывать переданные блоки?

def first_method
yield 1 # передается управление блоку с аргументом 1
yield 2
end

first_method do |a|
puts a*2
end

Если передан Proc-объект (т.е. блок кода, оформленный в объект):

def proc_reciever(proc_object, &normal_block)
proc_object.call(1)
proc_object.call(2)
normal_block.call(1)
normal_block.call(2)
end

proc_reciever(proc {|a| puts a}) {|b| puts b}

Александр Михайлович Кузнецов

пише?5 февраля 2007 в 1:38

Это всё чудесно, а его вообще где-нибудь принято использовать? :)

Олег Андреев

пише?5 февраля 2007 в 2:07

Да. Вот, где я использую (или использовал):

0. RubyOnRails.org
1. Rake вместо Make
2. Ruby для никсовых утилит (вместо Perl, Tcl, Csh, Bash)
3. Ruby для виндовых утилит (вместо WSH: JScript/VBScript)

Всякие success stories:
http://www.ruby-lang.org/en/documentation/success-st.../

Денис Постнов

пише?12 февраля 2007 в 22:26

Люди подскажите хостинг в рунете более менее норм для рельсов? или где можно почитать об установки рельсов и всего остального (rmagic и прочее) на всякие vps (feodora core например)

Олег Андреев

пише?13 февраля 2007 в 8:05

Неплохой shared-хостинг - www.Net.ru. Скоро собираются вводить новые тарифные планы, но и текущих настроек пока хватает (rmagick, unicode имеются).

http://forum.net.ru/viewtopic.php?t=4808

Про vps не подскажу.

Денис Постнов

пише?13 февраля 2007 в 11:20

что то мне говорили что там всё какоето тормозное.. хотя вишлист смотрел вроде очень даже бегает.. из минусов там конечно оплата сразу за год((( а про bhost.ru никто не знает?

Олег Андреев

пише?13 февраля 2007 в 23:41

Бегает быстро на тарифе large (600 Мб, 120 евро/год). Проблема в другом: нет нормального ssh, нет subversion, нет неограниченного кол-ва БД (у меня - 10 баз, хотя объем БД входит в квоту 600 метров). Нельзя запускать свой сервер. Они предоставляют свой апач с FastCGI.
Саппорт - отличный. Быстрый и умный. И я не помню, чтобы сервер когда-нибудь при мне падал.

В общем, если выберешь Нет.ру - это будет надежно и быстро, но без дополнительных удобств, о которых я уже сказал.

Денис Постнов

пише?18 февраля 2007 в 23:12

http://www.assembla.com/
халявный трак и svn ))

Олег Андреев

пише?19 февраля 2007 в 18:59

"халявный трак и svn ))"

Кстати, да. До ассемблы юзал http://opensvn.csie.org/, но он мне показался менее устойчивым. Эти же ссылочки имеет смысл кинуть в группу "Программисты".

Олег Андреев

пише?19 февраля 2007 в 19:04

Subversion на production-хостинге мне нужен не для репозитория, а для вычекивания и апдейта файлов.

Денис Постнов

пише?26 февраля 2007 в 22:36

ура мой первый проект на рельсах.. первый этап готов..
http://s04.bhost.ru:11025/

Олег Андреев

пише?27 февраля 2007 в 3:12

Так это ты tribesman в ror2ru? Этот скриншот я уже сегодня где-то видел :)

Денис Постнов

пише?27 февраля 2007 в 22:40

да.. надо же где то черпать знания))

Михаил Голуб

пише?11 марта 2007 в 0:26

Пофлужу тут немного у вас...ан нет..уже у нас :)

while line = gets
puts line if line =~ /start/ .. line =~ /end/
end

Вот такая конструкция в ruby вызывает смешанные чувства. От "Еще одна синтаксическая фича" до "Причем здесь интервалы? (ranges)"

Я конечно понимаю, что Range имеет min и max (как раз два значения для входа и выхода), но это из оперы "микроскоп тяжелый, поэтому им можно и гвозди забивать".

Конечно все имхо, но хочется, чтобы кто-нибудь прокомментировал.

Олег Андреев

пише?11 марта 2007 в 10:19

Отвечаю. Это из серии языка Си while(*p+ = *s );

Шутка. На самом деле, Руби - это метаязык. Он, в отличие от Джавы, не рекоммендует вам использовать какой-то конкретный дизайн кода, на нём можно писать во многих стилях - как на Перле (с использованием $_, $/, $! и т.п.), как на Лиспе (с кучей блоков) или как на Джаве. Но это все фигня, потому что не так эту возможность надо использовать.

На Руби нужно создать свой язык. Не больше не меньше. Т.е. тот язык, на котором именно ваше приложение будет описано наиболее естественным образом. Типичный пример - Rails. Это не просто набор библиотек, где нужно вызовы методов расставить по всему вашему коду. Это довольно хитрый язык, со своими собственными правилами и грамматикой. О как.

Пример 1. Декларативный язык ActiveRecord (приведенный пример можно использовать в реальной жизни прямо так, без единого дополнительного метода):

class Product < ActiveRecord::Base
has_many :pictures
has_and_belongs_to_many :tags
belongs_to :category
validate_presence_of :title, :number
validate_numericality_of :number
end


Пример 2. Генерация XML:
(http://api.rubyonrails.org/classes/Builder/XmlMarkup...)

xm.instruct!
xm.html {
xm.head {
xm.title("History")
}
xm.body {
xm.h1("Header")
xm.p("paragraph")
}
}

Ответ: если в твоем приложении использование Range в if-е это некрасиво, то не надо его использовать. В русском языке, например, есть слово "хуй". Но никто ведь не обижается на сам язык, да? =)

Олег Андреев

пише?11 марта 2007 в 10:22

блин.

while(*p плюс-плюс = *s плюс-плюс)

Олег Андреев

пише?12 марта 2007 в 11:58

Что-то я отвлекся. Насчет твоего примера:

while line = gets
puts line if line =~ /start/ .. line =~ /end/
end

Это называется syntactic sugar. Range не обязательно должен быть числовым, так что его можно использовать и там, где есть интервал чего-угодно.

Михаил Голуб

пише?17 марта 2007 в 23:51

Что-то тут никто не задает вопросы уровня чтения документации.
Пожалуй начну :)
Знакомлюсь с AJAX, не-индус во мне говорит о том, что нужно заставить приложение работать и без JS тоже.
В ruby on rails: в form_remote_tag сделано довольно просто:
в случае, если JS не отрабатывает, onclick не возвращает false и отправляется простейший POST-запрос на сервер.
Теперь хочется сделать то же самое, но только используя link_to_remote. А она зараза в качестве href ставит '#', причем чтение документации и экспериментирование с аргументами хелпера мне никак не помогло.

Олег Андреев

пише?18 марта 2007 в 0:45

Смотрим доки по link_to_remote.

Открываем сорс (кнопка show source), видим:
link_to_function(name, remote_function(options), html_options)

Открываем link_to_function, видим:
... :href => html_options[:href] || "#", ...

Возвращаемся к описанию link_to_remote:
link_to_remote(name, options = {}, html_options = {})

Теперь вместо:
link_to_remote("Delete", :url=>some_url)

пишем:
link_to_remote("Delete", { :url=>some_url }, { :href=>some_url })
(видишь, фигурные скобки ввели? это чтобы хэши options и html_options различить)

Ну, а в контроллере, для которого some_url ведет на some_action:

def some_action
respond_to do |f|
f.html # render some_action.rhtml with layout
f.js # render some_action.rjs
# OR:
f.js { render .... } # do something in block
end
end

Кстати, не всегда не-JS версия необходима, поэтому fall-through - это только один из вариантов, не всегда нужный и полезный.

Михаил Голуб

пише?18 марта 2007 в 1:38

ушел искать в гугл, что такое fall-through...
за ответ спасибо, работает..

Олег Андреев

пише?18 марта 2007 в 13:28

Я имел в виду, что для аякса, fall-trough - это работоспособность при отсутствии js. Например, при работе из links (текстового браузера) я сумел без проблем отправить сообщение на , несмотря на то, что они посылаются у всех аяксом.

Есть еще понятие degrade gracefully - т.е. "когда фича не работает, кое-как пользоваться еще можно". Это относится, например, к JS- и CSS-трюкам.

Михаил Голуб

пише?18 марта 2007 в 13:41

я думал.. это название какой-нибудь спец-техники, вроде postback handling :)

Олег Андреев

пише?18 марта 2007 в 13:54

Словарь спасет мир.

Олег Андреев

пише?27 марта 2007 в 0:55

16 и 17 апреля на конференции Российские Интернет Технологии (РИТ-2007), в Москве я рассказываю о 1) Ruby on Rails и 2) кодировках вообще и UTF-8 в частности.

Программка:
http://www.rit2007.ru/files/RIT-2007-timesheet.pdf

Будете в Москве - заходите (регистрация - 5000 руб.) Материалы доклада будут выложены в открытый доступ как только так сразу.

Олег Андреев

пише?5 апреля 2007 в 1:18

По свежим следам обсуждений Руби с Клишиным и Шитовым, обкатываю дерзкие мысли прямо здесь. Не пугайтесь.

Олег Андреев

пише?5 апреля 2007 в 2:05

Руби сделан японцем. А у японцев взгляды отличаются от наших, не так ли? Вот этот японец, Юкихиро Матцумото (Матц) - профессиональный программист, которого вконец заебало программировать.

Я могу его понять. У самого мыслей в голове - тьма, и все их нужно реализовать. Но даже если концепция продумана почти до самых мелочей, мне нужно взять в руки инструмент (язык программирования) и колбасить, колбасить, колбасить код. Как же это задалбывает! Нужно тут - подстроиться под библиотеку А, там - под компилятор Б, здесь - под браузер Ц. И расставить все точки с запятыми, скобочки, throws, инициализацию статических мемберов, какая-там-еще-поебень-нужна-чтоб- это-наконец-запустить.

Сами понимаете, в такой обстановке вы уже не свою задачу решаете, а заполняете бюрократическую форму со, всего лишь, _заявкой_ на решение.

Вот это Матц и хотел исправить.

Олег Андреев

пише?5 апреля 2007 в 2:28

Руби сделан с простой целью:

Быстро сделать дело, и свалить по-раньше на свидание с любимой (бухать, играть в хафлайв, подставить нужное)

Это всё. Красивый синтаксис, гибкость, множество парадигм, чистое ООП и прочее - всего лишь средства достижения упомянутой цели. Те, кому эта цель не нравится - нет проблем! Матца и 99% рубиистов не волнует ваше мнение совершенно. Если вы пишете на руби и испытываете проблему с совместимостью вашего мозга с существующим решением - изящно пропатчить его под ваши нужды не составит труда. Вы только представьте: если в существующей библиотеке есть метод (пусть хоть private), который реализован не так, как надо - вы его просто переопределяете:

class StupidLibrary::TextComparer
private
def contained_string
@string.chars # instead of plain @string, which is broken with UTF-8
end
end

Если нужно воспользоваться старой версией метода внутри новой - берите alias и запоминайте старый метод в новое имя:

alias :old_method :method
def method
puts "some trace before call"
old_method
puts "some trace after call"
end

Денис Валентинович Рысцов

пише?7 апреля 2007 в 19:01

Пока мои познания в Ruby очень ограничены, но пока все, что я вижу - это smalltalk (сам smalltalk я не знаю, но сужу по расширению TCL - Xotcl, который копирует объектную модель smalltalk)

И возникает естественный вопрос: smalltalk знаменит средствами разработки, есть ли их аналоги в Ruby?

Ruby знаменит благодаря RoR, на этом сфера его применения ограничивается?

Насколько оправданы средства метапрограммирования в Ruby? Да Active Record это здорово, но насколько часто эти возможности языка (не уже готовые библиотеки) применяют в обычном программировании (написать сайтик при жестких сроках)?

Олег Андреев

пише?8 апреля 2007 в 11:49

1. Руби используется не только в Рельсах (http://www.ruby-lang.org/en/documentation/success-st.../) . И еще на руби приятней писать утилитарные csh/sh/perl/tcl/vbscript/jscript скрипты.

2. Жесткие сроки и обуславливают гибкость и открытость языка. Если в процессе работы вы сталкиваетесь с багой в библиотеке или недостатком фичи, то исправить это можно рядом способов, включая очень быстрый - переопределить нужный метод (даже private) или константу.

Например, поддержку юникода внедрили средствами самого Руби, без перепрошивки интерпретатора или обязательных бинарных джемов.

Михаил Голуб

пише?9 апреля 2007 в 20:36

Правда не совсем так, как хотелось ввели. Помнишь, ты рассказывал, что на строки завязано IO? Поэтому красивее не получилось, разве только в JRuby.
Но сильно лучше, чем в том же python, где юникодная поддержка это отдельное API, а это значит, что большинству западных программеров нафиг не надо использовать юникод там, где они обходятся однобайтными кодировками.

Олег Андреев

пише?9 апреля 2007 в 22:54

На сегодняшний день есть три варианта:
1. Наколбасить отдельные, чисто текстовые функции, которые будут читать обычные строки с UTF-8 содержимым. Операции над потоком байт должны быть отедельными функциями. Так, например, вместо substring(start,length) две функции: substring и subtext. Последняя читает UTF-8, первая — байты (пример надуманный).

2. Сделать для текстовых строк отдельный класс и использовать методы с теми же именами и схожей семантикой, но для операций над UTF-8-потоком.

Первый вариант воплощен в Джаве и Перле. Второй - в Руби (active_support). Там используется прокси-объект "string".chars.

Второй вариант мне кажется предпочтительным, т.к. утф-строки все равно передаются по бинарным трубам, а явно конвертировать их на входе/выходе — это возврат к Перлу 5, где указывается кодировка при чтении/записи в файл. И, потом, меньше новых слов воникает (никаких substring/subtext).

Михаил Голуб

пише?10 апреля 2007 в 1:36

а где же 3-ий? :)

Олег Андреев

пише?10 апреля 2007 в 12:46

3-ий - это 2-ой.

Олег Андреев

пише?11 апреля 2007 в 4:44

We call it "beta" because it's betta than nothin' :-) Слайды к рассказу о Руби-на-Рельсах:
http://oleg.subway.net.ru/rit2007/

Алексей Лапшин

пише?13 апреля 2007 в 13:41

классная презентация!
хотелось бы послушать )))

Михаил Голуб

пише?13 апреля 2007 в 14:57

Алексей, ты уже 3-ий Лапшин, который занимается ruby.
Еще знаю Михаила Лапшина из railsware.com и Макса Лапшина по ror2ru.
И еще Клишин (novemberain.com) называл по-моему еще одного Лапшина.

У вас это фамильное увлечение?

Алексей Лапшин

пише?13 апреля 2007 в 16:44

выходит так ))))))))))))))))))))))))

Алексей Лапшин

пише?13 апреля 2007 в 16:57

Подскажите кто пользуется BHOST и net, какие плюсы и минусы провайдеров, существует ли что либо аналогичного уровня в России.

Олег Андреев

пише?14 апреля 2007 в 2:03

Вкратце: Net.ru - очень вменяемый саппорт, но по сравнению с dreamhost.com (дешевле, есть всё и 180 Гб диска, но не очень шустрый) и textdrive.com (дороже, и специально для рельсов), все российские хостинги просасывают по полной схеме.

Рекомендую не дешевить, а пробовать dreamhost (пока не нужно обрабатывать 5000 запросов в день), а потом смотреть в сторону textdrive. Российские хостинги отстают от современного мира лет на 10. Это факт.

Олег Андреев

пише?14 апреля 2007 в 2:22

Говно в net.ru:
1) кастрат-ssh, нельзя убить процесс, нельзя посмотреть список процессов, нельзя запустить скрипт (php, perl, ruby - все одно)
2) нет svn
3) мало места за такие деньги (120 USD/year на дримхосте - 180 Гб, 120 EUR/year на нет.ру - 0,6 Гб)
Хотя, месяц назад обещали ввести тарифы не хуже dreamhost-овых.
4) Небольшое число баз (что мускл, что постгрескл). И все - с дурацкими именами типа 10001234_0, 10001234_1, 10001234_2. Первое число - номер договора, второе - номер твоей базы.

Говно в dreamhost:
1) Медленный аплоад по ФТП (у меня 40 Кбайт/с, когда скачивание - 200..300 Кб/с).
2) Немного тормозящий ssh (сервер в США как-никак; нет.ру питерский в ssh летает, хотя ничего почти и не умеет).
3) И еще чаще бывают тормоза сервера, проблемы из-за ddos, проблемы с dns. Они кратковременные и редко, но на нет.ру очень уж редко что-то случалось (опыт - 3 года нет.ру, 1 месяц - дримхост).

Плюсы зарубежных shared-хостингов:

У дримхоста на сервере в самом дешевом тарифе можно заводить кучу юзеров - у них будут свои, настоящие, хоумы, свои ФТП, домены и шеллы. Полноценный ssh. Есть svn и можно свое поставить до кучи. Очень удобный и грамотный веб-интерфейс, в котором хозяин с комфортом расставляет днс-ы, юзеров, домены, емайлы, БД (любое кол-во, нормальное имя) и т.п. и т.д. Доки в вики - очень подробные, плюс нагуглить про дримхост можно много полезного, если что. И информируют хорошо: http://dreamhoststatus.com/

По рассказам, на textdrive нет говна под именем шаренный Apache+FCGI. Есть твои собственные серверы (монгрелы, скажем), которыми гораздо приятней рулить. Плюс, скорость выше, плюс саппорт конкретно с рельсами и руби дружит. Но цена в 1,5-2 раза выше. И она справедлива, думаю.

Борис Ярцев

пише?15 апреля 2007 в 17:51

Есть один очень хороший американский хостинг vervehosting.com

Михаил Голуб

пише?17 апреля 2007 в 18:05

Олег? Ну рассказывай, как прошла презентация на RIT2007?
Желательно выложить фото в альбом.

Олег Андреев

пише?18 апреля 2007 в 16:18

Алексей Лапшин

пише?20 апреля 2007 в 14:09

Взял хостинг на dreamhost.com, офигительно :) очень грамотный веб интерфейс, гораздо интуитивнее наших хостеров плюс куча емэйлов с инфой. По цене кстати тоже выгоднее наших. Если проблем со скоростью не будет то за эти деньги (3 р/год), похоже, лучшее решение.

Михаил Голуб

пише?25 апреля 2007 в 21:58

Алексей, ты бы не над проектом думал, а над идеей..
Люди гораздо охотнее будут искаться, если увидят в твоей идее что-то интересное..

А пока это звучит, как "Ребята, пошли в поход!"

Олег Андреев

пише?26 апреля 2007 в 2:18

А пошли в поход, ребята?

Михаил Голуб

пише?26 апреля 2007 в 18:54

Нет ничего чудеснее..
Чем строчку class_eval'а написать!
Рассевшись у костра с едой и песней!
Природа. ruby. Благодать!

Роман Delirium Троненко

пише?27 апреля 2007 в 19:03

Вещи, кажется, не совместимые...
Но почему бы и нет? :)

Михаил Голуб

пише?1 мая 2007 в 20:48

Ruby, благодаря Олегу, обсуждается где угодно, кроме этой группы :)

Денис Боровиков

пише?1 мая 2007 в 23:40

Это точно)))

Александр Пылающих Костров

пише?5 мая 2007 в 0:30

Не, товарищи, я привык во всё окунаться с головой. Отдыхать, так отдыхать. Rubyть, так rubyть (в собственное удовольствие, естественно).

Anton Gladchenko

пише?6 мая 2007 в 15:57

Только-только начал изучать Ruby по Википедии. Что можете посоветовать фундаментального по тому языку почитать. (желательно на рус. но не обязательно)?

Михаил Голуб

пише?6 мая 2007 в 18:52

Dave Thomas "Programming Ruby" - сам Ruby (эту книжку называют Pickaxe)
Параллельно можешь читать Dave Thomas and DHH "Agile Web Development with Ruby on Rails"
Впринципе уже этого хватит на первое время. Еще блоги читай:
http://novemberain.com (и в нем по ссылкам справа)

Олег Андреев

пише?6 мая 2007 в 23:39

Могу посоветовать выкинуть википедию подальше и послушать Мишу. Русских переводов нет и не будет. По-русски — разве что в блогах. А руби на викибукс — это наивысшее неуважение к людям, которые используют и учат руби, и полное наплевательство на Ruby Way.


Артем Лоенко

пише?7 мая 2007 в 13:33

количество ошибок, в том числе в синтаксисе и логике, на русском wiki по ruby удручает... а стишки - это вообще издевательство...

Павел Кузнецов

пише?9 мая 2007 в 16:20

каким образом на RoR осуществляется локализация ?

Михаил Голуб

пише?9 мая 2007 в 17:44

Есть плугины специальные (названия нужны или в гугле поищешь?). Просто политика партии такова: все, что обязательно понадобится ВСЕМ идет в core rails, все, что возможно понадобится кому-то идет в плугины.

Михаил Голуб

пише?9 мая 2007 в 18:33

Чтобы не быть голословным:
http://wiki.globalize-rails.org/globalize/

Олег Андреев

пише?10 мая 2007 в 11:33

Никакой партии нет. Не нравицца — форкайся или патчи рельсу (что плагины и делают, гыгы).

Михаил Голуб

пише?14 мая 2007 в 3:00

irb(main):004:0> class Fixnum
irb(main):005:1> def -@
irb(main):006:2> puts 'some'
irb(main):007:2> end
irb(main):008:1> end
=> nil
irb(main):009:0> 2.-@()
some
=> nil
irb(main):010:0> -2
=> -2

Кто-нибудь может прокомментировать это?

Олег Андреев

пише?14 мая 2007 в 13:38

Читай сорцы. Знак минус (скорости ради) обрабатывается в обход вызовов методов.

Михаил Голуб

пише?14 мая 2007 в 20:44

Ну я читал Pickaxe, там сказано, что унарные плюс и минус - тоже методы, и их можно переопределять.
Видимо устарела информация в Pickaxe, а я не догадался проверить.

Михаил Голуб

пише?14 мая 2007 в 20:51

Нам остался всего один человек :)
А ведь всего месяц назад тут было не более 20 человек.

Алексей Федоренко

пише?14 мая 2007 в 23:48

Блин..Привет!!!

Олег Андреев

пише?15 мая 2007 в 11:41

Да, унарные +/- — это методы. Но конкретно для фикснума — это операторы.

Роман Чернятчик

пише?25 мая 2007 в 19:31

Привет, руберойды, ну или рубимены =)

Артем Gil Ларионов

пише?31 мая 2007 в 10:50

ммм, такс, просвятите нубаса, чем же Рубя так выгодно отличается от того же пхп? думал почитать о нем, но прочитав + и - из викиучебника сложилось впечатление что особой уникальности у этого языка впринципе нет... есть некие плюшки, возможно упрощающие жизнь, ну собственно и все, обьясните плз где я что не понял и что не увидел?

Олег Андреев

пише?31 мая 2007 в 21:08

Викиучебник - редкое говно. Читай "Programming Ruby" (ссылки на книги внизу http://ruby-doc.org/). Да, хорошей литературы по Руби на русском нет и не будет. Разве что блоги отдельных товарищей (но начинать учиться нужно не на них, все равно). Есть список рассылки в гугл-группах ror2ru, где лучшие из лучших в России с удовольствием обсуждают Руби, Рельсы и все, что вокруг них.

ПХП - это язык для HTTP-сервера. Руби — язык общего назначения. Ruby on Rails — это фреймворк для веб-приложений. Также имеются упрощенные фреймворки типа Camping.

Особая уникальность языка состоит в том, что он:
1) Объекто-ориентированный (по честному, а не как Джава/Си+ или ПХП).
2) Гибкий донельзя.

Отсюда есть такие выводы:
1) Имеется куча удобных библиотек для самых разных задач.
2) Очень удобно программировать в разных стилях.
3) Хорошо написанная программа на Руби масштабируется гораздо лучше, чем хорошо написанная программа на Джаве и, тем более, на ПХП.
4) Хорошо писать на Руби проще, чем хорошо писать на Джаве и, тем более, ПХП.
5) Сообщество Руби-программистов на 99% состоит из прагматичных профессионалов (и на 10% из суперпрофессионалов), так что поиск решения проблемы гуглом выдает весьма пригодные вещи. В отличие от толпы недопрограммистов на пхп, которые задают бесчисленные тупые вопросы и, еще хуже, дают бесконечно тупые ответы на них.

Артем Gil Ларионов

пише?31 мая 2007 в 22:23

понятно, почиаем, так вроде прикольно, даже читая такой бред как викиучебник =) посмотрим )

Rafael' G.

пише?5 июня 2007 в 20:43

а если сразу за руби взяться не завязнешь?

Михаил Голуб

пише?6 июня 2007 в 10:13

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

Олег Андреев

пише?6 июня 2007 в 20:10

Если за руби взяться — завязнешь :-) В том смысле, что джава и прочие дотнеты будут казаться недоразумением.

Rafael' G.

пише?10 июня 2007 в 1:46

http://www.ruby.linux.by/news-article-047.html
прокомментируйте статью плз

Михаил Голуб

пише?10 июня 2007 в 5:23

http://www.infoq.com/news/2007/06/jruby10
Теперь у нас официально на одну виртуальную машину больше. Ура, товарищи! Скоро мы захватим мир! Му-ха-ха-ха!

Rafael' G. как по мне, так статья ни о чем. А автору нужно понять, что не абреввиатуры делают человека умнее.

Михаил Голуб

пише?10 июня 2007 в 5:31

Кстати именно этот чел пишет учебник на викибуксах. :)

Олег Андреев

пише?10 июня 2007 в 19:27

Рубинович концентрируется не на том. У него отношение к языку, как вещи "в себе", хотя концепция руби (в отличие от перла и io, например) противоположна: язык должен помогать решать проблему. Синтаксические фишки для "посмеяться" и holy wars противоречат тому, ради чего Матц всё это замутил. Т.е. прагматичности "getting things done".

Ибо успех приложения заключен не в том, на чем оно написано, а как быстро и насколько безглючно.

Rafael' G.

пише?10 июня 2007 в 19:54

зато как он старается продвинуть руби в массы! )

Rafael' G.

пише?12 июня 2007 в 2:53

какой менеджер баз данных под линукс посоветуете?

Михаил Голуб

пише?12 июня 2007 в 7:14

что такое менеджер баз данных? СУБД? Админка?

Rafael' G.

пише?12 июня 2007 в 17:24

мне нужно и то и другое

Михаил Голуб

пише?12 июня 2007 в 18:19

mysql + mysql-client устроят? :)

Михаил Голуб

пише?13 июня 2007 в 5:07

http://pastie.caboo.se/private/fkjfxgx9w7ee0wqco9 - мой вариант 99 бутылок на ruby

Михаил Голуб

пише?14 июня 2007 в 5:18

Небольшой хинт (я не знал):
(puts 'some'
.puts 'another') unless false

Всегда раньше писал как:
unless false
..puts 'some'
..puts 'another'
end

Я один такой?

Алек [夜]Kyuujitsu Монстович

пише?14 июня 2007 в 18:25

2Rafael MySQL Administrator и MySQL Query Browser.. если Линукс Ubuntu, то Synaptic'ом находишь очень легко..
сайто: http://dev.mysql.com/downloads/gui-tools/5.0.html

Олег Андреев

пише?14 июня 2007 в 21:11

2 майк: ды, ты один такой. Лисп замечателен не скобочками, так что нечего делать код похожим на него =)

Денис Валентинович Рысцов

пише?19 июня 2007 в 23:10

Ищу в google "smalltalk like ide for tcl"
Первая строчка: "XOTclIDE provide Smalltalk-like IDE"
Ищу "smalltalk like ide for ruby"
Первая строчка: "Why is there no Smalltalk-like IDE for Ruby?"

Забавно..

Олег Андреев

пише?20 июня 2007 в 1:05

А что такое Smalltalk-like IDE? Та самая уродливая виртуальная машина?

Михаил Голуб

пише?20 июня 2007 в 1:49

почему уродливая?
у смолтока неплохие же машины, но концепция: "мы все сами, и внешний мир нам не нужен" мне как-то не понравилась.

Денис Валентинович Рысцов

пише?20 июня 2007 в 14:29

MS Visual Studio = IntelliJ IDEA = text editor + debugger интерфейс-рисовалка
Smalltalk like IDE это другой подход к созданию программ. Насколько я понял, это примерно следующее. В основе база данных, в которой храниться программа: допустим таблица классы, таблица объекты, таблица методы. Сама IDE это интерфейс к этой базе данных: выбираем или создаем в списке классов или объектов класс или объект, в списке методов - метод, далее редактируем его - зачем файлы? “It's so 70's”:) Очевидный плюс такой реализации, кроме гуманитарных, имею в виду, удобность, - простота системы контроля версий, которой приходиться merge’ить не текстовой файл, с неизвестной структурой, а базу данных в определенном формате, с сообщениями вида: “в классе такой-то изменился метод”.
Другая особенность - к этой базе данных имеет доступ и само приложение, если запускается под контролем IDE. То есть если во время исполнения программы создать новый класс динамически, он появиться в базе. Так же благодаря этой IDE нету, таких понятий как время выполнения программы и время написания кода – они едины, например если вызвать метод, который не объявлен в классе, вылетит отладчик, в котором можно написать код этого метода и продолжить выполнения.
Допустим, что программа – сложная система, которая будет (или не будет) работать только через несколько месяцев, что делать? Ждать – не годиться. В IDE можно выбрать метод и выполнить его, если он требует параметров, то IDE тебя их спросит. Другая возможность – это что-то вроде irb. Пишем код, который использует классы нашей программы, выделяем часть его мышкой и в контекстном меню жмем “Do it”.
Разве это не крутая IDE?

Михаил Голуб

пише?21 июня 2007 в 4:17

Это image-based VM такая у смолтока. Кстати у Lisp'а такая же.

Денис Валентинович Рысцов

пише?21 июня 2007 в 9:41

Олег, что ты имел ввиду под уродливостью?

Олег Андреев

пише?22 июня 2007 в 3:30

Уродливая - это с уродским интерфейсом. Обсуждать тут нечего, мое личное мнение (сидит же 95% юзеров на винде и не знает, что она уродливая, ну и пусть сидит).

А идея виртуальной машины, как среды для программы очень здравая. Я использую только локальные джемы, чтобы все, на чем стоит проект зависело от конкретных версий библиотек. А обновление версий было контролируемым. В идеале, нужно делать копию всей операционки при установке нового сервера.


Top
 



You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
[ Time : 0.084s | 10 Queries | GZIP : Off ]