среда, 21 апреля 2010 г.

Замечательная конструкция __END__

Источник

Она замечательна тем, что позволяет существенно упростить хранение и доступ к тестовым данным, если они должны находиться в отдельном файле.
Допустим, пишешь класс - обработчик каких-то особенных файлов данных. Написал тест, файл с тестовыми данными, затем библиотеку (или в другом порядке). Удобно иметь библиотеку, тест и данные в одном файле. Здесь выручит директива __END__
Как она работает? Весь текст в файле после этой директивы становится доступен как содержимое объекта с именем DATA класса IO (файл). Он уже открыт, его можно читать. В простейшем виде получается так:
puts DATA.read
__END__тут уже пошло содержимое объекта DATAвторая строка этого содержимого и т.д.

Тестовый код можно прикрепить при помощи конструкции if __FILE__ == $0
module MyModule
  class MyClass
    def test_process_io io
      puts io.read
    end
  end
end

if __FILE__ == $0
  # код выполняется когда выполнен запуск ruby название_файла_этого_сценария.rb
  # а когда сенарий просто подключается require - не выполняется
  # сюда удобно помещать тестовый код
  MyModule::MyClass.new.test_process_io DATA
end

# а сюда удобно помещать тестовые данные
__END__
the first line is to be read from DATA IO
the second line is to be read from DATA IO
...

понедельник, 19 апреля 2010 г.

Терминал из Nautilus

apt-get install nautilus-open-terminal

открытие терминала на правой кнопке мышки при выборе папки в nautilus

пятница, 16 апреля 2010 г.

Использование SciTE

Источник
Чтобы настроить SciTE на работу с UTF-8 (и, автоматически - на правильную работу с русским языком), можно:

    * в файле /usr/share/scite/SciTEGlobal.properties заменить настройку code.page=0 на code.page=65001;
    * там же раскомментировать настройки LC_CTYPE=en_US.UTF-8 и output.code.page=65001;
Чтобы русифицировать меню SciTE, можно создать файл /usr/share/scite/locale.properties следующего содержания (в кодировке UTF-8):
# locale.properties by Neil Hodgson neilh@scintilla.org
# Placed in the public domain 2001

# locale.properties defines the localised text for the user interface
# Some definitions are commented out because they duplicate another string
# The format of each line is original=localised, such as File=&Fichier
# Even though the original text may have ellipses "..." and access key
# indicators "&" in the user interface, these do not appear in this file
# for the original texts. Translated texts should have an access key indicator
# if needed as the translated text may not include the original access key.
# Ellipses are automatically added when needed.
# The "/" character should not be used in menu entries as on GTK+ the "/" is
# used to specifiy the menu hierarchy and so will produce extra menu items.
# Each original text may have only one translation, even if it appears in
# different parts of the user interface.

# Please state any further license conditions and copyright notices you desire.
# If there are no further notices then contributed translations will be assumed
# to be made freely available under the same conditions as SciTE.

# Перевёл дополнения к версии 1.53 Stas (s_t_a_s@mail.ru)
# До версии 1.56 переведено Basf (basfer@mail.ru)
# До версии 1.59 + исправления Borodkin Yevgen (zzh@rambler.ru)
# До версии 1.62 + небольшие исправления - Androgen Belkin (androgen@pochta.ru)
# До версии 1.63 + контекстное меню файлов AU3 - Androgen Belkin (androgen@pochta.ru)
# До версии 1.74  + UTF - Karl Muenhgausen (muenhgausen@gmail.com)

translation.encoding=utf8

# Menus

# File menu
File=&Файл
New=Созд&ать
Open=&Открыть
Open Selected Filename=Открыть &выделенный файл
Revert=Вернуться к со&храненной версии
Close=&Закрыть
Save=&Сохранить
Save As=Сохранить &как
Save a Copy=Сохра&нить копию
Encoding=Ко&дировка
Code Page Property=Исходная кодировка
8 Bit=&8-битный формат
UCS-2 Big Endian=UCS-2 &Прямой порядок байтов (сначала младший байт)
UCS-2 Little Endian=UCS-2 &Обратный порядок байтов (сначала старший байт)
UTF-8 with BOM=UTF-8 используя BOM
Export=&Экспортировать
As HTML=в формате &HTML
As RTF=в формате &RTF
As PDF=в формате &PDF
As LaTeX=в формате &LaTeX
As XML=в формате &XML

Page Setup=Пара&метры страницы
Print=&Печать
Load Session=За&грузить сессию
Save Session=Сох&ранить сессию
Exit=В&ыход

# Edit menu
Edit=П&равка
Undo=&Отменить
Redo=&Повторить
Cut=&Вырезать
Copy=&Копировать
Paste=Вст&авить
Duplicate=Клонирова&ть
Delete=&Удалить
Select All=В&ыделить все
Copy as RTF=Коп&ировать в формате RTF
Match Brace=Найти парную &скобку
Select to Brace=Выделить &до другой скобки
Show Calltip=Показать подска&зку
Complete Symbol=Завер&шить символ
Complete Word=Завершить с&лово
Expand Abbreviation=Расшифровать сокра&щение
Insert Abbreviation=Вставить &сокращение...
Block Comment or Uncomment=Зако&мментировать или раскомментировать текст
Box Comment=Лине&йный комментарий
Stream Comment=Потоков&ый комментарий
Make Selection Uppercase=Перевести в вер&хний регистр
Make Selection Lowercase=Перевести в ни&жний регистр
Paragraph=Абза&ц
Join=&Объединить
Split=&Разделить

# Search menu
Search=&Поиск
Find=&Найти
Find Next=Найти &далее
Find Previous=&Предыдущее совпадение
Find in Files=Найти в &файлах
Replace=&Заменить
Incremental Search=Быстры&й поиск
Go to=Пере&йти к
Next Bookmark=&Следующая закладка
Previous Bookmark=П&редыдущая закладка
Toggle Bookmark=Д&обавить или удалить закладку
Clear All Bookmarks=&Удалить все закладки
Replacements:=Замены:

# View menu
View=В&ид
Toggle current fold=Свернуть или развернуть &текущий блок текста
Toggle all folds=Свернуть или развернуть все &блоки текста
Full Screen=&Полноэкранный режим
Tool Bar=Панель &инструментов
Tab Bar=Панель в&кладок
Status Bar=&Строка состояния
Whitespace=П&робелы
End of Line=Си&мволы перевода строк
Indentation Guides=Н&аправляющие отступа
Line Numbers=Н&омера строк
Margin=Пол&я
Fold Margin=Поле свора&чивания блоков текста
Output=Окно ко&нсоли
Parameters=Параметр&ы

# Tools menu
Tools=&Сервис
Compile=&Компилировать
Build=&Собрать
Go=&Выполнить
Stop Executing=&Остановить выполнение
Next Message=Следую&щее сообщение
Previous Message=&Предыдущее сообщение
Clear Output=О&чистить окно консоли
Switch Pane=Пере&ход между редактирование | консоль


# Options menu
Options=&Настройки
Always On Top=&Поверх всех окон
Open Files Here=&Открывать только одну копию программы
Vertical Split=&Консоль - сбоку
Wrap=П&еренос по словам
Wrap Output=Пе&ренос по словам в консоли
Read-Only=&Только для чтения
Line End Characters=&Символы перевода строки
CR + LF=
CR=
LF=
Convert Line End Characters=Кон&вертировать символы конца строки
Change Indentation Settings=&Изменить настройки отступа
Use Monospaced Font=Использовать моно&ширинные шрифты
Open Local Options File=Открыть файл &локальных настроек
Open Directory Options File=Открыть файл настроек директ&ории
Open User Options File=Открыть файл пол&ьзовательских настроек
Open Global Options File=Открыть файл &глобальных настроек
Open Abbreviations File=Открыть файл настройки сокра&щений
Open Lua Startup Script=Открыть &файл автоматизации Lua
Edit Properties=&Редактировать настройки

# Language menu
Language=По&дсветка

# Buffers menu
Buffers=&Вкладки
Previous=&Предыдущая
Next=&Следующая
Close all=&Закрыть все
Save All=&Сохранить все

# Help menu
Help=Спр&авка
SciTE Help=&Справка по SciTE
About SciTE=&О программе SciTE

# Dialogs
Abbreviation:=&Сокращение:
Insert=&Вставить

# Generic dialog
OK=&Применить
Cancel=&Отмена
Yes=&Да
No=&Нет

# About dialog
#About SciTE=
# This is to add something like: Swahili translation 1.41.1 by Neil Hodgson
TranslationCredit=Русский перевод: Valery Kondakoff 
Contributors:=Благодарности:
Version=Версия
by=Автор:

# Open, Save dialogs
Open File=Открытие файла
Save File=Сохранение файла
Save File As=Сохранение файла
Export File As HTML=Экспорт файла в формате &HTML
Export File As RTF=Экспорт файла в формате &RTF
Export File As PDF=Экспорт файла в формате &PDF
Export File As TeX=Экспорт файла в формате &TeX
Export File As XML=Экспорт файла в формате &XML
Save Current Session=Сохранение текущей сессии
Custom Filter=Фильтр

# Go To dialog
Go To=П&ереход к
Destination Line Number:=Введите &номер строки
Current line:=&Текущая строка:
Last line:=&Последняя строка:

# Indentation Settings dialog
Indentation Settings=Настройки отступа
Tab Size:=&Табуляция:
Indent Size:=&Отступ:
Use tabs:=&Использовать Tab'ы

# Replace and Find dialogs
Find what:=&Что:
Files:=В &файлах:
Replace with:=Ч&ем:
Match whole word only=&Только слово &целиком
Match case=&Учитывать регистр
Regular expression=&Регулярные выражения
Wrap around=&Возвращаться к началу
Transform backslash expressions=Преобразовывать backslash-выра&жения
Search for:=&Шаблон поиска
Replace All=Заменит&ь все
Replace in Selection=В в&ыделенном тексте
Direction=Направление
Reverse direction=В обратном направлении
Up=Вверх
Down=Вниз
Browse=Об&зор
Directory:=&Каталог:
Select a folder to search from=Выберите каталог, с которого начинать поиск
Mark all=&Пометить все
Destination Line:=Линия назначения:
Column:=Колонка:
In Selection=В выделенном
Replace in Buffers=Заменить в буфере
Search only in this style:=Искать только в этом стиле:

# Parameters dialog
Execute=&Выполнить
Set=&Применить

# Other UI strings
Untitled=Безымянный

# Properties used in global options
Text=Текст
All Source=Все исходные тексты
All Files (*.*)=Все файлы (*.*)
All Files (*)=Все файлы (*)
Hidden Files (.*)=Скрытые файлы
Show hidden files=Показать скрытые файлы

# Messages
# Messages may contain variables such as file names or search strings indicated
# by ^0 which are replaced by values before display. ^1, ^2, ... may be used in the future.
Can not find the string '^0'.=Текст '^0' не найден.
Find string must not be empty for 'Replace All' command.=Заполните поле 'Что:' для корректной работы команды 'Заменить все'.
Selection must not be empty for 'Replace in Selection' command.=Команда 'Заменить в выделенном тексте' не выполнена: отсутствует выделенный текст.
No replacements because string '^0' was not present.=Никаких замен не произведено, поскольку текст '^0' не найден.
Could not open file '^0'.=Не удается открыть файл '^0'.
Could not save file '^0'.=Не удается сохранить файл '^0'.
Save changes to '^0'?=Сохранить изменения в файле '^0'?
Save changes to (Untitled)?=Сохранить изменения в файле (Безымянный)?
The file '^0' has been modified. Should it be reloaded?=В файл '^0' внесены изменения. Загрузить его заново?
Bad file.=Неправильный файл.
Failed to create dialog box: ^0.=Не удалось создать диалоговое окно: ^0.
Can not start printer document.=Не удалось начать процесс печати.
URI '^0' not understood.=Не удалось разобрать URI '^0'
Invalid directory '^0'.=Несуществующая директория '^0'.
Find string must not be empty for 'Replace in Selection' command.=Команда 'Заменить в выделенном тексте' не выполнена: cтрока поиска пуста.
Could not save file '^0'. Save under a different name?=Не могу сохранить файл '^0'. Сохранить под другим именем?
Block comment variable '^0' is not defined in SciTE *.properties!=Переменная блочного комментария '^0' не определена в SciTE *.properties!
Box comment variables '^0', '^1' and '^2' are not defined in SciTE *.properties!=Переменная линейного комментария '^0' не определена в SciTE *.properties!
Stream comment variables '^0' and '^1' are not defined in SciTE *.properties!=Переменная потокового комментария '^0' не определена в SciTE *.properties!
The file '^0' has been modified outside SciTE. Should it be reloaded?=Файл '^0' модифицирован вне SciTE. Загрузить измененный файл?
File '^0' is ^1 bytes long,\nlarger than the ^2 bytes limit set in the properties.\nDo you still want to open it?=Файл '^0' на ^1 байт\nбольше чем ^2 байтовый предел, установленный в настройках.\nВы все еще хотите открыть его?
Find string must not be empty for 'Replace in Buffers' command.=Строка поиска не должна быть пуста для команды 'Заменить в буфере'

List Macros=Список макросов
Run Current Macro=Выполнить текущий макрос
Record Macro=Записать макрос
Stop Recording Macro=Прекратить запись макроса
# Контекстное меню файлов AU3 (чтобы были русифицированы пункты меню "Сервис" нужно переименовать соответствующие пункты command.name в файле au3.properties, как указано ниже)
SyntaxCheck Build=Проверить и компиллировать, если нет ошибок
SyntaxCheck Go=Проверить и выполнить, если нет ошибок
SyntaxCheck=Проверить синтаксис
SciTe Config=Настройка SciTe (подсветка синтаксиса)
FunctionPopUp=Меню функций PopUp
AU3Info=AU3Info (информация об окнах)
AU3Recorder=Записать макрос (AU3Recorder)
AutoitMacroGenerator=Записать макрос (макро генератор)
Tidy AutoIt Source=Обработать в "Tidy"
CodeWizard=Мастер создания диалогов (CodeWizard)
GuiBuilder=Создать GUI
ExamDiff=Запустить ExamDiff
User CallTip Entries=
Jump to Function=Перейти к функции
List Functions=Список функций
Toggle Override Font=Переключить шрифт
Insert Bookmarked Line(s)=Вставить строку(и) отмеченную закладкой
Debug to MsgBox=Отладка: перменную -> в сообщение
Debug to Console=Отладка: переменную -> в консоль
Debug: Remove Debug lines=Отладка: удалить отладочные строки
Debug: Add Trace Lines=Отладка: добавить трассировочные линии
Debug: Remove Trace lines=Отладка: удалить трассировочные линии
Debug: Comment ALL lines=Отладка: Закомментировать ВСЕ отладочные вставки
Debug: UnComment ALL lines=Отладка: Раскомментировать ВСЕ отладочные вставки
Cleanup Script WhiteSpace=Очистить пробелы в скрипте

вторник, 6 апреля 2010 г.

TFTP на Ubuntu

Источник
atftpd:
После установки обнаруживаем, что по-умолчанию этот сервис работает через inetd. Я, почему-то, не фанат этого метода, поэтому первым делом закомментировал соответствующую строку в /etc/inetd.conf.

inetd называют также "супер-сервером Интернет", потому что он управляет соединениями к нескольким даемонам. Программы, которые предоставляют сетевые услуги, называют даемонами. inetd выступает в качестве управляющего сервера для других даемонов. Когда inetd принимает соединение, он определяет, для какого даемона предназначено соединение, вызывает соответствующий даемон и предоставляет ему сокет. Запуск одного экземпляра inetd уменьшает общую нагрузку на систему по сравнению с запуском каждого даемона индивидуально в выделенном режиме.
В первую очередь inetd используется для вызова других даемонов, но несколько простых протоколов, таких, как chargen, auth и daytime, обслуживаются непосредственно.

 Управление сервисом производится
sudo /etc/init.d/openbsd-inetd {start|stop|reload|force-reload|restart}

При изменении следует не забывать рестартовать сервис. 

А по мне так удобнее работать.



Затем редактируем /etc/default/atftpd:

USE_INETD=false
OPTIONS="--daemon --tftpd-timeout 1500 --no-multicast --retry-timeout 20 --logfile /var/log/atftpd.log --maxthread 100 --verbose=5 /var/lib/tftpboot"


--tftpd-timeout — время жизни потока, при отсутствии запросов
--retry-timeout — таймаут отдачи файла
у меня установлены большие таймауты, т.к. сервис транслируется в городскую локальную сеть, которая периодически прогибается от обилия абонентов, и не справляется с потоком запросов.
Ну и, как и в предыдущем пункте, — создаём нужный каталог: mkdir /var/lib/tftpboot, и стартуем сервис invoke-rc.d atftpd start

Примечание 1: каталог: mkdir /var/lib/tftpboot создается вроде как автоматически.


можно настроить другой каталог:
mkdir /tftpboot
sudo chmod -R 777 /tftpboot
sudo chown -R nobody /tftpboot

Примечание 2: для управления сервисом можно использовать sudo /etc/init.d/atftpd start stop restart
чем он отличается от первого?

понедельник, 5 апреля 2010 г.

Менеджер пакетов Gem: практики

Источник
Понимание Пути загрузки Ruby
Когда вы вызываете такие функции, как load или require, Ruby просматривает файлы в своем пути загрузки (load path). Это позволяет вам указать относительные пути загрузки вместо полных.
В начальном состоянии путь загрузки содержит пути к стандартной библиотеке Ruby. Есть три альтернативных имени, которые указывают на глобальный путь загрузки Ruby: $:, $-I, $LOAD_PATH. Вы можете добавить к этому списку, в конец или в начало, ваши собственные библиотеки. Путь загрузки может быть изменен из командной строки при помощи флажка-I.
Вот начальная конфигурация пути загрузки на моем Макинтоше.
>> $LOAD_PATH
  => ["/Users/josh/.rip/active/lib",
      "/Library/Ruby/Site/1.8",
      "/Library/Ruby/Site/1.8/powerpc-darwin9.0",
      "/Library/Ruby/Site/1.8/universal-darwin9.0",
      "/Library/Ruby/Site",
      "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8",
      "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/powerpc-darwin9.0",
      "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0",
      "."]
Существует несколько ошибок, которые допускают люди при работе с путями загрузки.
Уважайте глобальные пути загрузки
При упаковке нового rubygem, чтобы поделиться с миром, вам следует быть осторожнее с файлами, которые вы размещаете непосредственно в каталоге lib/. Rubygems (и почти все другие менеджеры пакетов ruby) добавляют каталог lib/ вашего gem к пути загрузки. Это означает, что любой файл, на верхнем уровне каталога LIB / будет легко доступен любому пользователю, использующему gem.
Пример плохого gem:
`-- lib
      |-- foo
      |   `-- cgi.rb
      |-- foo.rb
      |-- erb.rb
      `-- set.rb
Вызов любых файлов из вашего пакета, по вашему усмотрению, может показаться безопасным, из-за использования пространств имен (namespace). Но если каталог lib / добавлен в начало переменной $LOAD_PATH то это нарушает работу библиотек erb и set. Функция require 'erb' будет использовать не файл erb из библиотеки Ruby, а файл erb из пакета (gem).
Безопасным (и верным) способом было бы переместить ваши файлы в другой каталог. Это просто осуществить, создайте папку в каталоге lib с тем же именем, что и ваш gem. Затем разместите все файлы в каталог lib/foo/вместо lib /.
Это своего рода "серая зона".. Нет строгого правила, что вы должны поместить все ваши файлы в папку с именем вашего пакета. Хорошо иметь несколько файлов в корневом каталоге Lib до тех пор, пока они запрашиваются отдельно. Переместите в другое место файлы, которые вы не хотите, чтобы запрашивались напрямую.
Запрос других файлов относительно друг друга
require File.join(File.dirname(__FILE__), "foo", "bar")
  # or
  require File.expand_path(File.join(File.dirname(__FILE__), "foo", "bar"))
Если вы используете File.dirname(__FILE__) с помощью функции require, то вы допускаете ошибку.
Исправить это просто, укажите относительные имена файлов.
require "foo/bar" 
Интересно, что 3 предыдущих примера использующие require, отличаются друг от друга коренным образом. Ruby может отследить лишь то, какие файлы он запрашивал с помощью полного пути, указанного вами. Первый относится, к вашему текущему каталогу (”./lib/foo/bar”), второй - путь поиска системных библиотек (”/usr/local/lib/ruby/gems/foo/lib/foo/bar”), и третий пример является относительным к пути загрузки (”foo/bar”).Функция require воспринимает каждый файл как отдельный, поэтому это может закончиться тем, что один и тот же файл будет загружаться несколько раз.
Зависимость от файлов вне пути загрузки
Это более важный пример, чем предыдущие.
module Rack
    module Test
      VERSION = ::File.read(::File.join(::File.dirname(__FILE__), "..", "..", "VERSION")).strip
      # ...
    end
  end
Ваши gem-папки могут быть отделены и реорганизованы при установке. Если кто-нибудь захочет "продать" вашу библиотеку, им лишь надо скопировать содержимое каталога lib/. Информация вне lib / не является важной для запуска кода. Никогда не создавайте папки lib или test на одном уровне. Минимальный инсталлятор, такой как rip, установит только содержимое папок bin и lib. Любой файл, необходимый для вашего пакета, должен находиться в каталоге lib и должен содержать корректное пространство имен в папке, чтобы избежать конфликтов. Если Вы попытаетесь установить эту версию rack-test с помощью rip, то require 'rack/test' завершится неудачей, потому что каталог ../VERSION не существует.
Библиотеки не должны модернизировать переменную $LOAD_PATH
IПакеты не должны модернизировать путь загрузки, это задача менеджеров пакетов. Когда rubygems активизируют gem, то он добавляет каталог lib вашего пакета к переменной $LOAD_PATH , которая может обычно обрабатываться через любую другую библиотеку или приложение. Безопасно считать, что вы можете относительно require любой файл из вашей папки lib.
unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
    $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
  end
Такой код можно удалять безопасно.
СОВЕТ: Конфигурируйте путь загрузки во время тестирования
Если вы попытаетесь создать свою библиотеку, то все проблемы, связанные с путем загрузки добавят вам головной боли. Это тот случай, когда могут пригодиться rake-тесты.
Rake автоматически добавит каталог lib в ваш путь во время тестирования. Так что вам не нужно использовать File.join (File.dirname (ФАЙЛ), ”..”, “lib”, “foo”) в ваших тестах. Вы можете добавить тестовый каталог к вашему пути загрузки с помощью “test_helper”, в который необходимо добавить следующий код.
Rake::TestTask.new do |t|
    t.libs << 'test'
  end
К сожалению, Rspec даже не добавляет каталог lib к вашему пути. Вы можете исправить это таким образом:
Spec::Rake::SpecTask.new do |t|
    t.libs << 'lib'
  end
Если вы хотите запустить изолированный тест, вы можете добавить каталог lib к переменной $LOAD_PATH с помощью флагов командной строки. (С этого начались долгие дебаты)
ruby -Ilib test/test_foo.rb
Используйте константу VERSION
Если вы создаете Awesome gem, то необходимо предоставить переменную Awesome:VERSION. При использовании Rubygems, возможен запрос того, какую версию gem вы используете, а при использовании альтернативного  менеджера пакетов, единственный способ узнать, какая версия загружена, только через интроспекцию.

Старайтесь не зависеть от rubygems

Если я пользуюсь вашей библиотекой, развертываю ваше приложение, или запускаю ваши тесты, у меня может не возникнуть желание использовать rubygems. Когда вы используете “require ‘rubygems’” в своем коде, вы лишаете меня такой возможности. – Ryan Tomayko
Можно безопасно удалить require "rubygems"  из вашей библиотеки, так как загружающий его код вероятно уже это сделал. Людям становится труднее (но не невозможно) использовать альтернативные способы создания пути загрузки, потому что нет никакого способа "отменить требование" rubygems. Существует много других возможностей управлять пакетами, как например rip, bundler, или задание переменной $LOAD_PATH вручную.
Избегайте указания зависимостей rubygem в каталоге lib/. Это означает удаление всех команд вида gem "foo". Если вам необходимо определить свою зависимость от gem в вашем gemspec, это создаст жесткую зависимость от Rubygems. Пакет Rubygems перехватывает метод require и автоматически разрешает такие зависимости во время выполнения. Вынос указания зависимости из библиотеки более гибок, т.к. другие менеджеры пакетов, могут управлять зависимостями во время инсталляции.
В время удаления gem, не обрамляйте код проверки загрузки с помощью rescue Gem::LoadError или rescue Gem::Exception. Если вам необходимо корректно обработать эти ошибки, имейте в виду, что Gem::LoadError наследуется от LoadError, поэтому это можно заменить на rescue LoadError.
# Bad
  begin
    gem "rack" 
    require "rack" 
  rescue Gem::LoadError
    puts "Could not load 'rack'" 
    exit
  end

  # Good
  begin
    require "rack" 
  rescue LoadError
    puts "Could not load 'rack'" 
    exit
  end

Зачем мне это нужно?

Я не знал ни об одной из этих проблем, пока Ryan не написал свою статью почему запрашиваемый rubygems некорректен в начале 2009 года. И я почувствовал, что многие другие Ruby-программисты просто пропускают эти проблемы, так как rubygems был нашим единственным выходом. Основы управления библиотекой Ruby построены на системе пути загрузки и для каждого автора ruby gem важно понять, как это работает.

Мы над этим работаем

Исправить каждую библиотеку ruby, это легче сказать чем сделать (существует  больше 12 000 библиотек ,  размещенных на RubyForge ). Rails в настоящее время нарушает несколько правил. Но мы упорно трудимся, чтобы это исправить. Мы также должны исправить все gems, от которых мы зависим. В идеале, мы хотели бы, чтобы Rails 3 загружался без rubygems и можно было бы использовать разные менеджеры пакетов.
Оригинал статьи на weblog.rubyonrails.org

пятница, 2 апреля 2010 г.

Передача файлов и каталогов по SSH

Источник: http://www.openbsd.ru/docs/ssh-tips.html#SEC06

Передать файл, используя SSH, можно одним из следующих способов:
$ cat myfile | ssh remotehost 'cat > myfile'
$ tar zcf - ~/coding | ssh remotehost 'cat > coding.tgz'

Чтобы рекурсивно отправить весь каталог, набираем:
$ scp -r mydir user@host.domain.ru:     после : указываем новую директорию для сохранения. В примере скопируется в тоже место в файловой системе только на удаленном компьютере.
 Пример         scp -r /home/sa/StatisticalControlStation sa@10.132.70.90:/home/FTP-shared/public/StatisticalControlStation

Ярлыки