На днях был зарелизен вот такой продукт как - модуль к апачу. Самое интересное, что это не заброшенный mod_ruby, это другая история, да ещё и с другими фреймворками не работает. Как шутят сами авторы -
Does it support other Ruby frameworks (Merb, Camping, etc.)?
No.
What?! Why??
Because this is an evil plot created by evil overlords, with the goal of world domination destroying all other Ruby frameworks.
Захотелось на будущее написать скрипт, который будет постить автоматом нужный URL во все известные сервисы закладок сайтов на свой аккаунт. Я уже писал про ruby библиотеку mechanize, при помощи которой это делать очень просто. Всё достаточно тривиально, полная имитация действий пользователя, описанная скриптовым языком. Но вот незадача - в некоторых сервисах (например в бобре), форма добавления url отрабатывается через javascript, который mechanize не умеет. Поиски натолкнули меня на интересный ruby gem -
(есть ещё предок - ), но он для IE, которого под линуксом у меня нет, я firefox больше люблю.
Кратко - это и библиотека на руби и extension к firefox, после установки экстеншена и запуска firefox с ключом -jssh extension открывает из браузера порт на локалхосте, к которому происходит коннект из руби для полноценного управления браузером. (В принципе, это может быть и любой другой язык вместо руби - какая разница, чем в сокет писать.)
Код при этом выглядит примерно так:
#!/usr/bin/ruby
require 'rubygems'
@url = "http://xxx.com"
@title = "xxx"
@desc = "xxx"
@tags = "xxx,xxx,xxx"
@tags_pr = @tags.gsub!(/,/,' ')
#Include the FireWatir file.
require 'firewatir'
#include the FireWatir Module.
include FireWatir
ff=Firefox.new
ff.goto("http://bobrdobr.ru")
if ff.text_field(:name,"login")
#Put your user name.
ff.text_field(:name,"login").set("xxx")
#Put your password.
ff.text_field(:name,"password").set("xxx")
#Входим
ff.button(:src,"http://static.bobrdobr.ru/images/enter.gif").click
end
#добавляем
ff.goto("http://bobrdobr.ru/addurl.html")
ff.text_field(:name,"url").set(@url)
ff.text_field(:name,"title").set(@title)
ff.text_field(:name,"description").set(@desc)
ff.text_field(:name,"tags").set(@tags)
ff.button(:src,"http://static.bobrdobr.ru/images/save.gif").click
Вуаля=) Правда с русским языком при передаче проблемы - корябается…
Таким образом, этот движок можно использовать как частичную замену юнит тестингу, в отличии от extensions, которые записывают действия для последующего проигрывания тут можно реально из языка всё делать динамически и очень просто. С документацией не очень, но исходники открыты…
С одной стороны, вроде как письку с пальцем сравнивают.
Хорошо, давайте переведу, но опять же - критикуйте, я сам боюсь.
только от себя - в гугле php лучше запросы смотрятся - искать легче.
Схожести:
1. Ruby is dynamically typed, like in PHP, so you don’t need to worry about having to declare variables
Ruby - это не строго типизируемый язык, не мучьтесь по поводу объявления переменных.
Да ладно, это давно уже анекдот.
2. Ruby has try/catch/throw style exception handling like PHP5
Это бля вообще пиздец - Ruby имеет try/catch/throw как php5.
Я бы тут промолчал, кто и кого имеет.
3. Ruby has classes and access modifiers (public, protected & private)
Это мы понимаем. Это как у всех нынче. Тон статьи начинает напрягать.
4. A Ruby class can have only one method with a given name
Клеточку нарисовать
5. Supports single inheritance, not multiple
1. extends becomes < - class User < Person
Это вообще пошлятина.
6. Invoke the parent method of an inherited class with super
super()
7. Ruby has heredoc syntax
Давайте кавычки обзовём вот так. Это ерунда.
8. You can include files with the load method
Охренеть.
9. You can require files with the require method
1. loads any given file only once (like require_once) - load ‘filename.rb’
2. no extension necessary - require ‘filename’
Ну да, да, проехали - абсолютная идентичность
10. true and false are the same as in PHP
Да Вы чо!
11. the equivalent to null is nil
Аз есьм.
12. String concatenation is joining of two strings, using the + operator
не понял, а как же точка?
13. Constants begin with capital letters. Example PI, Length
Это Вы к похожести? Хочу Ваших грибов. У php вообще бардак! Php им гордится!
14. You can always see what object you are in (current object) by using the special variable self
Эээ, self::это как бы у всех.
15. Comparing two strings for equality can be done by == or .eql? (for identical content) and .equal? (for identical objects).
Ну это вообще детский сад. Какашки можно отличить потому, что они похожи на какашки.
16. instance_of? returns true if object is an instance of the given class
объектный примитив, детский сад
Differences
Разница, что то я уже пожалел, что ввязался в это дело, ну да ладно
1. No semicolons ; required after statements. A statement can end with a carriage return or a semi-colon if you choose. Semi-colons are generally used when you wish to have more than one statement per line
; после конца строки, в принципе, это сильное различие, даже не знаю хорошо это или плохо.
2. The increment and decrement operators (++ and –) are not available in Ruby, neither in “pre” nor “post” forms
Это типа правда = x.succ! = это только для строк (немного разочарован)
3. When calling a method you don’t have to use parentheses
1. foobar
foobar()
foobar(a, b, c)
foobar a, b, c
Тут вообще полная свобода - не понял, что имеют в виду, или сам недопонял.
4. You can use variables in your Ruby programs without any declarations. Variable name itself denotes its scope (local, global, instance, etc.)
Это я и в php могу - объявлять переменные просто так. Проще говоря - э
то не strict language. Со всеми сборщиками мусора.
1. Normal local variables are plain strings, global variables include a dollar sign at the beginning, and class variables begin with the at-symbol. This is definitely a departure from php in which every variable has a dollar sign
Ну тут всё просто - переменные с долларом ($fuck) есть глобальные - забавно, правда гыыы?
2. Ruby has strong typing. You’ll need to call to_s, to_i etc. to convert between strings, integers and so on, instead of relying on the language to do it
Всё объект!
Это просто я хочу строчку - пишу 5.to_s - тогда это будет строка. Или “5″.to_i это будет integer, хотя в ruby integer понятие относительное - ruby умеет вообще забыть о tiny int или big int (если мы вспомним как оно хранится) Забудьте об этом, руби пофигу на размер числа и на то как оно хранится - всё это объект, попробуйте вычислить на php действительно крупное число=). Уже проходили. php тут сосёт.
5. Blocks of code can use curly braces “{ }” or the “begin … end” keywords. I normally use begin and end, and as such I will through the rest of the tutorial, but just remember you can use braces instead if you like.
Это вообще Вам как паскалю предлагают, или как обычно, {}, цените, смерды.
6. Instead of naming conditions, like underscores, the standard library and extensions are organized in modules and classes
Я иногда не догоняю, но в NetBeans IDE кликну на функции - и вот оно. И написано на Ruby, опять же.
Тут просто всё.
7. While the return statement does exist and works like you would expect, it is not required and a function will return the last expression it evaluated
любая def от руби всегда что-то возвращает, без return, а просто так
8. Ruby also has a negated form of the if statement, the unless end
Всего лишь одно из условий, ерунда
9. You can access an array beyond its boundary limits; it will return nil
Тоже ерунда, в php этого нет, да и не надо особо, вернули nil - значит попа.
10. Reflection is an inherent capatibility of objects, you don’t need to use Reflection classes like in PHP 5
Тут пропущу
11. Ruby has no abstract or interface classes
А потому, что всё объект, это вообще смешно - всё объект и похуй
12. In Ruby, everything from an integer to a string is considered to be an object
Бля, повторение пройденного, всё объект
13. hashes and arrays are not interchangable
Это абсолютно разные вещи, хэши - это массивы с ключами, у хешей нет упорядоченности.
14. PHP does not officially support namespaces (yet) and Ruby does
Скоро у php буду namespaces.