Showing posts with label личное. Show all posts
Showing posts with label личное. Show all posts

Monday, March 23, 2009

Sapka contest

Не так давно закончился контест Sapka, который проходил с 13-го по 20-е марта 2009 года. Я принимал в этом контесте участие и не могу не поделиться впечатлениями, ведь их было очень-очень-очень много.

Введение

Sapka - контест, больше похожий на ICFPC, чем на контесты, проводимые ACM. А именно - задание здесь одно, марафонного типа, которое может решить практически любой хороший программист, но только в ситуации, когда у него в распоряжении будет неограниченное количество времени. К тому же задания как в ICFPC, так и в Sapka обычно намного интересней, подаются в игровой форме и больше требуют не знания алгоритмов, а умения напрягать мозг, концентрировать усилия и бороться. Для меня контест Sapka стал первым контестом подобного типа.

Команда

Sapka и ICFPC - командные соревнования. Естественно, участвовать можно и одному, но для одного человека объем работы очень велик, да и вместе веселее. Поэтому очень важным является выбор команды, настройка средств коммуникации, распределение ролей и т.д.
Я до самого конца не был уверен, буду ли я участвовать в Sapka, поэтому команду я нашел лишь за день до соревнований, да и за день мы никак не готовились к участию. Как ни странно, но ничего страшного из-за этого не случилось, были и покрупней просчёты :) Итак, команда под названием "a" изначально состояла из трёх человек - Вашего покорного слуги, xa4a и A2K. Но у последнего участника под конец соревнования были завалы с учебой, поэтому написанием самого решения занимались всего два человека.

Начало соревнования

Оригинальное задание можно прочитать на сайте Sapka. Фан начинается уже здесь. Если кратко - то нам даётся некий сервер некой игры, в которую надо стучаться по телнету. Нужно написать клиента для этой игры. Всё! Никакого точного ТЗ, только упоминание о том, что сначала сервер нужно сконфигурировать. И вот с таким багажом знаний все участники и вступают в игру.
Лично для себя я всё время участия могу поделить на 3 этапа:

Этап 1. Хак сервера :)

То, что сервер написан на Java, и то, что защита там игрушечная, впоследствии позволило многим командам получить все нужные для конфигурации данные в течение первых 1-2х часов соревнования. Это также вызвало бурные дискуссии и недовольство тех, кто не смог сервер хакнуть. В гугл-группе даже жаловались, что из-за того, что в команде не было ни одного джависта, у них не получилось похачить сервер и поэтому они не смогли "заняться собственно программированием"(с). Для тех, кто все еще считает, что для взлома сервера обязательно нужны знания Java - следующий абзац.
Обладая минимальными знаниями Java и обладая к Java большой нелюбовью, я пересилил себя и приступил к "взлому" сервера. Вся процедура взлома заключалась вот в чём: разархивировать jar; увидеть, что там есть какой-то loader; натравить на него jad (найден в google по словам Java Decompiler); открыть Eclipse; запихать туда расшифрованный код; пройтись по коду и найти место, где происходит дешифрация; добавить запись в файл прямо там(код записи в файл был также найден в google ;));скомпилировать и использовать получившийся код для дешифрации файлов; после этого натравливать jad на дешифрованные файлы. Чтобы долго не лазить по обфусцированному коду, я взял и банально расшифровал самые большие файлы, которые были в архиве. И тут же налетел на нужные файлы - на описания логики игр. Чуть погодя(почему погодя - смотрите ниже) был написан и генератор конфигурационных токенов(простым копированием существующего кода). Вы всё еще считаете, что для взлома сервера нужно было знание Java? ;)
На самом деле, я занимался исследованием сервера намного дольше, чем это могло показаться. Во-первых, я вначале пытался достать конфигурационные токены прямо из памяти, но успеха не добился. Во-вторых, команда активно ковыряла квестовую часть Сапки, и я также принимал в этом участие.

Этап 2. Квест

Все конфигурационные токены можно было достать, пройдя текстовый квест, общаясь по telnet с сервером. Это было очень увлекательно, поэтому даже когда я уже достаточно продвинулся в процессе взлома, мы всё равно продолжали решать задачки. Так были найдены практически все токены, кроме DNA (сгенерировать токен оказалось намного проще, чем решить эту задачу). Также были подсмотрены в коде сервера секретные пароли, так что токены, которые они дают, также были получены путём хака.
В общем, описать квестовую часть практически невозможно - это было незабываемо! :) Внутри был Брейнфак, Forth-подобный язык, "шашки"(за них отдельное спасибо, я был просто поражен, когда обыграл его) + несколько задачек на преобразование текста. Я постарался не выдавать никаких секретов в описании, поэтому если вы не видели квеста - it's worth to try it out! Даже несмотря на то, что игра завершена, удовольствие вам гарантировано.

Этап 3. Программирование бота

После прохождения квеста стало ясно, что нам нужно написать клиент к bomberman-like игре. В качестве основного инструмента был выбран язык Python. Краткое описание процесса:
xa4a - написание парсера для сообщений от сервера
xa4a - создание визуализатора (на pygame)
tilarids(/me) - улучшение визуализатора
xa4a - создание keyboard controller
xa4a - рефакторинг, фикс багов, random AI
tilarids(/me) - добавлено избегание опасных мест
tilarids(/me) - добавление уничтожителя стен

Здесь небольшая врезка - кончился lightning раунд. На lightning раунд был отправлен бот, который не ставил бомб, а только убегал от опасностей. Причина - за убийство себя давали -1000 очков, а бот был страшен в своей наглости и часто себя убивал.
Дальнейшая разработка заключалась практически в улучшении, рефакторингом и пофиксах существующих алгоритмов.
xa4a - большой рефакторинг, добавлен нормальный механизм переключения состояний
tilarids(/me) - добавлен учёт времени взрыва бомб, простейшее начисление очков(в соответствии с идеей A2K), пофикс багов
xa4a - добавление охоты за бонусами, пофикс багов, рефакторинг бомб
tilarids(/me) - добавление охоты за противником
xa4a - завершение рефакторинга бомб, добавление учета подрыва бомбами друг друга, пофикс багов
tilarids(/me) - пофикс багов, пофикс учета коллапса мира, сабмит

На этом уже подошел к концу сам контест. Мы засабмитили бота, который умеет всё, что нужно для победы, но, к сожалению, он всё же не бессмертен и частенько умирает.
Краткое описание алгоритмов. Бот - простейший автомат, с такими состояниями как "беги", "ищи, куда поставить", "ставь", "охоться за бонусами", etc. Переход из одного состояния в другое был жестко зашит - никакой сложно логики выбора состояния не было - она была просто лишней. Для нахождения путей был применен волновой алгоритм, который учитывал опасности на пути. Для нахождения места, куда ставить, также использовался волновой алгоритм, на котором помечались цели с указанием очков за эти цели. После того, как алгоритм отрабатывал, выбиралась цель с набольшим количеством очков, такая, что если рядом с целью поставить бомбу, то мы сможем оттуда убежать(для проверки, можем ли мы убежать, также использовался волновой алгоритм). В случае, когда бомбу поставить не было возможности, включалась охота за бонусами.
Для тех, кто хочет посмотреть, как это выглядело:

Репозиторий с исходниками находится в публичном доступе. Также есть просмотрщик риплеев.

Благодарности

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

Организаторам

  • Всё же сервер надо защищать лучше. Чтобы взлом сервера был отдельной трудной задачей, а не заменял прохождение квеста. Например, можно было бы некоторые задания составить так, чтобы понадобилось их решать программно в момент запуска клиента
  • Побольше бы заданий наподобие fifth. Задачки на преобразование текста были занятные, но по количеству фана намного менее содержательные
  • Я буду очень рад поучаствовать в Sapka 2010 ;)

Себе на заметку

  • Если желаешь выиграть, нужно пользоваться даже относительно нечестными методами. Если бы мы не тратили время на квест, когда уже были почти все токены, на лайтнинг можно было бы успеть отправить уже активного бота
  • Количество участников в подобных соревнованиях - не главное. Но хорошо, если есть участники, которые могут потратить время на поиск и исправление багов
  • Возможно, стоило попробовать переписать всё вообще без состояний, чтобы получить простого, как пробка, но зато бессмертного/безбажного бота. Но после драки кулаками не машут :)
  • Pygame - отличная платформа для визуализации чего-либо

Wednesday, January 28, 2009

Write in C

Не так давно я довольно круто поменял направление деятельности, чем практически вытеснил язык С++ из своей коммерческой практики. Несмотря на это, я продолжаю его любить и продолжаю использовать в некоторых некоммерческих проектах. Так что, надеюсь, в последующих постах будет как Python, так и С++(не считая всего остального). И как доказательство моей преданности семье С языков, ниже отличный ролик. Улыбнитесь!

Если вы даже после этого не не соглашаетесь, что иногда стоит писать на C, а не, например, Python, предлагаю посмотреть вот сюда

Saturday, January 3, 2009

Ретроспектива-2008 и Перспектива-2009

Этим постом я хотел бы подытожить предыдущий год, а также по примеру Eric Florenzano и Lazy Pythonista рассказать о том, чем я собираюсь занять в будущем. Итак,

2008 год. Наконец-то...

  • ...этот блог стал превращаться из глупого эксперимента в нечто, куда мне интересно писать
  • ...я начал своё знакомство с Python, коим остался несказанно доволен
  • ...я начал своё знакомство с LISP, который меня впечатлил куда слабее
  • ...я попытался подружиться с Haskell, который не очень впечатлился мной :)
  • ...узнал о существовании великолепных Django и Twisted фреймворках
  • ...благодаря изменению области деятельности смог существенно расширить свой опыт в Linux и BSD системах
  • ...приобрел существенный опыт в VOIP
  • ...начал работу над бакалаврской работой, в связи с чем познакомился с потрясающей библиотекой OpenCV и инструментарием LaTeX
  • ...зарегистрировался в Juick, побывал на нескольких конференциях/встречах (Exception, IT Talk), открыл для себя прекрасную XMPP конференцию pythonua@conference.jabber.ru
  • ...начал участвовать в некоторых Open Source проектах

2009 год. Хотелось бы...

  • ...установить стабильный темп написания постов(~2 поста в месяц)
  • ...углубить уклон в сторону Python
  • ...переупрямить Haskell
  • ...не забывать про любимый мною С++. В демонстрационных целях хотелось бы попробовать написать простой и элегантный ORM
  • ...создать что-нибудь стоящее на Erlang
  • ...успешно защитить бакалаврскую работу. Я очень надеюсь, что получится выложить под GPL наработки, связанные с этой работой (TeX классы для пояснительной записки + программа)
  • ...расширить участие в Open Source проектах
  • ...попробовать себя в создании и продаже shareware софта
  • ...начать несколько небольших веб-проектов для души
Всех с прошедшими и наступающими праздниками! Я буду очень стараться, чтобы этот блог в 2009м году был интереснее, чем в прошедшем.

Friday, November 14, 2008

Об отношении к вышестоящим

Этот пост несколько дней лежал неопубликованным, потому что я не решался опубликовать эти субъективные размышления, так как они существенно отличаются от тематики предыдущих публикаций. Но сегодня случайно наткнулся на эту статью. Кому легче читать на русском(статья достаточно эмоциональна, а эмоции легче воспринимаются на родном языке) - вот здесь я видел перевод.
После прочтения статьи я стер всё, что написал ранее, потому что не cмог так точно передать свои мысли. Я прочел в этой статье не ненависть к "проприетарному миру", а увидел в ней свою же ненависть к людям, которые обществом ставятся выше меня. Это и начальство, которое мне как назло попадается недалекое. И различные менеджеры, утратившие(или никогда и не имевшие) способность созидать. И преподаватели, которые откровенно глупы. И вся эта кодла бюрократов, официалов, authorities и проч.
У каждого человека есть своя цена. И как неприятно ощущать, что твои познания о ценообразовании никуда не годны, и в реальном мире стоимость человека определяется по параметрам, которые тебе или непонятны, или, что нередко, отвратительны.

Thursday, January 31, 2008

Creative Commons лицензия

Creative Commons - это некоммерческая организация, которая ставит для себя цель предоставить писателям, музыкантам, художникам и т.д. простую возможность управлять правами копирования на свои произведения. Точнее, они предоставляют возможность поделиться на бесплатной основе своими творениями, при этом оберегая от нежелательного использования. Основная идея: CC(общепринятая аббревиатура) поможет вам перейти от "All rights reserved" к "Some rights reserved".
Как не утопично это звучит в нашем мире, где правит стремление к выгоде, и как не сложно в это поверить, но лицензирование по схеме CC получило достаточное распространение, особенно в творческой среде. Феномен этот сродни феномену Open Source Community, однако если участники Open Source движения часто пишут для себя, то CC предназначена для тех, кто не может удержать креативные порывы своей натуры и хочеть поделиться своими шедеврами с миром.
Но, возможно, основная цель CC - это воспитание уважения к чужому труду. Вот такой парадокс - множественные законы о копирайте, многочисленные судебные процессы не вызывают ничего, кроме раздражения, а возможность насладиться творениями других людей абсолютно бесплатно и легально действует как ушат холодной воды. И когда слушаешь какое-нибудь музыкальное произведение, то кроме наслаждения им самим, начинаешь испытывать что-то абсолютно новое - возможно, восхищение людьми, которые это создали.

Для тех, кто хочет окунуться в это прекрасное состояние, рекомендую сайт http://www.jamendo.com/
На этом сайте вы сможете:
- Прослушать и скачать множество альбомов самых различных музыкальных направлений. Удобно, качественно и при этом абсолютно бесплатно!
- Писать и читать рецензии на альбомы
- Пообщаться в сообществе людей, объединённых верой в свободное творчество
При желании также можно сделать пожертвование понравившемуся исполнителю для его поддержки.
В общем, "...не стесняйтесь, заходите на Jamendo и помогайте нам нести в массы бесплатную музыку!"(c)

Thursday, January 24, 2008

Квест "Покупка prepaid карточки Utel в Харькове"

Для тех, кто еще не знает, с недавнего времени(а точнее, с 1-го ноября 2007-го года) компания Utel начала продажу услуг мобильной связи поколения 3G (UMTS/HSDPA). Это не первая 3G сеть в Украине, но всё же она в новинку для украинского рынка - до этого услуги предоставлялись в основном по протоколу CDMA 2000 (тот же PEOPLEnet). Дабы не развивть тему сравнения технологий CDMA 2000 и UMTS предложу лишь обратить внимание на количество устройств, поддерживающих ту или иную технологию. Для меня решающим был как раз тот факт, что UMTS поддерживают большее количество телефонов.
Итак, начнём наш квест. Если вы решитесь его повторить, то о всём, что вам будет нужно в процессе выполнения, вы узнаете из дальнейшего текста. Единственное, что вам нужно изначально - это желание и понимание того, что вы делаете.

Приобрести карточку Utel нельзя в первом попавшемся магазине, как это бывает со стартовыми пакетами украинских GSM операторов. Для того, чтобы приобрести ее, прийдётся отправиться на пл. Конституции(здесь и далее я предполагаю, что читатель знаком с городом Харьковом). Напоминаем себе адрес - пер. Армянский, 1/3. Работают с 8ми и до... К сожалению, этого я не запомнил, но данные всегда можно уточнить по телефону 8-800-500-1188.
Итак, добираемся до пл. Конституции(ст. м. Советская) любыми средствами. Спускаемся до магазина "Мелодия"(вниз, мимо "Детского мира"). И смотрим налево, в тщетной надежде увидеть вывеску Utel. На сегодняшний день ее там нет, и, возможно, очень долго не будет. Горе тому, кто не знает, что Utel скрывается там, где написано "Урктелеком" - ведь найти Армянский переулок достаточно сложно(существует подозрение, что это не переулок, а дом), а даже обнаружив, можно долго ходить вокруг здания, ничего не понимая. Но довольно растеканий - проходим от магазина "Мелодия" в сторону длинного Московского проспекта немного - и заходим в дверь, над которой написано "Укртелеком".
Не думайте, что квест на этом заканчивается. Скорее всего, наличные деньги у вас не примут, но выдадут счёт, который будет нужно оплатить в отделении "Приват-банка". Ближайшее отделение - внутри магазина "Мобилочка" на пл. Розы Люксембург. Выходим из отделения "Укртелекома" и движемся в сторону ЦУМа и площади Розы. Магазин отыскать не сложно, поэтому остановимся лишь на моменте оплаты. Стоит карточка 100 грн(из них 50 грн - на счёт) - со всеми пенсийными и прочими сборами. Или не со всеми, как неожиданно решило руководство "Приват-банка". Вполне возможно, что вам прийдётся заплатить также и комиссию в размере 20 грн. А возможно и нет - при первом прохождении квеста кстати подвернувшийся сотрудник Utel'а быстро решил все недоразумения с комиссией и отправил назад получать карточку.
Возвращаемся и получаем заветную симку. Здесь же на месте можно попросить перевести на другой тариф(если вас не устраивает изначальный U'нион). Происходит это следующим образом - один тариф "выключается", второй "включается", и через 20-30 минут уже можно пользоваться новым тарифом.

Я использовал карточку в WM коммуникаторе Toshiba G900. Нашёл сеть он быстро и бзе проблем, а вот с настройками инета всё было куда более странно. Но это - уже другой квест, который был успешно пройдён(и, возможно, будет освещён в другой статье). В итоге - получаем неплохую связь, приятную скорость data connection'ов, видео звонки и прочие вкусности. Ведь это именно то, чего мы хотели, начиная этот квест?

Saturday, September 22, 2007

Переход на личности

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