среда, 28 ноября 2007 г.

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

Не так давно я рассказывал о библиотеке 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. Задача выполнена =)

вторник, 27 ноября 2007 г.

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

Не помню, писал ли я или нет, но в последнее время я плотно использую 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 и есть коммерческая лицензия, сопровождаемая поддержкой и прочими благами в обмен на деньги =) Выбор — это всегда приятно.

понедельник, 19 ноября 2007 г.

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

Ни для кого не секрет, что 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 поле (что характерно ;). Вот, в принципе, всё. Если остаются вопросы или предложения по оптимизации — прошу в комменты.

пятница, 16 ноября 2007 г.

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

Вводная

Сегодня будем заниматься кристаллизацией 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".

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

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

четверг, 15 ноября 2007 г.

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

Допивая крепкий чай, глядя на снег за окном, я занимаюсь тем, до чего руки не доходили уже...наверное год. Разворачиваю репозиторий и учусь с ним обращаться. Откопав где-то в закромах "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, указав ему на репозиторий. Но это я буду проверять завтра

вторник, 13 ноября 2007 г.

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

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

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

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

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

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

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

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

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

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

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

понедельник, 12 ноября 2007 г.

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

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

Такое вот изысканное вступление предваряет настройку клавиатурных сочетаний и мышиных кнопок в 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 =), но это уже другая тема.

воскресенье, 11 ноября 2007 г.

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

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

Клиентов 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 - Клиент видео-чата.

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

понедельник, 5 ноября 2007 г.

Проект-мечта. Осуществляем.

Итак. Пути обратно нет. Полечимся от латентной виндузятности и забудем на пару секунд про ZS. У нас есть Eclipse! (афигеть...) Будем работать с ним. Как всегда, при работе с Eclipse, сначала нужно подобрать плагины. Установить. Попытаться поработать. ... Надеюсь, получится.

Проект будет обычно-учебный, php+html+css+js+framework(codeIgniter, для разнообразия)+svn(для освоения). При таком раскладе, всё, что мне может потребоваться это:

  1. Eclipse 3.3 aka Europe с плагинами:
  2. SVN (и какая-нибудь gui-тулза, чтобы в консоли не пропасть ;)
  3. ER-Modelling Tool
  4. Syncrhonizer с удаленным ftp

Как видно, почти со всем я определился. Есть проблема с ER-диаграммами. Пока, единственное решение я нашёл в виде запуска под wine DBDesinger, почему-то их *nix-версия у меня работать не захотела. Видимо, она старовата. А коварный MySQL AB, который на основе неё собирался сделать свою тулзу MySQL WorkBench всё никак не соберется. Во-первых она "вечная альфа", а во-второых нет порта пол *nix.

Касательно синхронизации, я думаю проблем не будет, *nix. всё ж таки...

Рабочий процесс у меня в голове уже, вроде, сформировался. Действовать будем примерно, как я описывал давно-давно, придумал только пару уточнений к тому, что там было написано:

  1. На нашем девелоперском веб-сервере (локальном) делаем две папки. Production и Development.
  2. Обе делаем доступными в качестве VirtualHost. Например http://localhost/prod и http://localhost/dev
  3. Папка Production будет являться у нас по совместительству svn-хранилищем. А заодно точной копией internet-сервера.
  4. Все правки тестируются в папке Development, обкатываются и коммитятся.
  5. После чего, синхронизируем папку Production с удаленным сервером.

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

Обживаем Ubuntu 7.10 - Проигрыватели audio.

Вот никогда не мог подумать, что с аудио будут проблемы. Так много плееров, они такие красивые. И, вроде, всё должны уметь. Есть только одна проблема...оказывается, формат .ape закрытый. И не очень хорош с лицензионной точки зрения. И официального порта под linux авторы не делают. Соответственно, люди выкручиваются, как могут

У меня, например, достаточно много музыки в .ape, и для меня возможность проигрывать файлы этого формата являлась критичной. Длительное гугление привело к некоторым решениям, одно, другого страшнее ;), включая какие-то предложения о сборке самостоятельно и правке исходного кода, накладывании патчей и прочем шаманстве, которое не совместимо с моим желанием сделать всё простейшим образом. После нескольких тупиковых путей (wxMusik (извилистый ад зависимостей), xmms(gtk1 и русский не очень дружат)), наткнулся на Audacious. На нем и остановился. Вот последовательный рецепт:

  • Устанавливаем сам плеер apt-get install audacious. Он принесет с собой, всё, что ему нужно. Из "коробки" он умеет многое. Мне не хватало только .ape, flac и mp3, он подхватил сразу.
  • Открываем файл /etc/apt/sources.list, добавляем туда строчки:
    ## BackPort for MAC
    deb http://morgoth.free.fr/ubuntu gutsy-backports main
    deb-src http://morgoth.free.fr/ubuntu gutsy-backports main
    Это позволит нам забрать пакеты, не входящие в официальные репозитарии. Ещё необходимо прописать в консоли:
    wget -O - http://morgoth.free.fr/files/morgoth-signkey.gpg.asc | sudo apt-key add -
    А это нужно для того, чтобы APT не пугался незнакомых репозиториев =)
  • Теперь можно смело инсталлировать саму библиотеку Monkey Audio Codec и плагин для Audacious
    sudo apt-get install monkeys-audio audacious-mac
    Если чего-то не хватает, можно доставить. Самое главное у нас есть.
  • После установки, я столкнулся только с одной проблемой - кривые тэги в mp3 файлах. Но исправить это оказалось очень просто:
    Ctrl+P приводит нас в настройки, далее "Список воспроизведения", в выпадающем списке "Автоматическое определение кодировки для:", выбираем "Russian" и всё становится ок.

Такой вот беспроблемный плеер. Учитывая, что под виндами я всегда предпочитал winamp classic, мне его вполне хватит.

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

суббота, 3 ноября 2007 г.

Обживаем Ubuntu 7.10 - Проигрыватели video.

Есть под Windows один замечательный плеер, называется Gom. Тем, кто любит просто смотреть кино и не заморачиваться вообще ни по чему, настоятельно рекомендую. Открывает всё, что содержит видео. И скачивает кодеки по мере необходимости. Вообщем беспроблемный софт - это приятно.

Чего-то подобного я ищу и под Linux. Пока кандидатов трое:

  • MPlayer
  • VLC
  • Totem

Каждый из них представлен своим движком, MPlayer и его множественные GUI сами по себе, Totem, вроде использует под собой Xine (могу ошибаться), а VLC тоже сам по себе =)

Из всех троих, все трое не без проблем. Все установились (Totem уже был, правда), все притащили с собой необходимые кодеки (кроме Totem, но он их беспроблемно загрузил) и, в принципе, все работают. И только с одной проблемой я столкнулся, причем у всех троих. Они не воспроизводили субтитры. На русском языке. Это расстраивало. Путь решения у каждого плеера свой.

MPlayer

Находим файлик ~/.mplayer/config и вписываем в него следующее:
font = "/home/user/.mplayer/tahoma.ttf" #кириллический шрифт
subcp = "cp1251" #кодировка сабов
subfont-text-scale = "3" #размер сабов
subfont-blur = "1" #небольшой блюр, чтобы не резало глаза
subfont-outline = "1" #черный контур вокруг букв
Перед этим было бы неплохо разжиться кириллическим шрифтом. И положить его куда-нибудь. А потом указать на него из config.

VLC

Находим файлик ~/.vlc/vlcrc, в котором есть такая строчка:
subsdec-encoding=default
Меняем "default" на "WINDOWS-1251" и получаем результат

Totem

У тотема тоже есть файлик:
/home/user/.gconf/apps/totem/%gconf.xml
Можено править его. А можно запустить gconf-editor и исправить там.

Можно сказать, что траблшутинг окончен, теперь осталось определиться с тем, что мне больше подходит

Прошло три дня...

Нет, Ubuntu я ещё не снёс ;) Вообщем из этих плееров, больше всего мне пока нравится VLC, за то что и интерфейс у него вменяемый, и проигрывает он всё без проблем. Надо только DVD на нем потестить, hotkeys настроить под себя и всё будет в порядке. MPlayer оставлен для резерва...А вот тотем пришлось пристрелить ;) он какой-то совсем бесполезный. Для меня.

Обживаем Ubuntu 7.10 - План действий.

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

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

  1. Проигрыватель аудио (flac, ape, wv)
  2. Проигрыватель видео (DVD, divX, xVid)
  3. Запись дисков
  4. Синхронизатор/бэкапер всего со всем.
  5. Вменяемый клиент Torrent
  6. Skype или аналогичная прога с трансляцией видео.
  7. Домашние финансы
  8. Словарь (англ).

Это программы. Ещё есть некоторый список пожеланий, которые тоже хотелось бы видеть исполненными, например:

  1. Настроить на мышЕ кнопки вперед/назад
  2. Найти приличные шрифты для системы и браузера
  3. Синхронизировать телефон с компом
  4. Настроить клавиатурные сочетания для комфортной работы с системой

Можно заметить, что здесь ни слова о работе, редакторах, отладчиках и прочих тулзах, необходимых девелоперу. Это тема отдельная и смешивать её с пользовательской частью я не хочу. Хотя поиск программы для моделирования ER-диаграмм, пока не принес результатов, что грустно.

По мере решения проблем, буду постить рецепты и критерии выбора того или иного решения