Ignite software development 2013-06-09T09:49:20Z http://alexbard.org.ua/feed/atom/ WordPress Alex <![CDATA[Встраивать html5 видео все еще слишком сложно]]> http://alexbard.org.ua/?p=2132 2013-06-09T09:48:55Z 2013-06-09T09:47:57Z Как встроить видео на сайт?

Короткий ответ – воспользуйтесь Youtube или Vimeo. Там работают чрезвычайно умные люди, которые уже решили совершенно все проблемы, которые могут возникнуть при встраивании видео на сайт.

Как это сделать без помощи сторонних сервисов?

Существует 4 основных группы людей, которые будут смотреть видео у вас на сайте:

  1. Использующие современные браузеры с поддержкой коммерческих кодеков (Chrome, Safari, IE9+)
  2. Использующие современные браузеры с поддержкой некоммерческих кодеков (Firefox, Opera)
  3. Устаревшие браузеры (IE)
  4. Слабые мобильные устройства (iPhone 3GS, дешевые Android устройства)

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

Проигрывание видео в Chrome, Safari и IE9+

Самый простой случай. Видео-проигрыватель в одну строчку:


<video src=http://alexbard.org.ua/"video.mp4" width=640 height=360 controls>

Поддержка устаревших браузеров

Для поддержки устаревших браузеров (в первую очередь под этой фразой следует понимать IE7+) будем использовать javasript-библиотеку html5media.js, которая будет создавать flash видеоплеер для случая устаревшего браузера:


<head>
        <script src=http://alexbard.org.ua/"http://api.html5media.info/1.1.5/html5media.min.js"></script>
    </head>
    <body>
        <video src=http://alexbard.org.ua/"video.mp4" width=640 height=360 controls></video>
    </body>

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

  • Chrome
  • Safari(включая iPhone 4)
  • IE9+
  • IE8(flash)
  • Firefox(flash)
  • Opera(flash)

Минусы такой реализации: видео не проигрывается у пользователей firefox и opera без установленного флеша, а также у пользователей слабых мобильных устройств.

Поддержка браузеров с open source кодеками

Для того, чтобы пользователи с браузерами, которые используют open source кодеки, смогли смотреть ваше видео без flash-костыля, вы должны перекодировать видео в open source формат. Например, в WebM. В таком случае код встраивания примет такую форму:


<head>
        <script src=http://alexbard.org.ua/"http://api.html5media.info/1.1.5/html5media.min.js"></script>
    </head>
    <body>
        <video src=http://alexbard.org.ua/"video.mp4" width=640 height=360 controls>
            <source src=http://alexbard.org.ua/"video.mp4"></source>
            <source src=http://alexbard.org.ua/"video.webm"></source>
        </video>
    </body>

На данный момент наш проигрыватель поддерживает следующие браузеры:

  • Chrome
  • Safari(включая iPhone 4)
  • IE9+
  • IE8(flash)
  • Firefox
  • Opera

Теперь остались только владельцы слабых мобильных устройств.

Поддержка слабых мобильных устройств

Современные мобильные устройства поддерживают видео в высоком разрешении, но дешевые Android устройства или iPhone 3GS откажутся проигрывать что-то большее 320 x 180 пикселей. Чтобы поддерживать проигрывание вашего видео на этих устройствах вам необходимо создать видео в данном разрешении и использовать следующий код:


<head>
        <script src=http://alexbard.org.ua/"http://api.html5media.info/1.1.5/html5media.min.js"></script>
    </head>
    <body>
        <video src=http://alexbard.org.ua/"video.mp4" width=640 height=360 controls>
            <source src=http://alexbard.org.ua/"video.mp4" media="only screen and (min-device-width: 568px)"></source>
            <source src=http://alexbard.org.ua/"video-low.mp4" media="only screen and (max-device-width: 568px)"></source>
            <source src=http://alexbard.org.ua/"video.webm"></source>
        </video>
    </body>

На данный момент наш проигрыватель поддерживает следующие браузеры/устройства:

  • Chrome
  • Safari(включая iPhone 4, iPhone 3GS)
  • IE9+
  • IE8(flash)
  • Firefox
  • Opera
  • Android (включая дешевые устройства)

У меня все еще, что-то не работает

Проверяйте корректность декодирования видео в разные форматы или настройки своего сервера.

]]>
0
Alex <![CDATA[Nancy Framework]]> http://alexbard.org.ua/?p=2121 2013-06-09T09:49:20Z 2013-06-07T22:42:02Z Nancy – это легковесный веб-фреймворк для .net. Я уже имел возможность использовать этот фреймворк для написания нескольких коммерческих проектов и могу сказать, что работать с ним – одно удовольствие. Причем он подходит не только для начинающих веб-разработчиков, но и для профессионалов своего дела.

Начнем по-порядку.

Установка Nancy

PM> Install-Package Nancy

или с сайта  http://nancyfx.org/

Пишем первый сайт


public class SampleModule : Nancy.NancyModule
{
    public SampleModule()
    {
        Get["/"] = _ => "Hello World!";
    }
}

Готово!

Сайт на Nancy готов.

]]>
0
Alex <![CDATA[Aurora.js – аудио фреймворк для web]]> http://alexbard.org.ua/?p=2116 2013-06-07T21:22:20Z 2013-06-07T21:21:45Z Aurora.js – фреймворк, который позволяет значительно упростить написание аудио декодера средствами JavaScript. Фреймворк берет на себя организацию низкоуровневых процессов: работу с бинарными данными, декодирование и работу с оборудованием, создавая собственную абстракцию над этими процессами. Aurora.js имеет два высокоуровневых API для считывания информации и проигрывания аудио. Фреймворк легко расширяется для поддержки других форматов, декодеров и аудио-устройств.

Демо

Исходники

]]>
0
Alex <![CDATA[Планы и всякое]]> http://alexbard.org.ua/?p=2109 2013-04-24T13:15:50Z 2013-04-24T13:15:50Z Я давно не писал в блог “просто так”, о жизни. Этот пост будет посвящен этому. Я расскажу о том, чем я живу в последнее время, о прогрессе в разработке Ignite и о своих планах на будущее.

С 2009-го года я был в свободном плавании – будучи некрасиво уволенным по сокращению с предыдущего места работы, я не нашел ничего лучшего, чем открыть субъект предпринимательской деятельности и продолжить работать самостоятельно, на себя. Дела шли неплохо, но этот пост не про это, как и не про то, как в нашем государстве(Украина) способствуют развитию мелкого бизнеса. Скажу только, что к 2013-му году работать стало окончательно невозможно, и я начал искать работу программиста на стороне.

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

Я пошел работать на должность web developer`a и разрабатываю сейчас интересное web-приложение для своей компании. Она не занимается аутсорсом (как 99% компаний в Украине) и это первое, что меня радует. Второе – то что мне удалось совладать с собой и стресс с депресняком, которые преследовали меня при поиске работы и получении отказов, не заставили меня сменить ни род деятельности, ни даже язык программирования.. хотя конечно акцент с десктопов сместился на веб. Я все также продолжаю совершенствовать свои знания C# и .net framework.

От работы перейдем к личным проектам: работа над Ignit’ом опять застопорилась – за последние три недели я не написал ни строчки кода(ну может быть несколько). Если честно, мне просто надоело его писать. И, вероятно, это будет концом его разработки. В ближайшие дни я соберу версию, пригодную для публикации, и выдам ее на гора. Возможно, исходные коды уедут на github, но, если честно, мне стыдно за некоторые(многие) места времен hello world моего обучения языку C#. Возможно, публичный (сырой) релиз подстегнет мой интерес.. если же нет, то в задумке крутится новая (и совершенно не похожая на предыдущую) игра:

Игра будет написана с использованием MonoGame и будет поддерживать Windows/Linux из коробки и MacOS/iOS/Android в перспективе. Рабочее название Into the Void. Тематика: первое освоение далекого космоса.

]]>
0
Alex <![CDATA[C# Отложенное получение данных]]> http://alexbard.org.ua/?p=2099 2013-04-13T12:22:29Z 2013-04-13T12:17:30Z Иногда при программировании сталкиваешься с задачей, которая выполняется длительное время. Обычно такие операции выполняют в отдельном потоке, чтобы не мешать ходу работы программы – таким образом решается проблема недоступности потока программы во время выполнения длительной операции, однако тут же возникает проблема синхронизации полученных в результате длительных вычислений данных с данными программы. Тут не работает привычная присваивания:


var a = someAction();

В моей программе, я использую BackgroundWorker’ы для выполнения длительных вычислений. BackgroundWorker асинхронно выполняет поставленную ему задачу (в событии DoWork), а после ее выполнения может сделать еще какие-нибудь действия (событие RunWorkerCompleted):


public static void someAction()
{
   var worker = new BackgroundWorker();
   //действие
   worker.DoWork += (sender, args) => {};
   //результат
   worker.RunWorkerCompleted += (sender, args) => {};
   //запускаем асинхронный процесс
   worker.RunWorkerAsync();
}

К сожалению, если мы передадим переменную, которая должна измениться в результате выполнения асинхронного запроса с модификаторами out или ref следующим образом:


public static void someAction(ref int i)
{
   var worker = new BackgroundWorker();
   //действие
   worker.DoWork += (sender, args) => {};
   //результат записываем 
   worker.RunWorkerCompleted += (sender, args) => {
      i = 1;
   };
   //запускаем асинхронный процесс
   worker.RunWorkerAsync();
}

, то это приведет к ошибке на этапе компиляции, т.к. передача ref/out переменных в анонимные методы запрещена.

Обойдем это с использованием собственного класса:


class Interfaced<T>
    {
        private T _value;
        public T Value {
            get { return _value; }
            set
            {
                if (value.Equals(_value)) return;
                _value = value;
                ValueChanged.Invoke(this, null);
            }
        }

        public EventHandler ValueChanged;
    }

Класс очень простой: он состоит из свойства Value типа Т (т.е. любого, заявленного заранее, типа) и события, которое срабатывает, когда Value изменяется.

Пример использования класса:


class Main
{
    string[] strings;
    public Main()
    {
         var iValue = new Interfaced<string[]>();
         iValue.ValueChanged += (sender, args) => 
             strings = ((Interfaced<String[]>) sender).Value;
         Helper.AsyncAction(iValue);
    }
}

class Helper
{
    public static void AsyncAction(Interfaced<string[]> iValue)
    {
         var worker = new BackgroundWorker();
         worker.DoWork += += (sender, args) => {};
         worker.RunWorkerCompleted += (sender, args) 
             => {iValue.Value = new string[5];};
         worker.RunWorkerAsync();
    }
}

В данном случае, strings перестанет равняться null в момент завершения асинхронной операции.

]]>
0
Alex <![CDATA[]]> http://alexbard.org.ua/?p=2091 2013-04-10T08:21:48Z 2013-04-10T08:21:24Z

]]>
0
Alex <![CDATA[Управление свободной камерой]]> http://alexbard.org.ua/?p=2088 2013-03-11T18:02:51Z 2013-03-11T18:02:51Z

]]>
0
Alex <![CDATA[]]> http://alexbard.org.ua/?p=2086 2013-03-08T21:22:33Z 2013-03-08T21:22:33Z

]]>
0
Alex <![CDATA[Ignite pre-Alpha gameplay: New Interface]]> http://alexbard.org.ua/?p=2082 2013-03-04T13:26:47Z 2013-03-04T13:26:47Z

]]>
0
Alex <![CDATA[]]> http://alexbard.org.ua/?p=2080 2013-02-25T10:11:25Z 2013-02-25T10:11:25Z

]]>
0