Архивы по Категориям: Программирование

Неожиданное исчезновение звука при трансляции из Flash приложения через Red5

Есть чат на несколько десятков человек. Обычно кто-то один говорит, а остальные слушают. Периодически у некоторых пользователей пропадает звук. Если поставь NetStream на паузу и возобновить воспроизведение, то звук идёт снова. Никаких ошибок не возникает. Иногда Red5 пишет в логах, что «Consumer disconnect», но иногда нет.

Соответственно, совершенно непонятно в чём причина, т.к. с точки зрения Red5 и Flash всё работает в штатном режиме. В итоге был найден workaround средней степени костылистости.

У NetStream есть свойство «time», которое возвращает позицию воспроизведения. В случае, если кто-то говорит в микрофон, то «time» вернёт количество секунд прошедших с начала трансляции. Для решения проблемы с исчезновением звука — необходимо завести таймер, который раз в n секунд будет проверять свойство «time». Если оно не изменилось, то значит звук застыл и поток следует поставить на паузу и затем сразу же запустить воспроизведение.

GridSplitter, WebBrowser и WPF

Сегодня клиент словил надоедливый баг, от которого мне сразу захотелось начать плеваться ядом в сторону WPF, но прикинув объём писанины и примеров, необходимый для того, чтобы это выглядело убедительно — я решил просто записать описание бага и его решение для будущих поколений.
Читать далее »

Комфортная работа с Adobe Flash в Linux

В последнее время я всё больше работаю в Linux и в связи с этим у меня возникло желание перенести туда как можно больше рабочих проектов, в частности на Adobe Flash. Я попробовал некоторое количество инструментов и поделюсь хорошим рабочим решением с вами.

Сменить рабочую ОС я решился после того как объём серверных частей проектов превысил предел, при котором их ещё возможно комфортно разрабатывать в Windows. Если вы работаете только с flash и только с клиентской частью, то смысла в переезде нет никакого. По крайней мере с точки зрения ускорения разработки и увеличения её удобства. Однако, если вы работаете и над серверной частью, то вся инфраструктура в Linux гораздо более приспособлена для такого рода работ. С технологиями, которые в основном используются при разработке серверной части, в Windows всё очень плохо. Конечно, есть порты, сборки, что-то можно допилить руками, но это приемлемо только при эпизодической работе.
Читать далее »

Почему вам стоит участвовать в Ludum Dare

Потому что вы можете. :)

Ludum Dare — это клёвый конкурс (последний раз засабмитили 1402 игры) для разработчиков игр в котором вы должны в одиночку сделать игру за 48 часов (или за 72 и более лёгкими правилами, в другой номинации. Правила на русском здесь).

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

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

Обратите внимание, что я не использую слово «программист», потому что здесь вы должны не только программировать, но и заниматься абсолютно всеми аспектами разработки игры.

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

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

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

Иногда бывает трудно заставить себя сесть делать новую игру — конкурс это хороший повод. После двух дней беспробудной разработки вы наверняка захотите довести игру до логического завершения, особенно, если получите хороший фидбек.

48 часов это мало, но их всегда можно найти, в отличие от большинства других конкурсов, длящихся неделями. Твиттер, блоги, чаты кипят эмоциями тех кто уже сдался и тех кто ещё надеется засабмитить игру. Участвует невероятно много народу. Если на последнем конкурсе было 1402 готовых игры, то попробуйте представить сколько людей хотя бы пытались что-то сделать.

Удачи!

Ludum Dare Rules and Guide по русски

Рискуя навлечь на себя гнев тех, кто ждёт продолжение перевода серии статей про эмуляцию GameBoy на JavaScript, я всё же решил сделать перевод Ludum Dare Rules and Guide. Я считаю что это поможет привлечь к замечательному конкурсу больше разработчиков из России. Оригинал.
Читать далее »

Почему Ministro нежизнеспособен

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

На мой взгляд решение сделать такую программу было сделано по одной причине, а именно конский размер Qt библиотек и как результат apk файла не очень обрадует будущего пользователя потенциальной программы. А с Ministro получается что вроде как прога маленькая и качается быстро, но:

1. Представьте себя на месте пользователя, который скачал приложение, а оно ему такое: «Дружок, установи ка ещё одно, а?». Такое обычные юзеры не очень понимают;
2. Даже если он установил, то Ministro желает скачать несколько мегабайт библиотек. Что, кто-то будет ждать что ли? Если только программа исключительная и аналогов нет. А сейчас это большаааая редкость;
3. Автоматическое обновление библиотек потенциально может привести к тому, что программа будет неработоспособна. Я не знаю как тщательно проверяется совместимость в Qt, но теоретическая возможность есть;
4. Программа всё равно загружает гигантских размеров библиотеки в память.

С точки зрения программиста Ministro это довольно красивое решение. Когда Necessitas избавится от over 100500 глюков, то возможно даже приживётся в корпоративном сегменте. Но по хорошему развитие должно идти по пути дробления Qt, уменьшения размеров библиотек и т.п.

How to update System.Data.SQLite

When i’ve tried to use latest version of System.Data.SQLite i’ve ran into some problems and there was no working solution at the english and russian articles. So i’ve decided to create two language version of my solution.

System.Data.SQLite is most powerful library to work with sqlite from .NET. This is ADO.NET provider so we have support of the Entity Framework and other modern features. First versions of the library (due to 1.0.66.0) have been developed by this company. Next versions developed here. Latest version is 1.0.77.0.

At the latest version installer does not add SQLite data provider to the data providers list so we cannot use models auto generating for the Entity Framework. I don’t know why this decision has been made but my goal is to fix this issue. We cannot use 1.0.66.0 version because it is obsolete.

All actions performed on .NET Framework 4 and MSVS 2010.

1. Install 1.0.66.0 version;
2. Install 1.0.77.0 version. I recommend sqlite-netFx40-setup-bundle-x86-2010-1.0.77.0.exe. If installer would not work then use sqlite-netFx40-binary-bundle-Win32-2010-1.0.77.0.zip and install libraries to the GAC manually;
3. Create new app;
4. Add App.Config file to the project with such content:

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.77.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
</configuration>

5. Add System.Data.SQLite.Linq.dll to the References.

Обновление System.Data.SQLite

В .NET для работы с SQLite в качестве одного из решений используется библиотека System.Data.SQLite, которая выступает в роли ADO.NET адаптера и обеспечивает поддержку всех новомодных штук (Entity Framework, например). Первоначально разрабатывалась она вот этой вот фирмой и выросла до версии 1.0.66.0. Затем, разработка перетекла вот сюда и последняя версия на данный момент 1.0.77.0.

Однако, в последней версии установщик не добавляет SQLite Data Provider в общий список, что в частности делает невозможным автоматическую генерацию модели для Entity Framework. По каким причинам данную функциональность решено убрать я не знаю, но это неудобство нам надо как-то исправить. Остаться на версии 1.0.66.0 тоже возможности нет, т.к. она несколько устарела.

Конечно, можно попробовать поколдовать с SQLite.Designer и installer из исходников, но я предпочёл решение топорней.

Все манипуляции проводятся на .NET Framework 4.0 и MSVS 2010.

1. Установить версию 1.0.66.0;
2. Установить версию 1.0.77.0. Я советую использовать sqlite-netFx40-setup-bundle-x86-2010-1.0.77.0.exe Если установщик не работает, то скачайте sqlite-netFx40-binary-bundle-Win32-2010-1.0.77.0.zip и установите библиотеки в GAC вручную;
3. Создайте новое приложение;
4. Добавьте в проект файл App.Config следующего содержания:

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.77.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
</configuration>

5. Добавьте в References проекта System.Data.SQLite.Linq.dll.

Necessitas

Порт Qt на Android раньше назывался Lighthouse, а теперь Necessitas. Чёрт подери, кто придумывал это название, я его не могу не то что набрать, а даже запомнить, особенно в 4 часа утра. Копипастю из статьи с другой вкладки, ну и автодополнение браузера помогает.

Как театр начинается с вешалки, так и программа начинается с установщика. Здесь он сделан типа как в большом брате в виде online installer. Всё бы ничего, но с первой страницы я столкнулся с некоторого рода интересным отказом, а именно инсталлятор просто вылетал.

Эмпирическим путём было выяснено, что делает он это если при вводе пути для установки в текстовом поле нажать Enter, а для корректного продолжения нужно тыкать мышкой на Next.

Установка прошла, впрочем, нормально.

После запуска QtCreator я по старой привычке боялся нажимать лишний раз не на те кнопочки. Здесь я пытаюсь пошутить, но такое дело, что QtCreator от названия-фреймворка-которое-я-не-могу-написать возвёл идею полётов в абсолют и если у вас появилось желание поменять настройки проекта, то будьте уверены, что почувствуете себя сапёром, потому что вылетает и зависает это чудо инженерной мысли практически после нажатия каждого пункта меню. Ну может не буквально каждого, но практически каждого по моему мнению достаточно важного.

После попытки компиляции получаем, конечно же, обломс. Неужели, вы думаете, что сие произведение просто так даст вам что нибудь запустить. Оказалось, что JAVA_HOME была прописана неверно и должна указывать на JDK, а не JRE. О чём, конечно же, меня сигнализировало информативное сообщение об ошибке, типа «ant.exe завершился с кодом -1».

Потом, наконец то, всё скомпилировалось и запустилось.

Теперь, наконец, про недостатки самого фреймфорка. Для начала вкратце расскажу как он работает.

Чтобы программа на фреймворке-с-глупым-названием заработала мы должны сначала установить другую программу, Ministro. Qt-шные библиотеки имеют конский размер: QtCore — 20 Мб, QtGui — 90 Мб и так далее, поэтому деплоить напрямую с приложением довольно накладно. Ministro занимается тем, что скачивает из интернета эти библиотеки по мере надобности, обновляет их и т.п.

Вообще на мой взгляд, это глупая затея. Ну не будет обычный пользователь, после того как установил прогу ставить ещё что-то сверху. Не работают тут PC-шные подходы.

По наивности я было попробовал интегрировать библиотеки в apk файл. Подумал ужмёт мож или чё, но тулсет был суров и непреклонен выдав apk файл размером 45 мегабайт, что вызвало просто нервный смех.

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

А ещё если приложение закрыть и открыть снова, то оно просто зависает.

Ещё вот тут можно почитать.

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

Реализация освещения на ActionScript 3

Итак, давно обещанный пост про реализацию освещения в My Little Princess. Сперва я рассмотрю пробные варианты, ну и в конце будет тот, который вошёл в релиз. Вполне возможно, что я где-то повернул в неправильную сторону, так что обсуждение приветствуется. Да, использовался движок Flixel, но описываемые техники не содержат жёсткой привязки к нему.
Читать далее »