Помоему замечательная новость)) Далее копи-паст с сайта источника. Marcelo Barros de Almeida в своем блоге на Forum Nokia рассказал о свем новом opensource проекте [...] читать полностью
Программирование для смартфонов » страница 4
категории RSS
Что же содержит такого моя статья?Скажу сразу,что в ней я не буду учить вас писать программы и объяснять как это делать,я расскажу совсем о другом....И она будет полезна лишь тем кто только начинает познавать программирование(С++)..Те кто уже умеют кодить,пишут программы могут проходить мимо или в крайнем случае прочитать для ознакомления(НО для вас тут нет ни чего нового)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Моя речь в этой статье пойдет о: Средстваx разработки (Среды разработки) и Cpp(C++).Вкратце(Своими словами):
- Cpp - или C++,язык программирования.
- Средстваx разработки (Среды разработки) - Программа или набор утилит в которых разрабатывают ПО
---------
Теперь к делу...Я как и все новички в программировании полез (на рожон),т.е не прочит еще и целой книги принялся устанавливать ПО:Среду разработки(VS,Carbide,dev cpp),Sdk,Perl и прочие.. и начал кодить,я вставлял разные куски кода и тыркал на разные кнопки в программах в надежде что что нибудь запуститься,так как практически все Средства разработки на английском.Дальше у меня появилась проблема в Компиляции и т.д и .п.Все не перечислить.
Но все таки я понял(многое мне подсказали ,об этом в конце),я понял что не стоит спешить,ибо это не все просто.Нужно освоить 100 нюансов что бы перейти к самому процессу...
Вопрос: А что же делать ?Что делать перед этим?
Ответ: Остальная часть статьи будет ответом на этот вопрос.
Я считаю что Установка ПО является практически последним шагом,так как перед этим стоит сделать следующие:
1) Прочитать как минимум парочку книг общего программирования ,познакомиться с Алгоритмами , Функциями , Переменными
2) ПРочитать книги непосредственно по программированию ,в данном случае cpp
3) Почитать различные форумы,Статьи, и другую иную информацию
4) Скачать исходники и пробывать их прочитать,Понять
5) Узнать что такое sdk, и как с ним работать
я назвал 5 пунктов ,Которых считаю основными,ну уверен ,что есть еще море мелочей,Возможно кто то скажет,что удобней читать книгу и пробывать на практике...Возможно но это не характерно для c++ ,тем более если вы новичок в программировании,так как если вы будите делать : Читать книги,Писать код, не зная как работать со средой,и как все работает,то у вас юудет гораздо больше проблем,вопросов ,а через дня два закипит голова и вы бросите это дело...
Так что предлагаю Вам не торопиться , Плавными шагами Вы всего достигните, я сам толком не во всем разобрался.
=-=-=-=-=-=-==--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Благодарности:
Я благодарен этим людям за помощь в программировании и отзывчивость:
- arok
- _APTEM_
- Derail
- Besplotnyi
Так же хочу посоветовать Dev-C++ весит меньше 10мб на русском языке,Для развития юзайте ее)
Все вопросы пишите в лс,Комментарии пишете разные ,В том числе и негативные ,но если будет флуд и оффтоп выдам минусы DimonVideo
Всем привет,Это моя первая статья связанная с Программированием,надеюсь не последняя.Каждая статья должна чему то учить(или содержать полезную [...] читать полностью
4463
Зашел тут у нас в офисе разговор как наиболее «красиво» и быстро склеить список списков в Питоне. Действительно как?
Даже такую казалось бы тривиальную задачу можно решить несколькими способами, существенно отличающимися по скорости и выразительности.
ВАРИАНТ1
Все знают, что элементы списка можно перебирать в цикле и, то что можно добавлять элементы в конец. Это приводит нас к первому варианту решения:
Мало того, что функция растянулось аж на 6 строк, так вдобавок она еще и не эффективная.
Попробуем её улучшить в обоих смыслах: скорости и красоты («pythonic way»).
ВАРИАНТ2
Тут мы вспоминаем, что в Питоне есть оператор \"+\" для строк и получаем:
Это самая медленная реализация. Прокол в том что в таком виде оператор \"+\" в каждом шаге создает новый объект-список, который на следующем шаге выкидывается и т.д.
ВАРИАНТ3
Исправить легко, надо заменить \"+\" на форму которая не создает новый список, а добавляет к старому. Это оператор \"+=\", но я предпочитаю писать в явном виде метод «extend».
Так мы получили самый быстрый вариант, но не самый короткий.
Все последующие решения я буду писать через лямбда-выражения, тк они состоят из одного выражения. Имя аргумента сокращено до ll, тк в коде в одну строку это не уменьшает читабельности.
# через анонимную функцию
ВАРИАНТ4
Используя встроенные функции работы со списками, можно переписать вариант2 в стиле функционального программирования:
Он чуть чуть быстрее, но все еще тормозной по той же причине, что и его итеративный родственник. Здесь «lambda a,b: a+b» - анонимная функция двух аргументов, которая просто возвращает их сумму. Вариант B это просто шорткат, встроенный в Питон для удобста вычисления суммы элементов. Этот вариант самый короткий.
Лично меня не устраивает ни самый короткий (скорость), ни самый быстрый (красота). Попробуем найти компромисс.
ВАРИАНТ5
С помощью списковых выражений:
Не сильно длиннее предыдущего, но радикально быстрее. Вариант несомненно красив, хотя вложенные списковые выражения не всегда понятны с первого взгляда.
ВАРИАНТ6
А что если попробовать переписать самый быстрый вариант в функцональном стиле? Легко:
Заметьте \" d.extend(el) or d \" нам пришлось добавить оператор \" or \" тк метод extend возвращает None . По скорости он практически не уступает самому быстрому методу №3 (разница в скорости буквально единицы процентов и на мой взгляд не существенна).
По моему мнению \" выбор редакции \" стоит присудить варианту №6 )
Для замеров скорости маленьких кусков кода в Питоне есть библиотека timeit . Вот пример кода, тестирующего варианты 3, 5 и 6 (самые быстрые и красивые).
Пример запуска теста времени. Видно что разница скорости между итеративным и функциональным вариантом исчезающе мала. Вариант на списковых выражениях заметно медленней (тут на погрешности не спишешь), но и размер наших списков огромен, для некритичных к скорости приложений он тоже имеет право на жизнь.
Test repeats n = 100 times
INITSTR: lstlst=
gc.enable()
Iterate - 1.56133103371
Reduce - 1.57647109032
Comprehension - 7.5749669075
ДОМАШНЕЕ ЗАДАНИЕ
Предлагаю решить/обсудить более сложную задачу развертывание вложенных списков в линейный.
Пример:
# Исходный список:
# Результат:
DimonVideo
Статья не моя, нашел на хабре, показалась занятной. Источник, коменты там тоже занятные. Зашел тут у нас в офисе разговор как наиболее «красиво» [...] читать полностью
3788
Сегодня я расскажу как можно использовать функции акселерометра, а точнее его датчиков, в Ваших программах на Python, для этого мы воспользуемся модулем sensor. Акселерометр имеет сенсор, или другими словами просто датчик, поворота и сенсор ускорения.
Итак начнем..
Импортируем модули e32 и sensor:
Смотрим какие сенсоры нам доступны:
Получаем идентификатор и категорию сенсора ускорения, например так:
Определим функцию которая будет вызываться при событиях сенсора. Ей будет передаваться один аргумент который мы и используем внутри функции (вместо точек поставьте пробелы) :
Теперь давайте получим объект сенсора ускорения:
Установим фильтр событий на фильтрацию событий сенсора ускорения (чтобы фиксировались только соответствующие события) :
Подключимся к сенсору:
Подождем 15 секунд:
Теперь отключимся от него:
На этом пока всё. Ниже приведен полный листинг кода для датчика ускорения:
И код для датчика поворота:
Продолжение следует..Прикрепленный файл: 2570_ac_samples.zip DimonVideo
Просьба строго не судить, т.к. это моя первая, но надеюсь далеко не последняя, статья. Хотя это и есть по сути перевод статьи расположенной [...] читать полностью
8056
* Добавлены следующие стандартные модули:
Expat XML parser, ftplib, smtplib, urllib2, xmlrpclib, SimpleHTTPServer, cPickle, asyncore и socket.
* Введена поддержка сборщика мусора.
* Улучшен all-in-one installer.
* Упрощена упаковка python приложений в sis (при помощи утилиты Ensymble).
* Дополнительные модули PyS60 socket и calender переименованы в btsocket и e32calender, чтобы избежать конфликта имен с модулями ядра.
* Приложения, упакованные в SIS файл, стали более отказоустойчивы:
1. если среда исполнения не установлена, будет отображено текстовое сообщение об ошибке
2. если при старте приложения произойдет исключение, сообщение об ошибке появится на экране (ранее сообщение не отображалось)
3. приложения имеют консоль, поэтому print выполняется точно так же, как и в script shell
* UID среды исполнения Python и PythonScriptShell изменился
* Директория PythonScriptShell теперь не C:python, а C:datapython
* Для того, чтобы обеспечить совместное сосуществование сред исполнения 1.4.x и 1.9.0, имена бинарных файлов в новой версии имеют префикс \'251_\'.
Недостатки:
* Прекращена поддержка S60 2-й редакции (там нет поддержки OpenC)
* Более длительная установка и запуск.
* Релиз работает с S60 5-й редакции, но еще не содержит модулей для доступа к Touch возможностям платформы
* По неясной причине среда исполнения не подписана сертификатом.
Формат документации изменен с pdf на набор html файлов.
Список известных проблем и изменений в стандартных модулях ядра можно получить из Release Notes.
Скачать PyS60 1.9.0 можно здесь (проект с sourceforge переехал на maemo.garage).
Взято с devmobile.ru
https://devmobile.ru/index.php?option=com_content&task=view&id=398&Itemid=1 DimonVideo
Вышла версия Python for S60 1.9.0 на ядре Python 2.5.1. * Добавлены следующие стандартные модули: Expat XML parser, ftplib, smtplib, urllib2, xmlrpclib, SimpleHTTPServer, cPickle, asyncore [...] читать полностью
9330
Не знаю стоит или не стоит устанавливать, т.к. практически ничего не работает кроме оболочки, но я думаю для интереса стоит.
1. Первым делом качаем архив https://cid-6fac71b8e8cee5b6.skydrive.live.com/self.aspx/android/AndroidOnP535.rar это всё что нам понадобится, размер 35.2 Мб
2. Форматируем SD карту в формат файловой системы EXT2 (я форматировал в Linux Ubuntu Live CD 7.10)
3. Распаковываем архив и распаковываем файл rootfs.tar.gz на SD карту.
4. Копируем остальные файлы из архива во внутреннюю память устройства (в корень диска)
5. Вставляем SD карту в КПК
6. Запускаем файл \"haret-0.5.2.exe\"
7. Вы увидите на на черном экране мелкий текст, Вам нужно найти строки типа:
b300 975360 mmcblk0 driver: mmcblk
b301 975359 mmcblk0p1
\"mmcblk0p1\" - это имя Вашей SD карты, записываете его на листочек.
8. Открываете файл \"startup.txt\"
9. Изменяете строчку: set CMDLINE \"debug rootdelay=3 root=/dev/mmcblk0 init=/android.sh mem=64M\" на
set CMDLINE \"debug rootdelay=3 root=/dev/mmcblk0p1 init=/android.sh mem=64M\"
10. Копируете этот файл опять на КПК, перезапускаете \"haret-0.5.2.exe\" и всё.
Видео обзор
Подробно распишу как я форматировал SD карту в Linux:
1. Вставляем карту в карт-ридер.
2. Открываем Terminal, запускаем команду \"df\", Вы должны увидеть флэш карту \"/dev/sdb1\" которая смонтирована как \"/media/disk\"
3. Отключаете флэшку командой:
sudo umount /media/disk
4. Форматируете командой:
sudo mkfs.ext2 /dev/sdb1
5. Далее 2 команды:
sudo mkdir /media/disk
sudo mount -t ext2 /dev/sdb1 /media/disk
6. Заходим в папку где лежит файл rootfs.tar.gz и распаковываем его на флэшку командой:
sudo tar zxvf rootfs.tar.gz -C /media/disk
7. флэшка готова.
Я проделал все операции как тут написано и успешно запустил Android. Если у кого то будут вопросы, пишите, всем отвечу.Прикрепленный файл: 2233_dscn2057.jpg (65.61 кб)Прикрепленный файл: 2233_dscn2058.jpg (68.20 кб) DimonVideo
Первоисточники: xda-developers , asusmobile.ru Не знаю стоит или не стоит устанавливать, т.к. практически ничего не работает кроме оболочки, но я думаю [...] читать полностью
6804
---------------------------------
---------------------------------
Перевод статьи Basic Threading in Python (автор Peyton McCullough), автор перевода Сергей Шилов
---------------------------------
Если вы желаете, чтобы ваше приложение выполняло несколько задач в одно и то же время, то можете воспользоваться потоками (threads). Python может работать с потоками, но много разработчиков находят программирование потоков очень сложным. Среди прочего Peyton McCullough объяснит как порождать и уничтожать потоки в этом популярном языке.
---------------------------------
Введение
---------------------------------
Потоки позволяют приложениям выполнять в одно и то же время множество задач. Многопоточность (multi-threading) важна во множестве приложений, от примитивных серверов до современных сложных и ресурсоёмких игр, так что, естественно, многие языки программирования поддерживают возможность работы с
потоками. Python тоже входит в их число.
Однако, поддержка многопоточности в Python не обходится без ограничений и последствий, как писал Гвидо ван Россум:
«К несчастью, для большинства смертных программирование потоков просто Слишком Сложное, чтобы делать его правильно… Даже в Python — всякий раз, как кто-то всерьёз берётся за программирование потоков, на меня обрушиваются тонны сообщений об ошибках, причём если причиной половины из них действительно являются ошибки в интерпретаторе Python, то причина второй половины кроется в недостаточном понимании особенностей многопоточности…»
Прежде чем мы приступим к разбору кода, работающего с потоками, нам нужно рассмотреть наиболее важную вещь — глобальную блокировку интерпретатора (global interpreter lock,GIL) Python. Если два или более потока попытаются манипулировать одним и тем же объектом в одно и то же время, то неизбежно возникнут проблемы. Глобальная блокировка интерпретатора исправляет это. В любой момент времени действия может выполнять только один поток. Python автоматически переключается между потоками, когда в этом возникает необходимость.
---------------------------------
Использование модуля threading
---------------------------------
Модуль threading предоставляет нам простой способ работы с потоками. Его класс Thread может быть унаследован (subclassed) для создания потока или нескольких потоков. Метод run должен содержать код, который вы желаете выполнить при выполнении потока. Звучит просто, не так ли? Вот, посмотрите:
---------------------------------
---------------------------------
import threading
class MyThread(threading.Thread):
_def run(self):
__print \'Insert some thread stuff here.\'
__print \'It\'ll be executed...yeah....\'
__print \'There\'s not much to it.\'
---------------------------------
---------------------------------
Выполнить поток также просто. Всё, что нам нужно сделать, это создать экземпляр нашего класса потока, после чего вызвать его метод start:
---------------------------------
---------------------------------
import threading
class MyThread(threading.Thread):
_def run(self):
__print \'You called my start method, yeah.\'
__print \'Were you expecting something amazing?\'
MyThread().start()
---------------------------------
---------------------------------
Конечно, всего один поток это не бог весть что. Как и люди, потоки через некоторое время остаются в одиночестве. Давайте создадим группу потоков:
---------------------------------
---------------------------------
import threading
theVar = 1
class MyThread(threading.Thread):
_def run ( self ):
__global theVar
__print \'This is thread \' str(theVar) \' speaking.\'
__print \'Hello and good bye.\'
__theVar = theVar 1
for x in xrange ( 20 ):
_MyThread().start()
---------------------------------
---------------------------------
Давайте теперь сделаем с помощью модуля threading нечто условно-полезное. Сервера часто используют потоки для работы в одно и то же время с несколькими клиентами. Давайте создадим простой, но расширяемый сервер. Когда клиент подключится к нему, сервер создаст новый поток для обслуживания этого клиента. Чтобы отправлять потоку данные клиента нам понадобится перекрыть метод __init__ класса Thread, чтобы он принимал параметры. Отныне сервер будет отправлять поток своей дорогой и ждать новых клиентов. Каждый поток будет посылать упакованный (pickled) объект соответствующему клиенту, после чего печатать не более десяти строк, полученных от клиента. (Упакованный объект в общем случае является объектом, уменьшенным до нескольких символов. Это полезно при сохранении объектов для последующего использования или для передачи объектов по сети).
---------------------------------
---------------------------------
import pickle
import socket
import threading
# We\'ll pickle a list of numbers:
someList =
pickledList = pickle.dumps(someList)
# Our thread class:
class ClientThread(threading.Thread):
_# Override Thread\'s __init__ method to accept the parameters needed:
_def __init__(self, channel, details):
__self.channel = channel
__self.details = details
__threading.Thread.__init__(self)
_def run(self):
__print \'Received connection:\', self.detailsself.channel.send(pickledList)
__for x in xrange(10):
___print self.channel.recv(1024)
__self.channel.close()
__print \'Closed connection:\', self.details
# Set up
the server:
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((\'\', 2727))
server.listen(5)
# Have the server serve \"forever\":
while True:
_channel, details = server.accept()
_ClientThread(channel, details).start()
---------------------------------
---------------------------------
Теперь нам нужно создать
клиента, который будет подключаться к серверу, получать от него упакованный объект, распаковывать (reconstructs) объект и, наконец, посылать десять сообщений и закрывать соединение:
---------------------------------
---------------------------------
import pickle
import socket
# Connect to the server:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((\'localhost\', 2727))
# Retrieve and unpickle the list object:
print pickle.loads(client.recv(1024))
# Send some
messages:
for x in xrange(10):
_client.send(\'Hey. \' str(x) \'n\')
# Close the connection
client.close()
---------------------------------
---------------------------------
Конечно, приведённый выше клиент не в состоянии воспользоваться всеми преимуществами многопоточности нашего сервера. Клиент порождает только один поток, что делает многопоточность бессмысленной. Давайте добавим клиенту многопоточности, чтобы сделать всё более интересным. Каждый поток будет подключаться к серверу и выполнять приведённый выше код:
---------------------------------
---------------------------------
import pickle
import socket
import threading
# Here\'s our thread:
class ConnectionThread(threading.Thread):
_def run(self):
__# Connect to the server:
__client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
__client.connect ((\'localhost\', 2727))
__# Retrieve and unpickle the list object:
__print pickle.loads(client.recv(1024))
__# Send some messages:
__for x in xrange(10):
___client.send(\'Hey. \' str(x) \'n\')
__# Closethe connection
__client.close()
# Let\'s spawn a few threads:
for x in xrange(5):
_ConnectionThread().start()
---------------------------------
Пулы потоков (pooling threads)
---------------------------------
Важно помнить, что потоки не появляются мгновенно. Создание большого их числа может замедлить ваше приложение. Чтобы создать поток и, позднее, уничтожить его, требуется время. Потоки могут также потреблять много ценных системных ресурсов в больших приложениях. Эта проблема легко решается путём создания ограниченного числа потоков (set number of threads) (пула потоков) и назначения им новых задач, в общем, повторного их использования. Соединения будут приниматься и передаваться тому потоку, который раньше всех закончит работу с предыдущим клиентом.
Если вы по-прежнему не понимаете, сравните это с больницей. Скажем, у нас есть пятеро врачей. Это наши потоки. Пациенты (клиенты) приходят в больницу и, если врачи заняты, сидят в приёмном покое.
Очевидно, нам нужно нечто, что сможет передавать данные клиента в наши потоки, не вызывая при этом проблем (оно должно быть «потокобезопасным»). Модуль Queue Python делает это для нас. Клиентская информация сохраняется в объекте
Queue, откуда потоки извлекают её по мере надобности.
Давайте переделаем наш сервер, чтобы оценить преимущества пула потоков:
---------------------------------
---------------------------------
import pickle
import Queue
import socket
import threading
# We\'ll pickle a list of numbers, yet again:
someList =
pickledList = pickle.dumps(someList)
# A revised version of our thread class:
class ClientThread(threading.Thread):
_# Note that we do not override Thread\'s __init__ method.
_# The Queue module makes this not necessary.
_def run(self):
__# Have our thread serve \"forever\":
__while True:
___# Get a client out of the queue
___client = clientPool.get()
___# Check if we actually have an actual client in the client variable:
___if client != None:
____print \'Received connection:\', client
____client.send(pickledList)
____for x in xrange(10):
_____print client.recv(1024)
____client.close()
____print \'Closed connection:\', client
# Create our Queue:
clientPool = Queue.Queue(0)
# Start two threads:
for x in xrange(2):
_ClientThread().start()
# Set up the server:
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((\'\', 2727))
server.listen(5)
# Have the server serve \"forever\":
while True:
_clientPool.put(server.accept())
---------------------------------
---------------------------------
Как вы можете увидеть, он немного сложнее нашего предыдущего сервера, но не усложнён до полной непонятности. Для проверки этого сервера, так же, как и предыдущего,
можно воспользоваться клиентом из предыдущего раздела.
----------------------------------
Дополнительные хитрости
----------------------------------
Работа с потоками не заключается только в их создании и уничтожении. Модуль (может, не модуль а класс?) Thread из модуля threading содержит ещё несколько методов, которые могут вам пригодиться. Первые два предназначены для именования потоков. Метод setName присваивает потоку имя,
метод getName возвращает имя потока:
---------------------------------
---------------------------------
import threading
class TestThread(threading.Thread):
_def run(self):
__print \'Hello, my name is\', self.getName()
cazaril = TestThread()
cazaril.setName(\'Cazaril\')
cazaril.start()
ista = TestThread()
ista.setName(\'Ista\')
ista.start()
TestThread().start()
---------------------------------
---------------------------------
Ничего удивительного. Также, как вы можете видеть, у потоков есть имена, даже если вы их не задавали.
Мы также можем проверить, является ли поток «живым», воспользовавшись методом isAlive. Если поток ещё не закончил выполняться, независимо от того, что происходит в его методе run, то он классифицируется как «живой»:
---------------------------------
---------------------------------
import threading
import time
class TestThread(threading.Thread):
_def run(self):
__print \'Patient: Doctor, am I going to die?\'
class AnotherThread(TestThread):
_def run (self):
__TestThread.run(self)
__time.sleep(10)
dying = TestThread()
dying.start()
if dying.isAlive():
_print \'Doctor: No.\'
else:
_print \'Doctor: Next!\'
living = AnotherThread()
living.start()
if living.isAlive():
_print \'Doctor: No.\'
else:
_print \'Doctor: Next!\'
---------------------------------
---------------------------------
Второй поток остаётся в живых, поскольку мы заставили его ждать, воспользовавшись методом sleep модуля time.
Если нам нужно, чтобы поток дождался завершения другого потока, можно воспользоваться методом join:
---------------------------------
---------------------------------
import threading
import time
class ThreadOne(threading.Thread):
_def run(self):
__print \'Thread\', self.getName(), \'started.\'
__time.sleep ( 5 )
__print \'Thread\', self.getName(), \'ended.\'
class ThreadTwo(threading.Thread):
_def run(self):
__print \'Thread\', self.getName(), \'started.\'
__thingOne.join()
__print \'Thread\', self.getName(), \'ended.\'
thingOne = ThreadOne()
thingOne.start()
thingTwo = ThreadTwo()
thingTwo.start()
---------------------------------
---------------------------------
Мы также можем использовать метод setDaemon. Если при вызове в него передаётся значение True и другие потоки завершили своё исполнение, то из основной программы будет произведён выход, а поток продолжит работу:
---------------------------------
---------------------------------
import threading
import time
class DaemonThread(threading.Thread):
_def run(self):
__self.setDaemon(True)
__time.sleep(10)
DaemonThread().start()
print \'Leaving.\'
---------------------------------
---------------------------------
Python также содержит модуль thread, работающий на более низком уровне, чем threading. Хочу обратить ваше внимание на одну особенность: это содержащаяся в нём функция start_new_thread. Используя её мы можем превратить обычную функцию в поток:
---------------------------------
---------------------------------
import thread
def thread(stuff):
_print \"I\'m a real boy!\"
_print stuff
thread.start_new_thread(thread, (\'Argument\'))
---------------------------------
Заключение
---------------------------------
О многопоточности можно
рассказать значительно больше, чем я сделал в этой статье, но я не буду пытаться объять необъятное. Кроме того, как упомянул Гвидо ван Россум, преимущества, которые даёт сложная многопоточность в Python могут быть сведены на нет последствиями. Однако, небольшая доза здравого смысла может устранить большинство проблем в простой многопоточности.
Многопоточность очень важна, когда дело касается компьютерных приложений и, как я упоминал раньше, Python её поддерживает. При условии правильного использования, эффект от применения потоков может быть очень благотворным и часто даже критическим, как я подчеркивал в этой статье. Virtuos86
Основы работы с потоками в Python --------------------------------- --------------------------------- Перевод статьи Basic Threading in Python (автор Peyton McCullough), автор перевода Сергей [...] читать полностью
13329
Было дело, в народных массах появился первый бытовой компьютер. Было дело, нашелся фанатик, настрочивший первый примитивный язык программирования для этой хитрой коробочки с клавишами. И с того времени компьютерный мир понесся к своим нынешним вершинам, набирая и набирая обороты. Вслед за Бейсиками появлялись Паскали, Си и иные языки программирования. Менялись концепции, рождались новые интерфейсы, выходили на компьютерный \"подиум\" новейшие операционные системы. Все это было, все это давало жизнь целым индустриям. Одна индустрия стала столь обворожительной, что собрала под своим крылом как создателей компьютерных игр, так и просто любителей поиграть в последние игровые хиты.
\"Ох, - с горестью вздыхает современный сирота-игроделатель, -как просто было раньше\". И действительно, а ну-ка попробуй померяйся силой с нынешними монстрами в разработке игр, если сам ты один-одинехонек как программист. А ну-ка попробуй создать привлекательный продукт, если обычные Пакманы, Монтезумасы и Болдердэши уже не в ходу. Всем подавай Диаблы, Думы или Халф-лайфы. И поэтому нет предела печали одиноких фанатов игроделания, ибо смысл в их существовании как нужной кому бы то ни было единицы исправился полностью.
Теперь другая история. Было дело, в народных массах появился первый мобильный телефон. Было дело, нашелся фанатик, настрочивший первый примитивный язык программирования для этой хитрой... Стоп! Больно знакомый сюжет, чуть ли не \"де-жа-вю\" (однажды виденное). Кажется, финал истории известен заранее. Так вот чтоб опять не оказаться в роли вздыхающего сироты, будем думать. Есть над чем, поскольку в общем доступе появился Бейсик для создания программ под мобильные телефоны. Если не успели осмыслить сказанное, поясняю: жизнь дает \"сиротам\" еще один шанс к созданию Пакманов, Монтиков и прочей древности, пока дело не дошло до сложнейших игровых систем. В общем, будущие кумиры телефонного игрового мира, соображаете, о чем речь?
Срочно двигайте на сайт разработчиков этого полезного творения, ищите там раздел \"Download\" и немедля качайте Бейсик (примерно 16,8 Мбайт), пока вас не опередили. А мы, также немедля, перейдем к его рассмотрению. И начнем в первую очередь с программных вопросов, отчего вы сразу поймете, что торопиться нужно офигительно, как поется в песенке, \"скорый поезд набирает ход\". Кто не успел, тот к бабушке не едет. Вот!
А с успевшими занять лучшие места мы в следующий раз рассмотрим, как работать с Бейсиком и как писать что-то более продвинутое, потому как свято место пусто не бывает, и если прогрессивному не научимся мы, вместо нас это сделают другие.
О языке программирования в целом
Mobile BASIC 2.0 (март 2004 года) - это язык программирования для современных мобильных телефонов и PDA (так называемых карманных компьютеров или, в простонародном жаргоне, наладонников), поддерживающий спецификации MIDP-1.0 / CLDC-1.0, то есть мидлеты J2ME -это такие откомпилированные приложения, способные выполняться на телефонах. Возможности Бейсика, а в общем-то в комплекте находится вполне солидная по меркам \"телефонного\" ПО среда разработки приложений, плюс прилагающихся к нему сервисов все-таки достойны внимания. Самое в наших условиях главное - это, конечно, наличие сервисов по так называемой немедленной OVER-THE-AIR (через расстояние) установке написанных вами мидлетов на чужие телефоны. В традиционном варианте загрузка мидлетов в телефон предлагается с помощью соответствующего кабеля и программного обеспечения, поставляемого с телефоном.
Однако мы не те люди, чтобы позволить всучить нам при покупке телефона какие-то \"лишние\" провода, еще и компакт-диск. Да и то большая редкость, чтобы в наших салонах мобильной связи предлагалось что-то больше в комплектации, чем просто телефон с книжечкой и гарантийным талоном. Когда же возникает желание \"усовершенствовать\" свой телефон новым софтом (чаще всего имеются в виду игры), на помощь приходит установка OVER-THE-AIR. Короче говоря, некоторый программист пишет новую игру и кладет ее, допустим, на свой сайт. Пользователь, заходя с телефона на сайт программиста, можете закачать игру сразу же в свой телефон, и ни какой нервотрепки.
Все это, разумеется, достигается специальным бесплатным сервисом, называемым MIDlet Uploader. Такой сервис предоставляет домашняя страница мобильного Бейсика, но если есть желание поставить Uploader у себя на сайте, они же предлагают вставить в тело вашей страницы следующий HTML-код:
Выгрузкамидлета
Собственно, их сервис тогда будет выполняться в кусочке окна вашей страницы. Суть работы Uploader-а заключается в следующем. Написав программу, программист в мобильном Бейсике может сохранить ее в виде JAD- и JAR-файлов. Вот эти файлы с помощью Uploader-а и выгружаются на сервер Mobile BASIC. Сервер тут же создает из них WAP/WML-файлы, подключившись к которым с помощью телефонного WAP-браузера у владельца телефона появляется на экране опция для установки этого файла в телефон. Вот так программа и закачивается в телефон \"через расстояние\".
Ну а если такой путь неудобен (мало ли, вдруг используете в программе какие-то авторские алгоритмы или она у вас коммерчески ценная и не хотелось бы \"WAP-компилировать\" ее где-то на стороне, да и просто вдруг сервис сейчас бесплатный, а завтра в мгновение ока станет платным), то придется пользоваться софтом типа Oxygen Phone Manager, способным выгружать/сгружать мидлеты с компьютера на телефон через кабель, либо искать другие утилиты, чтобы компилировать WML-файлы прямо у вас на компьютере. В общем, было бы желание, найти все можно.
О других возможностях
Итак, наличие путей к загрузке программы в телефоны увидели. Это самое главное, ибо что толку, если наше творение не смогут оценить другие любители телефонного софта. Теперь попробуем увидеть наличие путей к изощрению программ, так как простым Print \"Привет мир!\"никого уже не удивишь.
Помимо уже известной возможности создавать мидлеты, существует равнозначный потенциал к созданию Web-аплетов (приложения для Web-страниц), а также разработки приложений, способных связывать телефон с удаленными интернет-серверами. Не менее важно, что реализованы средства контроля над ошибками, то есть ловушки ошибок, чтобы предупреждать алгоритмические сбои в работе программы. Далее идут довольно неплохие в рамках \"телефонного\" программирования средства управления просто графикой, затем спрайтовая графика с определением столкновений. Это как нельзя кстати пригодится для анимации и игр. Имеются интегрированными: графический редактор, редактор карт и плиточных изображений, а также редактор Nokia Ring Tone, то бишь тональных мелодий для телефонов Nokia. Поддерживаются четыре типа данных: Integer, Long, String и Float. Наличествуют логарифмические и тригонометрические функции. Поддерживается подсветка синтаксиса. Формы с масштабными, текстовыми, списочными элементами, изображениями, датой и временем. Окна предупреждений (alert box). Даже есть произвольный доступ к файлам, причем файлы могут сохраняться и в самом телефоне. Возможности работы со звуком и некоторые другие, уже более мелкие возможности.
Приятно удивило, что Бейсик включает много команд для написания именно телефонных игр, причем процесс разработки программ хорош тем, что не требует высоких стартовых знаний в области мобильных телефонов. А присутствие нормального списка функций для работы с числами с плавающей запятой, безусловно, открывает дорогу телефонным программам офисного класса. Не Word-ы и не Excel-и, разумеется, но всякие органайзеры, напоминалки, и прочие такие \"учетно-расчетные\" вещи в скором времени, возможно, будут странствовать по телефонам в широком спектре реализаций. Если еще приложить к этому умелое употребление функций связи с удаленными серверами, глядишь, не за горами бум многопользовательских сетевых телефонных приложений.
О регистрации
Мобильный Бейсик - вовсе не бесплатная программа и распространяется в соответствии с доктриной пробного пользования. Пробная (trial) версия полностью функциональна, однако ограничивает размер создаваемых для мобильных телефонов мидлетов и Web-аплетов до менее чем 1 килобайта исходного кода. Хотя на запуск программ в среде разработчика (то есть на компьютере) такие ограничения не накладываются. Так что в случае, когда ваш исходный код не умещается в 1 килобайт, точно придется покупать Бейсик, потому как иначе работу вашей программы будете лицезреть только вы, и то лишь на экране монитора. Впрочем, на примитивные примеры 1 килобайта должно хватить, так что очень даже реально хотя бы в общих чертах оценить, насколько производительно выглядят те или иные действия вашей программы на экране мобильного телефона. Как пример, прежде чем засесть за планомерное создание очередного игрового шедевра, стоит поэкспериментировать, как быстро (или как программно-ресурсо-человеко затратно) будет выглядеть планируемое решение. Килобайта на эксперименты как раз должно хватить. Как говорится, и молока испробовать и грудь ощупать.
Что касается регистрационных моментов, здесь они продуманы необычно. По сложившимся правилам определяются три вида Бейсика: незарегистрированная, пробная и зарегистрированная версии. Незарегистрированная версия запускается не более 30 раз, после чего потребуется регистрация. Пробная версия вроде как должна работать всегда и с полным спектром возможностей, просто не дает сохранить мидлеты или Web-аплеты с размером исходного кода более 1 килобайта. Регистрированная версия, как можно догадаться, избавлена от всех недостатков. И все же есть интересный нюанс. Регистрационный код приобретается в известном порядке и считается правомочным в течение последующих 12 месяцев. Код гарантирует бесплатные обновления на весь этот период. Однако после истечения года эксплуатации последующие обновления уже предоставляются только в платном порядке, благо, за меньшую стоимость. Либо пользуйте старую версию, либо копите денежку на обновления до новых версий.
Общие положения языка
Программа, написанная на мобильном Бейсике, ничем особым не отличается от программ, написанных в других Бейсиках. Точно также программа состоит из ряда строк, а каждая строка может содержать одну или более программных инструкций. Если в одной строке находится несколько инструкций, все они разделяются символами двоеточия \":\". Инструкция может состоять из команд, функций, переменных, констант и операторов.
Команды используются для того, чтобы сообщить Бейсику, что собственно он должен делать. Так, например, команда Print указывает ему, что в этот момент нужно вывести на экран некоторый текст, значение указанной переменной или нечто другое.
Функция - в принципе та же команда, но только функция всегда после себя возвращает определенное значение, зависящее от входных параметров функции. Возвращаемое значение передается в то места исходного кода, где функция вызывалась, что в определенном смысле позволяет ассоциировать функцию с динамической переменной, причем динамика изменений значения такой \"переменной\" определяется исключительно входными параметрами функции. В свою очередь входными параметрами могут быть переменные, константы или целые выражения. К примеру, переменная S$ после инструкции S$ = \"Итого: \" Str$ (3 4) будет содержать значение \"Итого: 7\", так как функция Str$ на основе входного выражения 3 4возвратит после себя текстовое значение \"7\", которое затем будет добавлено к текстовой константе \"Итого: \".
Переменная является обладающим собственным именем \"контейнером\", в котором могут быть сохранены значения соответствующего типа. Чтобы уяснить суть понятия переменной, вспомните действие кнопки \"Память\" обычного калькулятора. При нажатии этой кнопки число на экране калькулятора сохраняется в памяти. Потом это число при необходимости можно извлечь из памяти и поместить обратно на экран калькулятора. Память калькулятора как раз и есть той самой переменной (контейнером), где временно сохраняется нужное значение, только в Бейсике можно использовать не одну переменную, а множество разных, определив для них разные имена. А имена переменных всегда должны начинаться только с букв (от английского A до английского Z). То есть первый символ имени переменной всегда является буквой, но все последующие символы могут быть как буквами, так и цифрами. Допускается между символами имени переменной вставлять символ подчеркивания, имитируя при необходимости пробел. Все другие символы использовать в имени переменной запрещается. Кроме того, имена переменных, как, впрочем, и названия самых обычных функций и команд Бейсика, не чувствительны к регистру букв, поэтому имена типа \"TEST\", \"Test\" и \"test\" ссылаются на одну и ту же переменную.
Переменные могут быть разных типов, что указывается специальным символом сразу за именем переменной. Если за именем следует символ \"%\" (процент), тогда переменная предназначена только для хранения целочисленных значений типа Integer - целые числа со знаком, например, 1, 4, 16, -5 и так далее. Если за именем следует символ \"#\" (решетка), переменная хранит длинные целочисленные значения со знаком типа Long. Если за именем следует символ \"$\" (доллар), переменная хранит строковые значения типа String. Если за именем не следует ни одного из трех приведенных символов, тогда эта переменная хранит значения с плавающей запятой типа Real.
Естественно, переменная содержит помещенное в нее значение до тех пор, пока в эту переменную не будет помещено новое значение. В дополнение программисту нужно следить за корректностью обращения к переменным внутри исходного кода ввиду наличия четырех разных типов значений, так как имена X%, X#, X$ и X обращаются к четырем разным переменным, ведь в этих именах обозначены совершенно разные типы сохраняемых значений.
Константой называется безымянное значение, данное в момент написания программы и которое невозможно изменить в процессе ее работы. Как и в случае переменных, имеется четыре типа констант: целочисленные константы со знаком, длинные целочисленные константы со знаком (в конце помечаются символом решетки: 3142#), константы с плавающей точкой (3.142) и строковые константы (\"Привет\").
Операторами, как правило, называют самые тривиальные операторы математического языка, среди которых плюс, минус, умножить и так далее. Правда, Бейсик обладает не только математическими операторами, но и логическим (операторы сдвига значений), условными (операторы сравнения) и некоторыми другими.
Переходы между инструкциями
Все написанные в мобильном Бейсике программы начинают исполнение исходного кода с первой строки, затем последовательного продвигаясь по строкам вниз. В некоторый момент может понадобиться пропустить часть строк и перейти на какую-то другую, выделенную строку. Такой переход может быть безусловным или, если он осуществляется при помощи оператора If, условным. Поскольку допустимо не указывать в начале строк их номера, то для операции переходов между строками необходимо иметь определенный механизм маркировки выделенной строки, на которую выполняется переход. Такой механизм существует и реализуется он методом проставления уникальных меток у всех выделенных строк. Метка всегда начинается с буквенного символа от A до Z (далее могут быть любые буквенно-цифровые символы и символы подчеркивания) и завершается символом двоеточия \":\". За меткой в строке более не должна находиться ни одна инструкция. Все они пишутся на следующей строке, сразу после метки. Переход на выделенную строку осуществляется из любого места программы командой Goto, указав сразу за ней наименование метки (двоеточием завершать имя метки уже не нужно). Вот пример использования метки:
startLabel: Input \"Введите число больше 0: \", A% If (A% DimonVideo
сначало добавлю от себя. Найдя эту статью прям слезы навернулись.. Давно изучал этот язык.. Статья не моя. Копирайт сохранен. И так поехали.. Было [...] читать полностью
11097
Затем я закачал нужные СДК для QT и оказалось, что мне нужно значительно больше, чем я думал с начала, я загрузил 900мб, пытался собрать, для эмулятора все собралось, а вот с устройством были проблемы. Я не мог понять, почему оно не собирается, даже пытался писать на https://forum.nokia.com ничего не помогло, уже почти отчаявшись, грохнул все нафиг и распаковал архив заново, и о чудо! Найденный мной и крякнутый компилятор ARM RVCT2.2 собрал qt для устройства! Как я понимаю после билда для эмулятора, он оставляет старые файлы, которые при билде для устройства не переписывает, в результате я всегда получал ошибку.
make: *** No rule to make target `/S60/devices/S60_3rd_FP2_SDK_v1.1/epoc32/release/ARMV5/udeb/QtCore.lib\', needed by `/S60/devices/S60_3rd_FP2_SDK_v1.1/epoc32/release/ARMV5/udeb/QtGui.dll\'. Stop.
make: *** Error 2
Следующим этапом было опробовать сделанное на устройстве, в общем оно работает, но то как, пока очень оставляет желать лучшего, окна располагаются в случайном порядке на экране телефона, и часто в него не влезают, нет возможности нажать на меню чтоб оно выпало и.т.п. Вообще сама идея QT для S60 как мне кажется даже очень хороша, но вот на данный момент писать полнофункциональные приложения пока нельзя.
несколько скриншотов, стандартного примера адресная книга на телене:
https://files.myopera.com/Lubagov/blog/3.jpghttps://files.myopera.com/Lubagov/blog/13.jpghttps://files.myopera.com/Lubagov/blog/22.jpg
Возможности выбрать пункт меню или что-то в нем пока нет, окно уехало куда-то в сторону...
Далее в радости я попытался собрать свое собственное приложение. Следующей проблемой было то, что нигде не написано как же компилировать программу, исследуя примеры, было выяснено что компилировать надо так:
C:/TestQTs60>qmake -spec symbian-abld -o Makefile
C:/TestQTs60myapp.pro
C:/TestQTs60>bldmake bldfiles
и создать файл bld.inf:
#define BLD_INF_myapp_f1df1104
// Files to be exported
prj_exports
// Project platforms
PRJ_PLATFORMS
WINSCW GCCE ARMV5
// Project files
PRJ_MMPFILES
gnumakefile Makefile_f1df1104.mk
myapp_f1df1104.mmp
затем выполнить:
C:/TestQTs60>abld build winscw udeb
где myapp_f1df1104.mmp и Makefile_f1df1104.mk файлы созданные Qmake\'ом. Я написал не сложное приложение, чтобы посмотреть на диалоговые окна открытия и сохранения файлов на телефоне в QT. Вобщем в телефоне это выглядит точно так же как на компе, то есть размер диалогового окна даже не подсогнался под размеры, и так достаточно большого экрана Nokia E70 (Разрешение экрана у Nokia E70 416x352). Так же непонятно почему не работают сигнально-слотные соединения, и почему-то именно в моем приложении, и только на эмуляторе, на телефоне все работает хорошо, и в остальных примерах с этим все в порядке и на эмуляторе тоже. Собственно сам исходник, файл моего приложения TestQTs60.zip ну и сам sis архив myapp_unsign.sis (не подписанный сертификатом) 2129_testqts60.zip (3.29 мб). Еще одна проблема в том, что почемуто QMake создает *.pkg файлы в формате ANSI а не UTF-8 и их не \"хавает\" createpackage.
https://files.myopera.com/Lubagov/blog/4.jpg https://files.myopera.com/Lubagov/blog/5.jpg https://files.myopera.com/Lubagov/blog/7.jpg
Очень надеюсь, что к следующей версии QT, которую обещают выпустить в уже декабре, все-таки будут решены все эти мелочи, и можно будет писать полнофункциональные приложения для S60.
Если вдруг тут найдутся те кому тоже захочется помучится то конкретные инструкции как и что делать можно найти тут https://pepper.troll.no/s60prereleases/
Ну и компилятор RVCT с кряком, в придачу, очень будет полезен: 2129_rvct2.2.rar (3.54 мб) DimonVideo
Первая хорошая новость была о том что Nokia, недавно купившая Trolltech выпустила версию QT для S60, вторая тем что на спарке объявили что у нас с яндекса [...] читать полностью
5186
Материал посвящен технической стороне проекта ShakerRacer - управлению различными электронными устройствами с помощью акселлерометра. В качестве модели была взята достаточно крупная радиоуправляемая игрушечная машинка.
То что получилось, вы можете увидеть на следующем видеоролике .
Для управления использовался смартфон Nokia платформы S60 с акселлерометром, программа на Python for Mobile, передающая данные акселерометра по Bluetooth, и Микроконтроллер с моторчиком. Статья очень познавательна - описываются проблемы проектирования системы, программирование Python приложения, а также создание аппаратной части и ее программирование.
Проект ShakerRacer положил начало множеству подобных проектов и легко может быть перенесен на другие типы аппаратуры. К примеру, здесь демонстрируется управление елочной гирляндой.
Весь исходный код опубликован, и доступен на странице проекта.
https://devmobile.ru/index.php?option=com_content&task=view&id=322&Itemid=2
https://snipurl.com/4tm9i DimonVideo
SDN разместило очень любопытный документ \"ShakerRacer: Drive your Car with your Phone\" с ремаркой (at your own risk…). Материал посвящен технической стороне проекта [...] читать полностью
4349