понеділок, 29 червня 2009 р.

Redcar - аналог Textmate для Linux


Ті з вас хто хоч раз бачив Railscasts, думаю в курсі про Mac OS'ісовський текстовий редактор TextMate - Великий фетиш і Ідол всіх програмістів на Ruby під Mac. Особисто я був у захваті від побаченого. Але нажаль розробники TextMate не подумали про нещасних Linux користувачів, які готові віддати свої 57$. Так ось, схоже у нас тепер з'явився аналог - Redcar, автором якого є Daniel B. Lucraft'а.
Ось що говорить сам автор про свій проект:
Redcar - текстовим редактором для програмістів з відкритим вихідним кодом для Gnome(Linux). Він призначена для забезпечення сумісності з Textmate bundles(робота триває), і написаний майже повністю на Ruby, і з використанням Vala для швидкодії. Redcar все ще перебуває в зародковому стані...

Зараз функціонує вже 75% всіх можливостей TextMate.
Детальна (і що головне, робоча) інструкція як зібрати його під Ubuntu 9.04 лежить у git'і.
Дуже хочеться що б проект продовжував розвиватися.

понеділок, 22 червня 2009 р.

Merb tutorial in Ukrainian


На сайті молодої україномовної соціальної IT спільноти Розробка.com з'явився туторіал по Merb. Підручник охоплює як створювати прості програми за допомогою Merb, haml і DataMapper.

неділю, 14 червня 2009 р.

URL Encoding/Decoding with Ruby 1.9

Encode and decode a string for a URL with Ruby 1.9 (according to RFC 3986 and RFC 3629).

# URL encoded text:
enc_str = "http://uk.wikipedia.org/wiki/%D0%84%D0%B2%D1%80%D0%BE%D0%BF%D0%B0"

# Decode:
require 'cgi'
dec_str = CGI::unescape(enc_str)
=> http://uk.wikipedia.org/wiki/Європа
dec_str.encoding
=> #<Encoding:UTF-8>


# URL decoded text:
dec_str = "Декодований текст"

# Encode:
require 'cgi'
enc_str = CGI::escape(dec_str)
=> "%D0%94%D0%B5%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9+%D1%82%D0%B5%D0%BA%D1%81%D1%82"
enc_str.encoding
=> #<Encoding:US-ASCII>

Ruby 1.9 and R-Bus

Намагаючись завести зв'язку Ruby 1.9 + D-Bus, натрапив на проект R-Bus.
З офіційної сторінки бубліотеки:
R-Bus is a native implementation of the D-Bus protocol, with these goals in mind:Ruby + standard library is the only dependencies, a rubyish API, approach and way of doing things, complete client functionality and a comprehensive test suite.

Останньою новиною проетку є Ruby 1.9.1 support in trunk датована 5 квітня 2009 року.
Як виявилось пізніше версія з транку не працює з Ruby 1.9.1. Тому доведеться накладати патч. Перевірено, він сумісний не тільки з версією 1.9.1 Ruby, а й попередніми. Приємно, що автором патчу є наш земляк Sergey Yanovitsky, за що йому велике Дякую. Хоча і не всі функції працездатні :(.


Install Ruby 1.9.1 from sources:
$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p129.tar.gz
$ tar xzvf ruby-1.9.1-p129.tar.gz
$ mkdir ruby1.9
$ cd /home/mama/ruby-1.9.1-p129
$ ./configure --prefix=/home/mama/ruby1.9
$ make
$ make install
$ PATH=/home/mama/ruby1.9/bin:$PATH
$ ruby -v
ruby 1.9.1p129 (2009-05-12 revision 23412) [i686-linux]

Get the R-Bus code from Subversion with:
$ svn checkout svn://rubyforge.org/var/svn/rbus/trunk rbus
$ cd rbus

Get Ruby 1.9 and Rspec 1.2.2 support patch
wget http://rubyforge.org/tracker/download.php/3277/12588/25318/4487/ruby-1.9_rspec-1.2.2_support.diff

Apply patch:
$ patch -p0 < ruby-1.9_rspec-1.2.2_support.diff

Install rbus:
$ ruby setup.rb

Example:
require 'rbus'
session_bus = RBus.session_bus
rb_player = session_bus.get_object('org.kde.amarok', '/Player')
uri = rb_player.GetMetadata()

Посилання:
R-Bus API Docs, Tutorial and more

суботу, 13 червня 2009 р.

Ruby D-Bus

Цей запис описує створення простого D-Bus клієнта до аудіопрогравача Amarok 2 за допомогою Ruby.

Що таке D-Bus і принцип його роботи
D-Bus - це система міжпроцесної взаємодії, яка надає додаткам декілька шин для передачі повідомлень.
D-Bus є частиноє проекту freedesktop.org. Вона володіє високою швидкодією, інтегрується з багатьма робочими середовищами. D-Bus доступна для GLib, Java, Mono, Qt, Python, Ruby і є прозорою для мережі.
D-Bus надає системі декілька шин:
  1. Системна шина. Створюється під час старту демона. З її допомогою відбувається спілкування різноманітних демонів, вона практично недоступна для додатків користувача.
  2. Сесійна шина. Створюється для користувача, авторизованого у системі. Для кожної такої шини запускається окрема копія демона, через неї спілкуються додатки, з якими працює користувач.

Кожне повідомлення D-Bus має свого відправника і одержувача, а їхні адреси називаються шляхами об'єктів, оскільки D-Bus вважає, що кожен додаток складається із набору об'єктів, а повідомлення пересилається не між додатками, а між об'єктами цих самих додатків.
Кожен об'єкт може підтримувати один або більше інтерфейсів, які представленні у вигляді іменованих груп методів і сигналів.
D-Bus також передбачає концепцію сервісів. Сервіс - унікальне місцезнаходження додатка на шині. При запуску додаток реєструє один або декілька сервісів, якими воно буде володіти до тих пір поки самостійно не звільнить. Ніякий інший додаток, що претендує на той же сервіс, зайняти його не зможе. Іменується сервіси аналогічно інтерфейсам.
У кожного об'єкта своє унікальне ім'я, яке виглядає як шлях в файловій системі. Наприклад, /org/kde/amarok/Player

Інсталяція ruby-dbus
Бібліотеку Ruby D-Bus можна встановити за допомогою команди:
$ gem install ruby-dbus

Це все! Тепер можемо перейти до використання...

Використання бібліотеки в Ruby

Для того що використовувати бібліотеку ви повинні включити її у вашу програму за допомогою
require 'dbus'

Приєдняння до шини
bus = DBus::SystemBus.instance
bus = DBus::SessionBus.instance

відповідно, або до системної шини, або до сесійної.

Виклик методу
Наприклад ми хочемо отримати доступ до об'єкта клієнта аудіопрогравача Amarok через шину сесій. Amarok надає сервіс з іменем org.kde.amarok
rb_service = bus.service("org.kde.amarok")

Тепер у нас є маніпулятор для сервісу і ми знаємо, що він експортує об'єкт /Player. Отримати доступ до цього об'єкта можна за допомогою методу object:
rb_player = rb_service.object("/Player")

rb_player.introspect

Нагадаю, об'єкти D-Bus мають інтерфейси, а інтерфейси в свою чергу мають методи. Далі отримуємо доступ до цих методів:
rb_player_iface = rb_playes["org.freedesktop.MediaPlayer"]
rb_player_iface.Pause

Як ви можете бачити, коли ви хочете викликати метод об'єкта, ви повинні отримати правильний інтерфейс. Це трохи втомлює, тому ми маємо наступне посилання, яке робить те ж саме, що й раніше:
rb_player.default_iface = "org.freedesktop.MediaPlayer"
rb_player.Pause

Деякі D-Bus об'єкти забезпечують доступ до властивостей. Вони доступні, як хеш:
rb_player_iface.GetMetadata
=> [{"album"=>"www.reconstructionmusic.org", "artist"=>"allMeadow & Rob Costlow", "arturl"=>"", "audio-bitrate"=>350, "audio-samplerate"=>44100, "comment"=>"This Amarok theme was made by allMeadow & Rob Costlow especially for Amarok. You can check out more of their projects at Magnatune.com or at www.reconstructionmusic.org", "genre"=>"Instrumental", "location"=>"file:///usr/share/kde4/apps/amarok/data/first_run_jingle.ogg", "mtime"=>40000, "rating"=>0, "time"=>40, "title"=>"Art Of Nations (Amarok Theme)", "tracknumber"=>1, "year"=>"2010"}]


Замість висновків
Знайти докладну інформацію про D-Bus API конкретних програм буває непросто, але Google завжди буде відданим супутником у ваших дослідженнях.

На сьогодні це все, малята :)

Використанні посисання

Історія команд в irb

Якщо ви бажаєте, щоб історія введених команд зберігалася після закриття irb обов'язково додайте наступні рядки до ~/.irbrc
require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 100
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb_history"

Крім того загляньте сюди: Автодоповнення в irb

понеділок, 8 червня 2009 р.

Відновлення GRUB у Ubuntu після встановлення Windows

Це допис ніяким боком не стосується основної теми блогу.
Більше того, про відновлення GRUB в інтернетах не писав мабуть тільки лінивий. Тому я не буду стояти осторонь і додам свої 5 копійок :).
Між іншим Ubuntu Linux перейшов на використання завантажувача Grub2.
На моїй машині в дуалбуті постійно мешкають Windows(зараз Windows 7) і Linux(зараз kubuntu 9.04). Сьогодні встановав Windows 7 build 7100. Як на мене система досить непогана і на перший погляд працює значно стабільніше свого попередника. Хоча я більше надаю перевагу Linux. Але це тема іншої історії.
Так от встановлювач Windows перезаписує завантажувальний розділ жорсткого диску, і встановлює туди свій завантажувач. Як тепер відновити grub, щоб можна було при старті машини звично обирати ОС для завантаження?
Розписую покрокову інстукцію для свої системи:


1. Завантажуємо графічний інсталятор kubuntu 9.04 і відкриваємо консоль.
2. Дивимось таблицю розділів:
ubuntu@ubuntu:~$ sudo fdisk -l /dev/sda

Disk /dev/sda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x64920a32

Device Boot Start End Blocks Id System
/dev/sda1 * 1 2550 20482843+ 7 HPFS/NTFS
/dev/sda2 5101 30401 203230282+ f W95 Ext'd (LBA)
/dev/sda5 5101 11534 51681073+ 7 HPFS/NTFS
/dev/sda6 11535 18036 52227283+ 7 HPFS/NTFS
/dev/sda7 18037 19252 9767488+ 83 Linux
/dev/sda8 19253 19374 979933+ 82 Linux swap / Solaris
/dev/sda9 19375 30389 88477956 83 Linux
/dev/sda10 30390 30401 96358+ 83 Linux

де:
sda1 - розділ з windows.
sda5, sda6 - розділи де зберігається всякий хламу для windows.
sda7 - кореневий розділ ubuntu(fs ext4).
sda8 - розділ підкачки(swap) для linux.
sda10 - розділ boot.
sda9 - розділ файлосмітник для linux.

3. Далі необхідно примонтувати кореневий розділ ubuntu. Наприклад в /mnt/root.
ubuntu@ubuntu:~$ sudo mkdir /mnt/root/
ubuntu@ubuntu:~$ sudo mount -t ext4 /dev/sda7 /mnt/root/
ubuntu@ubuntu:~$ sudo mount /dev/sda10 /mnt/root/boot/
ubuntu@ubuntu:~$ sudo mount -t proc none /mnt/root/proc/
ubuntu@ubuntu:~$ sudo mount -o bind /dev/ /mnt/root/dev


4. Змінюємо кореневий розділ за допомогою chroot:
ubuntu@ubuntu:~$ sudo chroot /mnt/root/ /bin/bash
root@ubuntu:/#


5. Далі переходимо до командного рядка grub і встановлюємо завантажувач на /dev/sda:
root@ubuntu:/# grub
grub> root (hd0,9)
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"... 17 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+17 p (hd0,9)/grub/stage2 /grub/menu
.lst"... succeeded
Done.

grub>
Зверніть увагу! (hd0,9) == /dev/sda10.
Це повязане з тим, що номера розділів в Linux починаються з 1, тоді як Grub нумерує їх з 0.

6. Якщо все пройшло без помилок, то можна перевантажувати комп'ютер.

7. ???

8. PROFIT