среда, 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:)

суббота, 24 мая 2008 г.

Мультимедиа

Сегодня в нашей программе: просмотр фильмов и запись DVD.

Первая задача - запустить обыкновенный avi файл с субтитрами в srt. Самый простой "текстовый" mplayer субтитров, очевидно, не поймёт - думал я. Поэтому запас еще totem и vlc.

В общем, оказалось, что теперь субтитры играет каждая собака - достаточно просто стандартно положить файлик рядом и назвать так же, даже скучно.

Запись DVD тоже удивила только одним: записанный на 4х (перестраховался я, думал, медленная машина) скорости диск оказался на ощупь холодным, а не как обычно - тёплым.

С горя пошёл искать чего-нибудь странного и неожиданного - и таки вот: gnome tetris имеет больше десяти уровней! На десятом кубики летят не очень быстро, но он быстро заканчивается:)

среда, 14 мая 2008 г.

Про игрушки

Текстовые игры живы! Вот, например, юниксовый нетхак. Который продолжает зачем-то в наш HD-век развиваться и даже даёт побеги (slashem, например). Совершенно чумовые игрушки, там реально всё со всем может взаимодействовать, потому что авторы много думали и много писали.

Только вот все графические интерфейсы их только портят. И плоские, и трехмерные - убожество, как будто играм лет пятнадцать. Обидно даже. Так что текстовый режим пока лучший.

четверг, 8 мая 2008 г.

Фото

Ещё одной задачей было получить фотки с цифрового фотоаппарата. При его подключении дебиан мигал лампочками и говорил "я вижу камеру! получить снимки?" - но, к сожалению, ничего получать не получалось.

Нашёл, что с кэнонами работает gthumb (sudo apt-get install gthumb), и правда, показывает этакое окошко с превьюшками, что импортировать, что не трогать. Сойдёт для сельской местности.

А потом я понял, что импортировать фотки с фотика можно и пикасой. Не знаю, сама она такая умная или всё же тянет libgphoto2, которую поставил gthumb.

среда, 7 мая 2008 г.

icq

А вот асечный клиент до сих пор разыскивается.

Хочу немногого (XXI век на дворе или нет?): чтобы писать и получать сообщения по-русски (интерфейс не важно на каком языке, лучший - чтоб не видно было), чтобы передавались файлы хотя бы с некоторыми другими клиентами (по убыванию частоты среди моих контактов: qip, icq5, miranda), и чтоб работал. Всё. Смайлики, статусы, поддержка восьми других протоколов, плагин для синхронизации с кофеваркой - в топку.

Да, совсем забыл: для линукса.

Протестированы:
  1. gaim/pidgin не получает сообщения из оффлайна по-русски от некоторых клиентов. Прблема в кодировке. Пробую дорабатывать напильником. Вроде с некоторыми клиентами получается, если поставить кодировку "windows-1251". Что будет с юникод-клиентами - неясно. Передача файлов есть, хоть и по одному только.
  2. kopete. Какой-то кривой и по этим пунктам не работает. Хотя красивее.
  3. любимый qip под вайном. С кодировками не дружит.
  4. qip infium под вайном же. Разработчики, кажется, закрыли его тестирование, и скачать работающую без какого-то специального квип-аккаунта версию не удалось. в топку.
Так что пока тестируем пункт 1. И не обижаемся, если я не могу вам ответить:)

.торрент

И про мюторрент, вдогонку.

Сначала я хотел написать, какая у дебиана клёвая система пакетов apt. Не, она правда очень клёвая: с родных репозиториев можно скачать почти всё, а что нельзя - можно со сторонних (как x neural switcher например). То есть захотелось мне поставить, например, битторрент-клиент азуреус. И не надо по привычке гуглить азуреус, лезть по ссылке на sourceforge, выбирать платформу, качать и ставить. надо написать

$ sudo apt-cache search azureus

(это чтобы удостовериться, что он есть в репозитории и узнать точное имя), а потом

$ sudo apt-get install azureus

и всё. Следующая команда уже

$ azureus

Но сейчас не об этом.

При всём опенсорсе количество программ не переходит в качество. Оно и понятно - кому охота дорабатывать юзабельность написанного для себя клиента. И из-за этого трудно найти торрент или вот icq клиент, чтобы он нормально общался со своими виндовыми собратьями.

Так, bittorrent (динозавр-основатель!), rtorrent, qtorrent не поддерживают обычный DHT, а азуреус, который вообще на джаве и мультиплатформенный, к сожалению, давно развивает свою ветвь этого протокола (azureus вместо mainline). Ещё пытался проверить aria2, но она полчаса выделяла себе место под торрент, и я уже успел воплотить следующее решение.

Приходится ставить маленький, легкий, бесплатный, но виндовый мюторрент под эмулятором. И все счастливы. Почему так?

Googled wine

Пробую я тут много приложений на вайн устанавливать. Вайн - это такой почти эмулятор виндоуса под линукс (на самом деле, это "уровень совместимости" а не эмулятор, кто понимает). Некоторые программы встают легко, например мюторрент, некоторые - криво (например, квип), а с пикасой получилась интересная штука.

Просто так она не запускается. Но если погуглить "picasa wine", открываются страницы самого гугла, где сказано, что "под обычным вайном мы не работаем, но мы его обработали напильником и теперь предлагаем вам его скачать". Ну да, 20 мегабайт вместо пяти за пикасу + "googled wine". Но ведь это проще чем портировать целиком такой продукт на линукс.

Ставится. Работает. Молодцы.