неділя, 30 грудня 2007 р.

Google Trends

Забавна статистика.
Я не можу судити про достовірність наведених даних. але цілком очевидно, що по популярності Ruby не відстає від своїх прямих конкурентів Python і Perl.

пʼятниця, 28 грудня 2007 р.

Install Ruby 1.9 on Ubuntu

Prerequire:
$ sudo apt-get install build-essential

Download Ruby 1.9:
$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.0-0.tar.gz

Compile & install:
$ mkdir ~/ruby1.9
$ tar xzvf ruby-1.9.0-0.tar.gz
$ cd ruby-1.9.0-0/
$ ./configure --prefix=/home/mama/ruby1.9/
$ make
$ make install

Try it:
$ PATH=/home/mama/ruby1.9/bin:$PATH
$ irb
irb(main):001:0> RUBY_VERSION
=> "1.9.0"
irb(main):002:0> RUBY_RELEASE_DATE
=> "2007-12-25"

вівторок, 25 грудня 2007 р.

Ruby 1.9

Matz анонсував Ruby 1.9.0.
Доступні різдвяні пакунки як у вигляді вихідних кодів так і бінарних пакетів для Windows (i386 | x64).
Список відмінностей Ruby 1.9 від попередньої версії 1.8.

Merry Christmas!

пʼятниця, 21 грудня 2007 р.

UaEnv::FIO

Модуль UaEnv::FIO призначений для відмінювання прізвища, імені і по батькові у давальний відмінок.
На даний момент доступний через SVN проекту.
svn checkout http://uaenv.rubyforge.org/svn/

або
svn checkout svn://rubyforge.org/var/svn/uaenv


Подивитись вихідний код:
http://uaenv.rubyforge.org/svn/lib/fio/fio.rb

Попереджаю відразу, лінгвіст тут і поруч не стояв. Тому використовуйте цей модуль на власний страх і ризик. Прошу за знайдені помилки мене сильно не лаяти. Код з часом буде вдосконалюватись. І було б дуже доречним якби Ви повідомляли про знайдені неточності і баги.

UaEnv::FIO::dative_case("Іванченко", "Іван", "Іванович")
=> ["Іванченку", "Івану", "Івановичу"]

понеділок, 17 грудня 2007 р.

Дело Ленина живет!

Щойно переглядаючи звіти у Google Analitycs помітив що частина Referring трафіку йде з [live.julik.nl (referral)] [/2007/08/ruitls-goes-ukrainian]. Зацікавило. Ось автор RuTils пише про мій UaEnv:
Недавно в процессе браузинга наткнулся на UaEnv. Дело Ленина живет!
Как сторонник тотального космополитизма и дружбы между народами рукоплескаю и катаюсь в экстазе. Другое дело что перед форканием можно было и интегрировать оба, да? :-)

/me трохи соромно і водночас дуже приємно :).
А тепер щодо UaEnv. Я про нього вже і забув. Функціоналу який там зараз є мені наразі вистачає з головою :). Десь на днях додам до проекту функцію, що схиляє прізвище, ім'я і по батькові (в давальний відмінок). Заодно і скину нову версію gem-у.

Get current time from internet time server

Вдосконалюючи Новорічний Лічильник написав простенький скрипт який бере поточну дату і час з інтернету. Можливо комусь пригодиться.

# Provides date & time data from NIST (time.nist.gov)

require 'socket'

time_server = "time-nw.nist.gov"
begin
# http://www.faqs.org/rfcs/rfc867.html
# "JJJJJ YY-MM-DD HH:MM:SS TT L H msADV UTC(NIST) OTM"
#
client = TCPSocket.open(time_server, 13)
time_str = client.read
rescue SocketError => err
puts err
exit
end

# Parse and assign to variables
# ju - Modified Julian Date (MJD)
# ye - Year (2 digits)
# mo - Month (2 digits)
# da - Day (2 digits)
# ho - Hour (24-hour, 2 digits)
# me - Minutes (2 digits)
# se - Seconds (2 digits)
#
ju, ye, mo, da, ho, mi ,se = /(\d{5})\s(\d{2})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})/.match( time_str.strip)[1..7]

# Create the NIST time from parsed data
#
utc_time_now = Time.utc(ye, mo, da, ho, mi, se)

local_time_now = utc_time_now.localtime
puts local_time_now

четвер, 13 грудня 2007 р.

Rails & REST

Впивалися у вуха довбані звуки,
очі фіксували небачені глюки,
Мене зачепило й поволокло,
Туди, де прикольно, туди, де світло.
(© Роллік'С - Манера даБІЛА)

Рекомендовано до прочитання, ознайомлення і негайного вживання: http://www.b-simple.de/download/restful_rails_en.pdf

понеділок, 10 грудня 2007 р.

Rails 2.0.1 :: Обновився

Обновився... it's works: yay!

Пів дня потратив щоб хоч щось простеньке написати :(. Ніфіга з того не вийшло... Туплю, просто туплю...
І де "Wow!" яке я очікував? Де screencast-и "Як написати блог за 15 хвилин" :) ? Ну де хоча б один tutorial для dummies?
Хоча є і приємні моменти: Sexy migrations.
Дійсно sexyyyyy! Views також стали до неподобства sexy :). А без scaffold (це було "Wow!", коли я вперше подивився screencast про Rails 1.0) новачок в повній мірі зможе відчути жорсткий секс. Ага... є така файна штука як REST (wtf?).

В загальному враження позитивні! Будемо розбиратися...
От так от малята... Чекайте запису про те як же все таки написати блог за 15 хвилин використовуючи Rails 2.0.

UPD. Ласкаво просимо в світ Rails, світ не скаффолдінгу і тупих блогів за 15 хвилин, а уніфікації і організованості.

неділя, 9 грудня 2007 р.

Декілька хороших новин

Відразу декілька хороших новин.
З'явилися 2 книжки по Ruby on Rails російською:
Гибкая разработка веб-приложений в среде Rails

Rails. Сборник рецептов


Як тільки хоч одна з низ з'явиться в Україні, обов'язково придбаю :)

Вийшла фінальна версія Ruby on Rails 2: якось спробую...

І вийшла фінальна версія NetBeans 6.0 : ура!

Тепер тільки чекаємо Різдва і фінальної версії Ruby 2.

неділя, 25 листопада 2007 р.

До Нового Року ще можна пристрелитись



Зацініть який я файнєцький кавалок коду написав. Сам не можу натішитись :)

$KCODE = "u"

# Перетворює число секунд у зручний формат -- [секунди, хвилини, години, дні]
#
def human_timer(total_sec)
(day ,hour = (tmp, min = (tmp, sec = (total_sec.to_i).divmod(60))[0].divmod(60))[0].divmod(24))
return sec, min, hour, day
end

# Вибирає відмінок в залежності від числа
#
def choose_plural(amount, *variants)
variant = ( (amount % 10 == 1 && amount % 100 != 11) ? 1 : (amount % 10 >= 2 && amount % 10 <= 4 && (amount % 100 < 10 || amount % 100 >= 20) ) ? 2 : 3 )
return variants[variant - 1]
end

# Формує стрічку скільки часу залишилось до Нового Року )))
#
def glue_string
new_year_date = Time.mktime(2008)
total_sec = new_year_date - Time.now
if total_sec > 0
sec, min, hour, day = human_timer(total_sec)
a_string ="До Нового Року залишилось"
a_string << " #{day} #{choose_plural(day, 'день', 'дні', 'днів')}" if !day.zero?
a_string << " #{hour} #{choose_plural(hour, 'година', 'години', 'годин')}" if !hour.zero?
a_string << " #{min} #{choose_plural(min, 'хвилина', 'хвилини', 'хвилин')}" if !min.zero?
a_string << " #{sec} #{choose_plural(sec, 'секунда', 'секунди', 'секунд')}" #if !sec.zero?
else
a_string = "З Новим Роком!"
end
end

puts glue_string


Тільки не кажіть що так писати не можна :). Я ж так старався... Думаю як ще можна спотворити цей витвір...

Ось декілька прикладів виконання:
$ ruby happy_new_year.rb
До Нового 2008 Року залишилось 36 днів 10 годин 36 хвилин 28 секунд
$ ruby happy_new_year.rb
До Нового 2008 Року залишилось 36 днів 10 годин 36 хвилин 24 секунди
$ ruby happy_new_year.rb
До Нового 2008 Року залишилось 36 днів 10 годин 36 хвилин 21 секунда

пʼятниця, 23 листопада 2007 р.

Автодоповнення в irb

irb - це інтерактивна консоль Ruby, яка розповсюджується в офіційному пакеті інтерпритатора. Запускається з консолі за допомогою комади $ irb . Незамінна річ для вивчення мови "методом тику". Пишеш строку коду ruby, irb тобі відразу відповідає. Вводиш будь-яку команду і отримуєш результат або помилку. Наприклад: "2+2" а він: "4", або "abcdefg".upcase => "ABCDEFG".
Крім того irb володіє функцією автодоповнення (code completion), що дуже зручно якщо ви точно не пам'ятаєте команди або ж хочете переглянути всі доступні методи для змінної. Наприклад, набравши "ruby". і натиснувши клавішу "TAB" , ви отримаєте щось схоже:
Display all 130 possibilities? (y or n)
.map
.__id__ .match
.__send__ .max
.all? .member?
.any? .method
.between? .methods
.capitalize .min
.capitalize! .next
.casecmp .next!
.center .nil?
.chomp .object_id
.chomp! .oct
.chop .partition


Дуже зручно, чи не так?
Для того щоб підключити автодоповнення необхідно відредагувати конфігураційний файл irb (у Linux це ~/.irbrc):
require "irb/completion"

Після перезапуску irb автодоповнення стане доступним.

середа, 31 жовтня 2007 р.

Sun випустила NetBeans під GPL

Представники компанії Sun обіцяли це доволі давно, і відтепер - починаючи з версії 6.0 beta 2 їх середовище розробки стало цілком відкритим. відтепер NetBeans розповсюджується під подвійною ліцензією - GPL v2 і CDDL. Нагадаю що окрім підтримки Java, починаючи з 6 версії ця IDE підтримує також Ruby/Rails/jruby.
Докладніше про NetBeans 6 тут.

понеділок, 29 жовтня 2007 р.

вівторок, 16 жовтня 2007 р.

Hardware Upgrade

На тижні відправив свого старенького пенька (Pentium III 733, 128 Мб ОЗП) на пенсію. Пізніше застосую його у якості невеликого файлового сервера.
На зміну йому прийшов молодий боєць:
  • AMD Athlon 64 X2 Dual Core Processor BE-23000 1.91 ГГц
  • 1 Гб ОЗП
  • NVIDIA GeForce 7300 GT
Різниця на лице :).

gem-и перестали глючити...
$ gem search someone
Ляпота...
Поки що приглядають до NetBeans IDE 6.0 Beta 1 for Ruby

середа, 26 вересня 2007 р.

rmovie

rmovie є розширенням Ruby, яке надає методи для доступу до файлів мультимедіа (зокрема відео файлів), він може повертати кадри відео, як малюнки, які в подальшому можна імпортуватися до RMagick. Це дозволяє створювати ескізи малюнків із фільмів. rmovie також корисний для звіту про тривалість і бітрейт аудіо файлів (mp3, wma ...). rmovie має доступ до багатьох відео форматів, які підтримуються ffmpeg (avi, mpg, wmv, mov).

Насамперед пересвідчіться, що Ruby встановлений у вашій системі (тут використовується Ubuntu):
$ sudo apt-get install ruby1.8
$ sudo apt-get install ruby1.8-dev
$ sudo apt-get install rubygems

Для того щоб rmovie працював необхідно встановити також вихідні коди libavcodec і libavformat:
$ sudo apt-get install ffmpeg
$ sudo apt-get install libavcodec-dev
$ sudo apt-get install libavformat-dev


Для того щоб витягувати кадри відео необхідно встановити RMagick:
$ sudo apt-get install librmagick-ruby


Встановити rmovie можна декількома способами:
Спосіб 1.
$ wget http://files.rubyforge.mmmultiworks.com/rmovie/rmovie-0.5.1.gem
$ gem install rmovie-0.5.1.gem

Спосіб 2.
$ gem install rmovie
Building native extensions. This could take a while...
Successfully installed rmovie, version 0.5.1


Невеликий приклад використання rmovie спільно з RMagick

require 'rubygems'
require 'rmovie'
require 'RMagick'
mov = RMovie::Movie.new("movie.avi")
mov.duration # => 5440.43994140625
mov.frame_count # => 136011
mov.frame_width # => 672
mov.frame_height # => 384
mov.has_audio? # => true
mov.file_name # => "/media/sdb5/films/movie.avi"
frame = mov.frame(10)
img = Magick::Image.new(frame.width, frame.height) # => 672x384 DirectClass 16-bit
img.import_pixels(0, 0, frame.width, frame.height, "RGB", frame.to_string, Magick::CharPixel) # => 672x384 DirectClass 16-bit
img.write("output.jpg") # => output.jpg 672x384 DirectClass 16-bit 16kb


За більш докладнішою документацією зверніться до rmovie API Documentation та RMagick Documentation

Область застосування зв'язки rmovie + RMagick обмежує тільки ваша фантазія. Enjoy!

вівторок, 18 вересня 2007 р.

Качина типізація

Латентна, неявна або качина типізація (калька з англ. Duck typing) - вид динамічної типізації, яка використовується в деяких мовах програмування (Smalltalk, Python. Ruby, Boo), коли значення змінної визначає, те що вона може робити. Тобто є об'єкт, який реалізує інтерфейс, якщо він містить всі методи цього інтерфейсу, незалежно від зв'язків в ієрархії наслідування.
Англійська назва посилається на "качиний тест" (duck test) - "If a bird looks like a duck, swims like a duck and quacks like a duck, then it's probably a duck." ("Якщо птах виглядає як качка, плаває як качка і крякає як качка, це ймовірно і є качка").
Качина типізації піклується тільки про ті аспекти об'єкта, які використовуються, замість типу об'єкту безпосередньо.Наприклад, у мові без качиної типізації, можна створити функцію яка бере об'єкт Duck (Качка) і викликає його методи swim (плавати) quack (крякати). У мові з качиною типізацією, еквівалентна функція може взяти об'єкт будь-якого типу і викликати методи "плавати" і "крякати". Якщо об'єкт немає методів до яких звертаються, функція сигналізує run-time error (помилку виконання) .
Качина типізація - це фундаментальна частина мови програмування Ruby. Можна відмітити Ruby, не оголошує види змінних чи методів - все є тільки деяким видом об'єкту. Об'єкти Ruby (на відміну від об'єктів у деяких інших об'єктно-орієнтованих мовах) можуть бути змінені індивідуально. Ви завжди можете додавати методи до об'єкта. В Ruby поведінка і можливості об'єкту можуть відрізнятися від тих, що забезпечуються його класом.
В Ruby ми залежимо менше від типу (або класу) об'єкту і більше від його можливостей (методів). Відтепер, качина типізація має на увазі тип об'єкту, як те що з ним можна зробити, а не те, чим є об'єкт. Качина типізація посилається на тенденцію Ruby менше турбуватися про клас об'єкта, і більше концентруватися на його методах.
Якщо об'єкт плаває як качка і крякає як качка, то інтерпретатор Ruby щасливий розглядати його, ніби то це качка.
Розглянемо наступний приклад:
# Check whether the object defines the to_str method
puts ('A string'.respond_to? :to_str) # => true
puts (Exception.new.respond_to? :to_str) # => true
puts (4.respond_to? :to_str) # => false

Вищеописаний приклад - це найпростіший приклад філософії "качиної типізації"в Ruby, якщо об'єкт крякає як качка (або діє як рядок(String)), розглядати його як качку (або рядок(String)). При першій-ліпшій можливості, ви повинні розглядати об'єкт згідно методів, які він визначає, замість класів з яких він успадковується або модулів, у які він включений.
Шоб краще зрозуміти качину типізацію введемо наступні три класи - Duck, Goose і DuckRecording.

class Duck
def quack
'Quack!'
end
def swim
'Paddle paddle paddle...'
end
end

class Goose
def honk
'Honk!'
end
def swim
'Splash splash splash...'
end
end

class DuckRecording
def quack
play
end
def play
'Quack!'
end
end

def make_it_quack(duck)
duck.quack
end

puts make_it_quack(Duck.new) # => Quack!
puts make_it_quack(DuckRecording.new) # => Quack!

def make_it_swim(duck)
duck.swim
end

puts make_it_swim(Duck.new) # => Paddle paddle paddle...
puts make_it_swim(Goose.new) # => Splash splash splash...

Метод який вказує Качці (Duck) крякати, працює і для DuckRecording завдяки качиній типізації. Як і метод, який вказує Качці (Duck) плавати, буде працювати і для Гуски (Goose).

Використанні ресурси:
http://en.wikipedia.org/wiki/Duck_typing
http://rubylearning.com/satishtalim/duck_typing.html
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/100511

четвер, 13 вересня 2007 р.

Apache 2 + Ruby 1.8 + mod_ruby + eruby

В цій статі ми розглянемо встановлення і настройку Web-сервера Apache 2, Ruby 1.8 (mod_ruby + eruby) для використання на локальній машині під ОС Linux (Ubuntu/Debian).

Інсталяція:
Для початку необхідно встановити всі необхідні пакети:

$ sudo apt-get install ruby
$ sudo apt-get install apache2
$ sudo apt-get install libapache2-mod-ruby eruby


Я буду використовувати конфігурацію Apache "по замовчуванню".
Після інсталяції mod_ruby, автоматично буде створений файл /etc/apache2/mods-available/ruby.load з таким вмістом:
LoadModule ruby_module /usr/lib/apache2/modules/mod_ruby.so

Настройка:
В дистрибутивах Ubuntu/Debian(можливо і в інших) конфігураційний файл httpd.conf розбитий на велику кількість менших файлів у директорії /etc/apache2.
Для конфігурації mod_ruby створимо файл /etc/apache2/mods-available/ruby.conf. Також необхідно створити посилання на нього до каталогу /etc/apache2/mods-enabled, щоб він завантажувався автоматично.
sudo ln -s /etc/apache2/mods-available/ruby.conf /etc/apache2/mods-enabled/ruby.conf

З докладним описом процесу інсталяції і настройки можна ознайомитися тут .

Я буду використовувати зв'язку eRuby + mod_ruby.
eruby - це виконання eRuby(Embedded Ruby), що служить для включення коду Ruby у HTML та інші документи. Має розширення *.rhtml. Код включається за допомогою пари роздільників "<%" і "%>". Коли мене запитують про eRuby, я завжди відповідаю що це типу PHP, тільки для Ruby :). Докладніше про eRuby тут i тут .
Додамо наступні рядки до /etc/apache2/mods-available/ruby.conf.
<IfModule mod_ruby.c>
RubyRequire apache/eruby-run

# Обробляти файлами з директорій /eruby як файли eRuby
<Location /eruby>
SetHandler ruby-object
RubyHandler Apache::ERubyRun.instance
</Location>

# Обробляти *.rhtml файли як eRuby файли
<Files *.rhtml>
SetHandler ruby-object
RubyHandler Apache::ERubyRun.instance
</Files>
</IfModule>

<Directory /var/www/eruby>
AllowOverride All
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

AddType text/html .rhtml


Існує одна проблема, коли ви здійснюєте запит до директорії(наприклад, http://localhost/eruby), mod_ruby викликає помилку (щось типу /usr/lib/ruby/1.8/apache/eruby-run.rb:101:in `compile_file': Is a directory - /var/www/eruby/ (Errno::EISDIR). Щоб виправити це додамо наступний рядок до ruby.conf .
RedirectMatch ^/eruby/?$ /eruby/index.rhtml


Перезапустимо веб-сервер командою:
$ sudo /etc/init.d/apache2 restart


Створимо файл /var/www/eruby/index.rhtml:
<%= Time.now %>

Перейдемо у Web-броузері за адресою http://localhost/eruby і побачимо поточну дату і час.
Вуаля, готово!

Відображення помилок mod_ruby:
mod_ruby не терпить невдачу з попередженнями(warnings) і повідомлення про попередження не записуються до log-файлу (наприклад, /var/log/apache2/error.log чи будь-який інший), тільки повідомлення про помилки записуються до цього файлу. Так що забудьте про попередження під mod_ruby. Можливо є якийсь діагностичний рівень, на якому це можна встановити, але мені не відомо про це :(.
Коли Ruby зазнає синтаксичну або іншу помилку він повертає "Internal Server Error (500)" і повідомлення про помилку записується до log-файлу Apache. Щоб постійно слідкувати за помилками доводиться читати цей файл або використовувати утиліту tail:
$ sudo tail -f /var/log/apache2/error.log

Постійно доводиться переключатися у консоль, шо не дуже зручно у процесі написання коду.
Для виведення помилок на Web-сторінку використовується опція ErrorDocument Apache.
Створимо файл /var/www/eruby/errors/error_500.rhtml:
<%
r = Apache.request
r.content_type = "text/plain"
r.send_http_header
print "Ruby Error: ",r.prev.uri,"\n\n"
print r.prev.error_message
%>


І додамо у /etc/apache2/mods-available/ruby.conf наступний рядок.
ErrorDocument 500 /eruby/errors/error_500.rhtml


Перезапустимо Apache:
$ sudo /etc/init.d/apache2 restart


Тепер при виникненні помилки(але не попередження) фактичне повідомлення про невдачу буде показане не сторінці. Рекомендую використовувати даний метод лише під час розробки і відналагодження.

понеділок, 20 серпня 2007 р.

Ruby лучший друг программиста

Ruby лучший друг программиста. Саме так написано на головній сторінці нового російськомовного порталу по Ruby. Приємно, що на пострадянському просторі збільшується цікавість до цієї мови програмування. Сайт вартий уваги хоча б тому, що він один із не багатьох. На даний момент портал ще досить сирий. Подивимось, що з цього виросте.

субота, 18 серпня 2007 р.

methodphitamine <^_^>


http://jicksta.com/articles/2007/08/04/the-methodphitamine

Джей Філіпс (Jay Phillips) у свому блозі описав прості і ефективні можливості мови Ruby. Я в захваті. А-а-а-а! Відсипте дві!

rbtorstat - простий ґенератор веб-сторінки rTorrent

rbtorstat (r - ruby, rb - ruby, b - bit, btor - bittorrent, tor - torrent, stat - status) - простий ґенератор веб-сторінки, написаний (мною) на мові програмування Ruby, який показує інформацію статусу про rTorrent - консольний bittorrent клієнт для Unix/Linux систем. Це дає змогу швидко переглядати список torrent-ів і їх статус у веб-браузері, без необхідності коннектитись на віддалену машину (наприклад по ssh, далі screen + rTorrent).

Скрипт зчитує збережені дані про сесію rtorrent, створює звіт про статус torrent файлів і виводить код HTML на stdout, який далі можна перенаправити у файл і зробити його публічно доступним на веб-сервер. rbtorstat не підтримую віддалене адміністрування rTorrent. Але завдяки тому що у версії 0.7.5 була додана можливість віддаленого адміністрування використовуючи засоби xmlrpc (докладніше про це можна почитати тут) це не складе особливих труднощів. rbtorstat, як видно із заголовку переслідує зовсім інші цілі.

Початковий код rbtorstat базується на основі rtorstat, написаному Джорджом Нотарасом(
George Notaras) на мові програмування Python.

Залежності:
  • Ruby;
  • bencode - бібліотека Ruby для перетворення даних Bencode (що використовується в протоколі BitTorrent) у послідовну форму;
  • rTorrent - консольний BitTorrent-клієнт для Linux, написаний на мові програмування C++, сконфігурований для зберігання даних про сесії (про це докладніше далі);
Конфігурація rTorrent:
rbtorstat повинен зчитувати дані
сесії torrent, тому rTorrent потрібно налаштувати, так щоб зберігати цю інформацію у певну директорію. Далі наведений конфігураційний файл (.rtorrent.rc) :
port_range=6900-6999
download_rate = 64
upload_rate = 16
session = /opt/rtorrent
# Keeps session data files even if torrent has finished
session_on_completion = yes
session_lock = yes
# Save session data every 5 mins, with a 4 min offset
schedule = session_save,240,300,session_save=

Остання директива (
schedule) вказує rTorrent щоб зберігати дані сесії кожні 5 хвилин з відгалуженням 4 хвилини. Це означає, що дані сесії будуть збережені, наприклад, о 00:04, 00:09, і т.д.

Використання:

Для виконання скрипта достатньо вказати у вихідному файлі коректний шлях до директорії із даними сесії rTorrent. На виході буде отриманий код HTML, який можна перенаправити у файл, наприклад так:
$ ruby rbtorstat.rb > /var/www/index.txt

Крім того його можна прописати до cron:
*/5 * * * * root ruby /path/to/rbtorstat.rb /opt/rtorrent/ > /var/www/index.html

Скрипт буде запускатись кожні 5 хвилин.
Результат можна переглянути на веб-сервері.
Завантажити:
Наразі чорновий варіант скрипта можна завантажити за адресою:
http://anton.linux.googlepages.com/rbtorstat.rb

Реальний приклад:
http://info.opoz.homeip.net/rbtorstat.html

Плани на майбутнє:
Скрипт написаний виключно у приватних цілях і підтримуватись у майбутньому не буде.

Програмування:
Для того щоб обробляти torrent-файли або файли сесії rTorrent (які є тими ж *.torrent) у Ruby потрібно проінсталювати бібліотеку bencode:
$ gem install bencode

Приклад скрипта для завантаження torrent-файлу у хеш(Hash):
require 'rubygems'
require 'bencode'
t_dict = BEncode.load_file(torrent)

Дізнатись докладніше про специфікація протоколу Bittorrent тут .
Наприклад:
t_dict['info']['name'] # назва файлу
t_dict['info']['length'] # довжина файлу у байтах

Крім того rTorrent має декілька специфічних директив:
t_dict['rtorrent']['total_uploaded'] # кількість вивантажених байт
t_dict['rtorrent']['complete'] # статус закачки (завантажився чи ні?)
Просто і плоско до бєзобразія :). Успіхів.

Підбірка літератури по Ruby (on Rails)

Моя підбірка літератури по мові програмування Ruby, а також Ruby on Rails.
Поповнюється по мірі надходження нових книг.

Більшість книг є англомовними

Я сам не пірат, поважаю авторське право. Ті книги, які продаються на Заході (читайте: amazon.com) коштують $20 . В нашій країні не перекладені оригінали (можливо, навіть копії?) продаються по ціні мінімум X*2 раза більшії. Хоча особисто я поки не зустірчав їх у вільному продажу.
Тому користуємось тим що є. Це ж тільки для ознайомлення :)

пʼятниця, 3 серпня 2007 р.

WxRuby Beta

А тим часом тихо і непомітно вийшла перша бета версія бібліотеки WxRuby2
Судячи з changelogу виправлено величезне число багів і покращена роботу з пам'яттю. І це дійсно так і є. Тепер програми не падають просто так :).
Крім того додано класи для Advanced User Interface (AUI). М-м-м... смачна штука!!! Варто якось спробувати.

Побудова власно пакету gem

Цією статтею я хочу розпочати невеликий цикл записів про створення і підтримку власного коду Ruby. В більшій мірі я це пишу для себе, як шпаргалку :). Можливо це комусь і стане у нагоді.

В цій статті я хочу поділитись досвідом побудови інсталяційного пакету gem для Ruby. Якщо Вам здається, що Ви маєте бібліотеку, яка, можливо, була б корисна для інших людей, Ви можете легко упакувати її як gem і розповсюджувати її через Інтернет (для Ruby існує спеціалізований сайт для сторонніх бібліотек - http://rubyforge.org/).
Процес перетворення Вашого коду у пакет gem складається з двох частин. Не хвилюйтесь, Вам не доведеться змінювати ваш код, щоб пристосувати його до gem. По-перше, Вам необхідно змінити(створити) структуру каталогів, яка б відповідала потребам gem. Далі для прикладу я буду використовувати свій власний проект під назвою uaenv - http://rubyforge.org/projects/uaenv/.
Структура каталогу організована, як вказано нижче:
  • /uaenv/lib : цей каталог містить весь код Ruby, який має безпосереднє відношення до проекту.
  • /uaenv/pkg : каталог, у який власне і буде згенерований gem.
  • /uaenv/tests : каталог, у якому буде знаходитись код для тестів.
  • /uaenv/README : цей файл повинен містити опис проекту, ліцензію, і взагалі будь-яку інформацію за бажанням.

Це мінімум для того щоб створити gem.
Складніші проекти можуть містити наступні директорії:
  • /uaenv/bin : каталог для будь-яких виконуваних скриптів, які є частиною проекту.
  • /uaenv/doc : додаткова документація по проекту.

Це буде корисним, якщо існує необхідність додати нові інструменти командного рядка при встановленні в систему.
RubyGems підтримує зберігання не тільки джерельних кодів Ruby. Коли користувач встановлює пакет gem на комп'ютері, gem намагається скомпілювати додатковий код як частину установки. Перевагою використання gem таким чином є, те що не-Ruby код буде пов'язаний з фактичними бібліотеками, які встановленні на комп'ютері. Наприклад, це трапляється коли Ви встановлюєте RMagick. Якщо інсталятор не знайшов належних бібліотек(ImageMagick), він потерпить невдачу. Крім того до пакету можна додати заздалегідь скомпільовані файли, щоб уникнути проблеми неможливості компілювати код на комп'ютері призначення.
Як тільки Ви влаштували свій код у коректну структуру каталогів, Ви можете зосередитись на іншій частині процесу побудови gem - специфікації gem. Це декларація, яка надає всю необхідну інформацію щоб побудувати gem. Ви можете створити специфікацію gem, як автономний файл, але простіше якщо Ви будете використовувати стандартні засоби, створите Rakefile. Це значно спростить процес побудови.
Нижче наведений приклад файлу Rakefile, який повинен міститись у кореневому каталозі проекту uaenv.
require 'rubygems'
Gem::manage_gems
require 'rake/gempackagetask'
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "uaenv"
s.version = "0.0.3"
s.author = "Anton Maminov"
s.email = "anton.linux @nospam@ google.com"
s.homepage = "http://rubyforge.org/projects/uaenv"
s.rubyforge_project = "uaenv"
s.summary = "Simple processing of Ukrainian strings"
s.files = FileList['lib/**/*.rb','test/*'].to_a
s.require_path = "lib"
s.autorequire = "uaenv"
s.test_files = Dir.glob('tests/*.rb')
s.has_rdoc = true
s.extra_rdoc_files = ["README"]
end

Rake::GemPackageTask.new(spec) do |pkg|
pkg.need_zip = true
end

task :default => "pkg/#{spec.name}-#{spec.version}.gem" do
puts "generated latest version"

Це хороший приклад стандартного Rakefile для gem. Тут Ви можете бачити, що він включає RubyGems і додає деякі завдання для rake. Головна специфікація забезпечує всю інформацію про gem. Останнє завдання подає простого помічника який дозволяє запустити rake у каталозі і автоматично побудувати пакет gem і файл zip. Кожна лінія специфікації має спеціальне призначення. За більш детальнішою інформацією зверніться на офіційний сайт Rubygems - http://docs.rubygems.org/.

четвер, 2 серпня 2007 р.

Короткий огляд wxRuby.

В одному зі своїх попередніх дописів я обіцяв провести аналіз декількох графічних тулкітів для Ruby. Я цього не зробив і мабуть вже не зроблю... Так-так, я лінивий. Мене тільки вистачило на поверхневий огляд тулкітів... І вибір мій впав на wxRuby(wxruby.rubyforge.org). Чому? Хз... Просто чомусь відразу сподобався він мені.

wxRuby2 поточна версія, яка перебуваю у розробці. Базується на wxWidgets 2.8 API, і перебуває на стадії beta.

Декілька переваг:
  • досить непогана реалізація для Ruby;
  • легкість встановлення (rubygems + декілька сторонніх бібліотек)
  • кросплатфомність (Linux, MacOSX, Windows);
  • look and feel: використовує віджети Windows на Win32, Aqua на OS X і GTK2 на Linux. + стандартний набір віджетів, яких вистачить для написання графічних програм будь-якого рівня складності.
  • інтернаціоналізація (підтримка unicode стрічок по замовчуванню);
Плюс багато приємних дрібниць, таких як кросплатформна підтримка рідних гарячих клавіш і пунктів головного меню, підтримка трею. Мабуть всі ці переваги можна віднести до wxWidgets.
Крім того на оффсайті WxRuby є документація по API і декілька практичних посібників по використанню.

З недоліків, можу зазначити: нестабільність (часті RunTimeErrors і різного баги при виконанні), дивний вигляд інтерфейсу на ОС Windows.
Висновок. Як на мене, то бібліотека поки що не придатна для використання у стабільних проектах, але для власних домашніх цілей згодиться.

P.S. Я використовував WxRuby для однієї своєї невеликої програми для роботи з базою даних SQLite, конкретніше телефонна книга м. Тернополя, з можливістю пошуку і відображення результатів. Швидко і зручно.

Вирішення проблеми з rubygems під Ubuntu Linux 7.04

Вчора виникла необхідність встановити декілька пакетів з репозиторію rubygems. Раніше я вже писав про проблеми з цим. Після виконання $ sudo gem install <назва пакету>, через декілька хвилин система вішалась намертво. Неприємні враження :(.
Був проведений простий аналіз роботи. Ось як це відбувалось.
$ sudo gem install unicode

Дослідження трафіку утилітою iptraf показало що gem з'єднується з IP адресою 205.234.109.18(rubyforge.org) і завантажує приблизно 870 пакетів (125500 байт). Після закриття з'єднання починалось найцікавіше. Розмір swap(розділ підкачки) починав активно збільшуватись. Саме час відкинутись на спинку крісла і чекати завершення роботи :). В моєму випадку - піти перекурити. О жах! Свап 600 метрів. Комп практично не реагує на маніпуляції. Допомогла тільки перезавантаження системи.
Перевірив версія gem:
$ gem -v
0.9.0
Тоді як на оффсайті (http://rubyforge.org/projects/rubygems/) доступна 0.9.4. Завантажую і встановлюю її.
$ wget http://rubyforge.org/frs/download.php/20989/rubygems-0.9.4.tgz
$ tar xzvf rubygems-0.9.4.tgz
$ cd rubygems-0.9.4
$ sudo ruby setup.rb
Далі використовую інсталятор rubygem для встановлення себе самого.
$ sudo gem install rubygems-update
Ииии... чудо. Воно таки встановилося і працює:
$ gem -v
0.9.4


Хто винен? Висновки робіть самі...
P.S. І все одно воно працює повільно :(, але хоча б працює...

вівторок, 10 липня 2007 р.

Магія % Ruby

Відпочиваю...
От за що люблю Ruby так це за його дивовижний синтаксис О_о.
Ще зі школи пам'ятаю завдання з Pascal: написати програму яка б виводила табличку множення від 2 до 9. Випадково, бавлячись з блоками в irb, написав однорядковий аналог.

9.downto(1) {|i| puts; (1).upto(i*9) { |j| ( j.divmod(i)[1] == 0 ) ? ( print "%3d"%j ) : ( nil ) } }

Не читабельно, зате круто B)

неділя, 8 липня 2007 р.

Гуйня: Постановка задачі.

Накопилось декілька цікавих ідей щодо написання невеликих програмок(про них пізніше) з графічним інтерфейсом, які б без особливих викрутасів однакого працювали б як у Windows так і у Linux.
Для початку необхідно вибрати графічний тулкіт.
Кандидати:
Основні вимоги до них ставляться наступні:
  • кросплатформність + інтеграція з хостовою платформою;
  • простота використання і програмування;
  • достатня реалізації і відсутніть багів;
У настпуних записках мною буде проведений їх короткий огляд... і декілька слів про самі програмки.

Ruby! Ruby! Ruby...

Ruby, Ruby, Ruby, Ruby
Ahaa-ahaa-ahaa

© Kaiser Chiefs - Ruby

Чи більше часу маєш справи з тою чи іншою справою, тим більше розумієшся в ній, пізнаєш її тонкі моменти і недоліки. Це закономірно.
Цей запис присв'ячений тим недолікам, які особисто дратують мене у Ruby.
Почнемо.
  1. gem. Після команди $ gem install bla-bla-bla мій старенький пеньок (Pentium III 733, RAM 128 Mb) впадає в глибоку дипресію з подальшим самогубством :). Невже не можна було зробити щось подібне до deb? Нафіга ці трудноші...
  2. unicode. Це не недолік, це взагалі повна його відсутність. Існують вирішення . Але хочеться щоб робота з юнікодом була "з коробки", все ж таки Ruby інтерпритована мова і доставляти лишні костилі це не панацея.
  3. threads. Про потоки багато не скажу тому що працював з ними досить мало. Але і того вистачило, щоб зрозуміти, що в Ruby вони реалізовані якось НЕ_ТАК_ЯК_ТРЕБА.
  4. python. Так як я перейшов на Ruby з Python, можу зробити декілька порівнять рівня "дитячого садка". Ці дві мови практично одного рівня призначення. Перейшов саме через синтаксис, в Ruby він просто прекрасний. Табулятори Пайтона викликали багато незручностей з переносом коду з однієї частини скрипта в іншу. Тай ООП в Рубі на висоті (все - об'єкт). Швидкодія Рубі змушує бажати кращого. Маю надію у версії 2.0 це виправлять.
  5. RoR. Насамперед RoR != Ruby. Таке враження, що Ruby існує тільки завдяки RoR. Насправді все у точності до навпаки, RoR повинен завдячувати своїй простоті гнучкому синтаксису Ruby.
P.S. крім того багато матюків викликає робота з сторонніми бібліотеками. Часом це перетворюєтьтся в жах, і з'являються думки перейти назад/вперед на Python, як більш стабільнішу мову.

пʼятниця, 9 березня 2007 р.

Труднощі перекладу.

Написанні статті, а тим більше курсового чи дипломного проекту вимагає наукого стилю. Викладення вводночас повинне бути строге, лаконічне і просте для розуміння. Зміст повинен бути зрозумілий особам, які не надто впевнено почуваються в цій темі, а не тільки вузькому колу спеціалістів з певної області (програмісти, адміністратори).

Цікава стаття про те як не слід писати статті. Дуже актуальна для мене, тому що в ній я знайшов багато проблем які мене цікавили. Зокрема, проблема особових займенників, іншомовних термінів.
Не просто перекладати на українську мову специфічні програмерні терміни.
Дослівний переклад не завжди буде точно відтворювати оригінальний термін, 
смисловий переклад 
не завжди буде зрозумілий іншим, а широке використання кальки засмічує текст
і робить його не дуже приємним для читання.
Наприклад, framework. На просторах тенетів найчастіше вживається калька фреймворк, по смислу - програмний каркас. Це простий приклад. Існують складніші варіанти. Наприклад, mailer. Смисловий переклад привів мене думки, що доречніше буде вживати кальку мейлер. І таких прикладів дуже і дуже багато!

Ще однією проблемою є русизми. Значна частка документації написана російською. Часто-густо доводиться перекладати. І тут з'являється проблема відміни слів, зворотів і родів. Наприклад: Pascal - це мова програмування. Логічно Паскаль - це вона, хоча в контексті Паскаль це чоловічий рід. Ось і доводиться думати.

І на кінець українській мові на відміну від англійськї нажаль чи на щастя не існує безособових речень. Це значно погіршує ситуацію. Тому насамперед вже на початка потрібно визначитись, від якої особи буде вестись мова. Це значно покращить стиль написання і не приведе до курйозних ситуацій.

Доводиться діяти в різних ситуаціях на власний розсуд, тому що єдиного правильного рішення не інснує, і годі його шукати. ГОСТи та інші нормативні документи розвиваються повільнішими темпами аніж технології розробки.

Продовження буде...

Курсовий проект? Дипломний проект!?

Навіть не знаю як почати цей пост. Хоч моя спеціальність не має безпосереднього відношення до програмування, тим більше до веб-програмування, викладач здається таки дозволив писати курсовий проект з прив'якою до веб. Я навіть і не думав, що все буде так просто. Він навіть толком не запитався про суть проекту. Йому вистачило, що це буде з базою даних, авторизацією/автерифікацією користувачів і деякими автоматичними розрахунками. Ось так... Навіть здогадують чому так... Хе-хе... Але це тема іншого поста і не у цьому блозі...
Написати проект не проблема. Проблема вкласти його в рамки курсового. На мою думку, Ruby on Rails більш придатний для таких цілей ніж PHP. Тай описувати структуру і нюанси Рельсів значно приємніше :). Відчуваю роботи буди вдосталь. І це мені подобається. Я відчуваю внутрішній прилив позитивної енергії.
Можливо з цього і вийде якийсь невеликий україномовний посібник по Рельсах. Не знаю, не знаю... чим чорт не жартує :). Не хочеться загадувати наперед. Потрібно уточнити деякі нюанси.
Подовження буде...

понеділок, 15 січня 2007 р.

UaEnv-0.0.3

Хочу представити(прорекламувати) всій перший публічний модуль для Ruby. UaEnv - модуль для роботи з українським текстом. За основу взятий RuTils.

Інсталяція:
$ gem install uaenv
Деякі можливості:
require 'rubygems'
require 'uaenv'
=> true
UaEnv::VERSION
=> "0.0.1"
(87496.0005).propysom
=> "вісімдесят сім тисяч чотириста дев'яносто шість цілих п'ять десятитисячних"
(293.57).grn
=> "двісті дев'яносто три гривні п'ятдесят сім копійок"
"З Новорічними святами!".translify
=> "Z Novorichnymy sviatamy!"
require 'date'
Date::UA_DAYNAMES
=> ["неділя", "понеділок", "вівторок", "середа", "черверг", "п'ятниця", "субота"]
Date::UA_MONTHNAMES
=> [nil, "січень", "лютий", "березень", "квітень", "травень", "червень", "липень", "серпень", "вересень", "жовтень", "листопад", "грудень"]
Докладніше про модуль і плани на майбутнє можна дізнатися на сторінці проекту
SVN репозиторій: svn://rubyforge.org/var/svn/uaenv .
Поради і пропозиції приймаються :)

вівторок, 9 січня 2007 р.

puts "Hello World!"

Піддавшись на загальну моду, вирішив і собі завести блог.
Як видно з назви блог присвячений мові програмування Ruby і все що з нею пов'язано.

Декілька слів про сам блог:
  • блог буде вестись виключно для себе у вільний час.
  • українська - основна мова блогу. (а Ви думали це буде мова Ruby?)
  • власні доробки і лінки на інші цікаві проекти, статті - ось основний майбутній контент блогу.
  • Ruby on Rails ( куди ж без нього :) )