суббота, 19 декабря 2009 г.

Прошивка Cyanogen Mod в HTC Magic.

Обзавелся таким девайсом и сразу же решил чего-нибудь эдакое туда залить.
Прочитал этот обзор и выбрал прошивку Cyanogen Mod. Успешно ее залил, рассказываю как у меня это получилось.

Для начала нужно определить тип вашего устройства. Их бывает два: 32А и 32В. Отличаются аппаратной частью, в частности объемом оперативной памяти. Делается это следующим образом.
1. Выключаем полностью телефон.
2. Удерживая кнопку Назад(со стрелкой) нажимаем кнопку включения.
3. Должен появиться вот такой веселый экранчик Fastboot.

4. На нем я подчеркнул красным интересующие нас цифры и букву. Как видно, у меня оказалась версия 32В. И дальше рассказ идет про нее. Если у вас вдруг 32А, то чем отличается ее прошивка можно почитать на wiki(eng) CyanogenMod.
Теперь нам надо скачать следующие файлы:
Последний Android SDK.
Бинарник утилиты fastboot.
Последнюю CM recovery.
Образ базового Android 1.6.
Сам CyanogenMod.
Суммарно все весит мегабайт 150, поэтому, если вы не счастливый обладатель N-мегабитной безлимитки, лучше все поставить на загрузку и сходить погулять.

Скачали - едем дальше.
Распаковываем архив с SDK, например в /usr/local/. Папку tools для удобства желательно добавить в PATH. Бинарник fastboot кладем в tools и делаем исполняемым(chmod +x fastboot). Оставшиеся 3 файла копируем в корень SD карты.
Телефон подключаем к компьютеру проводом, загружаем опять в fastboot(экран с тремя зелеными андройдами).
На компьютере в терминале из под суперпользователя выполняем

fastboot boot cm-recovery-1.4.img

В выводе терминала должно появиться:

downloading 'boot.img'... OKAY
booting... OKAY

а телефон загрузится в Recovery mode.
Теперь, собственно сам процесс прошивки.
1. Выбираем пункт wipe data/factory reset. (очистка данных и сброс на заводские настройки)
2. Потом пункт apply any zip from sd, в нем выбираем DRC83_base_defanged.zip. Соглашаемся кнопкой Home(с домиком), ждем.
3. Ни в коем случаем НЕ надо перезагружать устройство.
4. Снова пункт apply any zip from sd, но теперь выбираем update-cm-4.2.x-signed.zip. Опять соглашаемся, опять ждем.
5. Вот теперь можно перезагрузиться соответствующим пунктом или нажатием на Home+Back.
6. Первый раз Magic будет грузиться долго, наберитесь терпения и ничего не трогайте.

Все, с прошивкой закончено, еще пара дополнительных моментов.
Можно установить напостоянную Recovery Mode. Для этого:
1. Подключаем загруженный и работающий аппарат к компьютеру проводом.
2. Последовательно выполняем команды в терминале компьютера(если вы не используете sudo, то сервер надо запускать из-под root):

adb kill-server
sudo adb start-server
flash_image recovery /sdcard/cm-recovery-1.4.img

И все, теперь, если при включении держать кнопку Home, телефон загрузится в Recovery Mode.

На этой прошивке встретилась небольшая проблема с Android Маркетом. Он вывешивает лицензионное соглашение, а кнопки "Принять" там нет. Чтобы обойти это надо в настройках(Меню -> Настройки -> Язык и текст -> Основной язык) выбрать English, принять соглашение(под ним появится кнопка Accept), а потом обратно включить Русский.

И напоследок расскажу, как поставить удобную экранную клавиатуру от HTC - Touch input.
1. Качаем ее отсюда.
2. Закидываем на SD карту.
3. Открываем с помощью файлового менеджера, например Astro File Manager(ставится из маркета).
4. Теперь ее надо включить. Идем в Настройки - Регион и ввод текста, ставим галочку напротив Touch Input. Потом в любом поле ввода удерживаете палец и из меню выбираете Touch input.
5. Чтобы появилось переключение на русский, надо повернуть телефон горизонтально. :-)

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

Продолжение...


пятница, 11 декабря 2009 г.

Мышь в 3D приложениях под wine.

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

Я пробовал это решение на двух играх: Aliens versus Predator(3D action) и Clusterball(аркадная леталка)
Проблема примерно в следующем: мышь перемещается только в пределах разрешения экрана, из-за этого нельзя развернуться больше чем на 180 градусов в AvP, а в леталке поворачивать можно только короткими рывками.
Ход действий таков:
Надо скачать архив с исходниками, например так:

wget http://downloads.sourceforge.net/project/wine/Source/wine-1.1.33.tar.bz2?use_mirror=sunet

Потом распаковываем их

tar xf wine-1.1.33.tar.bz2

Переходим в папку с нужном файлом

cd ./wine-1.1.33/dlls/dinput

Создаем здесь файл mouse.patch со следующим содержанием(взят отсюда, там много других еще есть, для определенных игр и т.д.)

--- dlls/dinput/mouse.c_old 2008-03-03 11:14:47.000000000 +0100
+++ dlls/dinput/mouse.c 2008-03-10 19:23:21.000000000 +0100
@@ -306,7 +306,7 @@
wdata = pt1.y;
}

- This->need_warp = (pt.x || pt.y) && dwCoop & DISCL_EXCLUSIVE;
+ This->need_warp = (hook->pt.x<2 || hook->pt.y<2 || hook->pt.x>((2 * This->win_centerX)-2) || hook->pt.y>((2 * This->win_centerY)-2) );
break;
}
case WM_MOUSEWHEEL:

и накладываем патч

patch -p1 mouse.c mouse.patch

Потом переходим в папку с исходниками, и командуем обычные:

./configure
make
sudo make install

Перед make install желательно убедиться, чтобы в системе не был установлен пакет родной wine, если установлен - удалить.
Должно собраться и поставиться без ошибок.
Потом идем в папку с игрой и запускаем как обычно

wine AvP.exe

У меня главное меню запускается в окне, но потом разворачивается на весь экран и работает нормально.

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

Продолжение...


пятница, 4 декабря 2009 г.

MOC + last.fm + русские тэги в UTF-8

Прочитал про этот плеер, понравился, начал пользоваться. Нашлись два маленьких неприятных момента: кривое отображение моих русскоязычных utf-8 тэгов и отсутствие скробблинга на last.fm. Чуток поковырявшись, оба решил, делаю пометку, чтобы не забыть как.

У меня нет раздела с windows, вся музыка хранится на ext3 разделе и тэги сконвертированы в utf-8 с помощью tag2utf. Но MOC отображает их точками, а если в конфиге выставить параметр ID3v1TagsEncoding=UTF-8, то решеточками. Оказалось, что проблема в тэгах ID3v1 и чтобы ее решить, надо их поудалять, а оставить ID3v2. Чтобы решать проблему комплексно, одновременно с конвертированием, надо делать так:
Ставим пакет python-mutagen(в ubuntu называется так). И даем команду

find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1

Команда перебирает все mp3 файлы в текущем каталоге и подкаталогах, обрабатывая их нужным образом. Готово, теперь вся наша музыка в пригодном для переваривания MOC'ом виде.

Теперь к скробблингу. Для его организации нам будет нужна опция OnSongChange в конфиге. Ее наличие зависит от версии MOC. Мне пришлось обновиться на вариант devel(2.5.0-alpha4), так как в обычном этой опции не было.
Кроме этого надо поставить пакет lastfmsubmitd. В конфиге(/etc/lastfmsubmitd.conf) прописать данные своего аккаунта. Если будет ругаться на отсутствие данных аккаунта, значит что-то с правами доступа к этому файлу.
Потом создать скрипт moc_submit_lastfm, вот такого содержания:

#!/usr/bin/env python

from datetime import datetime
from optparse import OptionParser
from subprocess import call, Popen, PIPE
import time

parser = OptionParser()
parser.add_option("-a", "--artist", dest="artist")
parser.add_option("-t", "--title", dest="title")
parser.add_option("-A", "--album", dest="album")
parser.add_option("-l", "--length", dest="length")

# Treating everything as bytestrings throughout seems to work OK even
# with non-ASCII characters in song titles etc (at least with a UTF-8
# locale).

def still_playing(artist, album, title):
p = Popen(["mocp", "-i"], stdout=PIPE)
out, err = p.communicate()
lines = out.split("\n")
for s in ["Artist: %s" % artist, "Album: %s" % album, "SongTitle: %s" % title]:
if not s in lines:
return False
return True

def submit_to_lastfm(artist, album, title, length):
args = ["/usr/lib/lastfmsubmitd/lastfmsubmit", "--artist", artist, "--title", title, "--length", length]
if album is not None:
args.extend(["--album", album])
call(args)

def main():
options, args = parser.parse_args()
if any(not options.__dict__.get(k) for k in ["artist", "title", "length"]):
print "All of artist, album, length must be specified"
exit(1)
if ":" in options.length:
mins, secs = options.length.split(":")
length = int(mins) * 60 + int(secs)
else:
length = int(options.length)
# wait until song is half played
wait = length/2

start = datetime.now()
while True:
time.sleep(5)
if not still_playing(options.artist, options.album, options.title):
exit(1)
if (datetime.now() - start).seconds > wait:
submit_to_lastfm(options.artist, options.album, options.title, options.length)
exit(0)

if __name__ == '__main__':
import sys
main()

И в конфиге .moc/config задать вышеуказанную OnSongChange:

OnSongChange = "/home/triklozoid/bin/moc_submit_lastfm --artist %a --title %t --length %d --album %r"

заменив путь на путь к созданному Вами скрипту.

Вот и все, вроде ничего не забыл.

Про скробблинг прочитал здесь, про перекодирование здесь, про MOC тут и там.



Продолжение...


среда, 18 ноября 2009 г.

Быстрый поиск в pidgin.

В данный момент использую pidgin в качестве IM и частенько пользуюсь просмотром журналов. И обратил внимание, что поиск работает неприлично долго: от 3 до 10 секунд при размере журнала 500 кб. Не знаю с чем это может быть связано, но это натолкнуло меня на мысль: а не изобрести ли мне велосипед?
Встречаем..

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



#!/usr/bin/perl
#тут у нас интерпретатор

#все серьёзно :)
use strict;
use warnings;

#подключаем поддержку utf-8
use utf8;
use encoding 'UTF-8';
use Encode qw(encode decode is_utf8);
use open ':utf8';

#тут можно указать свою любимую оперу или, скажем elinks
my $browser="firefox";
#импорт домашней директории из оболочки
chomp(my $home=`echo \$HOME`);

#ввод данных
print "Введите ICQ номер собеседника:\n";
chomp(my $icq_number=<STDIN>);

print "Введите значение для поиска:\n";
chomp (my $find_value=<STDIN>);

#удаление временной директории
`rm -r $home/temp_icq_hist/ >/dev/null`;
#создание пустой временнной директории
`mkdir $home/temp_icq_hist >/dev/null`;
#создание копии логов заданного номера
`cp -r $home/.purple/logs/icq/347298877/$icq_number \$HOME/temp_icq_hist/`;

#открываем дескриптор файла с результатами поиска
open RESULT, ">", "$home/temp_icq_hist/result.htm";

#пишем в него эту строку для правильного определения кодировки
print RESULT '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">';

#объявляем переменные
my (@file_strings,$i,$flag,$anchor_number);

#получаем список файлов с логами
opendir DIR, "$home/temp_icq_hist/$icq_number";
my @files=readdir DIR ;

#сортируем его в обратном порядке
@files=reverse sort @files;

#для каждого из файлов..
foreach (@files) {

#открываем дескриптор очередного файла логов
open FILE, "$home/temp_icq_hist/$icq_number/$_";
#читаем файл целиком в массив
@file_strings=<FILE>;

#открываем дескриптор для этого же файла на запись
open FILE, ">", "$home/temp_icq_hist/$icq_number/$_";

#обнуление счетчика якорей
$anchor_number=0;
#начинаем построчную обработку
for ($i=0;$i<scalar(@file_strings);$i++){

#если есть совпадение с искомым значением начаем писать
if ($file_strings[$i]=~/$find_value/i){

#в файл логов пишем строку с присоединенным якорем
print FILE "<a name=\"$anchor_number\"></a>$file_strings[$i]";

#в файл результатов пишем ссылку на якорь, предыдущую строку, текущую и следующую
print RESULT "<hr>
<a href=$icq_number/$_#$anchor_number>$_</a><br>
$file_strings[$i-1];
$`<span style=\"background: rgb(153, 255, 153)\">$&</span>$'
$file_strings[$i+1]";
#увеличиваем счетчик на единицу, чтобы избежать обработки двух строк
$i++;
#номер якоря
$anchor_number++;
}
#если совпадения нет, просто пишем строку в логи
else {
print FILE $file_strings[$i];
}
}}
#закрытие дескриптора результатов
close RESULT;

#открываем файл браузером
`$browser $home/temp_icq_hist/result.htm`


И эта жуткая штука выполняется за время в пределах полутора секунд, что меня вполне устроило. Кроме того получил немного опыта и много удовольствия от процесса.
Замечания, критика, предложения по улучшению и пожелания больше никогда не брать в руки текстовый редактор приветствуются. ;)


Продолжение...


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

Допиливаем IceWM под себя.

Уже довольно продолжительное время использую IceWM в качестве оконного менеджера и постепенно улучшаю свое существование в нем разными полезными и удобными вещами.
В этой заметке попытаюсь поделиться ими с людьми.


Я проделывал все это под Ubuntu, но в принципе советы универсальны для любого дистрибутива, только приложения нужно устанавливать через свой менеджер пакетов.

Переключение раскладки.
Тут есть два момента:
1. Раскладка должна переключаться(обязательно)
2. Должен отображаться индикатор(желательно)
Первый я традиционно решаю с помощью xorg.conf, вписывая туда в секцию "InputDevice" следующие буквы:

Identifier "Generic Keyboard"
Driver "kbd"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us,ru"
Option "XkbOptions" "grp:alt_shift_toggle"

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

Календарь

На примере календаря продемонстрирую один интересный момент в тонкой настройке системы.
Итак, нам нужно настроить кнопочку в трее, по которой рядом с ней будет появляться календарь, а потом исчезать, опять же по нажатию.
Ставим пакет xcalendar. По одноименной команде появляется этот календарь, но появляется где попало и вообще, на виндовыйпривычный календарь похож мало. Чтобы привести его в божеский вид, нужно использовать конфигурационный файл winoptions, из папки ~/.icewm. Он позволяет тонко настраивать поведение окна для каждого приложения. Сначала, с помощью команды xprop необходимо узнать имя окна приложения. Запускаем в терминале:

xprop|grep WM_CLASS

Курсор изменяется на плюсик и ткнув в нужное окошко, в терминале появится строка вроде этой:

WM_CLASS(STRING) = "xcalendar", "XCalendar"

Здесь, значение в первых кавычках, это как раз нужное нам имя.
Создаем файл ~/.icewm/winoptions с такие содержанием:(если файл уже есть, то дописать в конец)

xcalendar.tray: Exclusive
#создать иконку в трее и не создавать кнопку на панели
xcalendar.geometry: +800+800
#расположить окно в правом нижнем углу(цифры должны соответствовать выбранному разрешению)
xcalendar.dTitleBar: 0
#не отображать заголовок окна
xcalendar.icon: /usr/share/icons/Human/24x24/apps/menu-editor.png
#иконка
xcalendar.allWorkspaces: 1
#отображать на всех рабочих столах
xcalendar.ignoreQuickSwitch: 1
#не отобрать в списке окон по Alt+Tab

Об остальных опциях можно почитать в документации.

Заметки
Изначально использовал tomboy, но какой-то он слишком задумчивый(видимо из-за Mono), поэтому поменял его на zim. Какой-то специальный функционал меня не интересует, просто иметь возможность чего-нибудь быстренько записать и потом не потерять.
Пару моментов, как сделать, чтобы он правильно запускался и не мешал.
Заходим в Правка-Настройки-Дополнения и ставим галочку напротив TrayIcon. После этого можно запускать автоматически следующей командой:

zim --iconify ~/Notes/

где ~/Notes/ - адрес вашего блокнота.

Автозапуск

Автозапуск приложений при старте icewm реализуется с помощью скрипта startup, который должен лежать в директории "/home/username/.icewm/".
Он должен быть выполняемым (chmod +x startup).
Вот пример моего файла:

xcalendar &
rfcomm-dev-create &
gnome-power-manager &
zim --iconify ~/Notes/ &
fbxkb &
nm-applet &

Файловый менеджер и автомонтирование накопителей.
Обе задачи решаются с помощью pcmanfm. Легкий и обладает достаточным фукционалом. Проблемы с монтированием могут возникать достаточно экзотические, в зависимости от конкретного дистрибутива. Решаются с помощью google и прямых рук. ;)
Кроме того он может управлять рабочим столом, отображать фон и значки.

Для настройки сети я использую гномовский апплет, который запускается командой nm-applet.

Состояние батареи.
Для контроля состояния батареи раньше похожим образом использовал gnome-power-manager, но недавно в preferences наткнулся на родной индикатор. Параметр выглядит так:
TaskBarShowAPMStatus=1
Симпатичную цветную батарейку он, правда, не показывает, но ее заменяют вполне информативные цифры, которые при питании от батареи отображают примерное оставшееся время работы, а при работе от сети процент заряда аккумулятора.

Шрифты.
Еще скажу немного о шрифтах. Есть очень хорошая и полная статья по их настройке, но там очень много шагов, а я расскажу какими ограничился я и результат меня устроил. У меня десятидюймовый экран от eeePC.
1. Измерил линейкой ширину экрана: 22 см. Сделал расчет по формуле
1024 точек / (22 см / 2,54) = 118 точек на дюйм
2. Открыл gnome-appearance-properties, на вкладке Шрифты включил "Субпиксельное сглаживание". Потом в кнопке Подробнее указал полученное выше значение.
Все, после этого шрифты стали заметно глаже и симпатичнее. Кому этого мало, прошу по ссылке.


В принципе это все, что я успел на данный момент наломать настроить.
Также рекомендую почитать замечательные статьи о настройке, темах и возможностях IceWM.


Продолжение...


четверг, 3 сентября 2009 г.

Кто сожрал трафик или просмотр tcp соединений под linux'ом.

Еще в далекие темный времена использования неправильных ОС, частенько возникала проблема пропажи трафика, особенно остро встающая при подключении к интернет через gprs. Под windows это может быть связано с вирусами, но могут и какие-то совершенно честные приложения внезапно надумать обновиться. Недавно столкнулся с этим же под линуксом и вскоре нашел решение.

Заключается оно в использовании встроенной утилиты netstat.
Все делается проще некуда, команда:

netstat -tp

выведет нам примерно такую табличку:

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 gprs-internet:52725 buddychat-m02b ESTABLISHED 5101/pidgin
tcp 0 0 gprs-internet:46308 sablino:afs3-f ESTABLISHED 6364/firefox
tcp 0 0 gprs-internet:58030 bos-m053b-sdr2 ESTABLISHED 5101/pidgin
tcp 0 0 gprs-internet:51400 ww-in-f125.goo ESTABLISHED 5101/pidgin

Наибольший интерес представляет последний столбец(добавляемый ключом -p), который позволяет вычислить нарушителя.
Также можно добавить ключ -c и тогда информацию будет обновляться раз в секунду.


Продолжение...


пятница, 10 июля 2009 г.

Громкость записи звука в Linux

Давно не давала жить спокойно такая проблема. При записи звука с помощью Audacity, записывалось не пойми что(в плане каналов), а иногда ничего, просто тишина. Недавно, чисто случайно, натолкнулся на ее решение. Решил сделать пометку на память.

В виндоус для этого открывался Регулятор громкости, там в параметрах выбиралось "Запись" и вот они желанные ручки. Правда работали они не всегда, но это уже мелочи.
Я предполагал, что в линуксе все должно быть также, но добраться до них никак не получалось. Решение до ужаса просто:
Запускаем в терминале

alsamixer -V Capture

И все. Видим как раз то, что нам надо. Работает замечательно и как надо, я никаких проблем не нашел.

Продолжение...


четверг, 8 января 2009 г.

Выбор и настройка сканера в Linux.

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


После мучительных и продолжительных попыток, я отчаялся заставить работать свой старый сканер Benq 5000, и, решив подойти к проблеме кардинально, купил другой.
В начале пару слов о старом. На сайте SANE обещают поддержку на уровне "good", то есть пригодную для "day-to-day use". Я пытался заставить его работать в течении примерно полутора лет. Он замечательно определялся в sane-
find-scanner, цеплялся xsane'ом, но при попытке запуска предварительного просмотра упорно выдавал "Ошибка ввода-вывода при работе с устройством". Я пытался воткнуть разные прошивки, но бестолку. Потом, совсем недавно узнал(к сожалению уже не помню где), что на самом деле так и должно быть. Поддержка на уровне good, это без режима предварительного сканирования, только черно-белое и только в разрешении 1200dpi. Какой уж тут "day-to-day", этим же вообще пользоваться невозможно. Перезагружаться в windows ради сканера мне уже порядком надоело, поэтому я нашел-таки выход, хоть и немного странный. Я ставил VirtualBox с поддержкой usb, туда винду и родные дрова. И настраивал сохранение изображений сразу в общую папку. Не супер конечно, но всё же лучше, чем перезагружаться...
И вот теперь, пока после Нового года остались недотраченные деньги :) решил избавиться от этой проблемы до конца. Я сразу стал искать, у каких сканеров лучше всего отношения с линуксом и пришел к выводу, что у Epson'ов. Вывод я такой сделал, побывав вот на этой странице. Там можно скачать драйвера практически для всех их современных моделей.
Базой по поддержке SANE я не стал пользоваться по 2 соображениям. Про одно я уже говорил, сканер обозначенный как good, на самом деле едва ли может хоть что-то сделать. А второе заключается в том, что сканеры(я смотре
л epson'овские) с поддержкой уровня "complete" или уже не продаются или стоят больше 15 тысяч... Мне же ничего сверхъестественного не было нужно, просто возможность нормально сканировать документы и изображения. Поэтому, побродив по Маркету, а выбрал самую дешевую модель, а именно Perfection V10.
Теперь пару слов о настройке. Обратите внимание на "пару слов". Не инструкция на 5 страницах, из которых примерно половина консольные команды, а именно пара слов. На моей системе (Sabayon) вся настройка заключалась в уст
ановке пакета iscan. Предполагаю, что на абсолютном большинстве пакетных систем все будет аналогочно. Если же такого пакета вдруг в репозиториях не окажется, то по вышеуказанной ссылке можно скачать исходники в .tar.gz и собрать все самому. Больше делать ничего не пришлось. Я включил xsane, нажал "Предварительное сканирование" и вуаля! Несколько секунд на прогрев и начинает появляться изображение. Я чуток поигрался, попробовал цветной и черно-белый режим в разных разрешениях, все работает, как по маслу. Если вдруг столкнусь с какой-нибудь проблемой, обязательно здесь ее опишу.
На этом закругляюсь, очень надеюсь, что этот пост кому-нибудь поможет сделать правильный выбор при покупке.
Выглядит он примерно так:




Продолжение...