barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 24 июня 2011 г.

Подключение midi-клавиатуры в Linux

Ниже описан процесс подключения midi-клавиатуры CME M-key в Ubuntu 10.10.
CME M-key - пожалуй самая простая види-клавиатура с интерфейсом USB. В Linux работает без каких-либо доп. драйверов, требуется лишь программный синтезатор и звуковой сервер. В качестве первого я выбрал Qsynth (являющийся графической оболочкой для fluidsynth), а в качестве второго - Jack Server (не сказал бы что это хоть сколько-нибудь осознанный выбор, просто это было первое, что я нашел по запросу "midi", и к тому же увидел в интернете в паре инструкций по настройке midi в линухе). Все приложения ставятся через менеджер пакетов Synaptic (я установил fluidsynth и ещё один синтезатор muse, вместе с которым сразу установился Jack вместе с устилитой Jack Audio Control). Итак, сам процесс настройки (логика настройки простая: настроить сервер, настроить синтезатор, с помощью сервера соединить midi-клавиатуру и синтезатор):
1) Запускаем Jack Audio Control (Приложения - Аудио и видео - Jack Control)
2) Нажимаем в открывшемся окне "Параметры", в нём единственное что я поменял - установил в "Драйвер MIDI" - raw:
3) Запускаем Qsynth (не закрывая окна Jack Control), он расположен там же (Приложения - Аудио и видео).
4) Слева нажимаем "Настройки", на вкладке "Звук" я установил размер буфера - 512:
5)  Теперь необходимо перейти на вкладку "Файлы SF2" и добавить банк инструментов. Их можно найти в интернете, или добавить стандартный банк (он лежит прямо в папке, которая открывается по-умолчанию при нажатии на кнопку "Открыть" (я добавил стандартный банк, там достаточно много инструментов). Жмем ОК для сохранения изменений.
6)  Теперь можно запускать jack-cервер, чтобы соединить midi-клавиатуру и Qsynth. Для этого в окне Jack Control нажимаем "Запустить".
7) Соединяем Qsynth и midi клавиатуру. В окне  Jack Control нажимаем "Соединить", в открывшемся окне устанавливаем все, как показано на рисунке (установлено методом нучного тыка):
8) Все, соединение установлено, теперь, при нажатии клавиш на клавиатуре должна моргать зеленая лампочка в левом нижнем углу  Qsynth. Остается только выбрать банк: жмем "Каналы", там после двойного клика на канале 1  выбираем банк (если список пустой - значит Вы не добавили банк SF2, см. п.5).
9) Теперь должно работать)
ЗЫ За основу взята инструкция http://hardsofter.blogspot.com/2010/02/midi-linux.html.

Char* to int на C / C++ (имхо самый простой / не требовательный к библиотекам вариант)


#include <string.h>
int num;
char* str = "1234";
sscanf(str,"%d",&num);

Удобные макроопределения для работы с битами в C (например, для микроконтроллера)

#define SetBit(reg, bit) reg |= (1<<bit)
#define ClearBit(reg, bit) reg &= (~(1<<bit))
#define InvBit(reg, bit) reg ^= (1<<bit)
#define BitIsSet(reg, bit) ((reg & (1<<bit)) != 0)
#define BitIsClear(reg, bit) ((reg & (1<<bit)) == 0)

Восстановление grub2 (Ubuntu 10.10)

Чтобы восстановить grub (убитый, скажем, установкой винды), необходимо загрузиться с livecd Ubuntu (или практически любого другого линуксового livecd, облажающего таким же функционалом), после чего проделать несколько нехитрых действий.

Во первых, нужно посмотреть на свою таблицу разделов (проще, чтобы не писать перед каждой командой sudo, сразу перейти в режим рута, написав sudo su):

sudo su
fdisk -l
Команда выведет что-то наподобие следующего:

/dev/sda1 29 8369 66999082+ 83 Linux
/dev/sda2 * 8370 13995 45190845 7 HPFS/NTFS
/dev/sda3 13996 14593 4803435 5 Extended
/dev/sda5 13996 14593 4803403+ 82 Linux swap / Solaris

Отсюда видно, что Linux был установлен на разделе sda1. Там, скорее всего, находится и загрузчик в директории /boot (если Вы, конечно, не создавали для него отдельного раздела, но в таком случае Вы и сами знаете наверное, что делать ;)).

Примонтируем этот раздел в директорию /mnt, а также ещё смонтируем в её поддиректорию все устройства (/dev), а также директорию /proc:

mount /dev/sda1 /mnt
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc

Сменим корневой каталог на созданную директорию:

chroot /mnt
Теперь собственно произведем восстановление загрузчика grub:

grub-install /dev/sda

(если при выполнении команды возникли проблемы, введите команду grub-install --recheck /dev/sda).

Теперь выйдем из chroot, размонтируем разделы и перезагрузимся:

exit
umount /mnt/dev
umount /mnt/proc
umount /mnt
reboot

Все, grub восстановлен. При необходимости, обновите конфигурацию grub, выполнив sudo update-grub после загрузки Ubuntu (мне это понадобилось, т.к. сразу после восстановления установленной мной Win7 в списке загрузки не оказалось).

Источник: http://startubuntu.ru/?p=95

Общие папки в Ubuntu

Для того, чтобы создать в Ubuntu общий ресурс (папку, принтер), аналогичный общим файлам и принтерам в Windows, существует сервер samba. Такая общая папка будет "видна" компьютерам Вашей сети также, как если бы она была на компе с Windows.
Я опишу свой случай, когда мне нужно было дать доступ к папке на пк с Ubuntu 10.10 с компьютера под Win7.
Для начала ставим samba, например, через менеджер пакетов Synaptic.
После этого в меню "Администрирование" появится пункт "Samba", предназначенный собственно для настройки сервера samba:




В окне отображается список ресурсов, к которым открыт общий доступ. Добавить новый ресурс можно с помощью кнопки "Добавить ресурс Samba", изменить существующий можно выделив его и нажав "Изменить свойства выбранного каталога".

Но для начала необходимо настроить сам сервер. Делается это в "Настройки" -> "Параметры сервера". В "Рабочая групппа" введите имя Вашей рабочей группы Windows, далее на вкладке "Безопасность" убедитесь, что "Режим аутентификации" установлен "Пользователь", "Шифровать пароли" - "Да" (подробнее про режимы аутентификации можно почитать в документации по samba или тут: http://www.rhd.ru/docs/manuals/enterprise/RHEL-4-Manual/sysadmin-guide/s1-samba-configuring.html):

Теперь перейдем к настройке пользователей samba ("Настройки" -> "Пользователи Samba"). В моем случае я хотел, чтобы можно было подключаться из windows под пользователем, существующим в ней (remote), поэтому нужно было настроить самбу так, чтобы она принимала этого вользователя. Для этого я выбрал одного из Unix пользователей (он также называется "remote", мне нужен был именно он т.к. я хотел ширть папку из его домашней директории), и зайдя в его редактирование, в качестве имени пользователя Windows указал имя виндового пользователя, причем в виде домен\имя_пользователя (в моем случае вместо домена используется имя компьютера с win7, причем имя нужно указывать в нижнем регистре, что вероятнее всего справедливо и для имени пользователя). Далее я ввел пароль, установленный для него в Windows:

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

На всякий случай после внесения всех изменений лучше перезапустить сервер samba, делается этого так:

 

sudo service smbd restart 

 

Все, теперь папка видна из windows, и её можно, например, подключить как сетевой диск. Если винда спрашивает пароль для доступа к ресурсу, я использую учетные данные виндового пользователя remote (если я залогинен под ним, вводить ничего не требуется):



Определение версии Flash Player из JavaScript

Нашёл такую реализацию (100% работоспособность не проверил, но, по крайней мере наличие 10 FP в Opera / FF / IE 8 определяет, ровно как и отсутствие FP вообще в IE 8):

function flashVersion()
{
     if (!navigator.f)
          {
          navigator.f = '0';
     }
     var plugin = 0;
     plugin = (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"]) ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0;
     if (plugin)
          {
          var re = /(\d+)\.\d+/;
          var out = re.exec(plugin.description);
          if (out.length>1) navigator.f = parseInt(out[1]);
          }
     else
     if (navigator.userAgent && navigator.userAgent.indexOf("MSIE")>=0 /*&& (navigator.userAgent.indexOf("Windows 95")>=0 || navigator.userAgent.indexOf("Windows NT")>=0 || navigator.userAgent.indexOf("Windows 98")>=0 || navigator.userAgent.indexOf("Windows XP")>=0)*/)
          {
          try {
               for (i = 3; i <= 11; i++) {
                    if (eval('new ActiveXObject("ShockwaveFlash.ShockwaveFlash.'+i+'")')) {
                         navigator.f = i;
                         }
                    }
               }
          catch(e) {}
          }
     else
          {
          navigator.f = '0';
          }
     return navigator.f;
}

Транслитерация на JavaScript

Не могу утверждать что эта функция удовлетворяет ГОСТу (не было времени проверять соответствие символов), но главную функцию она выполняет - переводит русские буквы в английские:

function translit(src)
{
return src.replace(/А/g,"A").replace(/Б/g,"B").replace(/В/g,"V").replace(/Г/g,"G").replace(/Д/g,"D").replace(/Е/g,"E").replace(/Ж/g,"J").replace(/З/g,"Z").replace(/И/g,"I").replace(/Й/g,"Y").replace(/К/g,"K").replace(/Л/g,"L").replace(/М/g,"M").replace(/Н/g,"N").replace(/О/g,"O").replace(/П/g,"P").replace(/Р/g,"R").replace(/С/g,"S").replace(/Т/g,"T").replace(/У/g,"U").replace(/Ф/g,"F").replace(/Х/g,"H").replace(/Ц/g,"TS").replace(/Ч/g,"CH").replace(/Ш/g,"SH").replace(/Щ/g,"SCH").replace(/Ъ/g,"").replace(/Ы/g,"YI").replace(/Ь/g,"").replace(/Э/g,"E").replace(/Ю/g,"YU").replace(/Я/g,"YA").replace(/а/g,"a").replace(/б/g,"b").replace(/в/g,"v").replace(/г/g,"g").replace(/д/g,"d").replace(/е/g,"e").replace(/ж/g,"j").replace(/з/g,"z").replace(/и/g,"i").replace(/й/g,"y").replace(/к/g,"k").replace(/л/g,"l").replace(/м/g,"m").replace(/н/g,"n").replace(/о/g,"o").replace(/п/g,"p").replace(/р/g,"r").replace(/с/g,"s").replace(/т/g,"t").replace(/у/g,"u").replace(/ф/g,"f").replace(/х/g,"h").replace(/ц/g,"ts").replace(/ч/g,"ch").replace(/ш/g,"sh").replace(/щ/g,"sch").replace(/ъ/g,"y").replace(/ы/g,"yi").replace(/ь/g,"").replace(/э/g,"e").replace(/ю/g,"yu").replace(/я/g,"ya");
}

Отображение html-элементов поверх flash-контента

По-умолчанию, flash-объект находится в документе поверх всего (хотя в FF / Opera по-моему все-таки нет). Такое его поведение задается параметром / атрибутом тэга object - wmode (точнее, его значением по-умолчанию - window). Для того, чтобы другие html-элементы могли отображаться поверх falsh`a, необходимо ему присвоить значение transparent или opaque (по моему опыту, работоспособным является только opaque, при transparent IE 8 все равно отказывается что-либо показывать поверх):

<object ... >
     <param name="wmode" value="opaque">


На вариант с указанием wmode как атрибута тэга object ругается NetBeans ("недопустимый атрибут"), так что я экспериментировать не стал.
Данный param необходимо прописать у обоих объектов object (для IE и остальных браузерах), если используется подход с двумя объектами (если объект + embed, то для обоих из них).

Шаблон проектирования ObjectMother для написания (модульных) тестов

Вместо:
- тестируемые, а также все остальные необходимые для теста объекты, создаются и инициализируются в коде самого теста (если нет возможности объединить общую фикстуру, инициализируемую в setUp-методе)
- тестируемые, а также все остальные необходимые для теста объекты, создаются и инициализируются в отдельных методах тест-кейса, обращение к которым производится из различных тестов, которым необхоима аналогичная инициализация

Предлагается:
- использование одного или нескольких ObjectMother - классов, которые содержат методы для создания и(или) модификации любых часто используемых в тестовых методах объектов в различных комбинациях. Методы этого класса должны содержать максимально говорящие об их назначении имена, чтобы понятность тестов не снижалась. Объекты, создаваемые ObjectMother, должны иметь возможность легко менять свое состояние, так чтобы после их инициализации в ObjectMother, тесты могли легко поменять его (состояние) на требуемое. Чаще всего ObjectMother создает обычные доменные объекты вместе с требуемыми атрибутами, намного реже - заглушки и мок-объекты, так как последние более специфичны для конкретных тестов и менее - для всего набора модульных тестов приложения.

"+": повышается читабельность кода тестов, уменьшается дублирование инициализирующего кода, упрощается создание новых тестов

Более подробно и с примерами есть тут: http://wiki.agiledev.ru/doku.php?id=tdd:object_mother

четверг, 23 июня 2011 г.

Шаблон проектирования Inversion of Control (IOC)

Вместо:
- класс сам создает экземпляры сторонних классов (ресурсов), от которых он зависит
предлагается:
- класс получает объекты этих классов (ресурсов) одним из следующих способов: как параметр конструктора / setter-метод / параметр того метода, где эти объекты непосредственно нужны

"+": большая гибкость при использовании класса (особенно когда тип передаваемых объектов задается не конкретным классом, а интерфейсом)
"+": упрощается unit-тестирование. Можно контролировать состояние передаваемых классу объектов непосредственно в коде самого текста, а также заменять их мок-объектами

Настройка профилировщика в xdebug и средства анализа результатов его работы

xdebug.profiler_enable=1 - включает безусловное профилирование всех скриптов
xdebug.profiler_enable_trigger = 1 - включает условное профилирование скрипта (по наличию GET/POST-параметра XDEBUG_PROFILE
xdebug.profiler_output_dir - устанавливает путь сохранения результатов профилирования (cachegrind-файлов)
xdebug.profiler_append=1 - включает добавление результатов профилировки в предыдущий файл вместо создания нового
xdebug.profiler_output_name - задает формат имени профайл-лога. Можно использовать:
%p – идентификатор процесса
%r – случайное число
%u - время
%H – значение $_SERVER['HTTP_HOST']
%R – значение $_SERVER['REQUEST_URI']
%s – имя, включающее полный путь, слеши конвертируются в знаки подчеркивания

xdebug.profiler_enable (да я подозреваю, что и xdebug.profiler_enable_trigger) нельзя изменять с помощью ini_set(), видимо потому, что решение о включении профилировщика принимается до начала разбора скрипта. Это относится и к xdebug.profiler_output_dir.

Анализировать созданные профайл-логи можно с помощью:

- webgrind. Графиков и прочих красивостей не рисует, но выдает самую главную ифнормацию: число вызовов функций и их собственную / полную стоимость вызова (собственная не включает вызовы других функций в теле данной). По-умолчанию в меню сверху выводятся все профайл-логи xdebug из директории /tmp. Если xdebug настроен на сохранение логов в другой папке, необхоимо перенастроить webgrind (в файле config.php в папке устновки webgrind изменить значение статической перменной $profilerDir). Про установку webgrid в Debian я писал здесь: http://barbitoff.blogspot.com/2011/06/webgrind.html. Имхо не самый функциональный и удобный инструмент, да и к тому же, если включено безусловное профилирование, то webgrind, работающий на том же сервере, будет вызывать профилирование самого себя.. А условная профилировка не всегда удобна для AJAX-приложений, не будешь же добавлять XDEBUG_PROFILE во все AJAX-вызовы. В принципе, можно было бы отключить безусловную профилировку в глобальном php.ini, но включать её через ini_set() в тех php-файлах, которые хотим профилировать, но которым не хотим каждый раз передавать в GET/POST параметр XDEBUG_PROFILE (или наоборот, включить глобальную безусловную профилировку, а в index.php webgrind`а её выключить через ini_set()), но параметры xdebug.profiler_enable_trigger и xdebug.profiler_enable нельзя менять через ini_set(). Впрочем, эти параметры все ещё можно устанавливать через .htaccess, так что запрет профилирования webgrind`a сделать не сложно (не забыв, правда, в конфиге апача для директории webgrind установить AllowOverride Options):

php_value xdebug.profiler_enable 0


- kcachegrind. Самый, пожалуй, полнофункциональный инструмент, его и рекомендую. Имеет широкие возможности визуализации результата профилировки в виде рисования графов и карт вызовов. Вот пример его работы на очень простеньком скрипте:
Работает под Linux, но, говорят, возможен запуск и под Win, сам не пробовал. Всё, что необходимо сделать для анализа профайл-лога - открыть этот файл через меню.

- Wincachegrind. Как следует из названия, работает под Win, сам с ней не работал, но вроде бы она уже давно не разрабатывается и по функционалу уступает kcachegrind.

Полезная презентация про профилирование php-кода (и, в частности, про настройку профилирования в xdebug), есть тут: https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwZjamEZKA1CZTcxNDY4YzItMjc1ZS00ZjMyLWI2ODktNGI2YzkzZWZlZmRh&hl=ru&authkey=COraveAL

Найстройка параметров вывода xdebug

xdebug, кроме использования для отладки скриптов с использованием IDE, позволяет также намного увеличить читабельность и полезность информации, выводимой php-движком при возникновении ошибок / предупреждений (например, вызовов несуществующих функций). Так, кроме стека вызовов, выводимого по умолчанию при поключении xdebug-модуля, можно выводить содержимое суперглобальных массивов или отдельных из членов (в скобках - значения по-умолчанию):

xdebug.dump_globals - разрешает дамп суперглобальных переменных (1).
Что именно будет выведено, определяется параметрами вида xdebug.dump.*, например:
xdebug.dump.GET=*
xdebug.dump.SERVER=HTTP_HOST
xdebug.dump.SERVER=HTTP_HOST,SERVER_NAME

xdebug.dump_once -  если 1, то суперглобальные массивы выводятся лишь единожды, при первом возникновении ошибки, если 0 - то при каждой ошибке (1)
xdebug.dump_undefined - выводить неопределенные (undefined) переменные из суперглобальных массивов (Off)

Также, можно выводить другую дополнительную информацию:

xdebug.show_local_vars=1 - выводить значения локальных переменных
xdebug.collect_params - вывод информации о параметрах, передаваемых функции (имеет значение от 0 до 4, где 0 соответствует отсутствию информации, 4 - наиболее полному представлению)

Естественно, для того, чтобы всю эту красоту увидеть, необходимо, чтобы php-параметр display_erorrs был установлен в On (в php.ini или через ini_set()), а также чтобы Вы не переопределили обработчик ошибок через register_error_handler().

Также xdebug делает более информативным вывод функции var_dump(). Вот некоторые ini-параметры для настройки вывода, которые отображаются и на выводе var_dump, и на сообщениях, возникающих при ошибках:

xdebug.var_display_max_data - максимальная длина выводимых строк (512)
xdebug.var_display_max_children - число выводимых элементов массива / объекта (128)
xdebug.var_display_max_depth - максимальная выводимая вложенность массивов / объектов (3)


Также есть другие полезные параметры, например:

xdebug.max_nesting_level - ограничение на рекурсивные вызовы функции (100)
xdebug.show_exception_trace - выводить trace также при исключениях, даже если они отловлены (информация о неотловленных исключениях и так выводится) (0).

Полная инфорамция о настройках вывода xdebug есть в его документации здесь:
http://xdebug.org/docs/stack_trace 

среда, 22 июня 2011 г.

Подключение к БД из Eclipse Galileo в Debian Linux

В свежеустановленном Eclipse я не нашел одной важной для меня детали: Data Source Explorer, позволяющего подключаться в БД, выполнять к ней запросы и пр. (в Netbeans этот компонент вроде бы установлен по-умолчанию, по крайней мере, в Windows).
Для его добавления необходимо:

1) В сайты-источники приложений добавить http://download.eclipse.org/releases/galileo, если его там ещё нет (Window -> Preferences, там - в Install/Update -> Avaliable Software Sites), а если есть и не разрешен - разрешить (поставить Enabled)

2) Help -> Install New Software, там выбрать вышеуказанный сайт, снять галочку "Group items by category" (когда она стоит, почему-то половина плагинов не видно), и отметить для установки "Data Tools Platform Connectivity", "Data Tools Platform Enablement", а также плагины, необходимые для работы с различными БД, которые Вам необходимы (я, например, установил "Data Tools Platform Enablement for JDBC" и "Data Tools Platform Enablement for MySQL"). Кроме этого, я установил различные "Data Tools Platform SQL Development Tools ... ".

3) Когда всё установится, делаем Window -> Show View -> Data Source Explorer, или, если его там нет, то Window -> Show View -> Other -> Database Management -> Data Source Explorer. Правда, несмотря на то, что "Data Tools Platform Enablement for MySQL" я установил, пришлось дополнительно устанавливать через Synaptic пакет libmysql-java у при создании соединения в Eclipse вручную указывать путь к коннектору (он лежит в /usr/share/java).

вторник, 21 июня 2011 г.

Отваливающийся звук в Debian на EeePC T101MT

Периодически (в совершенно неопределенный моменты времени, никак по-моему не связанные с моей активностью) отваливается звук в системе: phonon, через который работает amarok, заявляет, что "The audio playback device Intel HDA ... does not work falling back to .", да и вообще во всей системе звук перестает работать, не только через phonon. Перезапуск alsa (/etc/init.d/alsa-utils restart) не помогает. Самое интересное, что через некоторое время всё само собой начинает снова работать. Но естественно, так жить не интересно, без музыки грустно..
Решилась проблема установкой сервера pulseaudio и его запуском (/etc/init.d/pulseaudio start), все сразу заработало, phonon после перезапуска amarok`а его увидел и стал играть через него.
Т.е. теперь получается что-то вроде:
Динамики <-> Железо <-> ALSA-драйвер <-> Pulseaudio Server <-> Xine <-> Phonon <-> Amarok
И да, можно в службах отключить aumix, все равно у меня он при запуске ругается что нашел сохраненные параметры звука alsa и его миксер работать не будет.

воскресенье, 19 июня 2011 г.

Переключение раскладок в LXDE

Поставил LXDE и был неприятно удивален тем, что из раскладок пропала русская, причем никаких графических средств настройки раскладок клавиатуры я там не нашел (lxde-keyboard-control почему-то работать отказался, вываливается с каким-то exception`ом). Пришлось добавлять раскладку из командной строки:

setxkbmap -option grp:switch,grp:alt_shift_toggle us,ru

Чтобы при каждом старте LXDE не делать этого заново, нужно добавить в /etc/xdg/lxsession/LXDE/autostart:

@setxkbmap -option grp:switch,grp:alt_shift_toggle,grp_led:scroll us,ru

пятница, 17 июня 2011 г.

Super Hybrid Engine на Asus EeePC T101MT в Debian Linux

Под виндой для EeePC есть фирменная утилита управления профилями энергосбережения, позволяющая менять их по Fn+Space. Для Linux есть аналог, устанавливается следующим образом:
1) Подключить ppa-репозиторий WebUpd8 (встроенной командой apt-add-repository ppa:webupd8team/jupiter в Ubuntu, ну а в Debian - самописным скриптом add-apt-repository ppa:webupd8team/jupiter natty, который я приводил тут: http://barbitoff.blogspot.com/2011/06/ppa-debian.html)
2) apt-get update
3) apt-get-install jupiter-support-eee
4) Перезагружаемся (без перезагрузки ничего работать не будет). Через меню значка в трее можно менять профиль энергосбережения, отключать тачпад, менять разрешение и ориентацию экрана, а также конфигурацию нескольких дисплеев. И даже Fn+Space работает :)

Также, говорят, данный подход работает и на не-EeePC, пакет достаточно универсальный. Только в таком случае нужно устанавливать просто пакет jupiter, а не jupiter-support-eee.

Установка PDT в Debain (Eclipse 3.5.2)

1) Установить eclipse и eclipse-emf через Synaptic
2) Запустить, зайти в Window -> Preferences, там - в Install/Update -> Avaliable Software Sites. Там нужно добавить (или разрешить, т.е. нажать Enable, если данные URL там уже есть, но запрещены):
- Galileo (http://download.eclipse.org/releases/galileo)
- Dynamic Languages Toolkit (http://download.eclipse.org/technology/dltk/updates/)
- PDT (http://download.eclipse.org/tools/pdt/updates/2.0/)
3) Теперь идем в Help -> Install New Software, там выбираем в списке сверху сайт PDT, выбираем для установки "PDT Runtime Feature". Жмем Next, снова Next, принимаем условия соглашения и нажимаем finish. Ждём пока загрузится / установится.

Теперь можно переключить перспективу на PHP через Window -> Open Perspective -> Other.

среда, 15 июня 2011 г.

Ждущий режим на EeePC T101MT в Debian

Через pm-utils (pm-suspend, pm-hibernate) ни ждущий режим, не спящий почему-то не работают: скрипты из /etc/pm/sleep.d/ и т.п. выполняются, вот только в ждужий / спящий бук все равно не переходит.
Поставил пакет hibernate из репозитория дебиана, теперь по крайней мере работает ждущий режим вызовом hibernate-ram из-под root`a. Для того, чтобы после выхода из ждущего / спящего режимов появлялось окно ввода пароля и отключался AMP винчестера (http://barbitoff.blogspot.com/2011/06/eeepc-t101mt-dabian.html), добавил / раскомментировал в /etc/hibernate/common.conf следующие строчки:

OnResume 99 hdparm -B255 /dev/sda
LockGnomeScreenSaver yes

UP Да, полезно иногда глядеть в логи: в /var/log/pm-suspend.log видно, что возникает ошибка при вызове скрипта /etc/pm/sleep.d/80_egalax_touchscreen, положенного туда пакетом egalax-multitouch-driver-common (из ppa:plippo/t101mt, пакет содержит вспомогательные скрипты для вращения экрана вместе с тачскрином, а этот файл отвечает за загрузку / выгрузку модуля взаимодействия с тачскрином hid_egalax, который в моей конфигурации и не используется т.к. я использую родной драйвер):

/etc/pm/sleep.d/80_egalax_touchscreen suspend suspend:ERROR: Module hid_egalax does not exist in /proc/modules

Выход - удалить /etc/pm/sleep.d/80_egalax_touchscreen или попросту закомментировать там удаление и загрузку модуля. После этого suspend / hibernate работают через pm-utils.

среда, 8 июня 2011 г.

Пример установки webgrind (в Debian)

Для начала, необходимо, чтобы был установлен php5-xdebug и php-services-json (не уверен точно, что он нужен, но вроде бы где-то писали и я поставил, вдруг и самому пригодится :) ). Все директории, описанные далее, актуальны для Debian:

1) Создать алиас для webgrind, чтобы он не путался вместе с остальными сайтами, прописав в apache2.conf (или, как я сделал, в новом файлике /etc/apache2/conf.d/webgrind):

Alias /webgrind /usr/share/webgrind

Для того, чтобы можно было через .htacces отключить профилирование самого webgrind`a (на случай, если в опциях xdebug Вы включите безусловное профилирование всех скриптов, ведь в таком случае скрипт webgrind также будет профилироваться, что, естественно, не очень нужно), разрешим переопределение опций (там же в apache2.conf или /etc/apache2/conf.d/webgrind):

<Directory /usr/share/webgrind>
     AllowOverride Options
</Directory> 



2) Скачать последнюю версию webgrind с официального сайта (http://code.google.com/p/webgrind/downloads/list), распаковать в  /usr/share/webgrind.

3) Разрешить профилирование в xdebug в /etc/php5/apache2/conf.d/xdebug.ini (я разрешил его только по триггеру , т.е. когда в GET/POST указано XDEBUG_PROFILE):
xdebug.profiler_enable = 1
или
xdebug.profiler_enable_trigger = 1

4)  Создать в папке установки/usr/share/webgrind файл .htaccess со следующим содержимым, что отключит профилирование для скриптов самого webgrind:

php_value xdebug.profiler_enable 0 


5) Всё, теперь для проверки запускаем любой скрипт (если включили xdebug.profiler_enable_trigger = 1, то указав ?XDEBUG_PROFILE), набираем http://localhost/webgrind/, выбираем в списке сверху файл профилировки и смотрим результат.

О дополнительных настройках профилировки в xdebug, а также других средствах просмотра результата профилировки, отличных от webgrind, я написал тут: http://barbitoff.blogspot.com/2011/06/xdebug_23.html

Как прикрутить flash в Debian Squeeze (Opera, Chromium, Firefox)

Автоматом флеш плеер у меня не поставился (ругается на неверную хэш-сумму), а gnash мало того, что не работает как надо (видео с Вк, например, не играет), так ещё и проц грузит. Поэтому пришлось ставить руками:

1) Скачать с сайта adobe.com tar.gz архив, распаковать.
2) Содержимое папки usr/ поместить в /usr/
3) libflashplayer.so скопировать в /usr/lib/chromium-browser/plugins/, /usr/lib/opera/plugins/ и /usr/lib/mozilla/plugins/. Ну или скопировать куда-нибудь и сделать в папках plugins ссылки на него (что, конечно, будет корректнее с точки зрения удобства обновления). Перезапустить браузеры.


Щелчки винчестера на EEEPC T101MT в Dabian и как от них избавиться

Очередное решение проблемы с винчестером EeePC T101MT, постоянно паркующего головки, на этот раз для Debian. В отличие от Ubuntu, тут нет /lib/hdparm/hdparm-functions, однако, и от Fedora есть приятное отличие - тут я нашел конфиг hdparm`a: /etc/hdparm.conf, куда и добавил следующие строчки:
/dev/sda {
apm = 255
}
После выхода из спящего/ждущего режима правда снова начинает щелкать, поэтому добавил ещё файлик /etc/pm/sleep.d/72_hdparm (не забыв сделать chmod 755):
#!/bin/sh
# Disable APM on resume|thaw
case "${1}" in
suspend|hibernate)
# nothing
;;
resume|thaw)
hdparm -B255 /dev/sda
;;
esac

вторник, 7 июня 2011 г.

Touchscreen eGalax на EeePC T101MT в Debian

Итак, пара часов в сумасшедших поисках, пара десятков перезагрузок и рецепт, как заставить работать тачскрин EeePC T101MT под Debian Squeeze найден.
Изначально проблема была такая - устройство вроде бы видется (в lsusb его почему-то нет, но xinput list его показывает), вот только независимо от места клика курсор убегает в левый верхний угол. Впрервые столкнулся с таким делом в Дебиане, в Убунте и Федоре все работало из коробки (в Убунте правда я ещё доставлял egalax-multitouch-driver-common из ppa:plippo/t101mt для удобных функций вращения экрана вместе с тачем на 90/180/270 градусов). Перепробовал различные конфиги через evdev / evtouch, ничего не помогало. Место клика перемещалось по экрану, однако все равно от места реального прикосновения к экрану никак не зависело.
В итоге после следующих действий все заработало, причем, в отличие от предыдущих Линухов с работающим "из коробки" тачем, у меня в руках оказалось ещё и средство калибровки от производителя:
1) Отключить работу тачскрина через evdev: в файле /usr/share/X11/xorg.conf.d/10-evdev.conf я закомментировал все блоки "Section", связанные с тачскрином (иначе события тачскрина будут обрабатываться дважды - и родным драйвером, и evdev`ом; блок, связанный с "Tablet", я тоже на всякий случай закомментировал):
#Section "InputClass"
# Identifier "evdev tablet catchall"
# MatchIsTablet "on"
# MatchDevicePath "/dev/input/event*"
# Driver "evdev"
#EndSection
#Section "InputClass"
# Identifier "evdev touchscreen catchall"
# MatchIsTouchscreen "on"
# MatchDevicePath "/dev/input/event*"
# Driver "evdev"
#EndSection
2) Сгенерировать конфиг иксов, которого в дебианоподобных системах нет (а он будет нужен установщику родного драйвера eGalax):
CTRL + ALT + F1 (переведет систему в консольный режим, из которого можно будет вернуться нажатием ALT + F7)
зайти под рутом (ну или делать все следующие действия через sudo)
service gdm3 stop
Xorg -configure
mv /root/xorg.conf.new /etc/X11/xorg.conf
service gdm3 start
3) Скачать и распаковать родной егалаксовский драйвер:
http://home.eeti.com.tw/web20/eGalaxTouchDriver/linuxDriver.htm
По ссылке имеются версии драйвера для версий ядра 2.4.x и 2.6.x, узнать, какая версия ядра у Вас, можно, набрав в консоли uname -r.

4) Запустить из-под рута setup.sh. Ответить на вопрос, к чему подключен экран, 3 вариант, т.е. USB. Перезагрузиться.

5)  Запустить eGalaxTouch, поковыряться в настройках, откалибровать по 4 точкам.

И всё, должно наступить счастье =)

Добавление ppa-репозиториев в Debian

Для Ubuntu есть очень полезный способ получения пакетов - репозитории типа ppa (имеют адрес вида ppa:user/ppa-name, прочитать про них можно тут). В Ubuntu ppa-репозитории добавлялись с помощью команды apt-add-repository, в Debian же её нет, поэтому приходится использовать собственный скрипт (взял я его тут: http://blog.anantshri.info/howto-add-ppa-in-debian/ и немного доделал, добавив возможность выбирать дистибутив Ubuntu, пакеты для которого будут загружаться из репозитория). Вот исходный текст срипта:


#!/bin/bash
if [ $# -ge 1 ]
then
ppa_name=`echo "$1" | cut -d":" -f2 -s`
if [ -z "$ppa_name" ]
then
echo "PPA name not found"
echo "Utility to add PPA repositories in your debian machine"
echo "$0 ppa:user/ppa-name [ubuntu-distributive]"
echo "For example: $0 ppa:mozillateam/firefox-stable maverick"
else
echo "$ppa_name"
if [ $# -eq 1 ] #запущен с 1 параметром - дистрибутив по-умолчанию lucid
then
ubuntuver='lucid'
else
ubuntuver=$2
fi
echo "$ubuntuver"

echo "deb http://ppa.launchpad.net/$ppa_name/ubuntu $ubuntuver main" >> /etc/apt/sources.list
apt-get update >> /dev/null 2> /tmp/apt_add_key.txt
key=`cat /tmp/apt_add_key.txt | cut -d":" -f6 | cut -d" " -f3`
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $key
rm -rf /tmp/apt_add_key.txt
fi
else
echo "Utility to add PPA repositories in your debian machine"
echo "$0 ppa:user/ppa-name [ubuntu-distributive]"
echo "For example: $0 ppa:mozillateam/firefox-stable maverick"
fi

Можно поместить его, например, в /usr/sbin, назвав add-apt-repository, не забыв дать права 755 и сменив владельца на root:
chmod o+x /usr/sbin/add-apt-repository
chown root:root /usr/sbin/add-apt-repository

Теперь добавлять ppa-репозитории (для примера я добавляют репозиторий с пакетами для нетбука eeepc t101mt) можно так:

sudo add-apt-repository ppa:plippo/t101mt

или

sudo add-apt-repository ppa:plippo/t101mt natty

Именно второй вариант работает, т.к. по-умолчанию в скрипте стоит дистрибутив lucid (10.04), но его почему-то apt не находит (при попытке apt-get update вылезают ошибки 404). В таких случаях версия дистрибутива, для которой пакет есть, подбирается вручную.
Правда, использование ppa не всегда помогает - например, поставить Firefox из ppa все равно не полуится - она зависит от пакетов, которые есть в Ubuntu, но отсутствуют в Debian. Подцеплять же весь убунтовский репозиторий в список репозиториев apt (/etc/apt/sources.list) - не вариант, в таком случае apt захочет снести пол-дебиана и заменить его на убунтовские версии пакетов,

Запись ISO-образа операционной системы на флешку в Linux

Для Linux существует аналог Universal USB Installer под Win, позволяющий записать на флешку загрузочный ISO-образ (а также скачать образ выбранной ОС при необходимости): unetbootin. Скачать его можно с официального сайта (http://unetbootin.sourceforge.net/) или из репозитория ОС. Существует также его версия по Win, но я лично её не пробовал.

пятница, 3 июня 2011 г.

Поддержка mp3 в Fedora 16

sudo yum install gstreamer-plugins-ugly gstreamer-plugins-bad gstreamer-ffmpeg xine-lib-extras-freeworld

(сначала нужно подключить доп. репозитории как написано здесь: http://barbitoff.blogspot.com/2011/06/fedora-15.html)

Помимо этого, я также установил все пакеты, начинающиеся с gstreamer-plugins-bad (-free, -nonfree и ещё какие-то).
После этого mp3 заработал в Amarok (и в Rythmbox тоже).

Добавление в Fedora 16 репозиториев с пакетами, не вошедшими в официальный репозиторий из-за политики авторских прав

Некоторые пакеты (например, необходимые для декодирования mp3), не входят в официальный репозиторий Федоры. Их можно установить, добавив с список репозиторием RPMFusion:

sudo rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm

sudo rpm -ivh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm

Для ускорения процесса обновления желательно сначала установить плагин fastestmirror для yum:

sudo yum install yum-plugin-fastestmirror