вторник, 19 июня 2012 г.

Как скрыть wxMediaCtrl

Задача

Вчера постала передо мной интересная задача. Нужно было скрыть wxMediaCtrl, который занимается проигрыванием видео на форме. Вообще, поскольку в wxPython все, что рисуется, является окном (window), посмотрел в методы wxWindow.

В лоб

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

Неожиданное решение

Переделывать все в корне не хотелось, хотя и форма у меня в принципе не ресайзится, поэтому методом научного тыка обнаружил, что проблему можно решить использованием метода Freeze(). Соответственно, обратный результат достигается методом Thaw().

Почему решение неожиданное? Потому что я никак не ожидал, что после вызова Freeze() контрол станет невидимым, собственно, если обратиться к реализации Freeze(), то можна обнаружить, что он предотвращает любые визуальные изменения объекта, невзирая на работу, которая над ним производится.

Freeze

Сам по себе метод Freeze() интересен тем, что позволяет оптимизировать работу окон на етапе визуализации. Например, перед вставкой большого количества элементов в комбо-бокс, стоит ему перед вставкой сделать Freeze(), а после, - Thaw(), таким образом, пока элементы вставляются, вызовы перерисовки производится не будут.

пятница, 11 ноября 2011 г.

wxPython: Gif-анимация и прозрачность

Кратко об анимации в wxPython

Дяденька делает анимацию на wxPython
В wxPython средства для работы с анимацией имеются в виде пакета wx.animate. Пакет довольно нехитрый - всего несколько классов, из которых чаще всего в работе используются 2:

  1. wx.animate.Animation - инкапсулирует параметры анимации, а также поддерживает загрузку анимации из файла. Поддерживает Gif и Ani форматы анимаций.
  2. wx.animate.GifAnimationCtrl - Контрол для отрисовки проигрывания Gif-анимации в графическом интерфейсе приложения.
Последний - очень соблазнительное средство, так как позволяет фактически в несколько строчек добавить в окно готовую анимацию:

...
ag_fname
= r"progress.gif"
ag = wx.animate.GIFAnimationCtrl(self, -1, ag_fname, pos=(0, 0), size=(64,64))
ag.GetPlayer().UseBackgroundColour(True)     
ag.Play()

Довольно неплохо. И даже больше ... прозрачность.

Прозрачность

Третья строчка вышеприведенного кода намекает нам, что анимация будет использовать вместо цвета, который в ней установлен прозрачным - фоновый цвет окна. Поговаривают, что на GTK оно так и есть, но я, к сожалению, не имел удовольствия в этом убедится, так как пишу софт, давший вдохновение на написания этой статьи, исключительно для ОС Windows.

Что ж, на Windows оно немножко не совсем так. В случае, если окно, на котором находится контрол имеет установленный цвет фона без дополнительных излишеств - все отлично. Проблемы начинаются тогда, когда на форме вручную через графический контекст рисуется картинка или, чего хуже, форма вообще не прямоугольная, а произвольного формата (к сожалению, так получилось, что мой случай).

В таком случае GifAnimationCtrl только вредит, поскольку на нашей красивой форме вырисовывается анимация с прямоугольным серым (ну, или каким там у вас будет) фоном.

Выход есть

Что же, отбрасываем контрол, берем голую анимацию (благо wx.animate.Animation имеет все средства для получения информации о кадрах, их количестве и "прозрачном" цвете) и рисуем на необходимом окне пользуясь DC (естественно, BufferedDC, чтобы избежать неприятных миганий) и таймером. Все, что нам нужно:
  • wx.Timer
  • wx.animate.Animation (.GetFrameCount(), .GetFrame(), ...)
  • wx.BufferedDC
Единственное, что здесь важно, - метод GetFrame(frame_number) возвращает не wx.Bitmap, который рисуюют, а wx.Image. Поэтому, чтобы получить картинку для рисования, нужно сделать Animation.GetFrame(number).ConvertToBitmap().

При этом, если исходный файл анимации имеет прозрачный цвет, картинке даже не надо делать SetMask(), маска будет создана исходя из кадра и цвета прозрачности. Код приводить не буду, в различных ситуациях он может быть разным, но смысл, думаю, понятен.

вторник, 19 июля 2011 г.

Wirbel - кина не будет: электричество кончилось

Мой последний пост о языке Wirbel немножко привлек внимание заинтересованных питонщиков, но тут я вынужден всех разочаровать (заголовок этого коротенького поста как бы намекает). 

С момента последней публикации прошло уже больше двух недель, а все мои попытки достучаться до автора по поводу вирбеля так и не увенчались успехом. Последние активные изменения в исходниках датированы 2008 годом, так что, судя по всему, автор, как говорится, "забил" на свое изобретение, и занялся чем-то более полезным с его точки зрения.

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

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

Всем спасибо за внимание.

суббота, 2 июля 2011 г.

Wirbel - компилируемый Python. Немножко о языке и установке.

Немножко о языке
Ну, не совсем Python, точнее совсем не Python, но синтаксически идентичен, за исключением некоторых ограничений, которые накладывает собой компилируемость в бинарник, а также нескольких новых возможностей. Автором языка и компилятора является немецкий разрбаботчик по имени Матиас Кеттнер, что нетрудно догадаться по картинке.  Вот короткий список характеристик, а заодно и отличий от Python 2.х:
  • print - функция. Поэтому print("Hello, world!")
  • Бинарный код, не требующий рантайма и совместимый с C++
  • Списки типизированы, так что [1, 2, 3, "string"] создать не получится
  • Есть сигнатуры функций, а поэтому def x(a), и def x(a, b) - две разные функции
  • Кортежи изменяемы и могут включать разные типы данных, в отличие от списков: (1, true, "Hi")
  • Строка и символ - разные типы данных. Символ - один байт
  • true, false - зарезервированные слова (в нижнем регистре)
  • import отсутсвует, автор уверяет, что компилятор все сам найдет.
  • Вирбель позволяет писать библиотечки и подключать их из C/C++
  • Ну и, естественно, скорость, как же без этого

Ну, это все можно узнать зайдя на сайт этого чуда. Гораздо же интереснее самому поставить и попробовать.

Вот как я его устанавливал на Ubuntu 11.10

Качаем со странички загрузки исходник. К слову, сам компилятор Вирбеля написан на С++ (вспоминаем, что СPython написан на С). Компиляция и сборка из исходников процесс не новый, а всем хорошо известный.
./configure
После этого он матюкается, что ему каких-то пакетов не хватает - доставляем.
./make
Тут он минуты две думал, плевался в консоль текстом и, в результате,
извините, мол, две ошибки... Ну что же, пишем автору (какой он нехороший человек, что его компилятор не компилируется на моей Ubuntu 11.10 Alpha 1) об ошибке. Но ждать надоело уже через минут пять, поэтому я полез таки в исходники и пофиксил две мелкие ошибки: в файлах Type.cc и Location.cc не хватало #include <cstdio>, а в baustones/httpd/HTTPRequest.h - строчки #include <stdint.h>, чтобы подключить определения целочисленных типов данных.
sudo make install

делает все необходимое, чтобы я наконец-то получил возможность пользоваться этим компилятором.

И наконец - первая программа

Не буду сильно оригинальничать - сделает обычный "Привет, мир!". Для этого создадим уютную папочку, зходим в нее, создаем текстовый файлик с расширением *.wfor (в моем случае wtest.wfor) и наполняем его единственной строчкой:
print("Hello, world!")
После сохранения файла выполняем компиляцию:
wic wtest.wfor -o wtest
Пара секунд размышлений и мы получаем исполняемый файл. Пока есть небольшой минус - такая мелкая программа занимает 93кБ, но, думаю, это некритично.

Надеюсь на to be continued...

вторник, 14 июня 2011 г.

"Clippy reborn" на Хакатоне от developers.org.ua

Clippy reborn on Hackaton

Многим известно, что на прошлых выходных в Киеве, в офисе компании Ciklum было совершенно замечательное мероприятие под названием DOU Hackathon, инициатором и организатором которого являлся Макс Ищенко, он же главный на developers.org.ua. Суть мероприятия заключалась в абсолютном и чистом 24-часовом кодинге на свободную тему на любой доступной технологии и языке. Длилось это дело целую ночь и принесло очень много удовольствия и приятной усталости. Команда, членом которой я являлся, выступила в следующем составе:

  • Дзинько Ростислав (я) - Python - разработчик
  • Котлярский Александр (alex.k) - Ruby / Mac / Mobile - разработчик
  • Дмитрий Домашевский - Python - разработчик
Но как ни странно ничего из того, в чем имеем много опыта мы не использовали, наоборот - целью было создать что-то прикольное с помощью чего-то, в чем мы ни бум-бум, при этом получив не только удовольствие, но и новые знания и опыт. Таким образом родилась идея нашего проекта Clippy, который по существу является просто забавным расширением для Google Chrome. Установить его можно абсолютно бесплатно и в один клик из Chrome Web Store. Проект представляет собой ностальгическую безделушку для Google Docs, которая еще умеет слушать Twitter. Также на github есть в открытом доступе исходники расширения. 

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

вторник, 10 мая 2011 г.

Теперь Google App Engine SDK доступен на языке Google Go

В данном посте не проявлю особого творчества, просто публикую здесь перевод поста из блога Go Project. Данный пост считаю очень важным, так как это первое нашумевшее серьезное применение этого языка; и хотя язык позиционируется, как средство системного программирования, в данном случае получаем язык для веб разработки на облачной платформе Google App Engine.


ОригиналПост на блоге Go Project


Google App Engine предоставляет надежные, масштабируемые и простые средства для создания веб приложений. Более сотни тысяч приложений хостятся на appspot.com и пользовательских доменах и при этом используют инфраструктуру App Engine. Изначально система была сделана для создания приложений на Python, а в 2009-м году добавилась еще и поддержка языка Java. Сегодня, на Google I/O, мы с восторгом объявляем вам, что следующим будет Go. Сейчас эта возможность обозначена как экспериментальная возможность App Engine, поскольку технология является новой; но при этом команды App Engine и Go в восторге от этого достижения.


Под словами технология новая мы подразумеваем то, что она еще "обкатывается". На сегодняшний день App Engine SDK для Go доступен для загрузки, а скоро будет доступен и для хостинга. Начиная с сегодняшнего для, используя SDK, вы получаете возможность создавать веб приложения, изучать API (а также, язык, если он для вас новый), а также запускать веб приложения локально. Когда будет доступна возможность хостинга, вы с легкостью сможете переместить проект в облако Google.

Если вам невтерпеж, и вы не можете ждать так долго, вы можете стать доверенным тестером. Для этого следует зарегистрироваться, и вы попадете в список тех, кому данная функция будет доступна раньше всех. После периода тестирования, мы откроем эту возможность всем, хотя она и будет еще некоторое время оставаться экспериментальной частью App Engine.

Еще одна классная, но менее очевидная вещь заключается в том, что вам предоставлен очень простой способ взаимодействия с Go. У вам Go может быть даже не установлен, так как SDK содержит компилятор внутри. Просто загрузите SDK, распакуйте, и начинайте писать приложения. Более того, сервер приложений, который входит в состав SDK, предполагает, что вам даже не придется компилировать приложение собственноручно; все до ужаса автоматизировано.

В SDK вы найдете много стандартных API App Engine, написанных в хорошем Go-стиле, включая Datastore, Blobstore, URL Fetch, Mail, Users, и другие. Поддержка остальных API будет добавлена со временем. Вам предоставляется полная поддержка языка Go и почти все стандартные библиотеки, кроме нескольких вещей, которые не имеет смысл использовать в окружении App Engine. Например, нет пакета unsafe, а пакет syscall урезан. (Реализация использует расширенную версию настройки в Go Playground на golang.org.)



Также, хотя go-рутины и каналы присутствуют, когда приложение на Go работает в App Engine, допускает запуск только одного потока в конкретном экземпляре (instance). То есть все go-рутины запускаются в единственном потоке операционной системы и нет никакой возможность использовать параллельность CPU для клиентского запроса. Мы ожидаем, что удастся убрать это ограничение со временем.


Невзирая на мелкие ограничения, это настоящий язык: код выкладывается в форме исходников и компилируется в облаке с использованием 64-битного x86 компилятора (6g), таким образом это первый компилируемый язык, который работает на App Engine. Go в App Engine предоставляет возможность создавать приложения, от которых требуется эффективность использования ресурса CPU.

Если вы хотите узнать больше, читайте документацию (начиная с “Getting Started”). Библиотеки и SDK поставляются в открытых исходниках, которые размещены на http://code.google.com/p/appengine-go/. Мы создали новый список рассылки google-appengine-go; не стесняйтесь связываться с нами по поводу вопросов об App Engine. Трекер задач для App Engine - это место для отправки сообщений об ошибках, связанных с новым Go SDK.

Go App Engine SDK доступен для Linux и Mac OS X (10.5 или больше greater); надеемся, что Windows версия также будет скоро доступна.

Мы хотим выразить благодарность за всю помощь и энтузиазм команды Google App Engine, которая сделала все вышеописанное возможным.



- David Symonds, Nigel Tao, Andrew Gerrand, и остальная часть Команды Go.

вторник, 12 апреля 2011 г.

Инструменты для разработки на Python для MS Visual Studio 2010

Наверное, многие уже слышали о том, что разрабатывается такой замечательный продукт. И вот сегодня вышла вторая бета версия. Напомню для тех, кто не в курсе, что этот плагин для Visual Studio поддерживает не только  IronPython, но и всеми нами любимый CPython, начиная с версии 2.5. Более того, частично поддерживаются также PyPy и Jython, и выходит под лицензией Apache 2.0 (ах да, студию все-таки придется купить :) ). Для Python-разработчиков, которые плотно взаимодействуют с ОС Microsoft Windows это будет сущий подарок. Единственный минус в том, что тестировались инструменты только  на Windows 7 и Windows Server 2008, так что пользователям XP и Vista, наверное, придется познакомится с подводными камнями в виде багов. Вот как выглядит это чудо:


Кроме всего вышесказанного набор инструментов поддерживает следующие вещи:
  • Редактор, Intellisense, REPL, …
  • Поддержка CPython и IronPython
  • Локальная и удаленная отладка
  • Профилирование
  • Интерактивные параллельные вычисления сопровождающиеся интегрированным IPython REPL
  • Поддержка кластеров HPC, MPI, включая отладку
  • NumPy & SciPy для .Net (это, по моему мнению, одна из самых больших вкусностей)
  • Поддержка облачных вычислений (тут не знаю, что имеют в виду, наверное, интеграцию с MS Azure, и да, это только в планах)
  • Поддержка Dryad (также пока не реализована)
  • Опен Сорс (Apache 2.0) 
Более детально ознакомится с продуктом, а также скачать и использовать можно посетив официальный сайт.

P.S.
Если кто-нибудь пробовал - отпишитесь в комментах о своих впечатлениях.

В этом гаджете обнаружена ошибка