Показ дописів із міткою linux. Показати всі дописи
Показ дописів із міткою linux. Показати всі дописи

вівторок, 8 січня 2013 р.

Встановлення Windows XP на віртуальну машину KVM

Процедури установки і налаштування хост-сервера не розглядається в рамках у цієї статті.

Що дано:
  • Хост-система Ubuntu Server 12.04 LTS
  • KVM
  • Гостьова система Windows XP
Під час інсталяції Windows XP на віртуальну машину KVM стикнувся з дуже низьким дисковим I/O. Метод спроб і помилок бажаний результат був досягнутий.

Створення образу гостьової машини розміром 20 гігабайт у форматі qcow2. Серед підтримуваних форматів QEMU, цей — найбільш універсальний.
$ qemu-img create -f qcow2 -o preallocation=metadata winxp.qcow2 20G

Virtio — це такі спеціальні драйвера, які безпосередньо прокидають фізичне залізо у віртуалку, без емуляції його. Власне це поввино зменшувати навантаження на хост-машину.

У Windows XP, як відомо, немає драйверів Virtio і при установці виникає помилка через відсутність доступу до жорсткого диску.

Для установки драйверів можете використати мій образ дискети Virtio Disk Floppy.
Або створити його власноруч (чи оновити драйвери на дискеті) за допомогою найсвіжіших Virtio Windows Drivers:
$ dd bs=512 count=2880 if=/dev/zero of=viostor-0.1-49-floppy.img
$ mkfs.msdos viostor-0.1-49-floppy.img
$ mkdir /mnt/floppy
$ sudo mount -o loop viostor-0.1-49-floppy.img /mnt/floppy
$ mkdir /mnt/iso
$ sudo mount -o loop virtio-win-0.1-49.iso /mnt/iso
і скопіювати відповідні файли viostor з ISO на дискету, використовуючи мій образ в якості орієнтира.
Для довідки:
wxp — Windows XP
wnet — Windows Server 2003

Далі переходимо до інсталяції віртуальної машини:
$ sudo virt-install -n winxp -r 1024 --disk path=winxp.qcow2,format=qcow2,bus=virtio,cache='writeback' --disk path=viostor-0.1-30-floppy.img,device=floppy -c winxp.iso --video=vmvga --accelerate --os-variant=winxp -v --vnc -w bridge:virbr0

неділя, 11 грудня 2011 р.

Ruby/Tk в RVM

Так як wxRuby не розвивається більше 2-ох років, а Qt4 надмірний для моїх задач. Вибір впав на бібліотеку Tk, яка поставляється разом з Ruby.

Tk (від англ. Toolkit — "набір інструментів", "інструментарій") - кросплатформна бібліотека базових елементів графічного інтерфейсу, яка розповсюджується відкритими вихідними текстами.

Для того щоб почати використовувати Tk достатньо імпортувати бібліотеку для роботи з нею:
require 'tk'
Якщо ви отримаєте помилку
LoadError: cannot load such file -- tk
значить Tk не скомпільована з вашим Ruby.
Якщо у вас RVM, ласкаво прошу під кат.

субота, 21 травня 2011 р.

Термінальний віконний менеджер Tmux

Майже кожен поважаючий себе linux'оїд знайомий з чудовою утилітою GNU Screen. Але у цій статті мова піде не про неї. А про її альтернативу Tmux, яка на мою думку є більш зручнішою.
Отже.
Tmux - це термінальний віконний менеджер, і мультиплексор. Тобто дозволяє використовувати декілька терміналів у одному. Tmux так само як і screen можна легко завести у фон, і так само легко повернутися до нього.

понеділок, 3 травня 2010 р.

Запуск web-додатку на Sinatra з Phusion Passenger

На сьогоднішній день одним з найпростіших способів запуску Rails і Rack web-додатків є Phusion Passenger, що представляє собою модуль для Apache і Nginx. Фреймворк Sinatra базується на Rack, отже, додатки на його основі Passenger здатний легко запускати.

Для програми необхідна базова структура директорій:
APP_DIRECTORY/
  |-- app.rb       <-- безпосередньо додаток
  |-- config.ru    <-- Rackup файл для запуску
  |-- public/      <-- директорія для статичних файлів (зображення, css, javascript)
  |-- tmp/         <-- тимчасова директорія

Встановлюємо Apache2:
$ sudo apt-get install apache2-mpm-prefork apache2-prefork-dev libapr1-dev libaprutil1-dev

Встановлюємо Phusion Passenger:
$ sudo gem1.9.1 install passenger

Налаштування модуля для Apache:
$ sudo /opt/ruby191/bin/passenger-install-apache2-module

Далі слідуємо інструкції.
Створюємо файл /etc/apache2/mods-available/passenger.load і додаємо наступні рядки:
LoadModule passenger_module /opt/ruby191/lib/ruby/gems/1.9.1/gems/passenger-2.2.11/ext/apache2/mod_passenger.so
PassengerRoot /opt/ruby191/lib/ruby/gems/1.9.1/gems/passenger-2.2.11
PassengerRuby /opt/ruby191/bin/ruby

Застосовуємо зміни і перезапускаємо сервіс:
$ sudo a2enmod passenger
$ sudo service apache2 restart

Припустимо наш додаток Sinatra знаходиться у /somewhere. Додамо віртуальний хост до конфігурації Apache і встановимо DocumentRoot у /somewhere/public
# /etc/apache2/sites-enabled/000-default
<VirtualHost *:80>
  ServerName www.yourhost.com
  DocumentRoot /somewhere/public
  <Directory /somewhere/public>
    AllowOverride all
    Options -MultiViews
  </Directory>
</VirtualHost>

Для запуску додатку із статті Привіт, Sinatra! створимо Rackup файл config.ru:
require 'sinatra'
require 'app.rb'

run Sinatra::Application

# app.rb
require 'rubygems'
require 'sinatra'

get '/' do
 "Привіт, Sinatra!"
end

пʼятниця, 29 січня 2010 р.

Вирішення проблеми з wxRuby на Ubuntu 9.10

Існує баг з wxRuby на Ubuntu Karmic Koala.
Темою цього допису буде вирішення цієї проблеми, щоб зробити можливою розробку додатків у зв'язці Ruby 1.9 та wxRuby на Ubuntu 9.10.
Отже,покрокова інструкція.

Інсталяція необхідних пакетів для розробників

$ sudo apt-get install build-essential libssl-dev libreadline5 libreadline5-dev zlib1g zlib1g-dev
$ sudo apt-get install libgtk2.0-dev
$ sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-0-dev

Встановлення Ruby (1.9.1)

Про те як зібрати Ruby 1.9.1 з вихідних кодів я описував тут
Коротко:
Завантажуємо останню свіжу версію Ruby (на момент написання статті це 1.9.1-p376)
Розпаковуємо архів і встановлюємо:
$ tar xzvf ruby-1.9.1-p376.tar.gz
$ ./configure --prefix=/opt/ruby191
$ make
$ make test
$ sudo make install

Встановлення змінних оточення

Оскільки Ruby ми збирали у /opt/ruby191, встановлюємо відповідні змінні оточення
$ PATH=/opt/ruby191/bin:$PATH
$ LD_LIBRARY_PATH=/opt/ruby191/lib:$LD_LIBRARY_PATH

Встановлення SWIG (1.3.38)

Спочатку видаляємо пакети SWIG з дистрибутиву якщо вони встановлені:
$ sudo apt-get remove swig swig1.3 --purge

Максимальна версія SWIG, що допускається для компіляції wxRuby - це 1.3.38.
Скачуємо архів swig-1.3.38.tar.gz з сайту www.swig.org
Розпаковуємо командою:
$ tar xzvf swig-1.3.38.tar.gz

У каталозі із вихідними кодами SWIG:
$ ./configure --prefix=/opt
...
checking for ruby... ruby
checking for Ruby header files... could not locate ruby.h...using -I/opt/ruby191/lib/ruby/1.9.1/i686-linux
checking for Ruby library... -Wl,-R -Wl,/opt/ruby191/lib -L/opt/ruby191/lib -lruby-static in /opt/ruby191/lib
...
$ make
$ sudo make install

Встановлення wxRuby (2.0.1)

Звантажуємо архів з вихідними кодами wxRuby з сайту wxruby.rubyforge.org
Розархівовуємо командою
$ tar xzvf wxruby-2.0.1.tar.gz
і в каталозі з вихідним кодом робимо:
$ rake1.9.1 WXRUBY_VERSION=2.0.1
$ strip -x lib/wxruby2.so
$ rake1.9.1 gem
$ sudo gem1.9.1 install -l wxruby-ruby19

Тестуємо

$ ruby1.9.1 /opt/ruby191/lib/ruby/gems/1.9.1/gems/wxruby-ruby19-2.0.1-x86-linux/samples/bigdemo/bigdemo.rb

середа, 19 серпня 2009 р.

Quake Live for Linux

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

Twitter доставив приємну звісточку:
QUAKE LIVE is back online, now with Mac & Linux support! Read more at www.quakelive.com/forum/showthread.php?t=31851


Протестовано на Ubuntu 9.04 з Firefox 3.0.13.
Плагін для Firefox оформлений у вигляді xpi-файла.

субота, 8 серпня 2009 р.

Ruby for System Administration → Ruby-inotify

Inotify - це підсистема ядра Linux, яка дозволяє отримувати повідомлення про зміни у файловій системі. У основне ядро була включена починаючи з 2.6.13. Основна сфера використання - в системах пошуку (наприклад Beagle), таким чином програмі-індексатору не потрібно сканувати всю файлову систему кожні кілька хвилин.

ruby-inotify - це Ruby інтерфейс для доступу до системних викликів Linux Inotify.
Дозволяє виявляти, якщо файл був відкритий, закритий, переміщений, видалений, модифікований і багато чого іншого.


Доступні події:
ACCESS - звернення до файлу(читання).
MODIFY - файл був змінений(запис).
CREATE - файл був створений.
ATTRIB - змінені метадані (права, дата створення/редагування, розширені атрибути, і т.д.).
CLOSE_WRITE - файл, відкритий для запису, був закритий.
CLOSE_NOWRITE - файл, не відкритий для запису, був закритий.
OPEN - файл був відкритий.
MOVED_FROM - файл був переміщений від слідкування.
MOVED_TO - файл був переміщений до слідкування.
DELETE - файл був видалений.
DELETE_SELF - відслідковуваний файл/каталог був видалений.
CLOSE - IN_CLOSE_WRITE | IN_CLOSE_NOWRITE
MOVE - IN_MOVED_FROM | IN_MOVED_TO
ALL_EVENTS - будь-яка з подій.
UNMOUNT - файлова система була відмонтована.
Q_OVERFLOW - черава inotify переповнена.
IGNORED - відслідковуваний файл був автоматично видалений, тому що файл був видалений або файлова система розмонтована.
ISDIR - подій відбулася відносто каталогу.


Процес інсталяції з вихідних кодів є дуже простим:
$ wget http://dinhe.net/~aredridel/projects/ruby/ruby-inotify-0.0.2.tar.gz
$ tar xzvf ruby-inotify-0.0.2.tar.gz
$ cd ruby-inotify-0.0.2/
$ rake1.9.1
$ sudo make install


Як воно працює?
У каталозі examples міститься скрипт watcher.rb, який є простим прикладом роботи з ruby-inotify.
#!usr/bin/ruby

require 'inotify'
require 'find'

i = Inotify.new

t = Thread.new do
i.each_event do |ev|
p ev.name
p ev.mask
end
end

raise("Specify a directory") if !ARGV[0]

Find.find(ARGV[0]) do |e|
if ['.svn', 'CVS', 'RCS'].include? File.basename(e) or !File.directory? e
Find.prune
else
begin
puts "Adding #{e}"
i.add_watch(e, Inotify::CREATE | Inotify::DELETE | Inotify::MOVE)
rescue
puts "Skipping #{e}: #{$!}"
end
end
end

t.join

При створенні/видаленні/переміщені будь-якого файлу чи каталогу на екран буде виведене його ім’я і маска.
Як бачите все доволі просто.

Запустимо скрипт:
$ ruby1.9.1 watcher.rb .


Створимо файл з іменем test.txt і подивимось на результат роботи скрипта
результат:
"test.txt"
256

Створимо каталог з іменем test
результат:
"test"
1073742080

Видалимо файл test.txt
результат:
"test.txt"
512

Видалимо каталог test
результат:
"test"
1073742336


Де застосовувати?

Та де завгодно! Наприклад на мому домашньому сервері крутиться скрипт, який слідкує за каталогом /mnt/smb/downloads (у який користувачі через ssh скачують файли з інтернету) і виводить час створення або видалення файлів на web-сторінку.

Посилання:

Ruby 1.9.1 on Ubuntu Jaunty

В репозиторії Ubuntu Jaunty немає Ruby 1.9.1, а лише пакети версії 1.9.0.
Тому ви повинні збирати його з вихідного коду або використовувати сторонні репозиторії.

Починаючи з версії 1.9.1. у комплект Ruby також входить Rubygems, так сказати Just Work™.


Встановлення із вихідних кодів

Спочатку встановдюємо необхідні залежності:
sudo apt-get install build-essential libssl-dev libreadline5 libreadline5-dev zlib1g zlib1g-dev


Далі скачуємо найсвіжішу версію Ruby 1.9.1 з офіційного сайту.
Компілюємо і встановлюємо:
./configure --prefix=/opt/ruby191
make
make test
sudo make install


І на сам кінець для зручності створимо відповідні посилання:
sudo ln -s /opt/ruby191/bin/ruby /usr/local/bin/ruby1.9.1
sudo ln -s /opt/ruby191/bin/testrb /usr/local/bin/testrb1.9.1
sudo ln -s /opt/ruby191/bin/rake /usr/local/bin/rake1.9.1
sudo ln -s /opt/ruby191/bin/ri /usr/local/bin/ri1.9.1
sudo ln -s /opt/ruby191/bin/rdoc /usr/local/bin/rdoc1.9.1
sudo ln -s /opt/ruby191/bin/irb /usr/local/bin/irb1.9.1
sudo ln -s /opt/ruby191/bin/gem /usr/local/bin/gem1.9.1
sudo ln -s /opt/ruby191/bin/erb /usr/local/bin/erb1.9.1


Готово!
$ ruby1.9.1 -e 'puts RUBY_DESCRIPTION'
ruby 1.9.1p243 (2009-07-16 revision 24175) [i686-linux]



Встановлення з репозиторію Ubuntu on Rails PPA

Тим, хто вже тестує Ubuntu on Rails PPA спеціальний бонус від Antono Vasiljev
Додаємо новий репозиторій:
deb http://ppa.launchpad.net/ubuntu-on-rails/ppa/ubuntu karmic main
deb-src http://ppa.launchpad.net/ubuntu-on-rails/ppa/ubuntu karmic main

$ sudo apt-get update
[...]
W: GPG error: http://ppa.launchpad.net jaunty Release: Слідуючі підписи не можуть бути перевірені, тому що, публічний ключ відсутній: NO_PUBKEY B6C6326781C0BE11
[...]

Додаємо публічний ключ:
gpg --keyserver keyserver.ubuntu.com --recv B6C6326781C0BE11
gpg --export --armor B6C6326781C0BE11 | sudo apt-key add -

Встановлюємо Ruby 1.9.1:
sudo apt-get install ruby1.9.1 ri1.9.1 rdoc1.9.1


Також можете зібрати пакет самостійно як це описано тут.

четвер, 23 липня 2009 р.

Ubuntu on Rails


Недавно на просторах Launchpad.net була створена команда Ubuntu on Rails.

Ціль команди полягає у підтриманні пакетів для розробки на Ruby/Rails. Першочергово це актуальні версії rubygems і passenger.
В команді беруть участь хлопці з Brightbox, які досі підтримують пакети passenger, nginx-passenger, ruby-ee для Ubuntu і Debian.

>>> Подробиці

неділя, 5 липня 2009 р.

Ruby for System Administration → Bash quoting

Інколи використовую Ruby для задач системного адміністрування. Ruby з широким набором бібліотек чудово для цього підходить.
Однією з поширених задач є виклик зовнішніх команд Linux, передачі їм різноманітних параметрів, отримання і обробки результатів. І тут ви обов'язково стикнетеся з маскуванням символів в bash.


Маскування(quoting) в bash використовується для відміни спеціального значення для команд інтерпрeтатора визначених символів або слів.
Маскування можна використовувати для скасування специфічної обробки спеціальних символів, для запобігання розпізнавання зарезервованих слів, а також для запобігання підстановки параметрів.
Метасимвол - це символ, який розділяє слова, якщо він не замаскований. Є одним з наступних символів:
| & ; ( ) < > пробіл табуляція

Існує три механізми маскування:
символ маскування (escape character), одинарні лапки і подвійні лапки.

Незамаскована зворотна коса риска (\) є символом маскування(escape character). Вона вимагає використовувати наступний за нею символ(за винятком переведення рядка) буквально.

Усі символи в одиночних лапках (') використовуються буквально. Символ одиночної лапки(апостроф) не повинен вказуватися між лапках, навіть якщо його випереджає зворотна коса.

Символи в подвійних лапках(") використовуються буквально, за виключенням $, !, ` і \
Зворотна коса має спеціальне значення тільки якщо після неї йде один з спеціальних символів.

З точки зору програмування, маскування з допомогою одинарних лапок є найпростішим (але не дозволяє маскувати символ одинарних лапок). Тоді як з допомогою зворотної косої - найскладніший.
Ми не шукаємо простих шляхів :)

Напишемо просто функцію, яка отримуватиме cтроку і повертатиме масковану строку, придатну для використання в bash.
Зауважу, код буде працювати тільки в версіями Ruby вище 1.9, оскільки в Regexp використовується нова можливість Oniguruma - іменовані групи(named groups).
#!/usr/bin/env ruby1.9
# -*- encoding: utf8 -*-

def quote_for_bash(text)
text = text.dup
text.gsub!( /(?<backslash>\\)/, '\\\\\k<backslash>' )
text.gsub!( /(?<space>\s)/, '\\\\\k<space>' )
text.gsub!( /(?<double-quotes>")/, '\\\\\k<double-quotes>' )
text.gsub!( /(?<single-quotes>')/, '\\\\\k<single-quotes>' )
text.gsub!( /(?<apostrophe>`)/, '\\\\\k<apostrophe>' )
text.gsub!( /(?<brackets>[()<>])/, '\\\\\k<brackets>' )
text.gsub!( /(?<semicolon>;)/, '\\\\\k<semicolon>' )
text.gsub!( /(?<exclamation-mark>!)/, '\\\\\k<exclamation-mark>')
text.gsub!( /(?<ampersand>&)/, '\\\\\k<ampersand>' )
text.gsub!( /(?<dollar-sign>\$)/, '\\\\\k<dollar-sign>' )
text.gsub!( /(?<number-sign>#)/, '\\\\\k<number-sign>' )
text.gsub!( /(?<vertical>\|)/, '\\\\\k<vertical>' )
return text
end


Задамо текст, який, наприклад, в майбутньому будемо використовувати як параметр для якоїсь команди:
text = %{#<b>$a;say "hello" & |Profit!|  -  (`1$)</b>}


Початковий текст матиме такий вигляд:
puts text
#<b>$a;say "hello" & |Profit!| - (`1$)</b>


Маскований текст буде таким:
puts quote_for_bash(text)
\#\<b\>\$a\;say\ \"hello\"\ \&\ \|Profit\!\|\ \ -\ \ \(\`2\$\)\</b\>

понеділок, 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'і.
Дуже хочеться що б проект продовжував розвиватися.

субота, 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 завжди буде відданим супутником у ваших дослідженнях.

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

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

понеділок, 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

понеділок, 23 лютого 2009 р.

Ruby 1.9.1 in Debian

Нещодавно в репозиторії experimental з'явилися пакети ruby 1.9.1 для Debian.

Основні нововведення Ruby 1.9:

  • Значно збільшилась продуктивність і зменшено споживання пам'яті. У деяких тестах Ruby 1.9.1, який використовує для інтерпретації коду нову віртуальну машину YARV (Yet another Ruby VM), виявився майже в 5 разів швидше Ruby 1.8.

  • Повноцінна реалізація багатопотоковості, що використовує засоби операційної системи (раніше була присутня реалізація "green threads", через емуляцію ниток (threads) інтерпретатором);

  • Повна підтримка мультибайтних кодувань (Unicode);

  • Значні зміни в синтаксисі мови. Гілка Ruby 1.9 не є 100% сумісною з попередніми версіями, з'явилося багато нових конструкцій і змін логіки роботи існуючих елементів.



Додайте рядки для відсутніх репозиторіїв у /etc/apt/source.list і оновіть список пакетів.
deb http://ftp.de.debian.org/debian/ experimental main
deb-src http://ftp.de.debian.org/debian/ experimental main


$ sudo apt-get update


Щоб встановити ruby1.9 з репозиторія experimental виконуємо наступну команду.
$ sudo apt-get install -t experimental ruby1.9
[...]
Пакунки, які будуть ВИДАЛЕНІ:
libruby1.9
НОВІ пакунки, які будуть встановлені:
libruby1.9.1
Пакунки, які будуть ОНОВЛЕНІ:
irb1.9 libopenssl-ruby1.9 libreadline-ruby1.9 rdoc1.9 ruby1.9 ruby1.9-dev
[...]


$ ruby1.9 --version
ruby 1.9.1p0 (2009-01-30 revision 21907) [i486-linux]

понеділок, 2 червня 2008 р.

Мій ~./vimrc

Цей допис не буде описувати структури конфігураційного файлу .vimrc.

Можливості:
  • ідентифікація типу файлу;
  • підстітка синтаксису;
  • заміна табуляції пробілами;
  • зміна кодування файлу для відкриття/зберігання;
  • зміна мови розкладки клавіатури;
  • перевірка орфографії;
  • статус-стрічка з інформацією про поточний файл;

Словники для перевірки орфографії можна скачати з сайту ftp://ftp.vim.org/pub/vim/runtime/spell/. Помістити необхідні файли *.spl в /usr/share/vim/vim70/spell/ .

set nocompatible          " We're running Vim, not Vi!
syntax on " Enable syntax highlighting
filetype plugin indent on " Enable filetype-specific indenting and plugging

set tabstop=2
set shiftwidth=2
set expandtab

set fileencodings=utf-8,cp1251,cp866,koi8-u
set encoding=utf-8
set termencoding=utf-8
set statusline=%<%f%h%m%r%=format=%{&fileformat}\ file=%{&fileencoding}\ spell=%{&spelllang}
set laststatus=2

" <F7> File fileformat (dos - <CR> <NL>, Unix - <NL>, mac - <CR>)
map <F7> :execute RotateFileFormat()<CR>
vmap <F7> <C-C><F7>
imap <F7> <C-O><F7>
let b:fformatindex=0

function! RotateFileFormat()
let y = -1
while y == -1
let encstring = "#unix#dos#mac#"
let x = match(encstring,"#",b:fformatindex)
let y = match(encstring,"#",x+1)
let b:fformatindex = x+1
if y == -1
let b:fformatindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
return ":set fileformat=".str
endif
endwhile
endfunction

" <F8> File encoding for open
" ucs-2le - MS Windows Unicode encoding
map <F8> :execute RotateEnc()<CR>
vmap <F8> <C-C><F8>
imap <F8> <C-O><F8>
let b:encindex=0
function! RotateEnc()
let y = -1
while y == -1
let encstring = "#koi8-r#cp1251#8bit-cp866#utf-8#ucs-2le#"
let x = match(encstring,"#",b:encindex)
let y = match(encstring,"#",x+1)
let b:encindex = x+1
if y == -1
let b:encindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
return ":e ++enc=".str
endif
endwhile
endfunction

" <Shift+F8> Force file encoding for open (encoding = fileencoding)
map <S-F8> :execute ForceRotateEnc()<CR>
vmap <S-F8> <C-C><S-F8>
imap <S-F8> <C-O><S-F8>
let b:encindex=0
function! ForceRotateEnc()
let y = -1
while y == -1
let encstring = "#koi8-r#cp1251#8bit-cp866#utf-8#ucs-2le#"
let x = match(encstring,"#",b:encindex)
let y = match(encstring,"#",x+1)
let b:encindex = x+1
if y == -1
let b:encindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
:execute "set encoding=".str
return ":e ++enc=".str
endif
endwhile
endfunction

" <Ctrl+F8> File encoding for save (convert)
map <C-F8> :execute RotateFEnc()<CR>
vmap <C-F8> <C-C><C-F8>
imap <C-F8> <C-O><C-F8>
let b:fencindex=0
function! RotateFEnc()
let y = -1
while y == -1
let encstring = "#koi8-r#cp1251#8bit-cp866#utf-8#ucs-2le#"
let x = match(encstring,"#",b:fencindex)
let y = match(encstring,"#",x+1)
let b:fencindex = x+1
if y == -1
let b:fencindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
return ":set fenc=".str
endif
endwhile
endfunction

" Russian support | CTRL+^
set keymap=russian-jcukenwin
" by default - latin keymap
set iminsert=0
" by default - latin keymap for search
set imsearch=0


" ftp://ftp.vim.org/pub/vim/runtime/spell/
if version >= 700
" По замовчуванню перевірка орфографії виключена.
setlocal spell spelllang=
setlocal nospell
function ChangeSpellLang()
if &spelllang =~ "en_us"
setlocal spell spelllang=ru
elseif &spelllang =~ "ru"
setlocal spell spelllang=uk
elseif &spelllang =~ "uk"
setlocal spell spelllang=en_us,ru,uk
elseif &spelllang =~ "en_us,ru,uk"
setlocal spell spelllang=
setlocal nospell
else
setlocal spell spelllang=en_us
endif
endfunc
" map spell on/off for English/Russian
map <F11> <Esc>:call ChangeSpellLang()<CR>
endif


Після перезапуску, Vim буде мати наступний вигляд:

пʼятниця, 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"

четвер, 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


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

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

Вирішення проблеми з 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. І все одно воно працює повільно :(, але хоча б працює...