Показаны сообщения с ярлыком Linux. Показать все сообщения
Показаны сообщения с ярлыком Linux. Показать все сообщения

 О чем речь (цитаты хайпующего в настоящий момент в лентах новостей deepseekа):

  1. Quansheng UV-K5 — это недорогая портативная радиостанция с поддержкой диапазонов VHF и UHF, широким функционалом, возможностью модификации прошивки и программирования, популярная среди радиолюбителей и профессионалов.
  2. Прошивка — это изменение или обновление встроенного программного обеспечения радиостанции, которое влияет на ее базовую функциональность.
  3. Программирование — это настройка параметров работы радиостанции в рамках ее текущей прошивки.

В сети полно инструкций про Windows, я коротко расскажу про работу со станцией под Linux

1. Кабель.

Для прошивки и программирования подходит один и тот же кабель. Самый обычный, совместимый с популярными аналоговыми Баофенгами вроде Baofeng BF-888S.

Кабель работает под Linux из коробки, определяется как USB Serial, цитата из вывода команды dmesg:

[   69.062664] usb 3-1: new full-speed USB device number 4 using xhci_hcd

...

[   69.274720] usb 3-1: ch341-uart converter now attached to ttyUSB0

Если у пользователя не хватает прав для работы с портом, скорее всего поможет добавление в  группу dialout (команда sudo usermod -a -G dialout $USER) и последующий ребут. 

2. Прошивка

Технологии дошли до того, что прошить радиостанцию (в том числе под Linux) можно прямо из браузера, но душа ретрограда требует консольной утилиты, и такая есть — k5tool.

Утилита на писана на C#, для ее работы нужно накатить в систему пакет mono-runtime (для debian-подобных дистрибутивов — командой sudo apt install mono-runtime), после чего утилиту можно запускать скриптом k5tool из корня скачанного git-репозитория.

Порт ttyUSB0 утилита распознает сама, указывать его требуется.

Далее нужно выбрать прошивку. Я выбрал прошивку egzumer, как достаточно функциональную, с хорошей документацией и прозрачной разработкой на githubе.

Перед манипуляциями рекомендуется забекапиться.

  1. Сделаем бекап калибровки:
    k5tool -rdee 0x1E00 0x0200 eeprom-calib.raw
  2. И бекап памяти eeprom целиком:
    k5tool -rdee
  3. После чего прошьем прошивку (это действие нужно проводить в особом режиме — рацию нужно включить с зажатой клавишей PTT, все остальные действия в статье работают на включенной обычным образом рации):
    k5tool -wrflash ./egzumer_v0.22.packed.bin
Готово, можно слушать дальнобойщиков на 27,135 МГц!

3. Программирование

Для программирования радиостанций под Linux есть популярная графическая программа — chirp. В сети много информации про плагины к ней для различных кастомных прошивок, но в первую очередь — смотрите документацию на выбранную прошивку. Так, с прошивкой egzumer, все просто — свежий chirp поддерживает ее из коробки (уже имеет встроенный плагин), в том числе позволяет настраивать специфичные для этой кастомной прошивки параметры. То, что chirp распознал прошивку, можно увидеть в окне Radio -> Download from radio... по надписи "Quansheng UV-K5 egzumer".

Официальная документация chirp рекомендует использовать для установки менеджер пакетов pipx, я же ограничился Debianовским aptом:

  1. Установил зависимости (полный список зависимостей см. в requirements.txt):
    sudo apt install python3-wxgtk4.0 python3-serial python3-requests python3-suds python3-yattag python3-lark
  2. После чего chirp можно запускать командой ./chirpwx.py из корня скачанного git-репозитория chirp.

Ссылки по теме UV-K5 


UPDATE МАРТ 2020: Яндекс актуализировал описание на официальном сайте, следует ориентироваться на него.

2020-й год, Yandex.Browser версии 19.12.3.332, Debian 10 Buster и сайт с DRM-видео, на примере Кинопоиск HD.

Трейлеры воспроизводятся, т.е. можно предположить, что с кодеками все в порядке. Однако при попытке воспроизведения купленного фильма видим: «Пожалуйста, подождите, идет настройка браузера для проигрывания видео. Для ручной настройки ознакомьтесь с инструкцией».

В своей инструкции Яндекс и авторы других прошлогодних инструкций предлагают распаковать libwidevinecdm.so в /opt/yandex/browser-beta/. Не помогает! Утилита lsof показывает, что файл libwidevinecdm.so браузером не открыт, а с помощью strace выясняется, что Яндекс.Браузер ищет  библиотеку в каталоге /opt/yandex/browser-beta/WidevineCdm/_platform_specific/.

Вот исправленная рабочая версия инструкции:


  1. Проверьте версию браузера. Если версия ниже 18.11.1, обновите браузер;
  2. Скачайте архив плагина Widevine Content Decryption Module;
  3. Извлеките из архива файл libwidevinecdm.so;
  4. Разместите его по пути
    /opt/yandex/browser-beta/WidevineCdm/_platform_specific/linux_x64/
    ;
  5. Измените права доступа к файлу libwidevinecdm.so на 644.


Устройство клавиатуры можно найти по имени в каталоге "/dev/input/by-id/". Возможно, нужно будет сменить владельца на текущего пользователя:
sudo chown user:user /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd 
Далее для снятия дампа в hex-виде предлагаю такую замысловатую команду:
sleep 1 ; hexdump -e '24/1 " %02X" "\n"' /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd & sleep 5 ; pkill hexdump
Здесь через 1 секунду (sleep 1, чтобы нажатие Enter не попало в дамп) начнется захват данных с клавиатуры, будет выводиться по 24 байта на строку (24/1), еще через 5 секунд (sleep 5) захват будет остановлен (pkill hexdump, чтобы мы смогли вновь пользоваться клавиатурой после снятия дампа).
Пример вывода, где пару раз была нажата кнопка F1:
sleep 1 ; hexdump -e '24/1 " %02X" "\n"' /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd /dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd & sleep 5 ; pkill hexdump
[1] 14693
 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 04 00 04 00 3A 00 07 00
 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 01 00 3B 00 01 00 00 00
 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 00 00 00 00 00 00 00 00
 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 04 00 04 00 3A 00 07 00
 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 01 00 3B 00 00 00 00 00
 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 00 00 00 00 00 00 00 00
 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 04 00 04 00 3A 00 07 00
 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 01 00 3B 00 01 00 00 00
 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 00 00 00 00 00 00 00 00
 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 04 00 04 00 3A 00 07 00
 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 01 00 3B 00 00 00 00 00
 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 00 00 00 00 00 00 00 00
Input-устройства выдают данные пакетами. Каждый пакет — структура input_event:
struct input_event {
 struct timeval time;
 __u16 type;
 __u16 code;
 __s32 value;
};
Структура имеет размер 24 байта (на 64-битной системе), именно поэтому выше мы выводили дамп по 24 байта на строку.

Первое поле структуры input_event — также структура, timeval. Использовалась 64-битная система, поэтому timeval состояла из двух 64-битных (по 8 байт) целых чисел — значения секунд и микросекунд. По первым 8 байтам каждой строки дампа видно, как меняется значение секунд (почти не меняется, только первый байт поменялся с 15 на 16, когда секунда "тикнула"). Следующие 8 байт каждой строки отвечают за микросекунды, а потому меняются хаотично (нажатие/отпускание кнопки F1 приходилось на произвольную долю секунд).

А самое интересное происходит в последних восьми байтах каждой строки дампа. Сначала идет двухбайтное поле type — его значение менялось с 4 (EV_MSC — некая дополнительная информация, разбирать ее не будем) на 1 (EV_KEY — непосредственно событие кнопки клавиатуры) и 0 (EV_SYN — разделитель).

Разберем события EV_KEY, их было всего 4:
 15 87 FC 5D 00 00 00 00 40 CA 07 00 00 00 00 00 01 00 3B 00 01 00 00 00
 15 87 FC 5D 00 00 00 00 3E C4 08 00 00 00 00 00 01 00 3B 00 00 00 00 00
 16 87 FC 5D 00 00 00 00 37 C4 08 00 00 00 00 00 01 00 3B 00 01 00 00 00
 16 87 FC 5D 00 00 00 00 75 60 09 00 00 00 00 00 01 00 3B 00 00 00 00 00
За полем event следует также двухбайтное поле code — код клавиши. В нашем случае — 3B в hex или 59 в десятичном виде. Смотрим файл input-event-codes.h. Действительно, 59 — это код клавиши F1.

И, наконец, последнее поле — четырехбайтное value. Здесь все просто: значение 1 соответствовало нажатию клавиши F1, значение 0 — отпусканию.

CMake-ковский CPack в Debian “wheezy” не справляется с созданием deb-пакета, если в RPATH прописан $ORIGIN. CMake вываливается с ошибкой вида:
$ORIGIN используется в RPATH (...)  и соответствующий каталог невозможно определить из-за отсутствия подкаталога DEBIAN в корне дерева сборки пакета
Или, для CLANG=C:
CPackDeb: dpkg-shlibdeps: dpkg-shlibdeps: warning: $ORIGIN is used in RPATH of ... and the corresponding directory could not be identified due to lack of DEBIAN sub-directory in the root of   package's build tree
Беда в том, что каталог "debian" есть, но название его состоит из маленьких букв, а не больших, как того хочет dpkg-shlibdeps.

Есть простенький патч для модуля CPackDeb.cmake, решающий эту проблему.

Однако, если нет возможности пропатчить CMake, то обойти проблему можно следующим, хоть и довольно грязным, костылем: прописать установку какого-нибудь файла, можно даже пустого, в каталог /DEBIAN:
install(FILES dirty_fix.txt DESTINATION /DEBIAN)
Вполне допускаю, что на основе этого костыля можно соорудить костыль поизящней, например удалять файл во время сборки, чтобы он не попадал в deb-пакет. В этом смысле совет выше можно рассматривать как направление, куда в дальнейшем копать.

В свежеустановленной Astra Linux не работала функция gtk_show_uri() с URI типа ghelp.

В GError при этом можно было увидеть ошибку:
'Действие не поддерживается'.
Или, с LANG=C:
'Operation not supported'.

Естественно, yelp был установлен.
Вопреки некоторым советам из интернетов, gvfs тут ни при чем.
Проблема решилась установкой пакета desktop-file-utils.

Задача следующая:
  • У вас есть образ раздела (скажем, sda1), но не всего диска (sda). Т.е. без таблицы разделов. Образ сделан с помощью старого доброго dd.
  • Нужно из него создать диск для VirtualBox'а (или другой виртуальной машины, например, VMware).
Решение:
  1. Создаем пока пустой файл myvm.img для будущего образа диска (всего диска, в т.ч. с разделами). Размер файла выбираем исходя из размера образа, но с запасом, чтобы поместилась еще и таблица разделов. Скажем есть образ в 99 Гб, возьмем сильно с запасом и создадим файл под образ диска в 100 Гб:
    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
  2. Разметим файл утилитой fdisk (нужно создать раздел и не забыть сохранить изменения командой 'w'):
    fdisk myvm.img
  3. Теперь сделаем полученный образ с разделами доступным в виде устройств в /dev:
    sudo kpartx -a myvm.img
  4. Копируем образ нашего раздела поверх раздела во вновь созданном файле:
    sudo cp sda1.raw /dev/mapper/loop0p1
  5. Можно, чтобы не пропадало место (тот самый "запас"), расширить файловую систему на разделе (учтите, что утилита resize2fs работает только с системами семейства ext{2-4}!):
    sudo resize2fs /dev/mapper/loop0p1
  6. Теперь можно убрать наш файл myvm.img из /dev:
    sudo kpartx -d myvm.img
  7. Получился "сырой" образ диска с таблицей разделов и собственно нашим разделом. Осталось сконвертировать его в формат нужной виртуальной машины. Для VirtualBox:
    VBoxManage convertdd myvm.img myvm.vdi --format VDI
    Для VMware:
    VBoxManage convertdd myvm.img myvm.vmdk --format VMDK
  8. Готово.
 Если на разделе установлена система и необходимо ее загрузить, то можно для начала загрузиться с какого-нибудь Live-образа, подмонтировать раздел и стандартным для этой системы способом восстановить загрузчик.

Ссылки:
  1. Алгоритм создания образа диска из образа раздела в обсуждении на stackexchange.com;
  2. Статья о конвертации 'сырых' образов дисков в формат образов для виртуальных машин (и обратно);
  3. Про восстановление загрузчика grub в треде на askubuntu.com.

Итак, есть планшет Acer Iconia Tab W511 (или другой, столь же кривой, т.е. на x86, но без поддержки Linux). Требуется запустить на нем Linux-программу с графическим интерфейсом (не портированную под win32, в т.ч. под cygwin). Пусть хоть в режиме тонкого клиента.

Решение — XServer под виндой (я выбрал Cygwin/X) и ssh-сервер на Linux-машине.

Алгоритм следующий:
  1. На Linux-машине должен быть поднят ssh-сервер;
  2. На планшете накатываем cygwin вместе с XServer-ом и ssh-клиентом отсюда (см. раздел "Downloading and Installing"). При установке не забываем (иначе придется переставлять cygwin заново) поставить пакеты xorg-server, xinit и openssh (зачем — см. здесь, пункт 15). Есть смысл сразу же накатить еще subversion и wget, чтобы иметь возможность в любой момент доставлять пакеты с помощью apt-cyg;
  3. Запускаем Cygwin Terminal (ярлык на рабочем столе);
  4. В Cygwin Terminal запускаем команду "startxwin.exe". Открывается классический xterm;
  5. В xterm запускаем ssh-клиент примерно так: "ssh -Y user@host", user и host меняем на пользователя и IP Linux-машины;
  6. После логина в ssh получаем командную строку Linux-машины, где можем запускать графические программы с выводом сюда же, на экран планшета (даже мультитач в GIMP'е работает). См. gedit на скриншоте ниже.
UPD: Если канал слаб, то можно попробовать связку NX Client и FreeNX сервер. Само собой, это потребует дополнительных телодвижений (например, установки сервера на Linux-машину, которого, к тому же, может не быть в репозитории).

В гите есть встроенные средства для создания и накладывания патчей. Но по умолчанию git не сохраняет сообщения коммитов "как есть" и изменяет время коммитов на время, когда были наложены патчи. Из-за этого меняются хэши коммитов. Что особенно неприятно если у вас есть два репозитория и один является субмодулем (git submodule) другого (т.к. основной репозиторий проверяет актуальность субмодуля именно по хэшу, который в данном случае не будет совпадать).

Чтобы сохранить комментарии и время коммитов патч нужно формировать командой:
git format-patch -k --stdout $HASH > ./patch_file
Где $HASH — хэш коммита, начиная с которого изменения необходимо сохранить в патче.
Накладывать полученный патч следует командой (одной строкой):
GIT_COMMITTER_NAME='Paul' GIT_COMMITTER_EMAIL='paul@example.com' git am -k --committer-date-is-author-date < patch_file
Где Paul — имя автора коммитов из патча, paul@example.com — адрес его почты (как указано в конфиге гита).

UPD:  если использование патчей не является обязательным условием, а нужен механизм синхронизации репозиториев как таковой, то возможно вам стоит копнуть в сторону git bundle.

Марк со своей Убунтой перешел на расположение кнопок в заголовке окна слева.
Стив уже давно проповедует именно такой стиль.
Быть может это действительно удобно и есть в этом смысл?

Чтобы это проверить, я решил переоборудовать свой IceWM под такую схему расположения кнопок.

Для этого в настройках (файл /home/USER/.icewm/preferences) нужно выставить следующие опции:

# Titlebar buttons supported by theme
TitleButtonsSupported="xim"
# Titlebar buttons from left to right
TitleButtonsLeft="xim"
# Titlebar buttons from right to left
TitleButtonsRight=""


Если вы (как и я) разворачиваете-сворачиваете окно по двойному клику по заголовку, можете также соответствующую кнопку убрать совсем:
# Titlebar buttons from left to right
TitleButtonsLeft="xi"

Перезапускаем IceWM.

Если не сработало и кнопки по-прежнему справа, возможно их расположение жестко прописано в теме.

Открываем файл настроек темы (если тема установлена локально для пользователя, то этот файл лежит в /home/USER/.icewm/themes/THEME_NAME/default.theme) и комментируем строки, относящиеся к кнопкам в заголовке окна (опции, начинающиеся с 'TitleButtons'). Например:
#TitleButtonsLeft=""
#TitleButtonsRight="xmi"
#TitleButtonsSupported="xim"
Перезапускаем IceWM. Теперь должно заработать.

Как известно, тире на клавиатуре набрать не так-то просто, поэтому в большинстве своем в интернете мы встречаем лишь один знак — дефис. Подробнее об этой орфографической и типографической трагедии можно прочесть в статье "Тире, минус и дефис, или Черты русской типографики". Знак минуса пока оставим в покое, а вот тире попробуем все же отыскать. Поможет нам в этом клавиша Compose.
Для начала ее следует назначить. В еще нормальных старых-добрых дистрибутивах сделать это можно было с помощью добавления соответствующей опции в секцию "XkbOptions" конфига иксов xorg.conf. Например, для назначения правого Alt-а (самый популярный вариант) в качестве Compose следует добавить фразу "compose:ralt", чтобы секция выглядела примерно так:

Option "XkbOptions" "grp:caps_toggle,grp_led:caps,compose:ralt"

В новых дистрибутивах "XkbOptions" можно редактировать через xml-конфиги hal-а, или (в случае Убунты) через "/etc/default/console-setup". Подробности ищите в документации к вашему дистрибутиву.

После назначения клавиши (и перезагрузки иксов/компьютера) заветный знак тире доступен по тройному нажатию дефиса с зажатой compose-клавишей.

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

Часто в руководствах и блогах даются советы добавить строку "export GTK_IM_MODULE=xim" (или то же с "QT_IM_MODULE") например в "/etc/environment". Qt-приложения не проверял, GTK-... у меня работают и без установки переменной окружения.

Неприятным сюрпризом стал конфликт Compose с xmodmap (см. статью про переназначение клавиш). Пришлось отказаться от переназначения правых Alt и win-клавиш, закомментировав пару соответствующих строк в "./.xmodmaprc" (благо пользуюсь исключительно левыми).

Любители кастомизации в файле "~/.XCompose" могут задать и свои собственные compose-последовательности (см. опять же).

Без вступления скажу, что Linux и гитара вполне себе совместимы, чем конечно же Америку не открою (см. кучу статей в гугл по запросу "linux гитара").
В замечательной статье по ссылке можно найти список полезных программ с их краткими описаниями.
От себя же просто хочу добавить описание одной обойденной вниманием в данной статье софтине - тюнере для гитары и (как видно из названия программы) не только для гитары - lingot.
Программа очень проста и наглядна (интерфейс в стиле аналогового тюнера):
Можно запускать и сразу начинать настройку инструмента без предварительной настройки программы =)

По умолчанию конфиг лежит в ~/.lingot/lingot.conf.
При наличии нескольких инструментов авторы резонно рекомендуют использовать соответственно и несколько конфигов. При запуске lingot с опцией "-c краткое_имя" автоматически создается/используется конфиг ~/.lingot/краткое_имя.conf.

Пользователей OSS (в т.ч. меня) порадует, что программа не заточена под ALSA (как некоторые современные медиаприложения под linux). Для настройки через микрофон в OSS мне пришлось лишь подключить его в гнездо звуковой карты и поднять ползунок IGain в микшере aumix. При этом ползунок "Mic" (если вам не требуется слышать усиленный звук из колонок) можно оставить на нуле.

Пара советов как привести изначально унылый внешний вид OpenOffice и Java-приложений к стилю программ на Gtk:



OpenOffice.org

Создаем файл /etc/profile.d/openoffice.sh со следующим содержанием:

#
# /etc/profile.d/openoffice.sh

export SAL_USE_VCLPLUGIN=gtk
export OOO_FORCE_DESKTOP=gnome
Теперь достаточно перелогиниться в системе, необходимые настройки подхватятся.

Java

Создаем файл /etc/profile.d/gtkjava.sh со следующим содержанием:
#
# /etc/profile.d/gtkjava.sh
export _JAVA_OPTIONS=" -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel \
-Dawt.useSystemAAFontSettings=on"
Также перелогинимся.

Пошаговое мини-howto, описывающее как расшарить сканер между linux-системами по аналогии с сетевым принтером.
Предполагаем, что локально сканер на сервере настроен и работает (см. sane).
Теперь нужно выполнить следующие действия:

На сервере:
1) Ставим демон saned (входит в состав разных пакетов, в зависимости от дистрибутива, наример sane-utils или sane-server).
2) В /etc/sane.d/saned.conf добавляем ip клиента(ов) (см. примеры в том же файле).
3) Создаем файл /etc/xinetd.d/saned (для автоматического запуска сервера сканирования сетевым демоном xinetd) вида:

service sane-port
{
disable = no
socket_type = stream
protocol = tcp
user = scanner
wait = no
server = /usr/sbin/saned
}
(здесь предполагается, что в системе присутствует пользователь "scanner" с правами на доступ к сканеру. конечно можно задать пользователя, от имени которого будет запускаться демон saned, по желанию. root строго не рекомендуется)
4) Выполняем команду (чтобы xinetd подхватил созданный нами файл):
$ sudo /etc/init.d/xinetd reload

На клиенте:
5) В /etc/sane.d/net.conf добавляем строку с ip сервера.
6) Пускаем xsane, сканируем, радуемся.

Что такое dwm...

...можно прочитать например здесь (динамический фреймовый оконный менеджер и т.п.).
Заинтересовавшимся про настройку можно (и нужно) почитать здесь.

Я же опишу свои самые первые шаги по освоению dwm, а именно его установку.
Первоначальные действия по распаковке (я ставил в домашнюю директорию) и сборке:

# Будем ставить в домашнюю директорию, в скрытый каталог .dwm
mkdir .dwm
cd ./.dwm/
# Распаковываем
tar -zxf /<PATH_TO_DWM>/dwm-<VER>.tar.gz
# Складываем файлы из архива сюда же в ~/.dwm
mv ./dwm-*/* ./
rmdir ./dwm-*/
# Первоначальные настройки в config.h =)
vim ./config.h
# Компилим
make

PATH_TO_DWM - путь к архиву, VER - версия в имени файла. Архив с новой версией можно взять на сайте dwm.

Если вдруг компиляция валится с ошибкой вида:
/usr/include/X11/Xlib.h: В функции 'XSetOMValues'
/usr/include/X11/Xlib.h:3573: ошибка: expected declaration specifiers before '_X_SENTINEL'

...ситуацию поможет исправить добавление данного ключа к переменной CFLAGS в файле config.mk (именно в Xfuncproto.h лежат нужные для сборки макросы):
-include /usr/include/X11/Xfuncproto.h
Далее создадим простенький скрипт запуска (скрипт взят из README из поставки dwm):
~/.dwm$ echo '    while true
do
echo `date` `uptime | sed 's/.*,//'`
sleep 1
done | ~/.dwm/dwm' > DWM
~/.dwm$ chmod +x ./DWM

Теперь о двух способах, которыми я организовал запуск dwm в двух различных системах (AltLinux Desktop 4 и Ubuntu 8.10):


Первый способ

В AltLinux я просто произвел первоначальные настройки по аналогии с альтовским спеком, а именно создал файл /etc/X11/wmsession.d/23dwm со следующем содержанием:

NAME=DWM
DESC=Light and fast window manager
EXEC=/home/USER/.dwm/DWM
SCRIPT:
exec /home/USER/.dwm/DWM

, где USER, конечно, - имя вашего пользователя (как часть пути в домашний каталог).


Второй способ

Как я ставил на Ubuntu.
Поставил пакет из репозитория и увидел, что в убунте путь к бинарику dwm из коробки задается с помощью системы альтернатив (подробней об альтернативах здесь):
~/.dwm$ ls -l /usr/bin/dwm
lrwxrwxrwx 1 root root 21 2008-06-05 17:07 /usr/bin/dwm -> /etc/alternatives/dwm
~/.dwm$ ls -l /etc/alternatives/dwm
lrwxrwxrwx 1 root root 20 2008-11-26 11:37 /etc/alternatives/dwm -> /usr/bin/dwm.default

Так что легко можно добавить свой бинарик dwm в качестве альтернативы с сохранением системного:
~/.dwm$ sudo update-alternatives --install /usr/bin/dwm dwm /home/<USER>/.dwm/DWM 23

Смотрим что вышло:
~/.dwm$ update-alternatives --display dwm
состояние dwm: auto.
ссылка сейчас указывает на /usr/bin/dwm.default
приоритет /usr/bin/dwm.default: 100
приоритет /usr/bin/dwm.web: 50
приоритет /home/<USER>/.dwm/DWM: 23
Текущая `лучшая' версия: /usr/bin/dwm.default.

И выставим свой бинарик dwm по умолчанию:
~/.dwm$ sudo update-alternatives --set dwm /home/<USER>/.dwm/DWM
Используется `/home/<USER>/.dwm/DWM' для предоставления `dwm'.

Всё, теперь наш dwm готов к запуску (его можно выбрать в том же gdm в меню выбора сеанса).

После обновления с AltLinux Desktop 4.0 до 4.1 приказал долго жить bootsplash.

Как выяснилось новая тема design-bootsplash-desktop не поддерживает установленное у меня разрешение фреймбуфера (1280x1024), о чём на данный момент висит соответствующая бага.

Вот мои действия по лечению проблемы:

1) Смотрим доступные разрешения:


$ ls /etc/bootsplash/themes/desktop/config/bootsplash-*.cfg
/etc/bootsplash/themes/desktop/config/bootsplash-640x480.cfg
/etc/bootsplash/themes/desktop/config/bootsplash-800x600.cfg

2) Выбираем то, что побольше - 800x600.
Пропишем загрузчику соответствующее разрешение. Для lilo - строчка "vga=0x314" в файле /etc/lilo.conf. Не забудем там же прописать ядру параметр "splash=silent".

3) И уходим в ребут...
4) Проверим разрешение фреймбуфера с помощью утилиты fbresolution:

# fbresolution
800x600

5) Выставим тему desktop в файле /etc/sysconfig/bootsplash:

THEME="desktop"

6) Перегенерим initrd (initial ramdisk) с помощью mkinitrd:

# cd /boot/
# mv initrd-`uname -r`.img initrd-`uname -r`.img.bak
# /sbin/mkinitrd --verbose initrd-`uname -r`.img `uname -r`

mkinitrd представляет из себя скрипт, который, кроме всего прочего, прописывает bootsplash из текущей темы (берёт её из /etc/sysconfig/bootsplash) для текущего разрешение фреймбуфера (разрешение берется из вывода утилиты fbresolution).

Результат:

Опишу как настроить мышь Apple MightyMouse на примере AltLinux Desktop 4.1 (в том числе горизонтальный скроллинг).


В первую очередь добавим udev-правило в каталоге /etc/udev/rules.d/. Cледует добавлять в файл, стоящий по алфавиту раньше правил по умолчанию 50-udev-default.rules. Само правило:

#For mightymouse

KERNEL=="mouse*|mice|event*", SYSFS{idVendor}=="05ac", SYSFS{idProduct}=="0304", NAME="input/%k", MODE="0640", SYMLINK="input/mightymouse"


После перезагрузки проверим доступна ли мышь по новой ссылке с помощью утилиты evtest:
# evtest /dev/input/mightymouse

Теперь пропишем мышь в /etc/X11/xorg.conf:

Section "InputDevice"

Identifier "mightymouse"

Driver "evdev"

Option "SendCoreEvents"

Option "Device" "/dev/input/mightymouse"

Option "Name" "Primax Electronics Apple Optical USB Mouse"

Option "HWHEELRelativeAxisButtons" "7 6"

Option "Buttons" "9"

EndSection


После перезагрузки иксов:
# /etc/init.d/dm restart
практически всё должно работать, в т.ч. горизонтальный скроллинг (например в GIMP'е). Для решения проблем горизонтального скроллинга в Firefox см. по ссылке.

И в заключение - полный список соответствий всех кнопок. Например button8 (левая боковая кнопка на мыши) в Firefox забиндина на действие "Назад".

Кратко о том, как перевести WxWidgets-приложение. На примере fityk-0.8.6.
Это ни в коем случае не how-to по gettext и WxWidgets, а просто ориентир куда копать за дальнейшими знаниями.

1) Скачиваем архив, распаковываем, переходим в распакованный каталог.
Следующими пунктами выполним минимальные (см. здесь и здесь) действия по подготовке кода к переводу .
2) $ vim ./src/wxgui/app.h
В конце класса FApp добавляем строку:

wxLocale ss_locale;

3) $ vim ./src/wxgui/app.cpp
В начале FApp::OnInit(void) добавляем строки:
if(ss_locale.Init())
ss_locale.AddCatalog(wxT("fityk.mo"));

Для примера будем просто грузить fityk.mo, который в следующих шагах сформируем.

4) $ vim ./src/wxgui/frame.cpp
Помечаем в файле строки, подлежащие переводу, для чего нужно заменить wxT() на макрос _() (см. доки WxWidgets)
Для примера:
Было:
append_mi(help_menu, ID_H_CONTACT, GET_BMP(bug16), wxT("&Report a Problem"),
Стало:
append_mi(help_menu, ID_H_CONTACT, GET_BMP(bug16), _("&Report a Problem"),
5) Собираем строки, подлежащие переводу в .po-файл (подробней см. по ссылке). Xgettext ищет вхождения _() в текстах и формирует .po-шаблон:
xgettext -C -n -k_ -o fityk.po ./src/wxgui/*.cpp
6) Непосредственно переводим .po-файл, например с помощью редактора poedit:
poedit ./fityk.po


7) Форимируем итоговый .mo-файл с переводами строк:
msgfmt -o fityk.mo fityk.po
8) Собираем и запускаем fityk
./configure
make
sudo make install
fityk

"Хозяюшке на заметку": автоматически откадрировать отсканированные изображения, удалив темные области по краям, можно простой командой (выполнять в директории с изображениями):

for file in $(ls); do mogrify -fuzz 75% -trim $file; echo $file'        [DONE]' ; done

Было:

Стало:

Оптимальный эффект достигается подбором чувствительности ("fuzz") в процентах.
Конечно, не забудьте сделать backup директории, т.к. mogrify в отличие от convert переписывает исходные файлы (для подробностей см. сайт ImageMagick).

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

Я пошел по пути наименьшего сопротивления и установил пакет kdebluetooth со всеми необходимыми зависимостями (в т.ч. пакет bluez-utils - основное linux-решение для такого рода задач).

Теперь подключаем наш bluetooth usb-адаптер и смотрим вывод dmesg и lsusb для того, чтобы убедится, что ОС его благополучно определила.

Дальше создадим файл /usr/local/bin/ssbt (start-stop bluetooth) со следующем содержанием:


#!/bin/sh
USER=some_user
export DISPLAY=:0.0

ps aux | grep kbtobexclient > /dev/null 2>&1
if [ $? == 0 ]; then
echo "Already running!"
exit 1;
fi

/etc/init.d/bluetooth start
su - $USER -c "kbluetoothd"

su - $USER -c "kbtobexclient"

/etc/init.d/bluetooth stop
killall kbluetoothd


Не забудем сделать его исполняемым и заменить "some_user" на имя своего пользователя.
Этот скрипт будет поднимать всю необходимую систему bluetooth и запускать графическую утилиту для передачи файлов kbtobexclient.
После работы же в kbtobexclient и закрытия программы скрипт будет самостоятельно гасить все ранее запущенные им службы.

Теперь для автоматизации организуем автозапуск этого скрипта при каждом включении usb-адаптера в наш ПК.
Для этого добавим udev-правило (коротко: значения product и vendor взяты из вывода lsusb, для подробных разъяснений см. ссылки раз и два) в один из файлов /etc/udev/rules.d/ (лучше для таких целей создать собственный файл с названием, стоящим по алфавиту выше остальных). Собственно текст правила:

# For bluetooth
BUS=="usb", SYSFS{idVendor}=="0a12", SYSFS{idProduct}=="0001", RUN+="/usr/local/bin/ssbt"

Готово: теперь с помощью kbtobexclient можно будет слать файлы на телефон, а демон kbluetoothd будет автоматически принимать файлы.

LiarLiar - простенький детектор лжи под Linux.

Описание из спека AltLinux:

Инструмент для определения состояния человека по голосу. Иногда используется, как звуковой детектор лжи (например, для определения волнения человека по его голосу, позволяющее определить искренность его состояния).

Voice stress analysis tool. Sometimes used as an audio lie detector (ie. used for detecting stress in a person's voice to allow for the determination of truthfulnessin a statement)


Работа LiarLiar.

Конечно, это не инструмент дознавателей ЦРУ, а всего лишь игрушка (по крайне мере со стандартным simple-плагином) и качество анализа оставляет желать лучшего (особенно на не особо качественных аудиозаписях), тем не менее довольно забавно испытать её на разных аудиофайлах.

Вот пример "лжи":

А вот "правды":

На последнем скриншоте также видно окно настроек.
Программа, к сожалению, давно не поддерживается авторами, поэтому сборка её сопряжена с некоторыми трудностями, а именно...

Сборка LiarLiar.

LiarLiar требует для сборки старый gstreamer-0.6.
Придется собрать его и плагины к нему.
Чтобы не нанести вреда системе (не переписать например новый gstreamer старым) есть смысл создать каталог /opt/liar, наделить его правами записи для вашего пользователя и все последующие операции (включая make install) проводить от непривилегированного пользователя.

1) Gstreamer-0.6

Тянем gstreamer-0.6.5 и устанавливаем.
Замечу, что с gcc-2.95 и gcc-4.1 он у меня не собрался, поэтому я собирал с помощью gcc-3.4:

~/gstreamer-0.6.5$ export CC=/usr/bin/gcc-3.4
~/gstreamer-0.6.5$ export CXX=/usr/bin/gcc-3.4
~/gstreamer-0.6.5$ ./configure --prefix=/opt/liar/ --disable-docs-build
~/gstreamer-0.6.5$ make
~/gstreamer-0.6.5$ make install

Если при сборке возникает ошибка вида:

gsttrashstack.h: In function 'gst_mem_chunk_alloc':
gsttrashstack.h:103: error: PIC register 'ebx' clobbered in 'asm'

Можно жестко отключить оптимизацию, заменив строку 54 ("#if defined/...") в файле ./gst/gsttrashstack.h на строку с false-условием
"#if 0" .

2) LiarLiar

Тянем liarliar-0.5.2.
Открываем новую консоль (или сбрасываем ранее установленные переменные окружения компилятора). Компилим liar:

~/liarliar-0.5.2$ export PKG_CONFIG_PATH=/opt/liar/lib/pkgconfig/:/usr/lib/pkgconfig/
~/liarliar-0.5.2$ ./configure --prefix=/opt/liar/
~/liarliar-0.5.2$ make

Теперь если возникнет ошибка вида:

simple.cpp: In member function 'virtual void simple::on_activate(const std::vector<double, std::allocator<double> >*, unsigned int)':
simple.cpp:23: warning: converting to 'int' from 'double'
simple.cpp:55: error: 'fabs' was not declared in this scope
simple.cpp:55: error: 'pow' was not declared in this scope
simple.cpp:88: error: 'pow' was not declared in this scope
make[1]: *** [simple.lo] Ошибка 1

То следует в начало файла ./plugins/simple.cpp добавить строку:

#include <math.h>

И продолжить установку:

~/liarliar-0.5.2$ make
~/liarliar-0.5.2$ mkdir -p ~/.liarliar/plugins/
~/liarliar-0.5.2$ cp ./plugins/.libs/* ~/.liarliar/plugins/
~/liarliar-0.5.2$ make install

Liar уже можно запустить, но без плагинов gstreamer'а работать пока он не будет =)


Небольшое лирическое отступление. LiarLiar следует собирать с библиотекой sigc++-1.2, devel-пакеты sigc++-2.0 устанавливать не надо! Если всё же вы захотите (или придется из-за особенностей дистрибутива) собрать с sigc++-2.0, то могут быть проблемы с include'ами (придется подключать файлы вручную), а так же придется в исходниках liar заменить все вызовы SigC::slot на sigc::mem_fun.

3) Плагины Gstreamer

Перед сборкой обязательно установите devel-пакеты libmad и libid3tag, они понадобятся для нужного нам плагина.
Качаем gst-plugins-0.6.5 и ставим:

~/gst-plugins-0.6.5$ export PKG_CONFIG_PATH=/opt/liar/lib/pkgconfig/:/usr/lib/pkgconfig/
~/gst-plugins-0.6.5$ export CC=/usr/bin/gcc-3.4
~/gst-plugins-0.6.5$ export CXX=/usr/bin/gcc-3.4
~/gst-plugins-0.6.5$ ./configure --prefix=/opt/liar/ --disable-ffmpeg --disable-v4l --disable-v4l2 --disable-cdrom --disable-vcd
~/gst-plugins-0.6.5$ make
~/gst-plugins-0.6.5$ make install
~/gst-plugins-0.6.5$ /opt/liar/bin/gst-register

Всё, можно запускать ($ /opt/liar/bin/liarliar)!

Готовую сборку под Ubuntu 7.10 можно скачать отсюда или отсюда.


 

Copyright © 2007 DamnSmallBlog. Content is licensed under Creative Commons Attribution-Noncommercial.

Design: GeckoandFly and Blogcrowds.