Archive for Ноябрь 2007

ExtJs. Один запрос, несколько Ext.data.Store.

28 ноября, 2007

Не так давно я рассказывал о библиотеке ExtJs, ей же будет посвящена сегодняшняя заметка. Эта заметка расчитана на подготовленного читателя, который уже разобрался с базовыми понятиями. Но и новичку будет полезно взглянуть на то, что предлагает эта библиотека, возможно захочется стать подготовленным =) Комментарии будут подробными.

Стоит заметить, что речь пойдет о второй версии, которая сейчас значиться Release Candidate 1 и доступна для скачивания по ссылке

Сегодня речь пойдет об Ext.data.Store. Объект удачный и используется во множестве виджетов в качестве источника данных. Обычный подход заключается в том, чтобы создать подгружающий себя объект и вызывать метод load(), для его загрузки.

//Инициализируем соединение
var rCon = new Ext.data.Connection({
    //Урл "кормящего" файла =)
    url:    '/data.php',
    //Метод
    method: 'POST',
    //Параметры, которые передадутся в запросе
    extraParams: {'act' : 'get_requests'}
});
//Само хранилище
var rDs = new Ext.data.Store({
    //Прокси с соединением, созданным выше
    proxy: new Ext.data.HttpProxy(rCon),
    //"Читатель" ответов, приходящих в формате JSON
    reader: new Ext.data.JsonReader({
        //Какое свойство читать
        root: 'requests',
        //Какое свойство отвечает за кол-во записей
        totalProperty: 'total_requests',
        //Поля записей
        fields: [
        'requests_key',
        'requests_name'
        ]
    })
});
rDs.load();

Так выглядит обычное создание и загрузка хранилища. При вызове метода load() идет асинхронных запрос к серверу, получаются данные и далее с ними делается то, что нужно. Вcё замечательно. Есть одно «но». Хранилище в силу своей универсальности используется и для ComboBox — выпадающих списков в формах. А этих самых ComboBox в одной форме может быть много. У меня, например 19 =) Таким образом, реализуя приведенную выше схему, мы получим 19 асинхронных вызовов. А это не очень хорошо.

Известно, что у браузеров есть ограничение на количество одновременных вызовов. Благодаря комментариям, мы знаем, что это 3 для FF и 2 для IE. И мы получаем сильное снижение производительности. Это если не брать в расчет проблемы с обработкой 19 вызовов, и синхронизации загрузки с отображением. Ведь если не успеют загрузиться хранилища, а мы уже начнем показывать форму, будет не очень красиво.

Продумав это всё в голове, я пришел к выводу, что надо действовать по-другому. Надо наполнить все 19 хранилищ за один запрос. Поиски на форуме не привели к нахождению решения. Хотя пару идей я получил. В рецепте, приведенном ниже будет использован метод loadData(), вместо load(). Который просто загружает уже пришедшие данные в хранилище, никуда не обращаясь. Я не буду приводить код для 19 хранилищ, приведу для двух.

//Создаем record. Пригодится для "читателя" хранилища.
dsDataRecord = new Ext.data.Record.create([
//Пишем название свойства и мапим его
//на второй элемент массива пришедших данных
{name : 'data_key', mapping : 1},
{name : 'data_name', mapping: 2}
]);
//Хранилище номер раз.
dataStore = new Ext.data.Store({
    //Читатель на этот раз "массивный" а не JSON =)
    reader: new Ext.data.ArrayReader({
        //Первый элемент массива для упорядочивания. Он уникальный.
        id: 0
        //Наш record.
    }, dsDataRecord)
});

//Создаем record. Пригодится для "читателя" хранилища.
dsDigitRecord = new Ext.data.Record.create([
//Пишем название свойства и мапим его
//на второй элемент массива пришедших данных
{name : 'digit_key', mapping : 1},
{name : 'digit_name', mapping : 2}
]);
//Хранилище номер два.
digitStore = new Ext.data.Store({
    //Читатель на этот раз "массивный" а не JSON =)
    reader: new Ext.data.ArrayReader({
        //Первый элемент массива для упорядочивания. Он уникальный.
        id: 0
        //Наш record.
    }, dsDigitRecord)
});
//AJAX-запрос на все данные
comboStoreRequest = Ext.Ajax.request({
    //Урл "кормящего файла"
    url: 'data.php',
    //В случае успешного запроса
    success: function(result){
        //Преобразуем JSON-ответ в объект
        comboStore = Ext.util.JSON.decode(result.responseText);
        //Загрузим массив данных первое хранилище
        dataStore.loadData(comboStore.data);
        //Загрузим массив данных во второе хранилище
        digitStore.loadData(comboStore.digit);
    },
    //Метод
    method: 'POST',
    //Параметры вызова
    params: {act : 'get_data'}
});

Приведенный код тоже не слишком сложен. Самое интересное, для меня, было сформировать теперь выдачу с сервера JSON-данных, чтобы их «прожевал» ArrayReader. И сделал из них массивы, приемлемые для загрузки в хранилище.

На основе документации, можно прийти к выводу, что ArrayReader ожидает данные в виде объектов вида:


[[1, key1, name1],[2, key2, name2],[3, key3, name3]]

Значит в PHP нам необходимо иметь массив, повторяющий приведенную структуру и применить к нему json_encode()

<?php
//Массив с данными
$data_array[] = array(1, "data_key1", "data_name1");
$data_array[] = array(2, "data_key2", "data_name2");
$data_array[] = array(3, "data_key3", "data_name3");
//Выводим JSON-массив
echo json_encode($array);
?>

Первый пункт выполнен. Этими данными вполне можно «накормить» один ArrayReader. А у нас их два. А ответ от сервера один. Значит надо наши массивы упаковать как свойства объекта. И обращаться к ним при загрузке в хранилище. Для этого на сервере нужен следующий PHP-код:

<?php
//Первый массив
$data_array[] = array(1, "data_key1", "data_name1");
$data_array[] = array(2, "data_key2", "data_name2");
$data_array[] = array(3, "data_key3", "data_name3");
//Второй массив
$digit_array[] = array(1, "digit_key1", "digit_name1");
$digit_array[] = array(2, "digit_key2", "digit_name2");
$digit_array[] = array(3, "digit_key3", "digit_name3");
//Собираем всё в один массив.
$data = array('data' => $data_array, 'digit' => $digit_array);
//Выводим окончательный ответ.
echo json_encode($data);
?>

Готово. Теперь мы передаем JSON-объект с двумя свойствами, которые являются массивами данных. И мы можем загрузить их в наши dataStore. Задача выполнена =)

Javascript библиотека ExtJs.

26 ноября, 2007

Не помню, писал ли я или нет, но в последнее время я плотно использую javascript библиотеку ExtJs. Для начала опробовал её для административной панели небольшого проекта, когда ExtJs была ещё версии 1.x. Потом применял её виджеты в frontEnd проектов покрупнее, тоже в версии 1.x. Теперь перешел на ExtJS 2.0RC1 в основном проекте. И с нетерпением жду релиза второй версии.

Если говорить о возможностях, предоставляемых библиотекой, то они всеобъемлющи. Если начать перечислять по памяти то, что я использую сам то получиться так:

  • AJAX, интегрированный на всех уровнях, контроллируемый с небывалой легкостью.
  • Гриды (продвинутые таблички) для данных разных модификаций и видов
  • Деревья с возможностями drag’n’drop и lazyLoad (загрузка только необходимых узлов с помощью AJAX)
  • Всевозможные Layout’ы для построения как отдельных кусков страниц, так и целых приложений
  • Формы с валидацией на стороне клиента, в которые можно и подгружать данные (AJAX) и сохранять асинхронно (опять AJAX 😉

Это лишь малая часть того, что может и умеет библиотека, на странице с примерами можно всё разглядеть поподробнее. И приступать к обучению

У библиотеки достаточно крутая кривая изучения, но она оправдывает себя в полной мере. На русском языке я знаю три ресурса, которые уделяют ей внимание это:

  • Гугл-группа ru-ExtJs — наиболее объемный источник информации
  • ExtJS по-русски — один из первых сайтов по тематике на русском языке, к сожалению, редко пополняется. В последнее время это статьи из…
  • Alpha-Beta-Release Blog — блог, посвященного веб-разработке во многих её ипостасях. Довольно интересные материалы, рекомендую.

Может быть я что-то упустил, но гугл до сих пор считает, что я искал extys и всё остальное — это единичные статьи и захабренные/бобренные сссылки.

Самым главным источником информации по ExtJs можно считать форум, который, естественно, англоязычный (хотя иногда встречаются китайские треды и русский код ;). Атмосфера на форуме очень хорошая, объясняют очень понятно, код приводят и вообще замечательное сообщество в плане помощи в обучении.

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

Ну а самым продвинутым и полным источником можно считать документацию. Там есть всё, иногда даже примеры реализации =) Она всегда должна быть под рукой во время разработки. Слишком уж много методов и свойств у каждого из объектов ExtJs.

Что касается лицензии, то ExtJs придерживается достаточно распространенной в последнее время двойной политики лицензирования. Есть вариант LGPL и есть коммерческая лицензия, сопровождаемая поддержкой и прочими благами в обмен на деньги =) Выбор — это всегда приятно.

Постраничная разбивка с Oracle.

19 ноября, 2007

Ни для кого не секрет, что Oracle — это труЪ =) Но когда я «проапгрэйдился» на проекте до него с MySQL, то я не нашел там привычного сердцу LIMIT 0, 20 и расстроился. Как же так. Самая лучшая БД, а такой полезной функции нет.

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

В приведенном решении меня не устраивало 3 вещи:

  1. Для подсчета строк надо делать отдельный запрос
  2. Глючит при хитрых ORDER BY
  3. DBA сказал «мутная весчь этот rownum» =)

Решение было найдено довольно быстро. И оно было избавлено от всех 3х недостатков. Вместо «мутного» rownum была применена функция row_number(), которая дала нужный результат. Плюс доработав запрос, я получил в нем и колличество строк. Правда оно пишется в каждой строке ответа, но нам же оно нужно для постраничной разбивки, поэтому заботиться о количестве данных, передаваемых по сети не стоит. Вот готовый рецепт:

select * from (
select ROW_NUMBER() over(order by req.requests_date desc) as r,
count(tab.id) over() as total,
from table tab,
where tab.column = 'value'
) x
where x.r between '" . ($start + 1) . "' and '" . ($start + $limit) . "'

Ссылка на документацию по Oracle может внести дополнительную ясность, от себя добавлю лишь, что в over() пишем все ORDER BY, $start и $limit это с чего начинать(начинаем с 0) и на чем остановиться (передается количество записей на страницу). count() должен применяться на unique поле (что характерно ;). Вот, в принципе, всё. Если остаются вопросы или предложения по оптимизации — прошу в комменты.

Subversion. Установка и настройка. День второй.

15 ноября, 2007

Вводная

Сегодня будем заниматься кристаллизацией workflow. Т.е. пытаться понять, как именно врезать svn в процесс разработки. Я уже приводил свои мысли на этот счет. Мои идеи были сформированы под воздействием пары веток форума и нескольких невнятных статей ;). Правда совершенно недавно я наткнулся на статью. в которой есть даже картинка 😉 Но в этой статье описана теория (зато есть картинка, очень наглядная). Меня же в силу неМифических сроков сдачи интересует практика. К ней и приступим.

Настраиваем Eclipse 3.3

Первое, что пришлось сделать — установить права на папку /var/www и все её подпапки. На запись права были только у рута, это мы изменили, набрав в терминале chmod -R 777 /var/www. Теперь право на запись есть у всех, и мы можем спокойно с ней работать из Eclipse. Второе, что пришлось сделать, это установить права и на папку /vwr/svn/, набрав ту же команду. На будущее стоит запомнить, что репозитории и папки с проектом лучше держать у себя в домашней папке. Или в той, от имени кого запускается Eclipse. В принципе, можно было сделать и gksudo eclipse, но это как-то совсем против правил =)

Далее — маленький фокус. Нужно настроить папку с workspace Eclipse таким образом, чтобы разработка шла по созданным выше адресам. Т.е. текущий проект Eclipse (в моем случае) должен разрабатываться в папке /var/www/dev/. Для этого меняем workspace: «File->Switch Workspace->Other». А в окошке пишем /var/www.

Теперь надо настроить репозиторий. Переключившись на perspective SVN Repository (доступную после установки subClipse), тыкаем правой кнопкой на левой части окна и выбираем «New->Repository Location». В появившемся окне пишем file:///var/svn/, или где там у вас хранилище. Должно случиться чудо, и отобразиться структура хранилища. У меня, в силу вчерашнего дня отобразилось следующее:

  • file:///var/svn/
    • project_name
      • trunk
        • index.php 1

Checkout

Связь есть, надо делать checkout. Т.е. забирать текущую версию из репозитария себе. На доработку. Правой кнопкой на «папке» trunk и в меню выбираем «Checkout…» В открывшемся окне стоит установить верхний радиоБатон в положение «Checkout as a project in the workspace» и вписать имя проекта «dev». Таким образом, мы получим настроенный ранее в Apache структуру /var/www/dev/, которая будет доступна из браузера по http://localhost/. Отлично.

Commit

После того, как файл появился у нас в workspace, можно его отредактировать. Перейдем на perspective PHP (она пришла вместе с PDT) и отредактируем файл. Напишем что-нибудь веское, чтобы доказать себе, что оно работает 😉 Теперь в левой части окна, в PHP Explorer, который отображает нам workspace, кликнем правой кнопкой на этом файле и выберем «Team->Commit…» На что получим предложение написать что-нибудь для истории, выбрать файлы, которые необходимо закоммитить и нажать «OK».

Можно приступать…

Вот, в принципе, и всё, что я хотел узнать за сегодня. Если дойдут руки, надо будет написать внятную и подробную статью где-нибудь на Хабре (и прославиться ;), с картинками красивыми и прочим. Но это будет не раньше, чем я отшлифую навыки пользования этой связкой. Ну и на проектах не будет посвободнее в плане времени. Т.е…видимо не скоро =)

Subversion. Установка и настройка. День первый.

14 ноября, 2007

Допивая крепкий чай, глядя на снег за окном, я занимаюсь тем, до чего руки не доходили уже…наверное год. Разворачиваю репозиторий и учусь с ним обращаться. Откопав где-то в закромах «Pragmatic Version Control using Subversion«, понимаю, что без этой книги было бы намного сложнее 😉

Install

До того, как установить svn, я установил Apache2.2, PHP5 и MySQL5. Вопреки всем своим привычкам, просто не захотев долго возиться, я устанавливал их через apt-get install и понял, что больше этого делать не буду. Очень уж сложно искать по системе где спрятались конфигурационные файлы, как они разбиты и что вообще происходит.

После этого, через тот же apt-get install subversion, установил svn. С ним проще, svn из исходников я не собирал и мне под него подстраиваться не надо =). Ну а чтобы subverion’у не было скучно и, просто из любопытства, я установил следующие пакеты:

  • nautilus-script-collection-svn — скрипты для правой кнопки мыши в Nautilus, что-то вроде TortoiseSVN для *nix
  • python-svn — просто ещё один визуальный клиент для svn написанный на Python
  • rapidsvn — очередной визульный клиент
  • subversion-helper-scripts — набор shell-скриптов, упрощающий жизнь хранителя хранилища =)
  • subversion-tools — ещё один набор вспомогательных скриптов
  • svn-workbench — ещё один визуальный клиент
  • websvn — модуль для web-представления репозитария, написанный на PHP, быстро заработавший после короткой настройки. Показал мне пустое хранилище 😉

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

Setup

Я не буду описывать процедуру создания двух папок для Production и Development версий проекта, настройки виртуальных хостов на разных портах. Скажу только, что у меня есть две папки /var/www/dev/ и /var/www/prod/ с вполне говорящими названиями. А доступ к ним идет через http://localhost/ и http://localhost:8080/ соответственно.

Запасшись софтом с избытком, я приступил к настроке хранилища и начал пытаться представлять как я буду с ним работать.

Для начала хранилище надо создать. Где угодно. Я предпочёл /var/svn/, чтобы поближе к ServerRoot Apache2, чтобы, в свою очередь, не запоминать слишком много ;). Смело пишем в терминале от рута:

cd /var
mkdir svn
svnadmin create /var/svn

Заодно запоминаем, что хранилищем руководит команда svnadmin.

Репозиторий есть. Теперь надо туда положить что-нибудь временное, чтобы потом оттуда это забрать и сделать рабочей копией ;). Сейчас стане понятней.

Создаем временную папку. Где угодно. Допустим, mkdir /home/svn_tmp. Кладем в неё файлик, допустим, index.php, в котором пишем:

<?php
echo "dev workin'";
?>

Теперь, находясь в этой папке импортим файлик в хранилище, создавая проект:

svn import -m "Creation" . file:///var/svn/project_name/trunk

Здесь «-m» — это добавление комментария, «.» — это все файлы текущей директории, ну а далее идет путь к хранилищу и проект, куда надо импортировать файл.

По рекомендации умной книги (и пока еще не осознав, зачем), в папке с проектом (которая project_name) существуют три поддиректории: trunk, branches, tags. О назначении каждой из них я ещё расскажу. Кстати, неверно думать, что пойдя в /var/svn/, вы увидите там поддиректорию с проектом 😉 всё хранится в псевдоБазе данных. Поэтому искать там не стоит.

Хранилище у нас есть. Проект тоже. Теперь надо сделать рабочую копию, с которой и будем работать впредь, периодически коммитя результаты в хранилище и синхронизируя с продуктивной версией. Рабочую копию я буду держать в /var/www/dev/, чтобы отлаживать было просто. И чтобы коммитить пакетами, а не после каждого сохранения. «Стоя» в папке /var/www, пишем:

svn co file:///var/svn/project_name/trunk dev

Сдесь у нас «co» — это checkout (синхронизировать с хранилищем), дальше путь и в конце название папки, где будет храниться рабочая копия. Если все прошло хорошо, то теперь у нас в папке /var/www/dev/ живет файлик index.php и скрытая папка .svn, в которой лежит мета-информация Subverion.

Это было начало пути. И, в принципе, насколько я понимаю, checkout можно было не делать. Можно было его сделать в subClipse, указав ему на репозиторий. Но это я буду проверять завтра

Обживаем Ubuntu 7.10 — Жжем диски.

13 ноября, 2007

В плане дискоЖжения, я человек развращенный Nero. Сильно развращенный. Мне нравится таскать мышкой папки. Мне нравится видеть сколько осталось места на болванке. Мне нравится Nero. Но раз уж я ушел в глубокий free-as-a-beer-софт, то сидеть дальше на Nero было бы как-то…некошерно =)

Значит надо искать что-то такое же ненапрягающее. Из разряда don’t make me think. Как всегда, видимо в свете поверхностного поиска (надеюсь) и очередного обращения к подшивке LinuxFormat, было выбрано два приложения:

Судя по обзорам и статьям, эти приложения были ближе всего к Nero по духу и наиболее наполнены функционально. Конечно, сначала я поставил GnomeBaker, потому что мне совсем не улыбалось устанавливать кучу библиотек KDE, да ещё и грузить их в память при желании записать диск. И, конечно, он не оправдал моих ожиданий. Ну не совсем, конечно, не оправдал. Мне разочаровало только одно. У меня не получилось перетащить папку для записи. Файлики таскались отлично, а вот вместо папок он мне ярлычки создавал. То ли пункт меню далеко спрятали, то ли я латентный виндузятнег, то ли меня в гугле забанили, но, вобщем, я установил K3b.

И он почти не заставил меня думать. Правда он пугает сообщениями о форматировании диска…а потом говорит, что у него что-то там не получилось отформатировать, но по-крайней мере, он пишет диски. И они читаются даже под виндой. Если выбрать правильный пункт меню. У меня получилось с 3-го раза. Режим doc-совместимости мне очень понравился. 8ми-буквенные названия файлов — это сила 😉

Обживаем Ubuntu 7.10 — Домашние финансы.

13 ноября, 2007

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

Под Windows существует великое разнообразие подобных программ, начиная с простых и примитивных, и заканчивая серьёзными и всеобъемлющими. Под *nix я такого разнообразия не заметил. А если выбирать особо не из чего, надо брать лучшее 😉 или хотя бы проверенное временем.

Потратив некоторое время на поиски, и перелопатив подшивку LinuxFormat’а, я остановил свой выбор на двух программах:

Для начала установил Grisbi. И почти сразу же удалил. Потому что он предложил мне вести бухгалтерию в евро. И не предложил альтернатив

Поэтому, отступать было некуда 😉 и я установил GnuCash. Сразу могу сказать, что программа не самая дружелюбная, но как известно друзей в *nix выбирают придирчиво (с). Поэтому, пришлось читать документацию, чтобы хоть что-то понять. Зато после прочтения, всё встало на свои места. И ещё один пункт из программы перехода под *nix, можно считать выполненным

Обживаем Ubuntu 7.10 — Повышаем комфорт существования.

11 ноября, 2007

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

Такое вот изысканное вступление предваряет настройку клавиатурных сочетаний и мышиных кнопок в Ubuntu.

Учитывая, что мы имеем дело с рабочим столом Gnome, который славится скрытностью настроек, копать нам придется. Но не слишком глубоко.

Клавиатурные сокращения

Если ваши предпочтения по запуску приложений совпадают с предпочтениями создателей Gnome, то вас вполне удовлетворит пункт меню «Система->Параметры->Комбинация клавиш клавиатуры». Мне повезло меньше =) поэтому мой путь был более тернист и проходил он через терминал

gksudo gconf-editor

Далее, имщем пункт меню «apps->metacity» и в нем нас интересуют два подпункта «global_keybindings» и «keybindings-conmmands». Первый отвечает за то к какому клавиатурному сочетанию будет забиндино что. А второй предоставляет возможность назначения произвольных 12 команд для выполнения клавиатурными сочетаниями. Вот, в принципе и вся премудрость.

Мышиные кнопки

Всё нижесказанное будет относится конкретно к мыше Logitech MX400. Но принцип достаточно универсален. Поэтому можно приладить к любой мышЕ.

Инсталлим evdev sudo apt-get install xserver-xorg-input-evdev

Открываем терминал cat /proc/bus/input/devices. Это заклинание выведет нам все устройства, используемые для ввода. Нас будет интересовать блок информации примерно такого вида

I: Bus=0003 Vendor=046d Product=c043 Version=0110
N: Name="Logitech USB-PS/2 Optical Mouse"
P: Phys=usb-0000:00:0b.0-3/input0
S: Sysfs=/class/input/input9
U: Uniq=
H: Handlers=mouse1 event3
B: EV=7
B: KEY=ff0000 0 0 0 0 0 0 0 0
B: REL=143

Нас здесь интересует только имя, которое присвоили нашей мышке. Далее, не отходя далеко от терминала пишем sudo gedit /etc/X11/xorg.conf. И, конечно, не забываем делать бэкапы перед тем, как правим конфигурационные файлы под рутом 😉

Пробегаем глазами до секции с мышами и закоментировав то, что уже было написано #, вписываем своё:

Section "InputDevice"
Identifier "Configured Mouse"
Driver "evdev"
Option "CorePointer"
Option "Name" "Logitech USB-PS/2 Optical Mouse"
EndSection

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

Предподготовка закончилась, нас ожидает sudo /etc/init.d/udev restart для железной части и <Ctrl>+<Alt>+<BackSpace> для софтверной.

Пошли кнопочки. Для начала sudo apt-get install xvkbd xbindkeys, это те програмки, которые будут за нами следить и нам помогать. Теперь gedit ~/.xbindkeysrc, здесь мы расскажем програмке зачем конкретно нам нужно слежение, и в этот файл мы впишем:

"/usr/bin/xvkbd -xsendevent -text "\[Alt_L]\[Left]""
m:0x0 + b:8
"/usr/bin/xvkbd -xsendevent -text "\[Alt_L]\[Right]""
m:0x0 + b:9

Теперь программа всё знает. Осталось её запустить, пишем в терминале xbindkeys и проверяем, работают ли кнопки там, где нам нужно. Если всё отлично, то идем в «Система->Параметры->Сеансы», жмахаем «Добавить» и вписываем xbindkeys в поле «Команда». Теперь програмка будет стартовать вместе с гномовой сессией.

Если что-то пошло не так. Или мышь другая. Или кнопок больше, то запускаем в терминале xev и нажимаем кнопки, послеживая какие значения получаем. Примерно так:

ButtonPress event, serial 30, synthetic NO, window 0x3a00001,
root 0x1a5, subw 0x3a00002, time 818838515, (41,36), root:(46,94),
state 0x10, button 1, same_screen YES

Вот этот «button 1» и есть наша кнопка. Значит её-то и надо биндить. Всё.

Nautilus

Нашел ещё один способ для повышения комфорта. Скрипты гномовского файлового менеджера Nautilus. Искал я, кажется, как открыть консоль ровно в том месте, где сейчас находишься в файловом менеджере. А нашел намного больше. Правда не всё мне пригодилось 😉

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

Вторая ссылка ведет нас…опять в документацию к ubuntu, на этой страничке приведены примеры скриптов, которые мне и пригодились. Придётся создавать файлы…но это не страшно.

Закончить можно было бы ссылкой на Advanced Bash Scripting =), но это уже другая тема.

Обживаем Ubuntu 7.10 — Клиент torrent-сетей.

11 ноября, 2007

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

Клиентов torrent-сетей под Linux, наверное, больше чем под Windows. Существуют как кроссплатформенные монстры на java (Azureus), которые много умеют, но и много кушают ресурсов, существуют «кроссплатформенные» поделия на GTK+ (Transmission), которые в силу небольшой конкуренции под Mac могу себе позволить уметь не слишком много. Можно в конце концов гонять uTorrent, для которого Wine позиционируется, как одна из возможных платформ.

Учитывая, что консольных изысков curve (rTorrent) и веб-нитерфейсов для серверов под FreeBSD на толстом канале (torrentFlux) мне не надобно, мне нужен простеньгий, гибкий и мощный клиент. С мыше-клавиатурным управлением.

Именно такой найти и сложнее всего. Пока гоняем uTorrent, который мне абсолютно всем устраивал под Windows. Правда, под Linux он страшноват =)

На очереди:

  1. Azureus
  2. Transmission
  3. Deluge

Не факт, что протестирую все, но первые два — точно. О результатах отпишу.

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

Обживаем Ubuntu 7.10 — Клиент видео-чата.

10 ноября, 2007

Причем, кроссплатформенный. До недавнего момента, эта проблема стояла достаточно остро, единственное решение я нашёл в Ekiga, но оно было мягко говоря небезглючным.
Поэтому тот факт, что новая версия Skype поддерживает видео, пришелся очень кстати.
И хотя, скайп печально знаменит троянскими наклонностями…и в ЛОР-кругах уже вовсю шуткуют на эту тему…всё равно его не брошу, потому что конкурентов не вижу.