среда, 26 ноября 2008 г.

Просмотр методов класса в ruby

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

>> Object.new.methods
=> ["inspect", "to_yaml_style", "to_query", "require_or_load", "tap", "silence_stderr", "stubba_object", "clone", "to_matcher", "copy_instance_variables_from", "decode64", "public_methods", "__send__", "object_id", "instance_variable_defined?", "require_library_or_gem", "equal?", "freeze", "daemonize", "extend", "subclasses_of", "debugger", "send", "methods", "to_yaml_properties", "acts_like?", "blank?", "silence_stream", "to_json", "hash", "decode_b", "method_exists?", "dup", "to_enum", "dclone", "instance_variables", "eql?", "reset_mocha", "instance_eval", "id", "returning", "breakpoint", "singleton_methods", "load", "taint", "unloadable", "send!", "duplicable?", "stubs", "instance_variable_get", "frozen?", "enum_for", "display", "instance_of?", "method", "to_a", "__is_a__", "stubba_method", "`", "instance_exec", "type", "instance_values", "require_dependency", "protected_methods", "==", "suppress", "require", "===", "with_options", "instance_variable_set", "respond_to?", "kind_of?", "remove_subclasses_of", "extended_by", "expects", "to_s", "taguri", "gem", "silence_warnings", "enable_warnings", "to_param", "class", "encode64", "require_association", "instance_variable_names", "private_methods", "=~", "tainted?", "__id__", "taguri=", "untaint", "nil?", "mocha_inspect", "b64encode", "mocha", "is_a?", "to_yaml", "extend_with_included_modules_from", "__metaclass__"]


Найдите десять отличий (мне захотелось узнать что умеет класс Exception):

>> Exception.new.methods
=> ["inspect", "to_yaml_style", "to_query", "require_or_load", "tap", "silence_stderr", "stubba_object", "clone", "to_matcher", "copy_instance_variables_from", "decode64", "copy_blame!", "public_methods", "__send__", "object_id", "instance_variable_defined?", "require_library_or_gem", "equal?", "freeze", "daemonize", "extend", "subclasses_of", "debugger", "send", "methods", "to_yaml_properties", "acts_like?", "blank?", "silence_stream", "exception", "to_json", "hash", "decode_b", "framework_backtrace", "method_exists?", "dup", "to_enum", "dclone", "blame_file!", "instance_variables", "eql?", "reset_mocha", "id", "instance_eval", "breakpoint", "clean_backtrace", "returning", "singleton_methods", "message", "load", "taint", "unloadable", "send!", "to_str", "duplicable?", "stubs", "instance_variable_get", "frozen?", "enum_for", "display", "instance_of?", "clean_message", "method", "to_a", "blamed_files", "__is_a__", "stubba_method", "`", "instance_exec", "type", "instance_values", "application_backtrace", "require_dependency", "protected_methods", "==", "suppress", "backtrace", "require", "===", "with_options", "instance_variable_set", "respond_to?", "kind_of?", "remove_subclasses_of", "extended_by", "expects", "taguri", "describe_blame", "to_s", "gem", "silence_warnings", "enable_warnings", "to_param", "class", "encode64", "require_association", "instance_variable_names", "private_methods", "=~", "tainted?", "__id__", "taguri=", "set_backtrace", "untaint", "nil?", "mocha_inspect", "b64encode", "mocha", "is_a?", "to_yaml", "extend_with_included_modules_from", "__metaclass__"]


А теперь вспомним, что массивы руби перегружают оператор вычитания:
>> Exception.new.methods - Object.methods
=> ["copy_blame!", "exception", "framework_backtrace", "blame_file!", "clean_backtrace", "message", "to_str", "clean_message", "blamed_files", "application_backtrace", "backtrace", "describe_blame", "set_backtrace"]


Ну как, удобнее? :)

Я использовал Object.methods, а не Object.new.methods, потому что Object.methods это методы экземпляра объекта Class... который сам унаследован от Object.

суббота, 22 ноября 2008 г.

Экономим экранное пространство в firefox

Если вам жалко тратить половину экрана на бесполезные панельки, вот идея про закладки:



было



стало


Можно убрать или по крайней мере сильно укоротить названия ссылок на панельке фаерфокса (по умолчанию туда пишется title страницы). Непривычные иконки можно оставить с подписями.

Ну и можно поискать тем оформления firefox поменьше размером, например whitehart.

P.S. Изобретателей стандарта анимированных favicon (в третьем фаерфоксе можно использовать гифки) поубивал бы. Только там баннеров не хватало.

среда, 19 ноября 2008 г.

Перенос ubuntu с wubi-установки на реальный раздел диска

Убунтовский инсталлятор wubi честно предупреждает о (немногочисленных) недостатках такой установки: чуть замедленные дисковые операции и, главное, невозможность использования спящего режима. Добавлю к этому отказ грузиться если хост-система (windows) завершилась некорректно и на NTFS-диске ошибки. Что ж, очень разумно со стороны убунты не лезть на раздел с ошибками.

Как только эти недостатки станут значительными - пора задуматься о переносе убунты на настоящий раздел диска.

Линукс-гуру могут заявить, что нормальной установке нужно по меньшей мере пять разделов - /, /home, /var, /boot и swap, но, во-первых, им не нужно это руководство, а во вторых - у меня тут не сервер, а простой ноутбук, и я предлагаю обойтись двумя разделами - / и swap.

Создать их предлагаю из винды каким-нибудь инструментом (я использовал partition expert). Линуксовый gparted вроде бы не умеет ресайзить NTFS-диски, а именно от такого и хочется "отгрызть кусочек".

0. Дано: windows vista на primary загрузочном разделе диска, ubuntu 8.10 на файле-образе c:\ubuntu\disks\root.disk. Вероятно, инструкция сработает и для других систем.

1. Итак, создаем primary-раздел под файлы, отформатированный в ext3 (или другую вашу любимую ФС) размером не меньше чем файл-образ C:\ubuntu\disks\root.disk (я помещался в 4.5 гиг) и раздел под своп (тип linux swap, размер исходя из объема оперативки найдите в гугле, я использовал 512мб). Насчёт обязательности primary я не уверен.

2. Перезагружаемся в убунту (старую) и устанавливаем пару необходимых для переезда пакетов (lvpm надо найти на http://lubi.sourceforge.net/lvpm.html и скачать, берите версию поновее):
sudo apt-get install gparted
wget http://puzzle.dl.sourceforge.net/sourceforge/lubi/lvpm_96_all.deb
sudo dpkg -i lvpm_96_all.deb

3. Запускаем gparted
sudo gparted




Смотрим, под каким именем появился новый линуксовый раздел, у меня это было /dev/sda4 (1 - recovery раздел ноутбучного диска, 2 - windows, 3 - extended, где лежит linux swap и раздел с данными, 4 - пятигиговый раздел под линукс, 5 - swap, 6 - данные, второй нтфс раздел). Цифру 4 хорошенько запоминаем, пригодится. Больше низачем нам gparted не нужен, если, конечно, вы не решили использовать его вместо виндовых программ для нарезки диска. Закрываем.

4. Запускаем наш грузовик для переезда
sudo lvpm



Интерфейс весьма минималистский, зато делает (почти) всё что от него нужно. Выбираем что делать (transfer) и куда (sda4 или какую там цифру вы запомнили).



Дальше он честно пишет, что переезд - дело долгое, и можно наконец-то откинуться на спинку стула (tm).





5. По идее, как только вы увидели сообщение о завершении копирования, можно перезагрузиться и радоваться жизни. Однако, в моем случае новый линукс сразу не загрузился (старый "виртуальный" с образа c:\ubuntu\disks, конечно, не пострадал). Так что исправлять ошибку загрузчика GRUB "Error 17: Cannot mount selected partition" придется со старой системы.

Монтируем новую ФС (все следующие команды под su или sudo):
mkdir /newlinux
mount /dev/sda4 /newlinux
vi /newlinux/boot/grub/menu.lst

находим там строки с (/host/ubuntu/disks/) и меняем на (hd0,3). Здесь 3 - это запомненная четверка sda4 минус один (тут разделы диска считают с нуля). Менять надо все строки, в том числе закомментированную
# groot=(hd0,3)

потому что этот файл потом будет обрабатывать робот update-grub и смотреть именно на комменты.

Ну и не удаляйте строки с загрузкой виндов - скорее всего, это что-то вроде
# This entry automatically added by the Debian installer for a non-linux OS
# on /dev/sda2
title Windows Vista
root (hd0,1)
savedefault
chainloader +1



На этом всё, можно перезагружаться в новый линукс. Все файлы и настройки будут как в старом, отличить на вид не удастся, проверяем /etc/fstab чтобы удостовериться (кроме того, на новой системе на будет установлено lvpm - а если его все-таки установить, он скажет, что умеет запускаться только с loopback установок и будет прав).

Старая установка по-прежнему доступна из виндового загрузчика, теперь можно её удалить (панель управления - установка и удаление программ - ubuntu), а можно не трогать - две системы теперь независимы.

вторник, 11 ноября 2008 г.

Слишком высокие шрифты NetBeans 6.1 в Ubuntu 8.10

Проблема, на которую я потратил пару часов поиска.

Свежеустановленный NetBeans на свежеустановленной убунте выглядит вот так:


Во всех элементах управления и редакторе просто чудовищные междустрочные отступы. Они не убираются в настройках. В сети советуют менять скины приложения - у java для этого какие-то специальные форматы. Не помогает.

Все бы ничего, но у меня ноутбук с "широким" (то есть - низким) экраном. И всего 15 строк кода на экране - это явно маловато.

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

Второй библиотекой стала настоящая JDK - вместо поделки openjdk, которая так коряво работает с интерфейсом.

sudo apt-get install sun-java6-jdk
sudo vi /etc/netbeans.conf

В этом файле меняем

netbeans_jdkhome="/usr/lib/jvm/java-6-openjdk"

на

netbeans_jdkhome="/usr/lib/jvm/java-6-sun"


И волшебным образом приобретаем нормальный вид:

вторник, 4 ноября 2008 г.

Дружественная система

Пришлось поставить линукс на ноутбук.

Места на диске вместе с вистой довольно мало, дай, думаю, не буду его резать, а поставлю на виртуальную машину. Поставил качаться убунту 8.10, пошёл читать описания виртуальных машинок. Выбрал virtualbox, а тут нарезанная уже убунта и говорит человеческим голосом:
- А у меня прикольный инсталлер теперь есть - из-под винды прямо. Без переразметки диска.

Прикольно, думаю. Ну и нажал. А он взял и правда без вопросов поставился. В виндовом boot.ini прописал строчку "ubuntu" и поднимается оттуда. Я не знаю как, но это работает! То есть по сути они встроили офигенное решение по виртуализации прямо в систему. Ценой заявленной "чуть меньшей производительности дисковых операций", правда.

Для "ноутбука разработчика" пойдёт. Работает всё из коробки. На диске пишет что занято 2.5 гб из 4.3 (он весь размещен в файле-образе в НТФС c:\Ubuntu\disks).

Для наведения красоты решил малость удалить ненужного из системы. Рука уже потянулась к bluetooth, но я вспомнил что это ноут и тут BT как раз есть. Работает. Будет аварийный инет через телефон:) Сейчас еще трехмерный рабочий стол посмотрю - давно хотел, а на виртуалке бы не стал наверное.

На второй день, когда я решился написать этот пост, я понял, что у меня нету русской раскладки. Вот, уже есть. С переключением по caps lock:)