суббота, 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 тут и там.



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