среда, 25 ноября 2009 г.

Разрешение экрана в virtualbox без guest additions

Я пользуюсь virtualbox с убунтой для разработки. По какой-то причине установка guest additions заставляла видеодрайвер работать медленно и странно. Без этих дополнений не устанавливался родной размер ноутбучного экрана для гостевой ОС, приходилось работать "в окошке". Наконец, я нашёл способ это исправить:


oleg@devel:~$ xrandr
Screen 0: minimum 64 x 64, current 1024 x 768, maximum 32000 x 32000
VBOX1 connected 1024x768+0+0 0mm x 0mm
1360x768 59.8
1152x864 60.0
1024x768 60.0*
800x600 60.3
640x480 59.9

oleg@devel:~$ xrandr --newmode my_mode 83.46 1280 1344 1480 1680 800 801 804 828 -hsync +vsync
oleg@devel:~$ xrandr --addmode VBOX1 my_mode


После чего иксы мигают, а в диалоге Screen resolution появляется искомый размер 1280x800.

воскресенье, 20 сентября 2009 г.

Hoptoad + redmine

Во-первых, есть отличный баг-трекер/вики/браузер исходников redmine. Он почти так же крут, как google code, но в отличие от него можно поставить на свой сервер и никому не показывать. Он на рельсе, так что "свой сервер" должен рельсу поддерживать.

А раз уж у вас есть свой сервер с рельсой, прикольно сделать чтобы все exception вашего веб-приложения сами собой приходили в виде issue вам на трекер. Для этого люди придумали hoptoad и его интеграцию с redmine.

1. Гуглим redmine hoptoad, ставим на redmine соответствующий плагин, настраиваем как там сказано (сгенерировать и записать API key).

2. Добавляем в редмайне в общих настройках новый трекер (рядом с "ошибка", "улучшение", "поддержка" в моем русском варианте я добавил "Exception"). Добавляем этот новый трекер в ваш проект на редмайне (вы же его уже создали?) - там галка внизу.

3. Теперь ставим плагин redmine_notifier на ваше приложение (в котором мы ловим баги). В /config/initializers/hoptoad.rb пишем примерно так:

HoptoadNotifier.configure do |config|
config.api_key = {
:project => 'my_project', # id проекта в редмайне
:tracker => 'Exception', # созданный специально для хоптоада трекер
:api_key => 'ZgNIolfoWDTKQTwDX5qP', # сгенерированный api key
:category => 'Development', # или что угодно
:assigned_to => 'oleg', # кому назначить задание
:priority => 5 # высокий
}.to_yaml

config.host = '...'
config.port = 80 # или где у вас там
config.secure = false
end


4. Тестируем все, запустив
rake hoptoad:test RAILS_ENV=production
- видим новый issue. Ура!

воскресенье, 22 марта 2009 г.

Оптимизация ubuntu

Начитавшись всяких статей, полез совершенствовать линукс. Убил одну убунту и три дня времени. Ниже читаем, чего не надо делать:)

Вот статья, которой я руководствовался: ускоряем debian. Так как убунта это дебиан, подходит.

1. Пересборка ядра. Само по себе не очень нужная новичку вещь, но без него не работает пункт 2 - переход на ext4. Ядро 2.6.28 скачал с kernel.org, маленько сконфигурил (собственно поддержку ext4), собрал, поставил, увидел что нет wifi адаптера, загрузился со старого, еще раз сконфигурил, собрал, готово.
При попытках лезть глубже и отключать ненужное - что-то слетело, так что пока оставил это веселое занятие.

2. Переход на ext4. Тут всё по инструкции. Откатить раздел обратно в ext3 не удается, так что с ядром без поддержки ext4 - бессмысленно. Ну и не забыть оставить /boot отдельным ext2 разделом.

3. Переход на apt-build. Незачёт. Если сборка ядра - это пара часов и пара гигабайт, то apt-build world не отработал за сутки и съел семь гигов на исходники и компиляцию, после чего был уничтожен. Так что из убунты генту не получается. И слава богу: установить любую программу за секунды из репозитория без ползанья по интернету, скачивания, инсталляции - один из главных плюсов линукса с вменяемым менеджером пакетов.

4. upstart вместо init. Поставить поставил, но конфигурацию пока отложил.

Итог: немного опыта:)

среда, 4 марта 2009 г.

Centos

Может, этот дистр и хорош для серверов с точки зрения безопасности или еще чего-то, но работать довольно неудобно. Во-первых, apt и deb лучше yum и rpm (имхо), ко вторым надо как-то вручную дописывать репозитории, почему всего и сразу нет в главном? И почему там руби, к примеру, 1.8.5, хотя уже сто лет как стабилен 1.8.6?

Во-вторых, у рута почему-то /sbin и /usr/sbin не в $PATH - мелочи, а неприятно.

пятница, 20 февраля 2009 г.

Сохраняем пароль от веб-морды д-линка в firefox

Мне давно не нравилось, что некоторые устройства d-link с веб-интерфейсом имеют слишком сложную страницу входа — как результат, фаерфокс не сохраняет пароль, вот тут:
Происходит это потому, что вместо семантически верного submit тут стоит button с каким-то навороченным джаваскриптом и момент сабмита, когда фаерфокс предлагает сохранить пароль, он почему-то пропускает. Что делать? Да подправить страницу чтобы в ней был сабмит, например, с помощью firebug:

Нажимаем на новую кнопочку — и вуаля, предложение "вы хотите сохранить пароль?"

вторник, 13 января 2009 г.

xserver на windows

Хотел написать, как легко и просто поставить xserver на винду (чтобы запускать графические приложения с удаленных линукс-систем), но нашёл хорошую инструкцию. Поэтому вот скриншот, что получается.



Слева внизу: кнопка "пуск". Справа внизу: видно запущенный Xming. Слева вверху: окно запущенного приложения.

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