пятница, 7 мая 2010 г.

Апплет уведомлений + gmail в Gnome

Источник - http://welinux.ru/post/3025/

UbuntuАпплет уведомлений + gmail в Gnome

gmail-notifier.jpg
Я давно нахожусь на тёмной стороне силы, и регулярно использую их почту. На основной ящик собирается почта из ряда других ящиков, и долгое время оперативность проверки почты меня мало интересовала.

Но некоторое время назад, вчера(с), я решил, что необходимо было бы сделать так, что бы Ubuntu сообщала мне о приходе почты, причём желательно, что бы она делала это привычным мне методом, методом эфемерных уведомлений.

Первым делом я подумал, что стоит написать скрипт на каком-нибудь питоне, или, если не получится, на баше с использованием notify-send из пакета libnotify-bin который потом загнать в крон и радоваться жизни.

Но воспользовавшись поиском темной стороны силы в мире, я обнаружил, что такой пакет, даже пакет, уже написан и лежит в свободном доступе на сайте http://ahadiel.org/projects/gmail-notifier. Особенно я обрадовался, что автор пакета, Michael Tom-Wing, даже протестировал его на Lucid.

Установка

Для того, что бы установить программу, необходимо добавить репозиторий deb http://repo.ahadiel.org/apt lucid/ и установить gmail-notifier
1
2
3
sudo add-apt-repository 'deb http://repo.ahadiel.org/apt lucid/'
sudo aptitude update
sudo aptitude install gmail-notifier

По окончании процесса инсталляции, в Приложения -> Интернет будет доступен пункт Gmail Notifier - Settings

gmail-notifier-settings.jpgРазработчиками была проведена титаническая работа по улучшению юзабилити интерфейса, результат которой Вы можете наблюдать на картинке.

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

На примере вы можете наблюдать настройки для ящика example@gmail.com с частотой проверки почты - один раз в минуту.

Когда Вам придёт письмо, всплывёт эфемерное сообщение, от программы Gmail Notifier с сообщением You have mail. изображение которого Вы можете наблюдать выше. Если Вы, по каким-либо причинам, пропустите это сообщение - не беда! Gmail Notifier встраивается в Апплет уведомлений и если у Вас есть письмо он зеленеет.

gmail-notifier2.jpg 
 
 
 
 
Код программы не сложный, всего 188 строк. Можете просмотреть. (Написана на питоне)

/usr/bin/gmail-notifier.py

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

среда, 31 марта 2010 г.

Ruby FTP, копирование файла на FTP

Источник: http://www.ruby.inuse.ru/blog/spine/ruby-ftp-kopirovanie-faila-na-ftp
Понадобилось из Руби скрипта положить файл на FTP Server, вот как я это оформил:

require 'net/ftp'


# Устанавливаес соединение с FTP сервером
session = Net::FTP.new( ftp_server, ftp_login, ftp_password )

# Указываем, что файлы надо воспринимать как бинарные
session.binary = true

# Переводим клиента в пассивный режим
session.passive = true

# Перемещаемся в заданный каталог на FTP сервере
files = session.chdir( 'ruby ftp example' )

# Отправляем файл на сервер
session.putbinaryfile('file_name')

# Закрываем соединение
session.close


Возможно кому-то пригодится. net/ftp это стандартный модуль, дополнительных библиотек не требуется.

Создание и удаление папок в Ruby

Для создания вложенных папок используем

require "fileutils"
FileUtils::mkdir_p "a/b/c"



Ранее опубликованное решение:

Источник: http://blog.inst.pp.ru/coding/creation_and_removing_dirs_in_ruby
Удаление (пробовал только в Windows)
    require 'fileutils'
    FileUtils.remove_dir('C:\FTP_Omega', force=true)


Когда встал вопрос о создании новой папки быстренько нашёл в документации к классу Dir метод mkdir, впрочем, мне это не очень помогло. Задача стояла создать директорию, но вот об уровне вложенности метод mkdir не заботится, — например, если по адресу «/home/inst/examples/newdir» не будет существовать папки «examples», то метод возвратит ошибку. Мне же требовалось создать и все вышележащие папки в случае их отсутствия. Очень повезло с тем, что нашёл в документации к калссу File метод makedirs. Он реализует как раз нужный мне в этом случае функционал. Чтобы им воспользоваться нужно подключить «ftools».


Пример использования:
require 'ftools'

File.makedirs('~/examples/newdir')

С удалением директорий почему-то мне повезло меньше. Удалить непустую директорию вроде бы невозможно. По крайней мере я не нашёл нужного метода и тогда принялся расширять функционал класса Dir. В результате моих раздумий появился метод clear!, который как раз и удаляет всё содержимое из директории, адрес которой передан ему в качестве параметра. Код метода:
class Dir
def clear!
counter = 0
map do |item|
if item != '.' && item != '..'
if File.directory?("#{path}/#{item}")
counter += Dir.new("#{path}/#{item}").clear!
Dir.rmdir "#{path}/#{item}"
else
File.unlink "#{path}/#{item}"
counter += 1
end
end
end
counter
end
end

Пользоваться очень просто, я делаю это так:
Dir.new('~/examples').clear!

Внимание! Методу всё равно какую папку очищать! Трижды проверьте свой код перед передачей параметров моему.

Замечу, что в приведённо выше примере сама директория «examples» не удалится, однако мне этого и не требовалось.

понедельник, 29 марта 2010 г.

изменение качества изображения из командной строки

sudo apt-get install imagemagick

convert P1020849.JPG -quality 15 P1020849_ew.JPG
сделать новый файл с 15% качеством.

convert -resize 800x800

четверг, 25 марта 2010 г.

Пересборка deb-пакета в Debian/Ubuntu

источник: http://www.ylsoftware.com/news/544
Очень часто у пользователей Debian, Ubuntu и других основанных на Debian дистрибутивов возникает необходимость пересобрать .deb-пакет какой-то программы из исходных текстов. Ниже будет показано как это можно сделать.
Немного конкретизируем задачу: автор этих строк использует дистрибутив Ubuntu Karmic (9.10), в репозитории которого есть Jabber-клиент Gajim версии 0.12.5, однако появилось желание использовать Gajim версии 0.13. Готового пакета для Karmic найдено не было, однако для Ubuntu Lucid (10.04) Alpha этот пакет уже был. Соответственно напрашивалось два варианта решения поставленной задачи:
  1. Подключить репозиторий Lucid, поставить Gajim из него, отключить репозиторий Lucid.
  2. Бэкпортировать (перенести пакет из более новой версии дистриубтива в более старую) пакет из Lucid в Karmic.
Автор решил использовать второй способ. Приступаем к решению этой задачи. Для начала нужно зайти на страницу пакета на http://packages.ubuntu.com и скачать архивы с исходными текстами. Для Gajim это страница http://packages.ubuntu.com/gajim а архивы (на момент написания статьи):
  • gajim_0.13-0ubuntu2.diff.gz
  • gajim_0.13.orig.tar.gz
  • gajim_0.13-0ubuntu2.dsc
Скачав эти файлы установим инструменты, необходимые для пересборки пакетов:
apt-get install build-essential dpkg-dev fakeroot
Теперь нужно перейти в ту директорию, куда мы скачали архивы с исходными текстами и распаковать эти архивы командой:
dpkg-source -x gajim_0.13-0ubuntu2.dsc
После распаковки будет создана директория с именем вида "имя_пакета-версия_пакета", в нашем случае имя будет "gajim-0.13", переходим в неё и пытаемся запустить сборку:
cd gajim-0.13 && dpkg-buildpackage -rfakeroot -b
Если будет выдано сообщение о не хватке каких-то пакетов — их нужно установить. Автору этих строк не хватило пакетов: python-dev, python-gtk2-dev, libxss-dev, libgtkspell-dev и dpatch. Список пакетов зависит от уже установленных пакетов и пересобираемой программы. Установим недостающие пакеты:
apt-get install python-dev python-gtk2-dev libxss-dev libgtkspell-dev dpatch
После успешной установки зависимостей запустим сборку командой:
dpkg-buildpackage -rfakeroot -b
Если и в этом случае сборка закончится неудачей — надо тщательно проанализировать сообщения об ошибке. Возможно придётся предварительно бэкпортировать более новые версии зависимостей и только потом собирать пакет.
У автора всё прошло гладко и был создан пакет "gajim_0.13-0ubuntu2_amd64.deb", расположенный в одной директории с архивами с исходными текстами. Теперь его можно установить командой:
sudo dpkg -i ../gajim_0.13-0ubuntu2_amd64.deb
Теперь можно пользоваться более новой версией любимой программы:) Остальные программы и библиотеки бэкпортируются аналогичным образом.
На этом всё. Приятной работы!


Анонимный посетитель 2010-01-24 18:04:56 (*)

> Если будет выдано сообщение о не хватке каких-то пакетов — их нужно установить.
Зачем? Есть штатные средства - apt-get build-dep gajim

MooSE 2010-01-24 20:28:06 (*)

Цитата:

Зачем? Есть штатные средства - apt-get build-dep gajim


Это всё клёво, но это работает в рамках текущего среза. Если ты ставишь версию новее чем в твоём репозитории - зависимости могут "поплыть".

morbo 2010-01-25 07:05:46 (*)

>После успешной установки можно зависимостей запустим сборку командой:

Слово "можно" - лишнее?

>Это всё клёво, но это работает в рамках текущего среза. Если ты ставишь версию новее чем в твоём репозитории - зависимости могут "поплыть".

Это всё клёво, но таки ставить зависимости лучше сначала с помощью apt-get build-dep gajim. Если всё нормально, то во-первых версия новее может скомпилироваться с зависимостями из текущего репозитория - тогда ничего дополнительно ни ставить ни бэкпортировать не придётся. А во-вторых, если она не скомпилируется, то хотя бы меньше придётся ставить и бэкпортировать.

Есть ещё такая вещь - atp-get source -b gajim, но это не бэкпортирование, а просто установка из исходников. Смысла в ней мало. Разве что скомпилировать пакет с более свежими установленными в системе зависимостями.

В целом по статье могу сказать, что это общеизвестный минимум.

MooSE 2010-01-25 09:13:40 (*)

Цитата:

Слово "можно" - лишнее?


Поправил. Спасибо.

Цитата:

В целом по статье могу сказать, что это общеизвестный минимум.


Не сомневаюсь. Вообще этот сайтик для меня скорее записная книжка, чтобы потом долго не искать.... :)

понедельник, 22 марта 2010 г.

Git через proxy

В домашней директории создаём файл  .gitconfig
вписываем туда свой proxy
[http] 
   proxy = 77.xxx.xxx.xxx:8123
 
И теперь при скачивании указываем
git clone http://github.com/scrooloose/vimfiles.git
 
надо просто git:// заменить на http://, тогда все работает 
 
пока не получилось сделать как http://blogs.gnome.org/juanje/2009/07/17/git_behind_proxy/ 
 
При работе с bitbucket.org через https возникла следующая ошибка
error: Couldn't resolve proxy '%http_proxy%' while accessing https://xxxxx@bitbucket.org/xxxx/xxxx/info/refs
fatal: HTTP request failed
 Помогло измерение в файле .gitconfig
 
  [http]
  proxy = https://xx.xx.xxx.xx:8080/
 
 
Если нужно использовать git по протоколу ssh:
Источник 1 
Источник 2 

Установливаем утилиту socat 
sudo aptitude install socat
 
Создаём файл .ssh/config  

Host=github.com
ProxyCommand=socat - PROXY:10.20.245.11:%h:%p,proxyport=8080 

пятница, 19 марта 2010 г.

Переводчик для VIM

источник 1: http://www.instanceof.ru/linux/vim/translate
источник 2: http://ru.wikibooks.org/wiki/Vim


Vim при переводах текста, или для чтения английской документации

Итак, чтобы можно было успешно читать и переводить документацию на английском языке, нужно ИМХО всего 3 вещи:
  • Редактор.
  • Переводчик.
  • проверка орфографии
Если их удобно объединить, то можно получить хорошую среду, для перевода/чтения.

Что возьмем

Редактор мы естественно возьмем VIM хотя бы потому что статья так называется. Переводчик mueller консольная версия, работает так:
% mueller sex
sex  [seks] _n. 1> _биол. пол; the weaker sex слАбый пол, жЕнщины; the sterner (или stronger) sex сИльный пол, мужчИны; the sex _шутл.  жЕнщины 2> секс 3> _at
tr. половОй, сексуАльный; sex instinct половОй инстИнкт; sex intergrade гермафродИт  
И орфографмометр: это spell в виме, словари скачаем с vim.org

Как настроим

Мне интересна возможность выпадающего списка, при наведением на неизвестное мне слово мышкой. Для этого, после долгого чтения манов (или гугленья) узнаем что с помошью команды system можно выполнить какое-то действие, вывод которой куда-либо записать. Короче, пишем где-нибудь в ~/.vimrc

function! MyBalloonExpr()
       return system("mueller ". v:beval_text)
endfunction
set bexpr=MyBalloonExpr()
set ballooneval
set balloondelay=100

Определили функцию MyBallonExpr которая будет формировать строку mueller [слово на которое навели] и выполнять. Результат выполнения будет выдавать в «балоне» выпадающем окошке, через 100 миллисекунд.
Естественно вместо mueller вы можите поставить любую другую программу, которая переводит текст.

Для перевода по нажатию клавиши

map   :call TRANSLATE()
function TRANSLATE()
   let  a=getline('.')
   let co=col('.')-1
   let starts=strridx(a," ",co)
   let ends = stridx(a," ",co)
   if ends==-1
       let ends=strlen(a)
   endif
   let res = strpart(a,starts+1,ends-starts)
   let cmds = "sdcv -n " . res
   let out = system(cmds)
   echo out
endfunction

Консольные хитрости

1.Копирование файлов с указанием прогресса. Всегда чертовски не хватало информативности в cp
rsync --progress file1 file2
2.Информация о использовании дискового пространства
           df -h

четверг, 18 марта 2010 г.

Пример скрипта

источник: http://linux-admin.net.ru/content/516
ПРИМЕР

#!/bin/bash
#################################################
#Keyfiles - tar/gzip configuration files        #
#Version:   Версия  1.0 (черновик)              #
#Ackn:      основан на идее Dave Turnbull       #
#Authour:   Thomas Adam                         #
#Date:      Понедельник 28 мая 2001, 16:05 BST  #
#Website:   www.squidproxyapps.org.uk           #
#Contact:   thomas@squidproxyapps.org.uk        #
########################################Комментарии

#Комментарии для Dave Turnbull. Чтобы он не заблудился :-).

#объявление переменных
configfile="/etc/keyfiles.conf"
tmpdir="/tmp"
wrkdir="/var/log/keyfiles"
tarfile=keyfiles-$(date +%d%m%Y).tgz
method=$1           #опции выбора операции
submethod=$2        #дополнительные опции для "$1"
quiet=0             #вывод отладочной информации (по умолчанию)

cmd=basename $0   #удаляем путь из имени файла
optfiles="Usage: $cmd [--default (--quiet)] [--listconffiles] [--restore (--quiet)] [--editconf] [--delold] [--version]"
version="keyfiles: Автор Thomas Adam, Версия 1.0 (Вторник 5 июня 2001, 23:42)"

#проверка конфигурационного файла...
if [ ! -e $configfile ]; then
  for beepthatbell in 1 2 3 4 5; do
    echo -en "\x07"
  done
  echo " " | mail -s "[Keyfiles]: отсутствует файл $configfile" $USER
  echo " [Ошибка!]: отсутствует файл $configfile" $USER
  exit -1
fi

#проверяем существование рабочей директории, если её нет, то создаём
[ ! -d $wrkdir ] && mkdir $wrkdir

#проверка того, запущен ли скрипт без опций
if [ -z $method ]; then
  echo $optfiles
  exit 0
fi

#синтаксический разбор командной строки
check_syntax ()
{
  case $method in
    --default)
    cmd_default
    ;;
    --listconffiles)
    cmd_listconffiles
    ;;
    --restore)
    shift 1
    cmd_restore
    ;;
    --editconf)
    exec $EDITOR $configfile
    exit 0
    ;;
    --delold)
    cd $wrkdir && rm -f ./*.old > /dev/null
    exit 0
    ;;
    --version)
    echo $version
    exit 0
    ;;
    --*|-*|*)
    echo $optfiles
    exit 0
    ;;
  esac
}

#Вот теперь и начинается самое интересное.....
#объявление функции используемой опцией "--default"
cmd_default ()
{

  #пакуем все файлы, указанные в $configfile

  if [ $submethod ]; then
    tar -cZPpsf $tmp/$tarfile $(cat $configfile) &>/dev/null 2>&1
  else
    tar -vcZPpsf $tmp/$tarfile $(cat $configfile)
  fi

  #если содержимое каталогов пусто......
  if test $(ls -1 $wrkdir | grep -c -) = "0"; then
    mv $tmp/$tarfile $wrkdir
    exit 0
  fi

  for i in $(ls $wrkdir/*.tgz); do
    mv $i $i.old
  done

  mv $tmp/$tarfile $wrkdir
}

#вывести список, содержащийся в $configfile
cmd_listconffiles ()
{
  sort -o $configfile $configfile
  cat $configfile
  exit 0
}

#восстановить файлы......
cmd_restore ()
{
  cp $wrkdir/keyfiles*.tgz /
  cd /

  #проверка флага тишины :-)
  if [ $submethod ]; then
    tar vzxfmp keyfiles*.tgz &>/dev/null 2>&1
    rm -f /keyfiles*.tgz
    exit 0
  else
    tar vzxfmp keyfiles*.tgz
    rm -f /keyfiles*.tgz
    exit 0
  fi
}

#вызов головной функции
check_syntax
-------------------
Следует заметить, что основные изменения, которые вы можете делать в скрипте -- это изменять три переменные:
configfile="/etc/keyfiles.conf"
tmpdir="/tmp"
wrkdir="/var/log/keyfiles"

Антивирус СlamAV

/etc/clamav/freshclam.conf  настройки обновления 
параметр Checks - кол-во обновлений в день с сервера обновлений

1. обновление базы clamav через proxy
Нужно в файле /etc/freshclam.conf прописать следующие строчки и раскоментить , прописав туда свои данные 
Code:
#HTTPProxyServer myproxy.com
#HTTPProxyPort 1234
#HTTPProxyUsername myusername
#HTTPProxyPassword mypass

2. Обновление баз вручную команда freshclam

3. Автоматическое обновление производится демоном
Для работы с демоном есть скрипт clamav-freshclam
находится он /etc/init.d/clamav-freshclam {no-daemon|start|stop|restart|force-reload|reload-log|skip|status}

4. Log обновления находится /var/log/clamav/freshclam.log




    

вторник, 16 марта 2010 г.

Точное время в Debian

1. С помощью следующей команды устанавливаем программу ntpdate:
   sudo aptitude install ntpdate

2.Внимательно читаем ридмишку к программе, которая располагается по адресу
/usr/share /doc/ntpdate/README.Debian.
Из ридмишки выносим следующее:
  • ntpdate не лучший вариант для использования
  • процесс синхронизации происходит каждый раз при “поднятии” сетевого интерфейса
3. Синхронизируем время
     sudo ntpdate debian.pool.ntp.org

аналог команда ntpdate-debian которая берет имена серверов для синхронизации из файла /etc/default/ntpdate
      параметр NTPDATE_USE_NTP_CONF=no чтобы не брать данные из /etc/ntp.conf (например: может быть не установлен пакет ntp)
      параметр NTPSERVERS= перечисляем сервера через пробел (у меня просто NTPSERVERS="10.132.70.90")

4. как сменить часовой пояс (при переезде) в Debian:
sudo dpkg-reconfigure tzdata
 
5. Добавляем задание в cron 
  Пример моего cron:   crontab -u root -l
SHELL=/bin/sh

# m h  dom mon dow   command
50 * * * * /usr/sbin/ntpdate-debian >> /home/sa/ntpdate-debian/ntpdate-debian.log


 
Для изменения cron команда crontab -u root -e  от имени root
после изменения не надо перезапускать cron 
 

Резюме

Была установлена программа ntpdate и с помощью нее было синхонизировано время. Программа будет синхронизировать время при понятии сетевого интерфеса (т.е. при включении или перезагрузки машины) + ее можно запускать руками в любоее вермя.
Такое решение прекрасно подходит для всех компьютеров, которые включаются хотя бы оди раз в день (за один день время далеко не убежит), т.е. для домашних машин и для ноутов. Для серверов, которые работают 24×7 это решение, является неоптимальным.

Удаленное подключение к рабочему столу Linux из Windows с помощью Xming и SSH

источник: http://debback.blogspot.com/2008/03/linux-windows-xming-ssh.html

Иногда приходится пользоваться тем, что дали. Мой компьютер, на котором стоит Debian Linux, был занят моей женой (не учите своих жен пользоваться линуксом). Зато был свободен компьютер сестры с установленным на нем Windows. И вот появилось желание подключиться к своему компьютеры с рабочей станции под управлением враждебной OS. Первым, что пришло в голову - это удаленный рабочий стол. Однако, нашлось более элегантное решение. И, несмотря на заголовок статьи, речь пойдет о немного другой технологии. Взгляните на этот снимок:


Вы видите приложения Linux прямо на рабочем столе Windows! Как же они туда попали?

Немного о теории. В отличие от Windows, в Linux графическая оболочка не является частью ядра системы. Стандартная оконная система для Linux - это X Window System, или, попросту говоря, иксы. Она берет на себя отрисовку графических элементов и взаимодействие с устройствами ввода-вывода. А самое вкусное заключается в том, что эта система имеет прозрачную клиент-серверную архитектуру. Оконная система выполняет роль сервера, а графические приложения - роль клиентов. Как и положено клиентам, они подключаются к серверу и взаимодействуют с ним для отрисовки и для получения событий мыши и клавиатуры.

Но это еще не все! Дело в том, что оконная система может находиться на другом компьютере, а графическое приложение связываться с ней через сеть. Так вы можете запустить приложение на удаленном компьютере, заставив его рисоваться на том компьютере, за которым сейчас работаете. Или наоборот. Или запустить программу на одном удаленном компьютере с отрисовкой интерфейса на другом удаленном компьютере. Заманчивая возможность, неправда ли? :-)

Думаю, достаточно теории, давайте приступим к практике.

Для начала подготовим удаленный компьютер Debian Linux. Все, что нам здесь нужно - это SSH-сервер. Через него мы будем подключаться удаленно и запускать нужные нам программы. Выполняем всего одну команду в консоли:

$ sudo apt-get install openssh-server

Все, с этим компьютером мы закончили, и касаться его клавиатуры в ходе этой статьи больше не будем. Теперь можем переходить к подготовке компьютера Windows. Здесь нужно установить две программы:

1. SSH-клиент. Я установил PuTTY.
2. X Server для Windows. Я выбрал Xming.

Обе программы можно загрузить с сайта SourceForge (пакеты Xming и Xming-portable-PuTTY). Также по желанию можно загрузить стандартный набор шрифтов (пакет Xming-fonts). Все, что загрузили - устанавливаем (с полной установкой всех компонент Xming), и переходим к настройке. Теперь главное не запутаться, что к чему будем подключать :-)

Для начала установим соединение по SSH с удаленным компьютером. Для этого запускаем PuTTY. Вводим IP-адрес компьютера Linux.


Теперь переходим в раздел Connection / SSH / X11 и включаем перенаправление графического интерфейса. В качестве расположения X-сервера водим IP-адрес компьютера Windows, за которым сейчас сидим.


Кроме того, чтобы вместо русских букв не всплыли крокозябли, желательно в разделе Window / Translation установит правильную кодировку (у меня - UTF8 - стандартная кодировка на Debian и Ubuntu). Возвращаемся в раздел Session, сохраняем настройки и подключаемся к компьютеру Linux. В случае успешного подключения мы вводим логин и пароль и видим текстовую консоль. С ее помощью мы можем удаленно запустить консольные программы, но графические программы не могут рисоваться в консоли. Поэтому оставим на время наше подключение по SSH.

Теперь настроим Xming. Для этого запускаем программу XLaunch - это мастер настроек. На первом шаге указываем способ интеграции в графическое окружение Windows. Мне более всего по душе первый, когда каждое приложение Linux находится в своем окне.


На втором шаге нам предлагается автоматически запускать какое-нибудь приложение вместе с иксами. Я предпочел сделать это позже по мере необходимости посредством уже запущенного нами PuTTY.


На третьем шаге указываем параметры запуска Xming. Опция Clipboard позволяет интегрировать буфер обмена. Также для полноценной работы я ввел следующие параметры:
"-dpi 96" - чтобы поправить размер шрифтов. Значение можно подбирать по вкусу.
"-xkblayout us,ru" - для работы с двумя раскладками клавиатуры.
"-xkbvariant basic,winkeys" - уточнение раскладок.
"-xkboptions grp:caps_toggle" - переключение раскладки клавишей CAPS LOCK.


И, наконец, на следующем шаге сохраняем настройки кнопкой "Save configuration" и запускаем X-сервер кнопкой "Готово".


В системном лотке появится иконка Xming


В дальнейшем запустить сервер с теми же настройками можно просто путем открытия сохраненного файла. Изменить настройки можно через контекстное меню файла.


Итак, X-сервер запущен. Возвращаемся в нашу консоль, предоставленную соединением SSH. Здесь мы можем удаленно запустить консольное приложение, и в этой же консоли увидим вывод этого приложения. А что теперь будет, если мы попытаемся запустить в этой консоли графическое приложение? Обычно, если вы подключились по SSH и пытаетесь запустить оконное приложение, вы получите ошибку, потому что вы подключились к удаленному компьютеру в консольном режиме, и рисовать окна просто нечем. Однако, в этот раз мы включили перенаправление графики на наш компьютер Windows, на котором уже запущен свой X-сервер. Поэтому, если вы попытаетесь запустить оконное приложение в удаленном консольном терминале, его окно нарисуется на компьютере Windows. Попробуйте, например, набрать следующую команду:

$ kwrite &
или
$ gedit &

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

Ну, надеюсь, у вас все получилось, и на вашем рабочем столе Windows красуются оконные приложения Linux.

Кстати говоря, благодаря этой клиент-серверной архитектуре злоумышленник может отправить на ваш экран окно с просьбой ввести ваш пароль или еще с какой-нибудь гадостью. Чтобы такого не происходило, не подключайтесь к общественным сетям без фаирвола. И помните: большие возможности - это большая ответственность.

Установка и настройка IceWM в минимальной конфигурации.

источник: http://avreg.net/howto_icewm.html
В статье рассматривается один из вариантов установки лёгкого оконного менеджера IceWM и его начальной настройки для создания графического рабочего стола (десктопа) «одного приложения».
Такая конфигурация может быть полезна при подготовке промышленных или служебных рабочих станций (операторы, кассиры, диспетчеры, охранники, и т.п.), в которых основные приложения работают в «графике».
Итого, нужно следующее:
  • система должна автоматически загружаться без участия пользователя и запускать основное рабочее приложение;
  • в системе не должно быть посторонних программ, кроме основной программы рабочего места и программ, необходимых для администрирования.
Рекомендуется что базовая система также удовлетворяет требованиям разумного минимализма (общее правило: больше возможностей и функций - больше дыр) (см. также «Установка дистрибутива Linux в минимальной конфигурации для эксплуатации в качестве сервера.»).
Требуется установленный и настроенный сервер Х ( читай «Установка и настройка сервера X.Org (X Window System).» ).
Уровень сложности: средний.
В. Почему IceWM?
О. По нашему мнению, в нём присутствует баланс скорости, безопасности, гибкости настройки и «привычности» интерфейса.
В. Не хочу IceWM.
О. Выбирайте любой оконный менеджер для X: 9wm, aewm, aewm++, afterstep, amaterus, amiwm, asclassic, blackbox, ctwm, dwm, enlightenment, evilwm, fluxbox, flwm, fvwm, fvwm-gnome, fvwm1, icewm, icewm-lite, ion2, jwm, kwin, larswm, lesstif-bin, lwm, metacity, olvwm, olwm, openbox, oroborus, pwm, qvwm, ratpoison, sapphire, sawfish, tinywm, twm, uwm, vtwm, w9wm, waimea, windowlab, wm2, wmaker, wmii, wmii2, xfwm4.
Для представления что такое оконный менеджер IceWM читаем:

Установка

Debian/Ubuntu

Ищем пакеты в описании которых есть упоминание о IceWM:
user@host:~$ apt-cache search icewm
icewm-lite - wonderful Win95-OS/2-Motif-like window manager
icewm-gnome-support - GNOME support files for IceWM
icedove-traybiff - traybiff - new mail alert for Icedove
grun - GTK based Run dialog
iceconf - Configuration tool for icewm
wmctrl - control an EWMH/NetWM compatible X Window Manager
icemc - Editor for IceWM menus
gsetroot - a C/Gtk-based front-end for Esetroot
dfm - Desktop-File-Manager for X11
icewm-experimental - wonderful Win95-OS/2-Motif-like window manager
fspanel - minimalist panel for X
icewm-common - wonderful Win95-OS/2-Motif-like window manager
icewm - wonderful Win95-OS/2-Motif-like window manager
icewm-themes - Theme files for the Ice Window Manager
Устанавливаем то, что выбрали и не забываем про эмулятор терминала xterm:
IceWM
user@host:~$ sudo aptitude install icewm xterm

# для локали ru_RU.UTF-8 устанавливаем в качестве x-terminal-emulator
# uxterm - X terminal emulator for for Unicode (UTF-8) environments
user@host:~$ sudo update-alternatives --set x-terminal-emulator /usr/bin/uxterm

RedHat/CentOS/Fedora

yum install icewm ??? FIXME

Настройка графического окружения

Выбор менеджером по-умолчанию.

В Debian/Ubuntu
Определяем icewm оконным менеджером по-умолчанию для всех пользователей.
Способ 1: определением x-window-manager и x-session-manager (также используются в скриптах xinit/startx) через подсистему альтернатив (man update-alternatives(8))
Примечание: переменная STARTUP не должна быть определена.
# доступные альтернативы для x-window-manager
user@host:~$ sudo update-alternatives --list x-window-manager
/usr/bin/icewm

# доступные альтернативы для x-session-manager
user@host:~$ sudo update-alternatives --list x-session-manager
/usr/bin/icewm-session

# смотрим кто сейчас x-window-manager
user@host:~$ ls -l /etc/alternatives/x-window-manager
lrwxrwxrwx 1 root root 14 2007-08-05 22:06 /etc/alternatives/x-window-manager -> /usr/bin/icewm
# если отличается от /usr/bin/icewm, то устанавливаем
user@host:~$ sudo update-alternatives --set x-window-manager /usr/bin/icewm
# проверяем
user@host:~$ ls -l /etc/alternatives/x-window-manager
lrwxrwxrwx 1 root root 14 2007-11-18 22:16 /etc/alternatives/x-window-manager -> /usr/bin/icewm

# смотрим кто сейчас x-session-manager
user@host:~$ ls -l /etc/alternatives/x-session-manager
lrwxrwxrwx 1 root root 14 2007-08-05 22:06 /etc/alternatives/x-window-manager -> /usr/bin/icewm-session
# если отличается от /usr/bin/icewm-session, то устанавливаем
user@host:~$ sudo update-alternatives --set x-session-manager /usr/bin/icewm-session
# проверяем
user@host:~$ ls -l /etc/alternatives/x-session-manager
lrwxrwxrwx 1 root root 22 2007-11-18 22:16 /etc/alternatives/x-session-manager -> /usr/bin/icewm-session
Способ 2 (устаревший): установкой глобальной переменной окружения STARTUP, которая обрабатывается скриптом xinit (startx).
user@host:~$ sudo echo 'STARTUP="icewm-session"' >> /etc/environment
Проверить состояние переменной можно командой env:
user@host:~$ env | grep STARTUP
STARTUP=icewm-session
Примечание: чтобы переменная «вступила» в силу нужно выйти из системы (logout) и войти заново (login).
Для проверки обоих способов используйте команду startx:
Запуск сервера X из консоли
user@host:~$ startx
Скриншот IceWM после установки.
IceWM

Отсекаем лишнее.

Все настройки IceWM расположены в конфигурационных файлах в каталогах:
  • /etc/X11/icewm - глобальные настройки для всех пользователей;
  • $HOME/.icewm - настройки пользователя, перекрывают глобальные;
Настройки распределены по смысловым группам и должны определяться строго в своих файлах:
  • theme - установки текущей темы;
  • preferences - главные параметры, yправляет поведением и общим внешним видом IceWM: пути, цвета, шрифты,…;
  • prefoverride - то же что и preferences, только может быть переопределено установками темы;
  • menu - управляет содержимым «стартового» меню;
  • programs - управляет содержимым «programs», подменю «стартового» меню;
  • toolbar - управляет рядом запускающих кнопок на панели задач, и имеет такой же синтаксис как и файл меню;
  • winoptions - управляет поведением отдельных приложений;
  • keys - глобальные сочетания клавиш для быстрого запуска приложений (прим: есть ещё уровень ниже: x key binding )
Описание и примеры (engl) см. в каталоге /usr/share/doc/icewm-common и http://www.icewm.org/manual/icewm-8.html
~/.icewm/preferences
user@host:~$ cat ~/.icewm/preferences
### Меню ###

# Отображать подменю программ
ShowProgramsMenu = 0

# ... подменю "Темы"
ShowThemesMenu = 0

# ... меню "Выход"
ShowLogoutMenu = 1
# Show logout submenu
ShowLogoutSubMenu = 0

# ... "Помощь"
ShowHelp = 0

# ... "О программе"
ShowAbout = 0

# ... "Запустить"
ShowRun = 0

# ... меню "Список окон"
ShowWindowList = 0


### Панель задач ###

# Отображать "Панель задач"
ShowTaskBar = 1

TaskBarShowAllWindows = 1

TaskBarShowMailboxStatus = 0
TaskBarShowWorkspaces = 0

TaskBarShowCPUStatus = 1
TaskBarCPUDelay = 1000
CPUStatusCommand='xterm -name top -title "TOP" -e /bin/sh -c "while : ; do top; sleep 5; clear; done"'

TaskBarShowNetStatus = 1
TaskBarNetDelay = 1000
NetStatusCommand = 'xterm -name netstat -title "Network Status" -e /bin/sh -c "while : ; do netstat -atun; sleep 5; clear; done"'
NetworkStatusDevice = 'eth0 eth1'
~/.icewm/toolba
user@host:~$ cat ~/.icewm/toolbar
# This is a default toolbar definition file for IceWM
#
# Place your personal variant in $HOME/.icewm directory.

prog XTerm xterm x-terminal-emulator
#prog    "Vim" vim /usr/bin/gvim -f
#prog    "WWW" /usr/share/pixmaps/firefox.png x-www-browser
prog    "avreg-mon" - x-terminal-emulator -e /usr/bin/avreg-mon -v
~/.icewm/menu
user@host:~$ cat ~/.icewm/menu
# This is an example for IceWM's menu definition file.
#
# Place your variants in /etc/X11/icewm or in $HOME/.icewm
# since modifications to this file will be discarded when you
# (re)install icewm.
#

prog Terminal xterm x-terminal-emulator -ls

Приложения в автозагрузку.

Включаем нужные приложения в автозагрузку по старту графической оболочки для конкретного пользователя:
# нужно войти под конкретным пользователем и перейти в его домашний каталог
user@host:~$ cd $HOME

# создаём каталог, с всеми пользовательскими настройками IceWM 
# (то есть можно потом клонировать для других юзеров)
user@host:~$ mkdir ~/.icewm

# создаём startup "автозагрузочный" сценарий
# показан метод с консоли, можно набрать в редакторе: 
# editor ~/.icewm/startup (исключая строки с командой cat и заключительным _EOF_)
user@host:~$ cat <<_EOF_ > ~/.icewm/startup
#!/bin/sh
# автозагрузка программ для icewm

# если установлен gkrellm
[ -x /usr/bin/gkrellm ] && /usr/bin/gkrellm&

# если установлен xxkb
[ -x /usr/bin/xxkb ] && /usr/bin/xxkb&

# если установлен локальный просмотрщик камер avreg-mon
# включать только после окончательной настройки AVReg
if [ -x /usr/bin/avreg-mon ]; then
   (sleep 3; /usr/bin/avreg-mon&)&
fi

# если установлен idesk
if [ -x /usr/bin/idesk ]; then
  (sleep 2; /usr/bin/idesk&)&
fi

exit 0

_EOF_

# делаем скрипт исполняемым
user@host:~$ chmod u+x ~/.icewm/startup

Переключатель раскладок клавиатуры XXKB.

Устанавливаем индикатор раскладки клавиатуры XXKB:
Debian/Ubuntu
user@host:~$  sudo aptitude install xxkb
Настройка xxkb (прим: глобально для всех пользователей) производится через файл /etc/X11/app-defaults/XXkb
Приводим отличия от стандартной версии конфигурационного файла:
  • «–» - помечены строки, которые нужно удалить,
  • »+» - добавить (обычно вместо удалённых).
/etc/X11/app-defaults/XXkb
-XXkb.mainwindow.enable: yes
+XXkb.mainwindow.enable: no

-XXkb.button.geometry: 15x15-60+7
+XXkb.button.geometry: 15x15-70+7

-XXkb.button.xpm.3: su15.xpm
-XXkb.button.xpm.4:

+XXkb.app_list.wm_class_name.ignore: gkrellm avreg-mon
Документация по настройке xxkb на русском языке:
"хитрый" способ, так как документ в KOI8-R, а локаль обычно в UTF-8
user@localhost:~$ zcat /usr/share/doc/xxkb/README.koi8.gz | iconv -f koi8-r | pager 

Вынос ярлыков для запуска на рабочий стол.

IceWM ничего не знает про ярлыки рабочего стола (иконки), поэтому для их использования понадобится приложение idesk.
Установка idesk в Debian/Ubuntu
user@host:~$ sudo aptitude install idesk
Создаём конфигурационный файл .ideskrc:
~/.ideskrc
user@host:~$ cat << _EOF_ > .ideskrc
table Config
  FontName: helvetica
  FontSize: 13
  FontColor: #37CFA6
  ToolTip.FontSize: 13
  ToolTip.FontName: helvetica
  ToolTip.ForeColor: #0000FF
  ToolTip.BackColor: #FFFFFF
  ToolTip.CaptionOnHover: true
  ToolTip.CaptionPlacement: Right
  Locked: true
  Transparency: 100
  Shadow: true
  ShadowColor: #000000
  ShadowX: 1
  ShadowY: 1
  Bold: true
  ClickDelay: 300
  IconSnap: true
  SnapWidth: 10
  SnapHeight: 10
  SnapOrigin: BottomRight
  SnapShadow: false
  SnapShadowTrans: 200
  CaptionOnHover: false
  CaptionPlacement: bottom
  FillStyle: fillinvert
  Background.Delay: 0
  Background.Source: None
  Background.File: None
  Background.Mode: Center
  Background.Color: #C2CCFF
end

table Actions
  Lock: control right doubleClk
  Reload: middle doubleClk
  Drag: left hold
  EndDrag: left singleClk
  Execute[0]: left doubleClk
end

_EOF_
Создаём каталог для файлов - ярлыков:
user@host:~$ mkdir .idesktop
Для примера создадим ярлык программы часов на рабочем столе:
user@host:~$ cat << _EOF_ > ~/.idesktop/xclock.lnk
table Icon
   Caption: Часы
   Icon: /usr/share/idesk/folder_home.xpm
   X: 31
   Y: 31
   Command[0]: /usr/bin/xclock
end

_EOF_
Документация по idesk:

Файловые менеджеры.

  • двухпанельные (с идеологией Norton Commander):
    • mc - Midnight Commander (на псевдографике, в консоли или в терминале);
    • emelfm, gentoo, worker - графические;
  • однопалельные в стиле проводника Win, но с табами:
    • pcmanfm или облегчённая версия без поддержки HAL pcmanfm-nohal.
Установка
Debian/Ubuntu
user@host:~$ sudo aptitude install ИМЯ_ПАКЕТА

Системные мониторы.

Если на целевом компьютере необходимо следить за системными показателями, такими как загрузка процессора, памяти, сети, заполнение диска(ов), можно воспользоваться графическими апплетами рабочего стола из класса системных мониторов.
В легковесных графических WM, к которым относится IceWM, нет встроенных мониторов как в полновесных GNONE и KDE, однако эта ситуация легко разрешается установкой «внешних» апплетов.
Мы советуем обратить внимание на два таких монитора:
  1. gkrellm
  1. conky

Заключительные операции

Автологин (вход без ввода пароля).

Автоматический вход в систему под определённым пользователем без ввода пароля с загрузка графической оболочки (и соответственно программ в «автозагрузке»).
В конце фазы загрузки любого дистрибутива Linux Вы увидите приглашение на вход в систему (login).
Если Вы физически находитесь прямо за целевым компьютером, то такое приглашение будет
  1. либо в текстовом режиме - на системной или виртуальной консоли,
  2. либо в графическом режиме - это работают дисплейные менеджеры gdm, kdm, xdm.
Если у Вас 2 случай - удаляйте эти пакеты (gdm, kdm, xdm) и перегружайтесь (загрузка должна остановиться на текстовом приглашении), так как, для обеспечения автологина нам нужно самостоятельно «поднимать» сервер X.
Как правило в большинстве дистрибутивов есть скрипт /etc/init.d/rc.local (пути могут быть несколько другими), который выполняется одним из последних, среди всех демонов(сервисов)
В свою очередь, /etc/init.d/rc.local, выполняет скрипт /etc/rc.local, в который мы и вставим команду, которая:
  1. обеспечит вход в систему пользователя с именем luser (подставьте своего);
  2. запустит графический сервер Х (далее нужные приложения см. #Приложения в автозагрузку).
Открываем в редакторе файл /etc/rc.local
user@host:~$ sudo editor /etc/rc.local
и добавляем в конец, перед последней строкой «exit 0», строки:
Bash
# автологин пользователя с именем "luser" с последующим запуском графической оболочки
/bin/su - luser -c "/bin/sh -lc startx"
Однако это ещё не всё. Теперь нужно определить кто может запускать сервер X.
Варианты:
  • только root;
  • пользователь с консоли;
  • кто-угодно (выберите этот вариант).
Debian/Ubunty
user@host:~$ sudo dpkg-reconfigure x11-common
user@host:~$ sudo /etc/init.d/x11-common restart
В других дистрибутивах просто отредактируйте файл /etc/X11/Xwrapper.config, определив параметр «allowed_users» значением «anybody»
user@host:~$ cat /etc/X11/Xwrapper.config
# Xwrapper.config (Debian X Window System server wrapper configuration file)
#
# See the Xwrapper.config(5) manual page for more information.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command as root:
#   dpkg-reconfigure x11-common

allowed_users=anybody
nice_value=0
Перегружаемся для проверки.
user@host:~$ sudo reboot
или
user@host:~$ sudo shutdown -r now

Очистка xsession-errors

В домашнем каталоге пользователя присутствует файл .xsession-errors в который дописывается STDERR вывод приложений, запускаемых в графической оболочке.
Проблема в том, что .xsession-errors файл умеет только «расти» и нужно как-то его очищать или запретить дозапись.
Приводим глобальный способ для всех пользователей через правку скрипта Xsession, выполняемого по startx или десктоп-менеджером, таким как xdm, gdm, kdm.
патч
debian:/etc/X11# diff -u /etc/X11/Xsession.orig  /etc/X11/Xsession
--- /etc/X11/Xsession.orig      2007-11-19 04:50:31.000000000 +0300
+++ /etc/X11/Xsession   2007-11-19 04:50:56.000000000 +0300
@@ -91,7 +91,7 @@
   errormsg "unable to create X session log/error file; aborting."
 fi

-exec >>"$ERRFILE" 2>&1
+exec >"$ERRFILE" 2>&1

 echo "$PROGNAME: X session started for $LOGNAME at $(date)"

Защита конфигурации

Необходимо обеспечить, что конфигурация рабочего стола не была случайно или не случайно испорчена вандалом юзером.
Вспоминаем, что все настройки, произведённые в примерах этой статьи находятся и сохранены в файловой системе (файлах). Это значит, что для нашей задачи нужно просто запретить изменение файлов и каталогов.
Например:
user@host:~$ sudo chown -R root .icewm .idesktop .ideskrc .bash*

Ярлыки

Архив блога