Highlighter

понедельник, 27 февраля 2012 г.

Гугл + Юзабилити

Дорогой Гугл, а тебе не кажется, что у тебя в последнее время начал сильно портиться дизай в части юзабилити? Вот кто придумал такую компоновку в интерфейсе блоггера? Почему не сделать так:

вторник, 7 февраля 2012 г.

Редактирование прошивки android под linux

Писал для 4pda.ru для телефона Samsung GT-I9001 Galaxy S Plus, может, кому будет полезно.

Данное руководство предполагает, что читающий обладает базовыми навыками использования linux (использование консоли, получение прав рута, установка программ, создание/редактирование системных файлов)

Зависимости и UDEV

Сначала нужно установить sun-jdk. Стоит отметить, что оракл недавно менял лицензию, поэтому в основном репозитории его может не быть. Для ubuntu достаточно установить sun-java6-jdk, но, если планирутся пересобирать ядро, то нужно будет установить дополнительные зависимости.

Для 32/64 битной ubuntu нужно выполнить следующее:
sudo -s
apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

Дополнительно, если у вас 64 бита, нужно установить 32х битные библиотеки
ia32-libs lib32z1-dev lib32ncurses5-dev gcc-multilib g++-multilib

Теперь, чтобы у обычных пользователей были права на использование adb, нужно создать соответствующее правило udev
echo 'SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"' > /etc/udev/rules.d/90-adb.rules

После этого жмём Ctrl+D, чтобы выйти из рутовской сессии.

Создаём своё ядро

Качаем гугловский sdk. Для этого идём на http://developer.android.com/sdk/index.html и качаем версию под linux http://dl.google.com/android/android-sdk_r16-linux.tgz
После этого распаковываем файл
tar xzf android-sdk*

Идём в папку android-sdk-linux/tools и запускаем файл android
./android

И устанавливаем Android SDK Platform tools
После этого появится папка android-sdk-linux/platform-tools, где и находится adb. Для удобства, есть смысл добавить эту папку в PATH, чтобы иметь быстрый доступ к adb (замените путь на свой).
echo 'PATH="/home/shtsh/phone/android-sdk-linux/platform-tools:${PATH}"' >> ~/.bashrc

Теперь можно подключать телефон в режиме отладки USB (Настройки - приложения - разработка - включить отладку USB) к компьютеру.
По команде adb devices должен показаться ваш телефон.

Теперь возьмём с телефона текущий конфиг ядра.
adb pull /proc/config.gz

Теперь распаковываем его при помощи gunzip и переименовываем в .config (стоит обратить внимание, что файл, начинающийся с точки - скрытый)

Идём на http://opensource.samsung.com и качаем исходники ядра, либо пользуемся git для получения. После этого распаковываем скачанный архив и копируем туда наш файл .config.

Теперь нам нужен тулчейн для сборки под arm. Для ubuntu можно скачать отсюда, затем распаковать.
В gentoo можно воспользоваться командой crossdev --target arm-none-linux-gnueabi.

Открываем Makefile и ищем там переменную CROSS_COMPILE и заменяем значение на тот путь, где находится наш распакованный (или установленный тулчейн). У меня этот путь
CROSS_COMPILE   ?= /usr/bin/arm-none-linux-gnueabi-

Теперь обычным make -jX, где X - число процессоров(ядер)+1 собираем ядро. Если собралось, то Вы — молодец. Можно накладывать патчи и что-то менять в ядре.
После сборки ядро находится Kernel/arch/arm/boot/zImage.

Модификация прошивки.

Сначала при помощи CWM нужно сделать бэкап прошивки.

После этого идём на https://github.com/dsixda/Android-Kitchen/archives/master и качаем кухню. Samsung GT-I9001 поддерживается с версии 0.182.
Качаем, распаковываем.
Копируем файлы, полученные при бэкапе из CWM в папку original_update.
Запускаем кухню
./menu

Выбор осуществляется вводом цифр/букв, которые написаны в начале строки.

Устанавливаем рабочий каталог, добавляем busybox. Затем жмём 0 и заходим в advanced options — тут можно сделать деодекс прошивки. Это нужно для того, чтобы можно было изменять файлы прошивки. Также стоит включить поддержку /etc/init.d.

После всего этого можно заняться кастомизацией интерфейса. Это делается очень просто - идём на http://uot.dakra.lt/kitchen/, выбираем, что нам нужно сделать и через некоторое время получаем готовую прошивку. Единственное, на что стоит обратить внимание — в пункте File Upload нужно выбрать:
update-binary — Type Galaxy
Upload system files — заливаем framework-res.apk, SystemUI.apk, twframework-res.apk.

После этого жмём submit и ждём, когда модификации будут готовы.
На выходе мы получаем zip-файл, который можно прошить через CWM. Но можно вынуть файлы из архива и скопировать их в нашу распакованную прошивку. Она находится в папке WORKING_число_число.

Установка нового ядра

Выбираем 20 - Tools for boot image (unpack/re-pack/etc.), затем распаковываем boot.img. У нас появится папка BOOT-EXTRACTED, где находится ядро и распакованный рамдиск, где можно подредактировать загрузочные скрипты и параметры. Делаем Build boot.img from BOOT-EXTRACTED folder (for working folder) и после этого можно собирать прошивку.

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

Примечание 1. У меня нету под руками ubuntu, поэтому с именами пакетов мог ошибиться. Все остальные действия не сильно зависят от используемого linux.

среда, 1 февраля 2012 г.

Настройка прокрутки для трэкпоинта

Вот список устройств ввода.
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ DualPoint Stick                           id=12   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad          id=13   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Laptop_Integrated_Webcam_2M               id=10   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=11   [slave  keyboard (3)]
Соответственно, DualPoint Stick - трекпоинт. Ему нужно включить эмуляцию прокрутки.

Вот насройки xorg.
/etc/X11/xorg.conf.d/20-synaptics.conf
Section "InputClass"
        Identifier "synaptics-all"
        Driver "synaptics"
        MatchProduct "AlpsPS/2 ALPS DualPoint TouchPad"
        MatchIsTouchpad "on"
                Option "TapButton1" "1"
                Option "TapButton2" "2"
                Option "TapButton3" "3"
                Option "VertEdgeScroll" "on"
                Option "HorizEdgeScroll" "on"
EndSection

Section "InputClass"
    Identifier  "Trackpoint Wheel Emulation"
    MatchProduct        "DualPoint Stick"
    MatchDevicePath     "/dev/input/event*"
    Option              "EmulateWheel"          "true"
    Option              "EmulateWheelButton"    "2"
    Option              "Emulate3Buttons"       "false"
    Option              "XAxisMapping"          "6 7"
    Option              "YAxisMapping"          "4 5"
EndSection

Теперь при средней кнопке + трэкпоинт происходит прокрутка.

При подготовке использовались материалы с арчевики

вторник, 31 января 2012 г.

XBMC и shutdown. Гнева пост.

Недавно возникла такая ситуация: в xbmc пропала возможность выключать компьютер (остался лишь suspend). Сие меня крайне опечалило и заставило искать решение проблемы. Наиболее распространённым было решение добавить политику для policykit.

/etc/polkit-1/localauthority/50-local.d/custom-actions.pkla
[Actions for me]
Identity=unix-user:1000                                                                               
Action=org.freedesktop.upower.*;org.freedesktop.consolekit.system.*;org.freedesktop.udisks.*
ResultAny=yes
ResultInactive=no
ResultActive=yes
Естественно, вместо 1000 нужен uid или логин пользователя, от чьего имени работает xbmc.
Однако это не помогло.

Каково было моё удивление, когда для решения этой проблемы потребовалось убрать ck-launch-session для запуска. То есть опять пришлось огребать проблемы из-за этого долбанного нестабильного consolekit. То бишь теперь всё запускается из слима командой:

/etc/slim.conf
login_cmd           exec dbus-launch /bin/bash -login ~/.xinitrc %session > ~/.xsession-errors 2>&1

Год назад при выходе 0.4.2 пришлось извращаться, так теперь опять ковыряться и искать причину.
 Господа разработчики основных линуховских подсистем, почему вы так регулярно всё ломаете?!

пятница, 27 января 2012 г.

Выводим список обновлений в gentoo при логине

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

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

/usr/local/sbin/update-system-check
#!/bin/bash

LOG_FILE=/var/log/updates
PID_FILE=/var/run/updates.pid

LANG=ru_RU.UTF-8

STRING_FILE_EXIST="Процесс уже запущен. Выход"
STRING_FILE_ALONE="Процесс был некорректно завершён. Перезапуск обновления"
STRING_GOOD="Обновление"

#для того, чтобы работал notify-send
USER="shtsh"

#Создаём лог-файл, если его нету
[ -e $LOG_FILE ] || touch $LOG_FILE && chmod 640 $LOG_FILE && chown root.log $LOG_FILE

#Пишем в PID-файл, качаем файлы и удаляем PID-файл
check_update(){
        ps aux | grep "bash /usr/local/sbin/update-system-check" | grep -v "grep" | awk {'print $2'} > $PID_FILE
                eix-sync > /dev/null
                eix-remote fetch > /dev/null
                emerge -qupDN @world >> $LOG_FILE
                TMP=`grep ebuild $LOG_FILE`
                if [ "x$TMP" != x"" ]
                then
                        # Тут извращаемся и пользователю $USER выводим при помощи notify-send, что обновилось. Так как используется DBUS, то нужно поизвращаться.
                        # Так как я использую KDE, то грепаем процессы по kdeinit для получения параметров DBUS
                        PID=$(pgrep -u $USER kdeinit)
                        DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )
                        sudo -u $USER DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS bash -c "notify-send $STRING_GOOD \"`/usr/local/bin/parse.pl html`\""

                fi
        rm -f $PID_FILE
}


if [ -e $PID_FILE ]
# PID-файл есть, проверяем на корректность завершения операции.
then
        process_count=`ps aux | grep "bash /usr/local/sbin/update-system-check" | grep -v "grep" | wc -l`
        if (( $process_count > 2 ))
        then
                # Всё хорошо, другой процесс работает
                echo `date +"%D %A %H:%M"` $STRING_FILE_EXIST >> $LOG_FILE
                exit 1
        else
                # Это единственный процесс, обновляем
                echo `date +"%D %A %H:%M"` $STRING_FILE_ALONE > $LOG_FILE
                check_update
        fi

else
#Файла нету, просто обновляемся
        echo `date +"%D %A %H:%M"` $STRING_GOOD > $LOG_FILE
        check_update
fi

Этот скрипт умеет проверять обновления и посылать уведомления через notify-send, что можно что-то обновить. Для этого используется другой скрипт, написанный на perl (в будущем планирую переделать всё под perl).

/usr/local/bin/parse.pl
#!/usr/bin/perl -w

use strict;

# проверяем аргументы, которые должны быть равны plain или html
# По-умолчанию выводим как plain text
my $output_type="plain";

if (defined(@ARGV)) {
        if (("$ARGV[0]" ne "html") and ("$ARGV[0]" ne "plain")) {
                print "\nUSAGE:\n $0 plain \t for plain text output\n $0 html\t for HTML output\n\n";
                die;
        }
        $output_type=$ARGV[0];
}

open(LOG_FILE,'<','/var/log/updates');

# Выводим список обновлений
while(<LOG_FILE>) {
        /ebuild/;
        if ("$output_type" eq "html") {
                print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/;
        } else {
                print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/;
        }
}
Этот скрипт умеет парсить файл, где записано, что обновилось и выводить в HTML для libnotify или plain text.

Теперь осталось засунуть вызов parse.pl в .bashrc. Так же можно использовать cat /var/log/updates. Только смотрите - у меня логи пишутся для группы log (я об этом раньше писал), поэтому, возможно, придётся немножко подправить.

Ну, и для обновления системы я использую следующий скрипт:
#!/bin/bash

LOG_FILE=/var/log/updates

emerge -auDN @world &amp;&amp; [ -e $LOG_FILE ] &amp;&amp; echo "" &gt; $LOG_FILE
revdep-rebuild &gt; /dev/null

Ну, и нужно добавить в /etc/crontab что-то, похожее на это:
5 */3 * * *     root    /usr/local/sbin/update-system-check
Каждые 3 часа будут проверяться обновления.

P.S. Парсер лох. Сейчас буду пытаться исправить.

понедельник, 23 января 2012 г.

Загружаемся с флешки через grub

Пришлось как-то недавно повозиться с ноутбуком, у которого dvd-rom уже начал глючить, а поддержки загрузки с usb флешки или внешнего dvd-rom нету.

Заодно захотелось сделать заявление: "Дорогая Toshiba, я никогда не буду покупать твою продукцию из-за кривых bios и ужасной поддержки linux."

Так вот. На этот ноутбук нужно было поставить арч, а при чтении с диска возникали ошибки. Поэтому пришлось гуглить. И знаете, нагуглилась очень классная штука - plop boot manager.

Plop - менеджер загрузки, который способен грузится почти откуда угодно. Нас же интересует его возможности по загрузке из grub.

Сначала качаем его с официального сайта. Затем находим в архиве файл plpbt.bin и кидаем его в /boot.

После этого добавим запись в меню.

GRUB
title Plop Boot Manager
root (hd0,0)
kernel /boot/plpbt.bin
GRUB2
Создаём файл /etc/grub.d/20_plop
#!/bin/sh
set -e

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib

# older versions of grub2 do not have this yet (LP: #459080)
if [ ! -e ${libdir}/grub/grub-mkconfig_lib ]; then
    echo "no grub-mkconfig_lib, exiting"
    exit 0
fi

. ${libdir}/grub/grub-mkconfig_lib

# We can't cope with loop-mounted devices here.
case ${GRUB_DEVICE_BOOT} in
  /dev/loop/*|/dev/loop[0-9])
    exit 0
  ;;
esac

if test -e /boot/plpbt.bin ; then
  USBBOOTPATH=$( make_system_path_relative_to_its_root "/boot/plpbt.bin" )
  echo "Found plpbt.bin image: $USBBOOTPATH" >&2
  cat << EOF
menuentry "Plop Boot Manager" {
   linux16   $USBBOOTPATH
}

EOF
fi
Взято тут
Затем делаем update-grub и у нас появляется нужный пункт меню, через который можно зайти в Plop.

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

воскресенье, 22 января 2012 г.

Собираем xbmc под gentoo ~amd64

Есть такой очень удобный и красивый медиа-центр xbmc.

Из стандартного репозитория gentoo он уже собираться не хочет, поэтому я перешёл на версию 9999. Однако и он собираться не захотел! Пришлось гуглить. Решение нашлось на гентушном форуме.

Проблема оказалась, что xbmc пока не поддерживает libpng 1.5.

mkdir -p /etc/portage/patches/media-tv/xbmc/ 
cd /etc/portage/patches/media-tv/xbmc/ 
wget http://trac.xbmc.org/raw-attachment/ticket/12001/xbmc-9999-libpng-1.5-fix-plt-trn-get.patch
wget http://trac.xbmc.org/raw-attachment/ticket/12001/xbmc-9999-libpng-1.5.patch
mv xbmc-9999-libpng-1.5.patch xbmc-9999-a-libpng-1.5.patch
Стоит отметить папку /etc/portage/patches. Из неё патчи будут накладывать автоматически при сборке.