Блог пользователя AlexSkidanov

Автор AlexSkidanov, 12 лет назад, По-русски

Сегодня я хочу рассказать про Хакатоны – интересный вид соревнований по программированию, который заметно отличается от всего, к чему привыкли люди, которые занимаются спортивным программированием. Хакатоны весьма популярны во всем мире, они проходят с какой-то периодичностью и в России, и на Украине, а в кремниевой долине их особенно много. За последние полтора месяца я поучаствовал в четырех хакатонах, и остался невероятно впечатлен.

Хакатон в Nokia
Самый первый хакатон, в котором мне довелось поучаствовать, проводился компанией Nokia, и целью хакатона, как можно догадаться, было разработать приложение для Windows Phone 7. Длительность “coding phase” была восемь часов, и разрешалось приходить с готовыми наработками. У нас готовых наработок не было, так что вся подготовка заключалась в том, чтобы найти два ноутбука с Windows, и поставить на них Windows Phone 7 SDK. Так как это был наш первый хакатон, мы не знали, чего ожидать. Мы приготовили идею – мы хотели написать приложение, связывающее два телефона, и дающее им канву, на которой они оба могут рисовать. Идея не очень сложная, и не очень новая – она, например, реализована в Pair. На хакатон я пришел с супругой, которая у меня тоже программист. Ни я ни она из-за рода работы не работали на Windows к тому дню уже порядка года, поэтому рабочая станция была немного непривычной. Для начала мы открыли документацию “пишем Hello World для WP7”, которая описывала, как создать простейшее приложение для WP7. Так как технологии развиваются с невероятной скоростью, простейшее приложение – это не приложение с текстом Hello World посередине, а web-браузер. Пройдя каждый пункт документации у нас получилось приложение с компонентой WebBrowser на весь экран. Это подтолкнуло нас к идее, что все приложение можно написать на HTML5 Canvas, и затем просто воткнуть его в эту самую компоненту. Мы в конечном итоге так и сделали. Через четыре часа приложение было уже написано, и мы рисовали на общей канве с двух компьютеров. Сервер мы быстренько подняли на EC2, и написали на PHP – буквально два 10-строчных скрипта. Порадовавшись тому, что за четыре часа до конца у нас все работает, мы решили проверить все на эмуляторе телефона. Указали WebBrowser компненте загружать страницу на EC2, запустили приложение, начали рисовать пальцем, и… а тут все стало не совсем радужно. Когда на WP7 нажимаешь пальцем и начинаешь его двигать, он прокручивает страницу, и ни Mouse Down, ни Mouse Move события на странице не вызываются вообще. Существующие специально для этой цели Touch Start и Touch Move события на WP7 не поддерживаются тоже. Я нашел вопрос на Stack Overflow, где спрашивали, можно ли отключить прокрутку страницы в WP7, с ответом “мой знакомый работает в WP7, и ответ – нет”. Тут-то мы и поняли, что четыре часа стараний ушли в унитаз, потому что запустить наш HTML5 код на WP7 попросту нельзя. Но, конечно, мы были далеко не первыми людьми, столкнувшимися с этой проблемой, и в мире есть много энтузиастов, которые так просто не сдаются. Порыскав поглубже в интернете я нашел двух ребят, которые через Reflection смогли найти во внутренностях WebBrowser часть, отвечающую за прокрутку, и собрали пример того, как ее оттуда можно выпилить. Я вошлебной силой копипаста реализовал такую же функцинальность у себя, перезапустил проект, повел пальцем, и никакой прокрутки не произошло. Это уже половина победы. К сожалению, как и ожидалось, отключение прокрутки не повлекло за собой срабатывание MouseMove или MouseDown – их, похоже, в WP7 в браузере нет как таковых. Но это решалось уже совсем просто – мы просто поставили обработчики на OnMouseMove и OnMouseDown в C# прямо на сам компонент WebBrowser, и в этих обработчиках вызывали события на HTML странице. Приложение заработало, мы его отполировали, и были готовы к презентации. На презентации мы сделали самое главное открытие о хакатонах, которое затем закрепили на каждом последующем из них: 95% всех презентаций – это шлак. Люди пишут календари, приложения для заметок, аггрегаторы социальных сетей и прочие двухколесные транспортные средства, и в среднем, не зависимо от количества команд, только 3-6 презентаций действительно интересны. На первом хакатоне мы не попали в топ3, но так как не ужасных приложений было всего 6, Nokia вручила 6 телефонов, так что мы с Машей унесли свеженький не залоченный Lumia 900 – очень недурной девайс.

AT&T Mobile hackathon -- Education

Через две недели после хакатона от Nokia мы пошли на значительно более масштабный хакатон от AT&T, посвященный проблемам образования. На нем мы узнали вторую интересную особенность хакатонов – люди относятся к ним очень серьезно. На вступительном слове организаторы сказали, что поводом для этого хакатона стало то, что в Америке 40% студентов не заканчивают университет. Затем люди представляли свои идеи, чтобы собрать команды. На этом хакатоне готовый код приносить было нельзя, и собрать команду было важно. Почти каждый второй человек рассказывал, как его беспокоит такая большая цифра, как 40%, и как его приложение поможет ее уменьшить. Правда, в основном это звучало как: “проблема заключается в том, что у студентов нет удобного календаря в телефоне”, или “у студентов нет удобных средств для заметок”. В общем теория о 95% проявила себя еще на стадии озвучивания идей. Было и несколько хороших серьезных идей – в основном высказанных учителями, а не программистами. Забегая в перед следует отметить, что выигравшая команда была как раз одной из тех, которые собрала учительница, а не программист. Еще до Хакатона решив, что писать надо для таблеток, мы одолжили у Ники c работы его iPad, который после прошлогоднего Russian Code Cup есть у каждого уважающего себя программиста (у меня нету). Наша идея была написать онлайн игру с математическими головоломками. Я ее озвучил, и к нам присоединились двое ребят из Cisco, которым она понравилась. Coding Phase был опять 8 часов. Пока ребята писали паззлы, я писал красивые эффекты на HTML5 Canvas и CSS3, чтобы игра выглядела презентабельно. Как раз когда я собрал небольшую демку с эффектами, к нам подошел парнишка из BlackBerry, и спросил над чем мы работаем. Я показал ему демку, и он предложил нам презентовать это дело не на iPad, а на PlayBook. Он дал нам PlayBook для презентации, и пообещал, что если мы что-то выиграем, он подарит каждому члену команды по Playbook. Поддержка HTML5 и CSS3 на Playbook была более чем достаточная, и моя демка отлично запустилась на нем. К тому времени ребята уже подготовили паззлы, и мы начали собирать все это дело в игру. Сервер опять развернули на AWS, с двумя 10-ти строчными PHP скриптами. За пол часа до конца Coding Phase мы смогли запустить первую рабочую версию игры, и поиграть с двух таблетов друг против друга. На PlayBook анимация немного тормозила, на iPad летала, поэтому мы решили для презенации только упомянуть, что второй игрок играет с PlayBook, но под камеру поставить все-таки iPad. Презентация прошла красиво. Перед награждением к нам подошел один из судей, и сказал, что хотя наше приложение и было технически заметно лучше многих других, в топ3 оно не может попасть, потому что оно не помогает решить проблему с 40% студентов, выпаюащих из колледжа. А так как правило 95% никто не отменял, на третьем месте оказалось приложение, которое просто показывает демотивирующие картинки, которые описывают судьбу человека без высшего образования. Мы же получили первый приз от AWS, так как Amazon спонсировал соревнование, в размере $1500 на AWS аккаунте, и, как следствие, по PlayBook на человека. Нам с Машей два PlayBook были ни к чему, так что она вместо своего взяла себе BlackBerry Bold 9900.

AngelHack

Парнишка из PlayBook оказался Larry McDonough, и предложил нам на следующем Хакатоне выступать от BlackBerry. За один только факт выступления BB платит по $500 на участника, и дает кофточки, кепочки и сумочки. За победу на хакатоне там цифры повыше, но победы не произошло, так что они не важны :о) Следующим Хакатоном, через две недели после AT&T, был AngelHack. Это огромный хакатон, с невероятным количеством участников. Coding Phase длится 24 часа, по итогам которых команда должна засабмитить 90 секундное видео с презентацией своего продукта. Из них выбирается 30 лучших, и они выступают с презентациями перед инвесторами, которые готовы вложить $25000 сразу на месте – это первый приз на соревновании. На этом Хакатоне мы выступали вдвоем c Машей, и писали игру, позволяющую выбрать друга на Facebook и намылить ему морду в игре, похожей на Mortal Combat. В этот раз мы хостились на Windows Azure, потому что они спонсировали соревнование, и я не могу не отметить, что Azure неплохо подрос со своим недавним релизом – если вам нужен PHP + MySQL (Python, Java, NodeJS) сайт, вы просто вводите название домена, и получаете доступы к MySQL и Git репозиторий. Все, что вы пушите в этот репозиторий, автоматически появляется на сайте. Во время работы с Azure было сложно поверить, что это сделал Microsoft. Кто бы мог подумать год назад, что делая git push со своей убунты я смогу обновлять сайт в Майкрософтовском облаке. В общем, в топ30 мы не попали, потому что на этом хакатоне ценились приложения с хорошими бизнес-перспективами, а мы просто написали забавную игру. Вот видео, которое мы в конечном итоге засабмитили:

По итогам этого хакатона мы не получили никаких призов, но унесли 1000 долларов за то, что представляли BlackBerry.

After Google IO hackathon

Наконец, в эти выходные, спустя всего неделю после AngelHack, мы пошли на хакатон, который нам наконец-то удалось выиграть. Хакатон был привязан к Google IO, и проводился компанией Mashery, с 36-часовой Coding Phase. Уставшие после AngelHack и тяжелой рабочей недели, мы не хотели писать ничего сложного, а просто хотели пообщаться с людьми, и выучить что-то новое, посвятить больше времени изучению того, что предлагают спонсоры на этом соревновании. Среди интересных спонсоров были AllJoyn, с API, которое позволяет легко общаться между телефонами/таблетами/компьютерами на небольшом расстоянии по Bluetooth или через общую точку доступа к WiFi, и Sphero Ball – шарик, которым можно управлять с Андройда, и который можно программировать. Сначала мы очень хотели написать что-то для Sphero, но первую половину дня шариков ни у кого не было – спонсор забыл прийти на событие. Но это было не важно, потому что первая половина дня все равно благополучно ушла на то, чтобы поставить Android SDK и разобраться как им пользоваться. Телефонов на Андройде в нашей команде ни у кого не было (у меня WP7, у Маши BB, у двух других ребят iPhone), так что телефон мы одолжили опять заранее, у Дэвида с работы, который купил его всего пару дней назад и еще не успел заполнить его личной информацией. Во второй половине первого дня шарик-таки нашелся, но после непродолжительной игры с ним мы поняли что он является абсолютно бесполезным девайсом. Точность выполнения команд, равно как и точность всех сенсоров в нем настолько ужасная, что написать хоть что-то рабочее для него не представляется возможным. Поэтому мы решили сконцентрироваться на AllJoyn. Настройка его, и долгие попытки связать два телефона заняли ненулевое время, как моего, так и представлителя AllJoyn на хакатоне, но в конце концов мы смогли заставить один телефон получить данные с акселорометра другого. Выступали мы вчетвером, с Марко с работы и молодым человеком по имени Харшит из Cisco, c которым мы выступали на AT&T хакатоне. Марко в первый день нашел Open Souce версию бомбермена на Java, в которую мы попытались сыграть вчетвером. Это было очень легко раньше, во времена, когда существовали цифровые клавиатуры, и стрелки были далеко от букв. Разместить четыре человека на клавиатуре сегодня, когда люди используют в основном лэптопы, дело не простое, и весь второй день мы неспеша хакали эту игру, чтобы сделать возможным управлять человечками с телефонов. Часа четыре с утра я с парнишкой из AllJoyn пытался разобраться, почему код, почти идентичный семплам, разрывает соединение ровно через 20 секунд после установки. Парнишке пришлось поднять половину команды, разрабатывающей AllJoyn, посреди воскресенья, чтобы разобраться в проблеме. В конце концов оказалось, что я создавал ссылку на объект, отвечающий за соединение, в области видимости метода, этот объект создающего, а не класса, содержащего этот метод, и Java любезно через 20 секунд после завершения метода тот объект собирала мусоросборщиком. Откуда берется волшебное значение в 20 секунд я могу только догадываться. В любом случае, задолго до конца Coding Phase все было готово, и мы нарезали в бомбермена с телефонов. Акселорометр управлял человечком, а нажатие в любом месте экрана ставило бомбу. Управление оказалось на удивление недурным, и презентации еще не начались, когда уже почти каждый участник хакатона зарубил в эту игру с нами. Единственные несколько человек на хакатоне, кто все еще не видел это произведение искусства из Open Source игры, едва измененного семпла AllJoyn и нескольких строк кода, все это связывающих, были судьи. Правило 95% в очередной раз проявило себя, и хороших презентаций было от силы 5. Плюс была одна презентация, почти ничего из себя не представляющая, но сделанная двумя 16-ти летними девочками. Они, собственно, собрали почти все вторичные призы – потому что 16-ти летние девочки, по мнению судей, на хакатоне являются более важным качеством команды, чем техническая сложность исполнения. В любом случае, AllJoyn использовало только четыре команды, и мы среди них волшебным образом заняли только второе место, уступив ребятам, которые сделали приложение, позволяющее быстро собрать контакты всех ребят, присутствющих на событии (вместо постоянного обмена визитками). Но в общем зачете мы разовали всех, и заняли первое место, внеся в свою копилку первую победу на хакатоне. В итоге мы ушли домой с $1300, которые, правда, пришлось делить на четверых. Так что для нас с Машей AngelHack, на котором мы заняли ничего, оказался прибыльнее, чем IOhack, который мы выиграли. А сразу после хакатона мы побежали на концерт Dream Threater, который в этот день выступал буквально в квартале от того места, где проходил хакатон, и в трех кварталах от нашего дома.

В итоге за четыре события мы обогатились на три новых девайса и чуть больше чем $3000, выучили много новых для себя технологий (разработка для WP7 и Android, Azure, Facebook API, AllJoyn API, Sphero), познакомились с огромным количеством очень интересных людей. Единственный большой минус хакатонов – они ужасно изматывают, и забирают единственные два дня на неделе, когда можно отдохнуть.

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

  • Проголосовать: нравится
  • +208
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится +32 Проголосовать: не нравится

Спасибо за пост! Все прочитал, очень понравилось!=)

»
12 лет назад, # |
  Проголосовать: нравится +16 Проголосовать: не нравится

А бывает, что участники хакатона публикуют исходники? Было бы прикольно, если бы участие подразумевало бы публиковать весь наработанный материал. Типа, прошел хакатон и по его итогам на github появился такой проект с исходниками всех участников.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +13 Проголосовать: не нравится

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

    Мы наш код пушим обычно после тура в github. Например

    https://github.com/SkidanovAlex/angelhack_angryme

    https://github.com/SkidanovAlex/atthackgame

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +15 Проголосовать: не нравится

Отличная статья. Всегда удивляюсь как Александр так пишет, что невозможно оторваться.

Оффтоп: Не понимаю проблемы 40% отчисленных. Чем жестче отбор, тем лучше выпускники.

Конечно, есть две стороны медали. Или плохо учатся (плохие студенты), или плохо учат (плохие преподаватели).

В моей группе на первом курсе было ~30 человек. Сейчас я закончил 4 курс, и нас осталось меньше 15. По-моему, надо еще 2-3 отчислить.

Я видел этих отчисленных студентов. Для меня остается загадкой зачем они вообще поступали на факультет Компьютерных Наук и Информационных Технологий.

»
12 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

И тут бомбер :)

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится

    Я лично считаю, что MineBombers была значительно более гениальной игрой, чем бомбер. Но я замечаю, что я в этом вопросе в меньшинстве.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      В меньшинстве лишь потому, что minebombers порядком менее популярен, имхо.

»
12 лет назад, # |
Rev. 3   Проголосовать: нравится +36 Проголосовать: не нравится

Подобные мероприятия проводятся и в Украине. Вот одна из ссылок, если кто не знает. Мне посчастливилось поучаствовать в них дважды: первый раз случайно — присоединился к команде друзей, из двух человек. Писали нечто похожее на космическую стратегию. Миниатюрную, с ресурсами, юнитами и зданиями. Организаторы раздали участниками одинаковые блокноты, и действие нашей игры происходило "в одном из них". С объектами, стилизованными в виде ручных рисунков.

На второй Хакатон меня пригласили сотрудники. Планировалось участие в команде, и интересный проект с клаудом. Но так сложилось, что... они не пришли :) Тогда я решил писать хэлпер для игры "Словомания" — моей любимой, популярной на планшетах. Картинка захватывалась с экрана iPad, распознавалась и решалась втупую построением бора по русскому словарю, с последующим бэктрекингом. Как результат — набор игровых полей, на которых стрелочками и подсветкой уже потрэканы соответствующие слова.

Могу сказать, что участие в Хакатонах — это действительно интересно. Захватывает атмосфера и нетипичный режим работы :) Но к сожалению, в наших краях Хакатоны менее популярны. И менее прибыльны. Оба раза я больше фанился, чем кодил. На этих мероприятиях проводятся разные конкурсы, и что-то все время происходит. Программирование велось на чистой Java, и занимало не более 5-7 часов. Тем не менее, оба проекта удостоились 3-го места из ~25-35. И да, мы тоже обагатились. Не нужно жить в Штатах, чтоб "нарезать бабло" на Хакатонах. Теперь у нас есть два Amazon-сертификата, на 100$ каждый, и несколько фирменных девайсов. Футболочек с надписями "douhack" :)

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +31 Проголосовать: не нравится

Я тоже напишу об одном мероприятии. Скорее, оно было похоже на Code Game Challenge, чем на описываемые здесь хакатоны, но, наверное, всем будет интересно.

В Самаре есть компания Cloud Castle, которая взяла себе за правило раз в полгода устраивать Cloud Contest-ы. Первый Cloud Contest прошел ровно в тот день, когда мы приехали с слитого NEERC-2011, и я на него не пошел, т.к. сильно устал. В конце марта этого года прошел второй, о котором я и расскажу.

На этом мероприятии участники должны были написать искусственный интеллект для ботов. Опыт в таких вещах имеется, 4 четвертьфинала в Саратове позади, так что я и Hohol решили прийти и выиграть это мероприятие. Сначала надо было выполнить "тестовое задание" — показать, что ты хоть что-то умеешь :) Оно заключалось в том, что надо было вывести бота из лабиринта к выходу, при том, что карта лабиринта неизвестна, но ее можно было исследовать (подробные правила тут). Я, не долго думая, закодил алгоритм жучка, который примерно один раз из 10 приводил к цели :) Правда, мне потом написали, что мой бот слишком редко находит выход и предложили переделать — что поделаешь, пришлось написать что-то более умное.

Сам контест проводился в арендованном ресторане, где можно было вкусно покушать и выпить. Участники приходили со своими ноутбуками — язык программирования значения не имел — программа должна была обмениваться с сервером сообщениями в формате JSON, передавая их через сокеты. Я выбрал Java, Hohol — C#. Также пришел поиграть еще один олимпиадник, переехавший к нам учиться в аспирантуру, Kasparyan_Mikhail, он тоже выбрал Java.

Контест начался, и мы узнали правила. Кодить нам предстояло 6 часов, и ботов, в отличие от тестового задания, тоже было 6 — можно было управлять каждым из них в отдельности. А вместо нахождения выхода из лабиринта участникам предстояло уничтожать вражеских ботов. Чем больше уничтожил — тем больше очков получил, все предельно просто. Полные правила можно прочитать здесь.

Люди сразу ринулись что-то писать, а я полчаса читал документацию. Потом аккуратно написал обмен сообщениями с сервером и начал думать над алгоритмом. Алгоритм получился такой: все 6 ботов одновременно идут к какой-то точке, уничтожая все на своем пути. Как только они подошли к этой точке, случайным образом выбирается новая точка, достаточно удаленная от каждого из ботов — теперь им предстоит идти туда. И т.д. Стрельба у меня была жадная: если можно убить кого-то с 1HP, я это делал, далее, если можно убить кого-то с 2HP, я это делал, аналогично с полностью здоровыми ботами с 3HP. Этот алгоритм неоптимален, но для данного мероприятия подошел очень хорошо — случаев, когда он не оптимален, практически не возникало. А вот код, который я написал на контесте: http://pastebin.com/4h4mLB3c (лучше его не читать, он какой-то ужасный)

Через 4 часа (привык к саратовским CGC, не иначе) после начала контеста я закончил писать код и оставшееся время ходил и болтал с другими участниками (это было не запрещено, наоборот, все друг с другом общались и веселились). Наконец, начались схватки. Турнир проходил по олимпийской системе, из каждого раунда дальше проходило по 2 или 3 участника, что довольно честно — выбывали всегда только самые слабые.

Моя турнирная сетка была несложная. Я несколько раз с большим премуществом выигрывал свои раунды, так было до полуфинала. В полуфинале меня совсем чуть-чуть обогнали, и я прошел в финал со второго места. Как выяснилось в дальнейшем, человек, который меня обогнал, неправильно написал стрельбу — к примеру, если перед его ботом было два вражеских бота с 1 и 2 жизнями соответственно, он почему-то стрелял в того, у которого было 2HP. В финале этот недочет раскрылся по полной, и он занял четвертое место.

В другой половине почти в каждом раунде сражались Hohol и Kasparyan_Mikhail. Наконец, Михаил в полуфинале не выдержал, занял третье место и вылетел. Codeforces осталось представлять два человека :)

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

Призы давались только за 1 и 2 места, так что Никите не повезло. Мероприятие очень понравилось, несмотря на некоторые баги со стороны разработчиков :) Говорят, что в сентябре будет следующий Cloud Contest — жду с нетерпением!

UPD. А еще есть пост на Хабре от одного из сотрудников этой компании, там несколько фотографий.

»
12 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Нечто подобное проводилось и Казахстане (слышал что начиналось в России, но не факт). Звалось сие чудо Hack day. Те же правила: краткая презентация, набор команд, раздача футболок (которых не всем, в том числе и мне, хватило :( ) и море жратвы. Началось оно около 4 часов дня, закончилось — утром следующего. Спонсором был Samsung. Было там несколько категорий: собственно программирование, кино и видео, и что-то связанное с контентом. У моей команды была бредовая собственно идея — решебник задач по геометрии. Когда мне ее предложили я представил себе идеи эвристики, машинного разума итд. Но ничего больше разбора случаев мы не придумали. За отсутствием MSVS и хорошего интернета, мы писали на Дельфи))))) Естессно, ничего не заняв, мы проспали сутки после этого мероприятия. Первое же место получил проект, в котором при помощи кинекта распознавали жесты (языка глухонемых) и переводили их на русский язык.

»
12 лет назад, # |
  Проголосовать: нравится +10 Проголосовать: не нравится
»
12 лет назад, # |
Rev. 2   Проголосовать: нравится -8 Проголосовать: не нравится

О правиле 95% — я хочу с друзьями подготовиться к подобному соревнованию. Хотелось бы знать (хотя бы приблизительно) какого рода приложение надо разрабатывать, чтобы оказаться в числе других 5% ?