2 года Лаптичке

27 ноября исполнилось 2 года, как вышла моя первая игра для Apple Appstore! Лаптичка!

 

Минисервер

Мне на Новый Год подарили минисервер.
Настоящий сервер! Сделан не в Китае, а в Европе.
Крепкий и надежный корпус. Тяжелый. Дверца на ключе! Винтики и инструменты в комплекте.
Это HP Microserver работает на двухядерном процессоре AMD N54L на частоте 2.2 ГГц.
Изначально в нем было всего 2 Гб оперативной памяти, я тут же добавил еще 4 Гб.
Диск был 250 Гб, пока так и оставил, позже перенесу в него свои объемистые диски, чтобы организовать файлопомойку и торрентокачалку.
Поставил на него Linux Kubuntu: как оказалось серверная Ubuntu – плохая система, а вот декстопная работает на ура!
А так пока использую для тестирования своих серверных приложений: EruditeServer (для пошаговых игр) и OctaveServer (для математических вычислений).

Это чудо стоит всего 8 тыс. руб. в Ситилинке. Сущие копейки! (На самом деле это предыдущее поколении сервера, а актуальное поколение стоит вдвое дороже).
Память обошлась еще в 1300 руб.
Всем брать!

Доволен как слон! Единственный недостаток – он все-таки шумит. Ночью, когда засыпаешь – слышно. Но мне кажется, я стал спать под этот звук даже лучше 🙂

Минисервер в работе
Минисервер в работе

Octave Server

Начал работать над сервером для GNU Octave для лаборатории. Я поискал-поискал и нашел только PHP привязку, причем сам демон сервера тоже на PHP, что не есть хорошо… Поэтому моя идея – сделать сервер на Erlang.

Прототип уже работает. Можно проверить на

telnet dev.erudite-express.ru 20444

 

internal-rfc1918:OctaveServer tirinox$ telnet dev.erudite-express.ru 20444
Trying 195.122.249.19...
Connected to dev.erudite-express.ru.
Escape character is '^]'.
3+2
ans = 5
10-20
ans = -10

Скобки

Они говорили в LISP много скобок… Да, порой действительно много, но они всегда одинаковые – обычные круглые скобки.

А вот Erlang 🙂

jiffy:encode([{[{<<"a">>,1}]}]).

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

Домашний марсоход

Еще позавчера он нарезал свои самые первые круги по моей комнате, а сегодня на него уже повесили хитровыдуманные датчики и показывают инвесторам. Как же быстро растут дети! 🙂

IMG_2596

Решение проблемы с неудаляемыми играми

Существует официальный баг в Game Center API, когда из списка не удаляется GKTurnBasedMatch. Баг достаточно распространенный, он происходит главным образом тогда, когда активный участник покидает игру (вызов participantQuitInTurnWithOutcome:…) и удаляет ее из своего списка матчей. Игра получает какое-то неверное состояние, после чего остальные игроки не могут ее удалить из списка. Причем не могут как из интерфейса матч-мэйкера, так и вызовом removeWithCompletionHandler:… Возвращается ошибка номер 17 (Error=17) о том, что какие-то параметры заданы неверно. При этом сам матч может иметь уже статус завершенного GKTurnBasedMatchStatusEnded!

Как я уже отметил, Apple призналась в баге, но не исправила до сих пор.

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

Суть в том, чтобы несмотря на завершенность матча попытаться (в случае возникновения ошибки) завершить свой ход, передав его любому другому участнику, затем выйти из игры ВНЕ хода и снова отправить запрос на завершения матча. Этот workaround помог мне со всеми неудаляемыми играми!

Вот код:

- (void) removeGameFromGC
{

    [_match removeWithCompletionHandler:
     ^(NSError *error) {
         if(!error)
         {
             DLog(@"match removed!");
         }
         else
         {
             [self reportError:error];

             GKTurnBasedParticipant *nextParticipant = nil;
             for (GKTurnBasedParticipant *participant in _match.participants)
             {
                 participant.matchOutcome = GKTurnBasedMatchOutcomeTied;
                 if(![TurnBasedHelper isHeLocal:participant.playerID])
                     nextParticipant = participant;
             }

             [_match endTurnWithNextParticipants:@[nextParticipant]
                                     turnTimeout:GKTurnTimeoutDefault
                                       matchData:nil
                               completionHandler:
              ^(NSError *error)
              {
                  if (error)
                  {
                      [self reportError:error];
                  }

                  [_match participantQuitOutOfTurnWithOutcome:GKTurnBasedMatchOutcomeQuit
                                        withCompletionHandler:
                   ^(NSError *error)
                   {
                       if (error)
                       {
                           [self reportError:error];
                       }
                       [_match removeWithCompletionHandler:^(NSError *error)
                        {
                            if (error)
                            {
                                [self reportError:error];
                            }
                        }];
                   }];
              }];
         }

     }];
}

Эрудит с Друзьями

Вот над чем мы сейчас трудимся!

942281_4246864669905_1003189680_n

Игра Study Maths

ТЕМА НА GAMEDEV.RU

Мне лень писать что-то, так что копирую оттуда.

Всем привет.
Мне тут вздумалось погрузиться в дебри нейросетей и запилить быстренько приложение, которое позволяет распозновать рукописные (нарисованные на сенсорном экране пальцем или еще чем-то) цифры. Самая простая идея: игра – обучение/тренировка арифметике. Игроку предлагается некий простенький пример, он решает его и пишет ответ, система распознает и говорит «верно»/»неверно». Можно еще добавить очки или ограничить время. Тут недавно была похожая тема, но у меня акцент именно на рукописном способе ввода.

Название: Study Maths (рабочее, возможно, сменится)
Жанр: обучающая головоломка
Начало разработки: 19 февраля 2013 года
Текущий статус: есть демка с базовым функционалом
Язык, API: Obj-C, Cocos2D-iPhone

Пока поддерживаются операции сложения (от 0 до 19), вычитания (без отрицательных), умножения (до 10 * 10), деления (на ноль нельзя!).

На алгоритм распознавания потратил очень много времени: почти неделю. Но пока он далек от совершенства. Я использую 5 слойную сверточную нейросеть, наученную на базе рукописных цифр (MNIST, 600000 цифр). Отсюда вытекает главная проблема: в базе цифры написаны ручкой на бумаге, потом отсканированы. У меня же они пишутся пальцем на экране, рендерятся в текстуру и идут на нейросеть. После нейросети есть еще пара хаков: например, моя рукописная 6 всегда почти распознается, как 5. Пришлось использовать некоторые свойства кривых, чтобы различать их. И то, не всегда успешно. Также алгоритм разделения кривых на цифры, который я придумал сегодня утром, иногда сбоит и нуждается в явной доработке. Хочу добавить еще знаки «+» и «-«, позже «.».

Еще есть концептуальная идея прикрутить к этому делу CMU Sphinx и какой-нить text-to-speech, получим, таким образом, и чисто голосовой вариант. Игра читает игроку пример, игрок отвечает голосом, получает одобрение или наоборот. Обязательно попробую в скором времени, если пойдет гладко (справлюсь менее, чем за неделю), то 100% включу в проект.

Дневник разработки:
19.02.2013 Начало

26.02.2013 Добавлена озвука примеров и результата на аглийском Flite text-to-speech

27.02.2013 Добавлена поддержка распознования голоса (см. видео со звуком):

К сожалению, результат меня сильно не устраивает. Слишком мала точность, требуется тишина, трудно сделать русский язык, приложение очень сильно разбухает в объеме. Так что в первом релизе скорее всего распознования голоса не будет. Я пока не знаю, как улучшить распознования голоса, т.к. использую сторонний API.

Распознование рукописных цифр на iPhone

Фуф! Наконец-то, я добился того, чтобы оно работало более менее нормально. Итак, распознавание рукописных цифр на iPhone. Используется 5-слойная сверточная нейронная сеть.  Сеть натренерована на базе MNIST, которая содержит 60000 образцов рукописных цифр (на каждую, вроде бы, итого 600000). Вдохновлялся этой статьей. Сеть написал сам, но тренеровал ее программой из статьи. Пришлось поднять виртуальную WinXp, поставить на ней VC++ 6, собрать проект, дописать нормальный экспортер данных (по умолчанию был на MFC – CArchive, который вообще некорректно работал и не загружал тестовые данные). Очень долго шло обучение, понадобилось несколько часов. И оно все еще идет… Я периодически скидываю дамп нейросети себе в проект.

Конечно, результат далек от совершенства. Например, эта сеть отказывается воспринимать мою цифру 6, всегда говорит 5. Пришлось писать специальный твик (по-русски – костыль), которые анализирует кривую и по некоторым статистическим данным различает шестерку и пятерку. У программы много параметров, и мне предстоит с ними еще поиграться, чтобы достичь максимальной точности. Планирую скрестить несколько алгоритмов и заставить их работать, как суд присяжных.

Свидетельство на Resonator Studio

 

СвидКольцов2 Еще одно свидетельсво прислали, на этот раз на Resonator Studio (это такая программа для расчета открытых лазерных резонаторов, я написал ее в рамках своего диплома в ННГУ). Теперь у меня два оффициальных документа, что я умею хэллоувердить 😎

Картинка кликабельная, можно посмотреть в полном формате.