• «Умный дом» собственными руками

    Представьте картину: вы входите домой, автоматически включается свет и приятный женский (мужской, впрочем — кому как) голос приветствует вас. Вы небрежно бросаете фразу в сторону микрофона: «Дом, включи мой компьютер». Через несколько секунд слышите привычный шелест кулеров своего родного железного коня.

    Фантастика? Под хабракатом я хочу поделиться своими успехами в построении подобной системы у себя дома.
    Читать дальше →
  • Управление транспортным средством с помощью нейронной сети

    • Translation

    Аннотация


    Используя нейронную сеть, мы хотим, чтобы транспортное средство управляло собой само, избегая препятствий. Мы добиваемся этого путем выбора соответствующих входов/выходов и тщательного обучения нейронной сети. Мы скармливаем сети расстояния до ближайших препятствий вокруг автомобиля, имитируя зрение водителя-человека. На выходе получаем ускорение и поворот руля транспортного средства. Нам также необходимо обучить сеть на множестве стратегий ввода-вывода. Результат впечатляющий даже с использованием всего лишь нескольких нейронов! Автомобиль ездит, обходя препятствия, но возможно сделать некоторые модификации, чтобы это программное средство справлялось с более специфическими задачами.

    Введение


    Идея в том, чтобы иметь транспортное средство, которое управляет собой само и избегает препятствий в виртуальном мире. Каждое мгновение оно само решает, как изменить свою скорость и направление в зависимости от окружающей среды. Для того чтобы сделать это более реальным, ИИ должен видеть только то, что видел бы человек, если бы находился за рулем, так что ИИ будет принимать решения только на основе препятствий, которые находятся спереди транспортного средства. Имея реалистичный ввод, ИИ мог бы быть использован в реальном автомобиле и работать так же хорошо.
    Когда я слышу фразу: "Управление транспортным средством с помощью ИИ", я сразу же задумываюсь о компьютерных играх. Многие из гоночных игр могут использовать эту технику для контроля транспортных средств, но есть целый ряд других приложений, которые ищут средство управления транспортом в виртуальном или же реальном мире.
    Так как же мы это будем делать? Существует множество способов реализации ИИ, но ведь если нам нужен "мозг" для управления транспортным средством, то нейронные сети подойдут как нельзя лучше. Нейронные сети работают так же, как и наш мозг. Они, наверное, и будут правильным выбором. Мы должны определить, что будет входом, а что выходом нашей нейронной сети.
    Читать дальше →
  • Конструктор для «Умного Дома» — от идеи до воплощения



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

    Проект, начавшийся в формате «для души», удивительным образом вышел за рамки хобби, и вырос серьезную разработку. В основе лежало желание создать систему, интересную как в плане технического творчества и программирования, так и удобную для повседневного использования. Хотя работа еще в разгаре, уже отчетливо видны контуры задуманного: распределенная система, высокотехнологичный «конструктор» для реализации всевозможных идей умного дома, с хорошей масштабируемостью.
    Читать дальше →
  • Linux Foundation представила первый релиз ОС для автомобиля



      Некоммерческая организация Linux Foundation, вернее, рабочая группа от этой организации, представила первый релиз Linux-платформы для автомобилей. Эта платформа получила название Automotive Grade Linux (AGL), разработка AGL началась в 2012 году, когда и была сформирована специальная рабочая группа.

      По словам разработчиков, новая платформа предназначена для работы со всеми системами авто разных производителей (с необходимостью «доводки» AGL под себя), включая панели приборов, медиасистемы и прочее.

      Читать дальше →
    • Моя реализация «умного дома»

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

        Попытался начертить схему моей комнаты со всеми устройствами объединёнными в сеть, картинка кликабельна:



        Вся идея держится на трёх китах:

        • Децентрализация — вся система функционирует без какого-либо главного модуля;
        • Простота — минимум компонентов и лёгкость подключения;
        • Дешевизна — себестоимость устройства легко уложить в 100 рублей.

        Читать дальше →
      • Наш контроллер для умного дома



          UPD: мы сняли работу Wiren Board Smart Home на видео

          Краткое содержание:


          На базе нашей платформы Wiren Board (компактный индустриальный компьютер с Linux и разными интерфейсами) мы сделали навороченный контроллер для домашней автоматизации Wiren Board Smart Home (ARM9 64MB RAM, GSM/GPRS, Ethernet, Wi-Fi, USB, 2xRS-485/Modbus, CAN, 2 реле, ASK/FSK радиомодуль 433MHz, NRF24L01+ и т.д.), к которому можно подключить кучу всяческих проводных и беспроводных исполнительных устройств и датчиков от разных систем и производителей. Устройство готово и протестировано. На устройства из первой большой партии мы открываем заказ с доставкой до майских праздников по специальной цене.
          Читать дальше →
        • Математические выражения в .NET (разбор, дифференцирование, упрощение, дроби, компиляция)

            Мне со школьных времен был интересен алгоритм вывода аналитических производных и упрощения выражений. Данная задача была актуальна впоследствии и в вузе. Тогда-то я реализовал ее, только получилось все не так, как хотелось: вместо кода IL у меня просто генерировался C# код в текстовом виде, сборки не выгружались, ну и к тому же не было возможности вывода производных в аналитическом виде. Однако потом я решил все-таки реализовать такую библиотеку, так как интерес остался. Стоит отметить, что таких библиотек в интернете большое количество, но нигде я не нашел именно этапа компиляции выражений в IL код, т.е. по сути везде выполняется интерпретация, которая не столь эффективна, в отличие от компиляции. Ну и к тому же я это разрабатывал чисто для себя, для изучения новых технологий, особо не надеясь, что результат моих трудов может где-нибудь потребоваться. Для нетерпеливых: исходники, программа.

            Используемые программы и библиотеки


            1. GOLD Parsing System — IDE для написания грамматик и генерации кода лексеров и парсеров под различные языки (C, C#, Java, JavaScript, Objective-C, Perl, Python, Ruby и др.). Основана на LALR парсинге.
            2. Visual Studio 2010
            3. GOLD.Engine — сборка под .NET, подключаемая для взаимодействия со сгенерированными таблицами.
            4. NUnit — Открытая среда юнит-тестирования приложений для .NET.
            5. ILSpy — OpenSource дизассемблер под .NET.

            Этапы, на которые я разбил весь процесс:
            1. Построение дерева выражения
            2. Вычисление аналитической производной
            3. Упрощение (симплификация) выражения
            4. Обработка рациональных дробей
            5. Компиляция выражения

            Читать дальше →
          • Мой удобный дом

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

            То есть, умный дом — это дом, который может все. А удобный дом — это дом, который все, что может, делает сам.

            Давайте сначала я просто похвастаюсь тем, что умеет мой дом сейчас, а вы решите, имеет ли смысл читать про мой местами горький (а местами очень даже ничего) опыт дальше, ок?
            Читать дальше →
          • Избавляемся от строковых констант в Objective-C

              Магические константы в коде — зло. Строковые константы в коде — еще большее зло.
              И вроде бы от них никуда не денешься, они повсюду:

              1) При загрузке объектов из xib-ов:
              MyView* view = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] lastObject];

              MyViewController* controller = [MyViewController initWithNibName:@"MyViewController" bundle:nil];

              2) При работе с CoreData:
              NSFetchRequest *request = [[NSFetchRequest alloc] init];
              [request setEntity:[NSEntityDescription entityForName:@"MyCoreDataClass" inManagedObjectContext:moc]];
              [request setSortDescriptors:@[ [[NSSortDescriptor alloc] initWithKey:@"someProperty" ascending:NO] ]];

              3) Если вы используете KVO, то строки появляются и тут:
              [self addObserver:someObservedObject 
                     forKeyPath:@"someProperty"
                        options:(NSKeyValueObservingOptionNew |  NSKeyValueObservingOptionOld) 
                        context:nil];

              4) Ну и KVC:
              NSInteger maxValue = [[arrayOfMyClassObjects valueForKeyPath:@"@max.someProperty"] intValue];

              5) Но даже если CoreData вы предпочитаете работу с SQLite напраямую, xib-ами вы брезгуете, то вот такой код вам должен быть знаком:
              [self.tableView dequeueReusableCellWithIdentifier:@"MyTableViewCell"];

              6) Ну и когда Apple представила миру Storyboard — это было замечательно, если-бы не одно но:
              [self performSegueWithIdentifier:@"MySegue" sender:nil]

              -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:( id )sender {
                 if ( [segue.identifier isEqual:@"MySegue"] );
              }

              Вы видите проблему? Она состоит в том, что компилятор никак не проверяет содержимое строк, поскольку не знает (да и не может в принципе знать), что в них содержится. И если вы опечатаетесь или измените значение соответствующих полей в xcdatamodel / xib / storyboard / переименуете property, то ошибка вылезет не на стадии компиляции, а в рантайме, и отловить и исправить ее будет дольше и дороже.
              Так что-же можно сделать?
              Читать дальше →
            • Смешивание текстур ландшафта

              • Tutorial


              В данной статье я расскажу об алгоритме смешивания текстур, который позволяет привести внешний вид ландшафта ближе к естественному. Этот алгоритм легко может быть использован как в шейдерах 3D игр, так и в 2D играх.

              Статья рассчитана на начинающих разработчиков игр.
              Читать дальше →
            • Пишу игрушечную ОС (доступнее о планировщике)

              • Tutorial

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

              Итак, что такое планировщик? Планировщик — это часть ОС, реализующая многозадачность. Число процессоров, обычно, намного меньше числа выполняемых задач. Поэтому на каждый процессор приходится несколько задач. В силу своей последовательной природы процессор не может выполнять эти задачи одновременно — и он поочерёдно переключается с одной задачи на другую.

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

              Далее задачи будем называть потоками. Изначально задачи были однопоточными, и поток выполнения всегда соответствовал задаче. В настоящее время это уже не так, поэтому задача логически разделилась на два родственных понятия: процесс, как контейнер ресурсов, и поток, как независимая последовательность исполнения кода.
              Читать дальше →
            • Пишу игрушечную ОС (о планировщике)


                Продолжаю вести блог о разработке игрушечной ОС.

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

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

                Кроме того, было бы здорово, если бы планировщик не занимался выделением памяти, а мог принимать и возвращать память, выделенную под поток кем-то другим. С одной стороны, это бы обеспечило гибкость произвольного резервирования памяти потоков. С другой – дало бы уникальную возможность сохранять поток во внешней памяти (например, на жёстком диске) с последующей его загрузкой и запуском с прерванного места.
                Читать дальше →
              • Баланс в играх жанра Tower Defense (часть 2)

                  В первой части мы начали рассказывать о балансе юнитов в нашей игре жанра TD, которая неплохо себя показала, добравшись до топовых мест в своих жанрах US, RU и др. Appstore, получила фичеринг в разделе «Игры» в RU Google Play и в New&Noteworthy в 60 странах Appstore.
                  В данной статье мы затронем тему создания новых типов башен по принципу «от рассмотренной ситуации – к юниту», расскажем о расчете параметров крипов и дадим описание бонусов.


                  Читать дальше →
                • Баланс в играх жанра Tower Defense (часть 1)

                  • Tutorial
                  В данной статье речь пойдет о принципах вычисления баланса в нашей игре жанра Tower Defense (TD), которую мы выпустили летом 2012г. для платформ iOS и Android. Мы расскажем, c какими сложностями и ограничениями пришлось столкнуться, каков был ход мыслей геймдизайнера при выборе того или иного решения, и как был получен конечный результат.

                  Достижения игры
                  1. побывала в топ6 и топ7 в категориях US Appstore;
                  2. занимала топ1 категорий и топ7 overall в RU Appstore;
                  3. «письмо счастья» от Apple;
                  4. 425 000 закачек;
                  5. 5 звезд (средняя оценка для всех магазинов);
                  6. множество положительных комментариев;
                  7. обзоры на ведущих мировых мобильных порталах.


                  Читать дальше →
                • Кулинарный путеводитель по архитектурам AI

                  • Translation
                  image

                  Мне постоянно приходится слышать от студентов и начинающих гейм-дизайнеров – да, честно говоря, и от бывалых программистов тоже – один и тот же вопрос, который звучит примерно так: “Какую архитектуру AI мне выбрать для своего проекта?”. Этим вопросом пестрят форумы, его можно услышать на конференции разработчиков игр GDC, и, конечно же, его не один раз вспоминают во время пре-продакшна создатели любой игры – от AAA-класса до инди. Я работаю консультантом по игровому AI, поэтому я постоянно слышу ее от своих клиентов.

                  Обычно, самый лучший ответ на этот вопрос – «Когда как». Вот только подобный ответ мало кого устраивает, поэтому после него мне приходится устраивать самый настоящий допрос.
                  Читать дальше →
                  • +69
                  • 48.7k
                  • 6
                • Вывод текста в iOS: CoreText, NSAttributedString

                  Я хотел бы Вам рассказать про вывод текста на экран в iOS. Вначале это задумывалось как туториал, затем как сбор неочевидных фактов, а получилось что получилось.

                  Способы вывода текста условно можно разделить на несколько категорий:

                  • UIKit — привычные UI контролы. Дают только базовые возможности по отображению, совсем мало возможностей по форматированию
                  • UIKit + NSAttributedString — привычные UI контролы с возможностью установки строки с атрибутами отображения. Куча возможностей по форматированию
                  • CoreText — фреймворк для работы с текстом и текстовыми представлениями. В связке с NSAttributedString дает массу возможностей по форматированию текста и, благодаря нескольким уровням абстракций над элементами текста, расширенные методы по их отображению
                  • CoreGraphics — с помощью него тоже можно отрисовывать текст

                  Читать дальше →
                  • +29
                  • 7.3k
                  • 9
                • Алгоритм поиска пути Jump Point Search

                  Этот алгоритм является улучшенным алгоритмом поиска пути A*. JPS ускоряет поиск пути, “перепрыгивая” многие места, которые должны быть просмотрены.  В отличие от подобных алгоритмов JPS не требует предварительной обработки и дополнительных затрат памяти. Данный алгоритм представлен в 2011 году, а в 2012 получил высокие отклики. Что из себя представляет данный алгоритм и его реализацию можно прочитать дальше в статье.


                  Читать дальше →