В предыдущем посте я обещал, что ближайшее время освою и опишу методики написания программ под свой maemo. Для начала немного философии. Все уже в курсе, что внутри этого на первый взгляд глянцевого девайса самый настоящий красноглазый Linux. Debian Linux, если точнее. Какой именно debian уже не поймешь, но разработка начиналась на etch, потом перешла на lenny, а потом вообще отошла от ветки debian, хотя бинарная совместимость более-менее осталась. Так же остался формат пакетов — deb, так что сборка пакетов для maemo останется так же легка. Хотя разработчики прикрутили свой формат пакетов - .install, чем-то напоминающий .jad. То есть это просто текстовый файлик с несколькими строчками: какой пакет скачать, какой репозиторий подключить, какие зависимости удовлетворить. Выглядит примерно так:

[install]

catalogues = extras

package = mgutenberg

[extras]

name = Maemo Extras

uri = http://repository.maemo.org/extras/

dist = fremantle

components = free non-free

Чтобы установить программу из .install-пакета не нужно ничего, кроме самого этого файлика и соединения с Интернетом. Оно само подключит нужный репозиторий, сделает apt-get update, и установит программу. Поэтому .install-пакеты становятся приоритетнее для нас, тем более на сайте https://garage.maemo.org/ кому угодно дают репозиторий под свой проект, который автоматически попадает в extras-devel. Это удобно еще тем, что телефон время от времени проверяет обновления во всех репозиториях и можно быть уверенным, что пользователи вашей программы получат новую версию моментально, после коммита. Это лишь часть Linux Way, привычная линуксоидам, но которая может показаться «революционной» пользователям windows.

Maemo тем и хороша, что внутри себя подчиняется философии unix. Не перестаю удивляться простоте реализации большинства вещей здесь. Хотим получить данные с акселерометра? Нет, нам не нужно качать 300-меговый SDK за $499 с кучей фреймворков. В самом простом случае мы читаем координаты из файла /sys/class/i2c-adapter/i2c-3/3-001d/coord. На выходе получаем три координаты, по которым можно точно определить положение телефона в воздухе. Вот тут хорошая статья про акселерометры вообще: http://tom.pycke.be/mav/69/accelerometer-to-attitude, а в официальном вики описано это применимо к maemo: http://wiki.maemo.org/Accelerometers. Существует так же ворой вид получения координат — через D-Bus. Это уже более привычный не-линукс разработчикам интерфейс, когда мы вызываем системную функцию, которая возвращает нам координаты по одной.

А что если мы хотим получить доступ к сенсору освещенности на передней панели устройства? Снова читаем файл:

cat /sys/bus/i2c/drivers/tsl2563/2-0029/lux

Получаем значение освещенности окружающей среды в Люксах - стандартных единицах системы СИ. Физикам будет приятно :)

Другое доказательство «внутренней красоты» - это видеокамеры на N900. Как известно, их две — фронтальная (640x480 - 0.3 мегапикселей) и задняя (848*480 - 0.4 мегапикселя). Напоминаю, что это разрешение видео, а не фото. Для фото у нас полноценные 5 Мпикс. Так вот как бы вы думали к ним организован доступ? Для тех, кто в теме, даю две строчки кода:

$ mplayer tv:// -tv device=/dev/video0 # back camera

$ mplayer tv:// -tv device=/dev/video1 # front camera

Круто, а? Для тех, кто не в теме, объясняю. Текущая картинка с камеры — это файл. Точнее поток. Поток байтов, прочитав которые мы можем через любой видеоплеер проиграть их как обычный медиафайл.

Hint для тех, кто захочет бриться во фронтальную камеру:

$ mplayer tv:// -tv device=/dev/video1 -vf mirror

Так ваше бритье будет приятным, а кожа мягкой, как попка младенца xD

Все ждут, когда уже разработчики Joiku Spot портируют свое приложение под N900. Но не все знают, что имея полноценный Linux можно устроить себе то же самое через iptables. Просто пустить трафик с одного интерфейса (который принимает его по gprs) на другой (который отдает по wifi или usb). Как это сделать описывать слишком долго, но сам факт. На вики был ман, как пустить интернет по USB, используя N900 как 3G модем. Все это стандартными средставами Linux: http://wiki.maemo.org/N900_USB_networking. Кстати, пользователям Mac OS повезло. Для них ничего делать не надо, просто подключить устройство «в режиме PC Suite» и mac os сама определит ее как модем. Windows, как всегда, не повезло больше всех, тут придется качать 100-метровый глючный PC Suite, который еще и в автозапуск селится и память жрет.

Вам не нравится стандартная раскладка выдвижной клавиатуры? В Linux для этого есть Xmodmap. Кстати, раз уж я спалил конторку, то вы конечно же можете пойти на http://natisbad.org/N900/ и прочитать пару статей, градус гиковости в которых превосходит даже инструкции к старым советским телевизорам. Особенно в этом тотальном описании телефона, в котором разобрано все, вплоть до производителей резистивной тачскрин-пленки на экран и принципиальной схемы (!!!) LED на передней панели: http://natisbad.org/N900/n900-commented-hardware-specs.html. Кстати, парочку предыдущих примеров, я взял оттуда. Остальное - из официальной вики.

Что, не ожидали, что уроки метрологии и ТОЭ пригодятся вам при покупке телефона? :D

Как мы видим — опенсурс (как-то я не люблю это слово) царит тут не только для ПО. А linux way так вообще. Перейдем к практическому применению.

А нет, я спиздел. Снова теория. На этот раз история. Когда-то давно Nokia пришла к компании Riverbank и сказала: «А давайте вы нам лицензию на ваш PyQt продадите, а мы на ней будем делать софт и получать профит». Ривербанк почесало репу, да сказало, что они за опенсурс и вообще у них GPL Головного Мозга, поэтому на буржуйскую LGPL они переходить не будут. Nokia не растерялась, на те же деньги наняла еще разработчиков и сделала свою PyQt с преферансом и поэтессами. PyQt так и осталась со своим Столлманом и его GPL, без возможности хоть какой-то монетизации. Нет, библиотеки PyQt тоже есть в репозиториях maemo, но все же Nokia рекомендует пользоваться PySide. API у них, кстати, полностью совместимы, то есть если вы не использовали никаких специфических фич PyQt, то можно просто заменить import PyQt на import PySide и наслаждаться. Вот такая поучительная история о GPL Головного Мозга и чрезмерном опенсурсе. Теперь к делу.

1. Устанавливаем Maemo SDK

Полный ман по установки SDK я сам писать не буду, во-первых, он есть в вики на maemo.org, а, во-вторых, весь интернет пестрит способами его установки. Дам ссылку на самый простой способ — через гуевый инсталлятор. Лично проверял, ставил, работает. Причем сначала я ставил старую версию SDK через консоль, а потом накатывал на нее новую этим гуем. Встало нормально. Собственно, вот: http://maemos.ru/forum/index.php?showtopic=368. Кстати, вот на этом шаге можно поржать над фреймом во фрейме. После всего этого у нас на рутовом разделе появится папочка /scratchbox (у меня весит 4 терабайта, потому что монтирует еще и системные, смешно), а на десктопе появится ярлык запуска Maemo SDK (ведет на /usr/local/bin/start_xephyr.sh) и ссылка на вашу папочку home в том scratchbox. Полезные вещи, не удаляем их пока.

Немного о том, как оно запускается. Запуск происходит через Xephyr - это, так называемый, «вложенный X-сервер». Еще одна сессия иксов запускается на DISPLAY=:2 и переносится в окошко xephyr'а, в котором и живет, пока его не закроют. Таким образом можно запускать не только maemo, но и любые x-сессии. Нажав на ссылочку на рабочем столе уже можно полюбоваться немного урезанной Maemo 5 Fremantle в окошке (там нужно подождать секунд 10, пока она запустится и полюбоваться на серый экран). Для тех, кто никогда не видел ее, это забава минут на десять :) Честно говоря, что-то у меня она глючила, например не добавлялись репозитории. Да и функционал сильно урезан, убраны все «телефонные» фичи, типа камеры, звонилки и других приложений.

Я немного поиграл с локалями и у меня слетели часики, но выглядит примерно так :D

Параллельно с этим в консольке набираем scratchbox. Вуяля — вы получили доступ к этой маеме. Получать рута можно через fakeroot <команда>, запускать программы run-standalohe.sh <команда>. Если без run-standalohe.sh, то у гуевых программ не будет прорисовываться графический интерфейс в стиле maemo.

Ах да, забыл, в том мане, что я дал ссылку, в /etc/apt/sources.list поцык добавляет репы diablo (предыдущей версии маемо). Так что нам нужно везде заменить diablo на fremantle:

deb http://repository.maemo.org/extras/ fremantle free non-free

deb-src http://repository.maemo.org/extras/ fremantle free

deb http://repository.maemo.org/extras-devel/ fremantle free non-free

deb-src http://repository.maemo.org/extras-devel/ fremantle free

Перед этим еще посмотрите, вроде какой-то из них уже подключен там.

2. Ставим либы

Думаю вы уже подключили репы правильно и сделали apt-get update. Перед нами окружение scratchbox, которое представляет из себя помесь maemo и вышего linux. Можно попробовать сделать cat /proc/cpuinfo и убедиться, что железки оно не эмулирует, а использует ваши. Однако /etc/apt/sources.list и другие специфические вещи у нее свои. Можно поставить PySide:

$ fakeroot apt-get install pyside pyside-core pyside-qt4-gui pyside-qt4-core pyside-tools

На этом список либ не заканчивается, можно посмотреть полный через apt-cache search pyside. Aptitude, кстати, нету, все делаем через apt. А кто хочет разрабатывать на pure C++, тому помогут либы типа libqt4-maemo5-***.

3. Собственно, кодим

Кто ни разу не работал с PyQt и PySide могут обратиться в гугол и найти вводные статьи по этому поводу. Мой друг enchantner даже писал по этому поводу парочку введений. Я уже говорил, что основная часть API у обоих библиотек одинакова, но по PyQt больше мануалов, так что начать можно с них. Вот пара статей от него:

http://habrahabr.ru/blogs/python/75226/

http://habrahabr.ru/blogs/python/75323/

Остальное ищется в гугле по соответствующим запросам. Официальные маны, как всегда, представляют из себя лишь api reference и годятся в качестве справочника: http://www.pyside.org/documentation/. Если перед этим имелся опыт с Qt на C++, то вся философия Qt должна быть понятна. На Python это даже чем-то проще, например в connect() не надо точно указывать объект-приемник (ибо в питоне всё объекты), даже можно указать просто функцию (а не метод) в качестве слота. В общем там много сахара, сейчас не об этом.

Я думал, что бы такого написать, чтобы не сильно углубляться в питонячие либы. Ну чтож, Лаппи в помощь, напишем перевод комплексных чисел из алгебраической формы в показательную. Приступим.

[sbox-FREMANTLE_20100122_X86: ~] > cd PySide

[sbox-FREMANTLE_20100122_X86: ~/PySide] > mkdir PyComplex

[sbox-FREMANTLE_20100122_X86: ~/PySide] > cd PyComplex/

[sbox-FREMANTLE_20100122_X86: ~/PySide/PyComplex] > vi main.py

# -*- coding: utf-8 -*-

# Это все, что нам нужно для Qt

from PySide import QtGui, QtCore

# То же самое можно вызывать как QtCore.SIGNAL,

# но я привык к С++, там короче

from PySide.QtCore import SIGNAL, SLOT

# Ну а эти хоть как пригодятся

import sys, math

class PyComplex(QtGui.QWidget):

def __init__(self, parent=None):

# Явно вызываем конструктор родителя

QtGui.QWidget.__init__(self, parent)

# Заголовок окна приложения

self.setWindowTitle("PyComplex")

# Много текст эдитов

self.re_edit = QtGui.QTextEdit("1", self)

self.im_edit = QtGui.QTextEdit("1", self)

self.abs_edit = QtGui.QTextEdit("", self)

self.abs_edit.setReadOnly(True)

self.arg_edit = QtGui.QTextEdit("", self)

self.arg_edit.setReadOnly(True)

self.alg_to_pow = QtGui.QPushButton("Convert", self)

# Создаем вертикальный layout, который

# разместит все наши виджеты вертикально

self.layout = QtGui.QVBoxLayout(self)

self.layout.addWidget(self.re_edit)

self.layout.addWidget(self.im_edit)

self.layout.addWidget(self.alg_to_pow)

self.layout.addWidget(self.abs_edit)

self.layout.addWidget(self.arg_edit)

# Делаем наш layout главным для окна

self.setLayout(self.layout)

# Надо как-то обрабатывать нажатие на кнопку. Соединяем со слотом

self.connect(self.alg_to_pow, SIGNAL("clicked()"), self, SLOT("convert()"))

def convert(self):

real = int(self.re_edit.toPlainText())

imag = int(self.im_edit.toPlainText())

# Чтоб не было деления на ноль

if real != 0:

# Любая школота знает, как надо переводить

abss = math.sqrt(real**2 + imag**2)

arg = math.atan(imag/real)

self.abs_edit.setText(str(abss))

self.arg_edit.setText(str(arg))

else:

# А если все-таки деление на ноль

self.re_edit.selectAll()

# Тогда показываем варнинг

msgBox = QtGui.QMessageBox()

msgBox.setText("Real part is zero :(")

msgBox.exec_()

# Оставшаяся часть станадартна для любого Qt-приложения

# создаем аппликацию, создаем сколько хотим окон (у нас одно),

# запускаем

app = QtGui.QApplication(sys.argv)

myWindow = PyComplex()

myWindow.show()

sys.exit(app.exec_())

На коде останавливаться не буду, кто не знает — все равно не поймет, а кто знает (даже на уровне hello, world), тому хватит комментариев. На одно обращу внимание. Последняя строчка, я вызываю app.exec_(). Это именно так, с подчеркиванием в конце. Те, кто знают Python, поймут почему это так.

4. Запускаем

Я уже вроде говорил про волшебную команду run-standalone.sh. Так вот обычно можно запускать и без нее. Например так:

[sbox-FREMANTLE_20100122_X86: ~/PySide/PyComplex] > python2.5 ./main.py

но тогда это будет выглядеть вот так:

Немного не то, что мы хотим. Если нам нужен такой простой интерфейс, то проще было запустить эту программу у себя в системе и полюбоваться. Тогда делаем вот так:

[sbox-FREMANTLE_20100122_X86: ~/PySide/PyComplex] > run-standalone.sh python2.5 ./main.py

Вот это другое дело. Дальше — сами. Быть может через еще некоторое время я покажу как работать с акселерометром, но пока нашел только СИ-интерфейс для этого. Нет, СИ нам не нужен, хватило уж.

Кстати, маемо полностью стилизует все элементы управления Qt. Вот, например, как выглядит наш всплывающий месседж:

То же самое происходит с меню и всеми остальными специфичными контролами. Важно не забывать, что перенос Qt 4.6 на maemo еще в самом разгаре, а создание биндингов для Python тем более. Но с каждым днем Qt-приложения выглядят все более нативно. Maemo 6 во втором квартале 2010 обещают полностью на Qt, так что начинать писать на GTK+, на котором все крутится сейчас, по-моему смысла нет. Ну и пару полезных ссылок:

http://pymaemo.garage.maemo.org/index.html — главные поцыки, занимающиеся популяризацией Python на платформе maemo. Информации по Qt вы там не найдете (кроме хвалебных слов), а вот информацию по работе с внутренностями платформы через Python — всегда пожалуйста. Так же там можно засабмитить какой-нибудь нужный функционал и есть шанс, что он появится.

http://wiki.maemo.org/PyMaemo — туда же. Много полезных ссылок именно по Python. Полюбуйтесь как просто отследить входящие СМС: http://www.paraiso.dk/incomingsms.txt

http://maemo.org/community/ - официальная ветка коммьюнити. Тут обсуждают все, от троллинга Nexus One, до ошибок компиляции ядра на телефоне. Особо интересны багтреккер, новости и brainstorm.

http://maemo.org/development/ - кладезь материалов по разработке в формате вики. Как всегда, как это принято в мире вики, с ужасной навигацией по статьям. Зато полезно для индексирования гуглом. Почти во всех запросах по разработке на maemo первые ссылки именно туда. Ну а так же там все про SDK и scratchbox. Минус один — большинство статей написаны для Maemo 4 и пока не переписаны под новую платформу.

google.com - отличный сайт, я проверял, это правда работает!

Cornholio — 03.02.2010 - 15:48 [10.204.60.69]
как классно..
themylogin — 03.02.2010 - 18:26 [192.168.0.3]
if real != 0:
arg = math.atan(imag/real)
else:
if imag >= 0:
arg = math.PI / 2
else:
arg = -math.PI / 2


не?
V@s3K — 03.02.2010 - 18:33 [80.64.90.224]
Да, спасибо.
JasonX — 03.02.2010 - 21:03 [80.64.175.145]
какбе намекает - http://thelogin.ru/forum/showthread.php?t=1786 )))

последний коммент. ))
themylogin — 03.02.2010 - 21:29 [192.168.0.3]
JasonX ты заебал уже
V@s3K — 03.02.2010 - 21:54 [80.64.90.224]
JasonX, феерическое владение Ctrl+V
JasonX — 04.02.2010 - 01:04 [80.64.175.145]
themylogin, а вот вася в такой ситуации просто поржал, подправил и забил...
ReDetection — 04.02.2010 - 01:04 [80.64.175.137]
>у меня весит 4 терабайта
у тебя ж было 2?..

>напишем перевод комплексных чисел из алгебраической формы в показательную
хм, а что там с либой cmath?

>пока нашел только СИ-интерфейс для этого. Нет, СИ нам не нужен, хватило уж
ну, можно создать пакет с модулем для питона, написанный на си. ничего лишнего, только те же самые вызовы. по сути там и писать-то ничего не придется :( пруф http://docs.python.org/extending/extending.html
V@s3K — 04.02.2010 - 01:12 [80.64.90.224]
> ну, можно создать пакет с модулем для питона, написанный на си. ничего лишнего, только те же самые вызовы.
Вот больше этого костыли я еще не писал. Спасибо, нет :)

> хм, а что там с либой cmath?
А что с ней? Все есть.

> у тебя ж было 2?..
http://me.thedevel.ru/storage/krusader_fail.png
Cornholio — 04.02.2010 - 01:16 [10.204.60.69]
>у меня весит 4 терабайта
Вообще-то, это четыре, эм, эксабайта? ( смотри точки и запятую )
ReDetection — 04.02.2010 - 01:25 [80.64.175.137]
>http://me.thedevel.ru/storage/krusader_fail.png
да чо мне скрин?) лучше скажи, в чем фишка? или у тебя нетерабайтными винтами накоплено еще два?..
>Вообще-то, это четыре, эм, эксабайта? ( смотри точки и запятую )
я уже ничего не понимаю Х)

>Все есть.
да просто подумал,нафиг делать это через math, когда можно подключить cmath. или там вдруг перевода из одной формы в другую?

>Вот больше этого костыли я еще не писал. Спасибо, нет :)
этим ты меня убил совсем.
прости, в каком месте это - костыль? считай, что все стандартные либы питона выполняются как си. каким же еще образом достигать хоть сколько-нибудь нормальной производительности?
окей, тогда каким ты себе представляешь реализацию этой либы не таким методом? в питоне извлекать из файлика в /sys ?
хотя, пожалуй, я бы понял ,если бы это дело на си было бы реализовано как раз извлечением координат из файлика /sys, а не вызовом системной функции..
V@s3K — 04.02.2010 - 01:31 [80.64.90.224]
> считай, что все стандартные либы питона выполняются как си.
Ну и на кой хуй мне упали его стандартные либы? Корни вычислять я могу и в си. А все нужные мне либы обычно не имеют С-аналогов.

> лучше скажи, в чем фишка? или у тебя нетерабайтными винтами накоплено еще два?..
Я уже говорил. В многократном монтировании и хардлинках.
ReDetection — 04.02.2010 - 01:39 [80.64.175.137]
>Я уже говорил. В многократном монтировании и хардлинках.
спасибо.

>Ну и на кой хуй мне упали его стандартные либы? Корни вычислять я могу и в си. А все нужные мне либы обычно не имеют С-аналогов.
странная отговорка от вопроса
>прости, в каком месте это - костыль?
themylogin — 04.02.2010 - 07:45 [192.168.0.3]
JasonX, а теперь давай поподробнее, потому что я нихуя не понял.

А swig не костыль кстати, потому что расширение для svn, используемое в trac, который только ленивый себе ещё не поставил, делается именно им
V@s3K — 04.02.2010 - 13:10 [80.64.90.224]
> А swig не костыль кстати
Вставлять куски СИ в код на Python для ускорения - это хорошее и обдуманное решение. Но вставлять куски Python в СИ, потому что СИ убог на библиотеки и синтаксис - костыль.
themylogin — 04.02.2010 - 14:08 [217.79.61.36]
Кто вставляет куски Python в СИ? =-O
V@s3K — 04.02.2010 - 14:34 [80.64.90.224]
themylogin, товарищ выше и вот они: http://docs.python.org/c-api/intro.html#include-files
ReDetection — 04.02.2010 - 15:46 [80.64.175.137]
V@s3K, ты чего-то попутал. перечитай мое сообщение еще раз.
я тебе как раз и предлагаю вставлять куски C в Python. я даже ссылку правильную дал :(
ReDetection — 04.02.2010 - 16:07 [80.64.175.137]
хорошо, возможно, я недостаточно ясно изложил эту мысль здесь.. я распишу подробней:
преедлагаю написать модуль(расширение, extention) на СИ, и вставить его в питон. модуль будет содержать только системные вызовы библиотеки акселерометра и описание таких же в виде, пригодном для питона.
Cornholio — 04.02.2010 - 18:08 [10.204.60.69]
>Я уже говорил. В многократном монтировании и хардлинках.
В n-миллион раз?)
У меня такой размер имело несколько файлов в прошлом. Перепроверь, что именно заимело такой размер. Это лечится.
themylogin — 04.02.2010 - 21:39 [192.168.0.3]
V@s3K, так swig это другое :-(

Да и таким вещам можно найти применение. Например, для быстрого прототипирования в существующем коде на C.
refresh

(не заполняйте это поле)

i