*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

вторник, 26 января 2010 г.

Распространенные заблуждения про банковские карточки

Работая долгое время области банковского ПО, а в частности по всяким электронным платежам, вместе с коллегами я составил мини-ЧАВО на тему банковских пластиковых карт. Многие вопросы очевидны, а некоторые могут быть весьма туманными. В России бизнес пластиковых карт набирает обороты, что приятно, и лучше быть подкованным по "матчасти".

Итак, 10 распространенных заблуждений.

1. Количество денег хранится на самой карте.

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

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

Нельзя просто так кому угодно подключиться напрямую в Визу или Мастеркард. Это могут делать только богатые банки или независимые процессинговые центры, так как нужно особое оборудование, немалые страховые счета, сертификация по безопасности и много других "мелочей" (даже не каждый банк может себе такое позволить). Все остальные желающие принимать карты пользуются их услугами.

3. Банкоматы или терминалы для платежей подключены прямо в Визу или Мастеркард.

Крупные международные платежные системы не держат своих банкоматов или платежных терминалов. Любой банкомат или терминал обязательно принадлежит какому-то банку, который в свою очередь либо сам, либо опосредовано (см. п.2) подключен в платежную систему.

4. У меня "на карте" $200. Это все, что я могу потратить.

Остаток на счету и сумма, которую можно потратить в день с карты, сильно между собой несвязаны. Конструктивнее говорить о дневном лимите по карте. Дневной лимит зависит от множества факторов, и может быть как меньше остатка на счету, так и больше. Например, даже если на счету миллион, вам врядли дадут снять в банкомате более нескольких тысяч в день (и это не ограничение банкомата как устройства). И наоборот, но если вы VIP-клиент, у которого обычно на счету миллионы, а сейчас вы в казино и все уже продули, то после звонка в банк, в индивидуальном порядке какой-то из высоких менеджеров может дать команду установить лично для вас нужный лимит, чтобы вы смогли-таки расплатиться. В этом случае банк берет на себя ответственность, что вы ему потом все отдадите.

5. При использовании карты ПИН-код проверят сам банкомат или платежный терминал.

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

6. На магнитной полосе записан ПИН, который может "украсть" любой сотрудник банка, стоит только отвернуться, пока твоя карточка у него в руках.

На самом деле, на магнитной полосе записана крипто-свертка ПИНа и номера карты, полученная при помощи криптографического ключа, который хранится внутри суперохраняемой железяки в банке. То есть с помощью данных с магнитной полосы можно только проверить ПИН, да и то, если знать секретный ключ. Обычно в качестве алгоритма шифрования используется 3DES. «Суперохраняемая железяка» - это аппаратное устройство для хранения ключей и проведения крипто-операции на их основе. То есть после начального ввода ключей (персонализации) в этой устройство они никогда не передаются вне физического корпуса в чистом виде.

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

Интересна методика начального ввода ключей. Например, реален вот такой сценарий. Выбирается N сотрудников безопасности банка, например, 3 (в идеале, они даже знать друг друга не должны лично). Каждый генерирует вариант ключа и никому его, конечно, не показывает. Затем, они по очереди заходят в помещение, где стоит оборудование по хранению ключей, и вводят каждый свой ключ. Затем, когда все ключи введены, устройство делает операцию XOR между ними, и это сохраняет внутри себя в качестве ключа. Получается, что ключ не знает никто вообще. И чтобы его восстановить, надо получить исходные компоненты от каждого из тех N сотрудников безопасности, которые обязаны заботиться о конфедециальном их хранении.

Как я уже писал, в безопасности полумер нет, и подобные административные меры нужны, когда кончается сила криптографии, и начинается человеческий фактор.

Важное замечание: никто из сотрудников банка, никогда, ни при каких условиях не будет спрашивать вас ПИН. Но если б вы знали, сколько раз из десяти, клиенты, звонящие в банк, на вопрос оператора об их секретном слове (которое задавалось при открытии счета), говорят ПИН.

7. При совершении покупки деньги сразу попадают напрямую со счета клиента на счет магазина.

Обычно реальный обмен деньгами (пусть и электронными), происходит в конце рабочего дня. А в момент самой покупки производится только блокировка суммы из доступного лимита (см. п.4). Списание же обычно происходит через несколько дней, когда до банка-владельца счета дойдет финансовое представление от банка, через чей терминал был проведен платеж.

8. Сумма, написанная на вашем чеке при оплате картой, в точности будет списана с вашего счета.

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

Также, сумма, заблокированная при авторизации, может отличаться от суммы, списанной со счета, в случае, если валюта счета отличается от валюты операции, так как реальное списание средств со счета происходит через 1-2 дня, а за это время курс конвертации может измениться.

9. Сумма, заблокированная на счету при оплате картой, так или иначе спишется с моего счета.

Сумма, заблокированная при авторизации, может никогда быть не списана со счета. Через 10 (для банкомата) или 45 (все остальные терминалы) дней без прихода в ваш банк финансового подтверждения операции из платежной системы она будет разблокирована. Это и "хорошо" и "плохо". Это "хорошо", когда вы сделали операцию, от которой хотите тут же отказаться. Сразу после операции вы звоните в банк, объясняете оператору причину отказа, и если она разрешенная, то операция "отменяется", и блокировка может быть снята. В этом случае если вдруг на операцию придет финансовое подтверждение от торговой точки (через пару дней), то сам банк будет разбираться с ним без вашего участия (и ваших денег). Это "плохо", когда вы таки подождали день-два, и финансовое подтверждение уже пришло в банк до вашего звонка, тогда "откатить" операцию будет уже сложнее. Банк будет вынужден начать официальное разбирательство по этому случаю, которое может длиться эти 45 дней. В течение этого времени сумма покупки может оставаться заблокированной.

10. Владельцы дебетовых (а не кредитных) карт не могут оказаться "должны банку".

Как уже говорилось в п.4 — логика авторизации покупки основана не на реальной сумме на счету, а на дневных лимитах, то как и для кредитных карт, так и для дебетовых, можно "залезть в минус", если банк ставит дневные лимиты, немного превышающие остаток на счету даже для дебитных карт.

Надеюсь, эта информация поможет вам избежать некоторых неприятных сюрпризов при использовании пластиковых карточек.

Посты по теме:

воскресенье, 17 января 2010 г.

KeePass, TrueCrypt или как обезопасить свои конфиденциальные данные

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

Меня всегда интересовал вопрос — если администратор замечательного сервиса всех времен и народов «Мейл.ру» сможет узнать пароль ящика пользователя (не удивлюсь, если они хранят пароли в чистом виде) – какова вероятность, что у пользователя с аналогичным именем, скажем, на почте Яндекса, будет точно такой же пароль — более 90% или нет? (А сколько у вас «кросс»-паролей? 2, 3 или больше?)

Вообще, проблема использования одинаковых паролей на публичных сервисах очень недооценена, увы. Вспомните, сколько всяких форумов, онлайн-магазинов, социальных сетей и т.д. могут при восстановлении пароля на аккаунт прислать вам пароль по почте? Их много. Это значит, что ваш пароль где-то хранится в чистом виде и может быть сдан на сторону недобросовестным администратором или подсмотрен из письма, адресованного вам с напоминанием текущего пароля.

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

Интересно, современные почтовые системы типа Gmail или Яндекс используют подобные устройства?

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

Пример из личного опыта. Пару лет назад у меня «увели» почтовый ящик на «Мейл.ру» (с тех пор у меня устойчивый рвотный рефлекс при упоминании этого сервиса). Я не «восторженная блондинко»™ с паролем «1234» на все и имею здравый смысл. Пароль там был «сильный», и единственный способ его потери – это сдача «налево» кем-то из «администрации». Цель? Не могу даже представить, для чего можно это сделать (продать однофамильцу красивый адрес? бред). Но месячная переписка с суппортом и менеджментом сервиса не привели к успеху – ни то, что я мог показать им всю почтовую базу за пять лет и переписку с новым «владельцем» ящика, который предлагал мне его продать назад – ни к чему не привели. Ящик мне не вернули. Благо использовался он только для пересылки, и писем в онлайне не было. Но я потратил недели, чтобы вспомнить все места, где я регистрировался по тому ящику, и экстренно заменить украденный адрес и пароль (пока это не сделал новый владелец через восстановление пароля на e-mail). Не думаю, что это была целенаправленная атака на меня именно, но масштаба проблемы это не уменьшило ни на йоту. Забавно, были сервисы, например, «Аромат.ру», в котором имя аккаунта был сам e-mail, поэтому единственный выход был — это удалить аккаунт на Аромате. А были сервисы, где просто нет функции удаления аккаунта (зачем кто-то будет удалять потенциальный товар, который можно продать спаммерам?). В общем, я кое-как все подчистил, но было очень, очень противно. Очень схожее ощущение, когда тебя ограбили. Так что до сих пор от души желаю «Мейл.ру» скорого разорения.

После истории украденным ящиком, я переосмыслил методу создания, хранения и использования паролей.

Главный принцип — никогда не использовать повторяющихся паролей.

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

Единственный выход — электронный хранитель паролей.

Подобных программ великое множество. У меня были основные критерии:

  • open-source
  • максимальная простота и кондовость использования (в идеале должен быть один exe-шник и portable-режим)
  • наличие клонов под разные платформы (Windows, Linux, сотовые телефоны, iPhone, а теперь уже и Android.

Почему open-source? Факт наличия открытых исходников дает более менее уверенность, что в программе нет «закладок», отсылающих ваши пароли по интернету, «системных» паролей по умолчанию (так как спецслужбы этого могут требовать), и вообще – популярный open-source – это значит, что код отсмотрен сотней другой внимательных глаз.

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

Мой выбор пал на KeePass. Все три критерия великолепно выполнялись, а список платформ, под которые есть реализации, впечатляет.

Почему удобно иметь версии под разные платформы? А чтобы один и тот же секретный файл можно было бы открыть и в Windows, и в Linux или прямо на iPhone или Андроиде, если ты в пути.

Что конкретно делает эта программа, и почему это правильно?

Программа создает файл-хранилище, зашифрованный паролем. Так как используются современные алгоритмы шифрования, то взломать файл его можно разве что методом «грубой силы» полным перебором возможных паролей или по словарю, или методом паяльника. Если пароль «сильный», а не 1234, то в реальности остается только паяльник, но защита от паяльника уже вопрос не компьютерный, а организационный. Поэтому если пароль забыть — с данными можно попрощаться. KeePass имеет приятную дополнительную возможность, когда для открытия хранилища нужен не только пароль, но и секретный файл-ключ (или только он сам без пароля).

Внутри зашифрованного файла можно создавать записи. Каждая запись имеет имя и набор полей — имя, e-mail, url, пароль и поле для произвольных текстовых данных. Записи можно организовывать в группы с помощью простой древовидной структуры. Также есть контекстный поиск по записям.

Поле пароля — особое. По умолчанию оно отображается звездочками. Это удобно, если открытые окно программы случайно увидит кто-то посторонний. KeePass может по команде поместить пароль в буфер обмена на 10 секунд, чтобы вы успели переключиться в окно браузера сделать вставку пароля в форму. По истечении этого времени пароль будет стерт из буфера обмена. Таким образом, паролем можно воспользоваться, даже не видя его.

А теперь ключевая функция программы — генерация паролей. Допустим, вы регистрируетесь на каком-то сайте. Придумали логин, ввели e-mail, и надо вводить пароль. Вы нажимаете в KeePassе кнопку «Сгенерировать пароль» (его длину и алфавит используемых символов можно менять), и получаете новый случайный пароль у себя в окне KeePass’а (напомню, по умолчанию он отображается звездочками). Затем через буфер обмена вы переносите новый пароль в форму регистрации. При такой схеме, вы можете даже сами и не знать, какой там пароль.

Я зарегистрирован на десятках разных форумах, и я не только не помню свой пароль от них, я его даже и не знаю. Если надо, я его перетаскиваю из окна KeePass не глядя.

Конечно, есть ключевые пароли: от вашего основного ящика, мессенджера и т.д., которыми пользуешься часто, и их удобно держать в голове. Но их должно быть два-три. Они также должны абсолютно разными и «сильными», но запоминаемыми. Остальной же регистрационный мусор стоит хранить не в голове, а в программе (например, в KeePass), тем самым не подвергая основные пароли опасности.

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

Если у вас есть портативное устройство (например, телефон с J2ME, Windows Mobile, iPhone или Android), то доступ к паролям можно получить прямо на ходу, если периодически сбрасывать на устройство последнюю версию зашифрованного файла.

У Андроида есть отличная вещь: разработчик приложения декларирует в манифесте какие ресурсы нужны его приложению (сеть, записная книга, флеш-карта, GPS и т.д.). Все остальные ресурсы приложению будут заблокированы. Этот манифест показывается тебе при установке приложения, и сразу видно, чем ты рискуешь. Было бы странно, если бы при установке KeePass на Google Nexus One мне бы сказали, что приложение будет ходить в интернет. Но KeePass запросил только доступ к флеш-карте для хранения файла с паролями.

KeePass хорош для хранение небольшого объема данных. А если счет идет уже на мегабайты или гигабайты, нужен другой подход.

Кроме KeePass я активно последние несколько лет использую TrueCrypt для создания зашифрованных дисковых томов. Удобно, например, на рабочем компьютере создать место, куда стопроцентно никто, кроме вас не заглянет. Кроме того, такие шифрованные «диски» удобно переносить с места на место и бэкапить. TrueCrypt, конечно, open-source, не требует предварительной установки в систему (можно просто носить на флешке) и существует под Windows и Linux (можно лазить за защищенный контейнер из любой из этих систем).

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

вторник, 12 января 2010 г.

Google Nexus One — начало

Вчера мне DHL доставил из Штатов Google Nexus One, заказанный в пятницу на сайте.

Цена вопроса (без контракта): 529$ аппарат, 19$ британская зарядка, 30$ доставка. Итого 578 американских буказоидов.

Я давно являюсь фанатом Андроида, и после G1 и G2 я наконец решил купить сам аппарат, а не только играться на эмуляторе. Тем более Nexus — это официальный аппарат именно от Google.

Сразу скажу, что я пока не рассчитываю, что Nexus сразу полностью заменит мне айфон. Очевидно — аппарат новый, новый Андроид 2.1, так что скорее всего будут глюки (и они есть), но в качестве "игрушки для взрослых" — в самый раз (прошлой игрушкой у меня был Lego NXT), и так как платформа не в пример Эпплу открытая и свободная, обновления, новая информация, и вообще активность разрабочиков не заставит себя ждать (по крайней мере хочется в этого верить).

Вместо подробного отчета с расписыванием размеров, веса и т.д. просто приведу моменты, на которые обратил внимание, как программист (тем более, что есть официальный 3D тур по аппарату.

Что дают в комплекте.

Сам аппарат, съемный аккумулятор (не могу поддержать восторгов на эму тему, так как за два года пользования неразборным айфоном ни разу не захотелось его открыть и поменять аккумулятор, хотя он более одного дня не работает), зарядка от сети (американская и опционально плюс за 20$ британская), проводная гарнитура с микрофоном и кнопкой, кабель USB-to-MiniUSB (боже! стандартный разъем mini-USB), приятный чехол с логотипом Андроида, mini-SD карта на 4GB, инструкция в виде небольшой картонки, мини книжка с гарантией и условиями.

Забавно, что при оформлении заказа можно "персонализировать" аппарат путем нанесения надписи из двух строк на заднюю панель аппарата. Я ввел надпись на русском, и в заказе она выглядела нормально, но вот на в реальности на аппарате каждая русская буква представлена символом ? — ну не взял их принтер русский шрифт на грудь. Не беда, это в своем роде тоже уникальная надпись.

Вынул я симку O2 из айфона и заправил в Нексус. В отличии от айфона, разъем симки находится под аккумулятором, и там же находится карточка mini-SD. Аппарат завелся. Грузился чуть дольше, чем айфон.

Первое, что он меня спросил — это гугловский аккаунт. После этого спросил пароль на wifi и затем моментально подхватил все из гугловского аккаунта (почта, календарь, контакты).

Настройки EGDE/GPRS пришлось руками вбивать из айфона, так как аппарат, конечно, был не в курсе о параметрах O2.

Gmail сделан отдельным приложением, заточенным только под него. Работает в фоновом режиме. Для традиционной почты (POP3, IMAP и т.д.) есть приложение Mail. Пользоваться очень удобно.

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

Я как-то и не ожидал, что в первых версиях прошивки будет русификация. Но русские шрифты и язык для интерфейса таки оказались. Русской же клавиатуры не было. Ну я было уже приуныл и решил, что подожду обновления прошивки, но тут пришла мысль — а не сходить ли мне на Google Market (аналог Apple Store). И первое бесплатное приложение, которое я поставил — это она из русских клавиатур. Теперь я могу писать на русском.

Еще я бесплатно поставил (играясь вчера пару часов): англо-русский словарь (о да!), распознавалку штрих-кодов (фоткаешь штрих-код, и она находит в сети товар), эмулятор игры "Ну погоди!" (там, где волк яйца ловит с четырых полок — это угар!), клиент твиттера, эмулятор терминала (можно telnet'иться на сам Nexus), карту метро и нотификатор состояния его линий (для лондонского метро это актуально). Пока все. Понимаю, набор странный, но это только начало.

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

В качестве аналога iTunes Store предлагается Amazon Store. Работает похоже (можно послушать и купить). Богатство ассортимента я не сравнивал пока (хотя догатываюсь, i-кто победит).

Явные пройгрыши айфону.

Тач-скрин не поддерживает так называемое мульти-нажатие, к которому так привыкаешь в айфоне (очень удобно для zoom'а). В Нексусе zoom сделан просто — делаешь двойной клик на экран, и возникают полупрозачные кнопки "+" и "-". Кстати, надо отметить, что браузер в Nexus мне понравился больше, чем в айфоне, несмотря на отстутствие мульти-тача для увеличения/уменьшения. По умолчанию отображается сайт по всей ширине (горизонтальная ориентация, конечно, тоже есть), и при двойном клике на экран браузер каким-то удивительным образом подбирает размер шрифта для комфортного просмотра.

Еще одно явное неудобство — айфон гораздo умнее плане автоматического отображения виртуальной клавиатуры, когда на экране появляются поля ввода. В Нексусе надо практически всегда вызывать ее принудительно, кликая на поле ввода. Может это поведение можно как-то изменить в настройках — пока не нашел.

Также интересная деталь: в айфоне количество настроек в целом (меню Settings, например) разительно мало, по сравнению с Windows Mobile (скажите, кто не употреблял матерных слов, пытаясь настроить GPRS или Dial-up в смартофоне Windows?) — дают настраивать только что, реально надо настраивать. Так вот: в Нексусе настроек еще меньше.

Замеченные реальные глюки.

Пока я нашел только один — самопроизвольное переключение с wifi на EDGE (я уже читал, что это многими замеченный глюк). Лечится выключением и включением wifi (благо есть просто иконка на десктопе). Будем ждать обновления прошивки.

Пока все. На этом закончились мои первые несколько часов наедине c Nexus.

В целом вывод такой: возможности заменить им айфон пока точно нет, но степень интеграции с гугловскими сервисами и открытось платформы для разработки очень подкупают. Так что для не-фанатов гугла — может имеет смысл подождать, но для любителей гаджетов и поклонников Андроида — отличная игрушка, обеспечащая вам достаточный уровень красноты в глазах.

Постараюсь и далее рапортовать моих интересных находках в Google Nexus.

суббота, 9 января 2010 г.

Инструментальное скоростное прохождение игр

Когда-то я играл в Дум, особенно в Дум 2. Ночью по модему с постоянными обрывами связи, потом по локальной сети, потом через интернет. Да и сейчас люблю порой оттянуться c друзьями на старых "клаcсических" картах Дума, например через Doom Legacy.

Но сейчас не об этом. Дум сразу имел классную особенность — записывать игровые сессии для последующего просмотра. Это порой очень увлекательное зрелище, особенно когда играет мастер или мастера. А самая главная штука — это способ записи. При записи игровой сессии записываются не кадры видеоизображения, а просто последовательность действий игрока — зажатия на клавиатуру и движения мыши или джойстика. Во-первых, такая запись занимает очень мало места, во-вторых — это "чистая" запись, исключащая видеомонтаж, так как для проигрывания можно использовать свою копию игры, которая заведомо нормальная.

Едем дальше. В любой игре подобного толка есть новички (они же "мясо"), есть сильные игроки (я!), а есть мега-монстры (в случае с Думом — "дум-годы"). Очевидно, что сессии игры, записанные такими спецами смотрятся как увлекательное кино. Уровень, который ты проходишь минут за 5 он проходит за 5 секунд. Всю игру, на прохождение всех уровней которой у тебя могут уйти недели, он проходит за 15 минут на максимальной сложности. Наблюдать за этим просто сказка, особенно когда еще такие спецы рубятся друг против друга.

Но сейчас снова не об этом.

Что я познал недавно?

Оказывается с развитием мощностей компьютеров и, как следствие, эмуляторов старых платформ, появилось такое движение как TAS — Tool assisted-speedrun (инструментальное скоростное прохождение). В двух словах — это показательное прохождение игры до победного конца за рекордное время.

Как это делается. Берется старая "классическая" игра. Запускается на эмуляторе. Работа на эмуляторе позволяет делать с игрой все что угодно — замедлять время, дизассемблировать исходный код, делать временные сохранения достигнутых результатов даже если сама игра такого не позволяет, анализировать недостатки и внутренние особенности "движка" игры, пробовать разные маршруты и т.д. Море всяких трюков. Очевидно, что игра живого игрока во многом ориентирована на безопасность, нежели на время прохождения. "Автоматизированный" же игрок может делать то, что живой никогда делать не будет — может подойти к врагу очень близко, так как заведомо знает, что из-за особенностей движка игры при расстоянии, например, в 2 пикселя, враг тебя никогда не убьет. А живой игрой может даже и 20 пикселей не рискнет, так как ему "на глаз" так проще. И "автоматизированный" игрок может уже не бежать за здоровьем, имея только 1% жизни, так как точно известно, что ему этого хватит до конца уровня.

В общем, шаг за шагом, уровень за уровнем создается и записывается в виде действий "игрока" оптимальный сценарий прохождения игры. После этого найденный оптимальный сценарий подсовывается оригинальной игре (или оригинальной игровой приставке) — либо через механизм проигрывания демо-сессий (если игра поддерживает таковой), либо изготавливается для игры специальный игровой контроллер (клавиатура, мышь или джойстик), который уже управляется не человеком, а компьютером по найденному оптимальному сценарию. И игра проходится, проходится вся и очень быстро. Так например, был пройден классический "Супер Марио" на Ниндендо чуть ли не за 5 минут.

Например, вот один из так называемых speedrun'ов в Дум 2:

и Супер Марио:

Понятно, что такая "игра" далека от получения удовольствия от реальной игры, но это просто другой, но также очень увлекательный жанр.

среда, 6 января 2010 г.

Больше коммитов, хороших и разных

Как часто у вас бывает, когда после часов работы выясняется, что все беспробудно сломано и уже не поддается никакой отладке. И причем уже непонятно, где новый код, а где старый. И в этом случае надо доставать вчерашний бэкап и как-то выяснять, что вы тут напрограммировали.

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

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

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

Что делать если у вас используется централизованная SCM? Просто начните использовать любую из современных распределенных систем параллельно с основной централизованной. Для начала можно вообще не вдаваться в детали хитрой интеграции локальной распределенной SCM и централизованной для автоматизированного переноса коммитов туда-сюда (например, как p4-git для Git и Perforce), а делать все просто: просто коммитить процесс работы в вашу собственную локальную распределенную систему для удобства отслеживания микро изменений, а когда все готово — делать большой коммит на сервер.

Мне приходится работать параллельно с разными SCM, и они преимущественно централизованные (SVN, Perforce, ClearCase), и преимущественно правила коммитов и слияний между ветками очень жесткие и детально прописанные. А про создание собственных веток я уж и не говорю. Но это не мешает мне локально использовать git, в котором в дополнение к официальным веткам сидит десяток моих собственных, коммиты и слияние в которых я делаю десятки раз в день.

Я стараюсь коммитить как можно чаще. Например, добавил новый target в Makefile — коммит, добил новый тест (пусть даже он пока не компилируется толком) — коммит, заставил тест компилироваться — точно коммит, ну а заставил тест работать — стопудово коммит. Решил попробовать новый метод линковки проекта и для этого подкорячить Makefile — создал новую ветку, поигрался, слил результаты с основной веткой и удалил временную. Конец рабочего дня и пора лететь на купание дочки — коммит, даже если исходники представляют собой поле боя, так как завтра тебя с утра могут неожиданно перебросить на Умань чинить срочный баг, и потом уже точно не вспомнить, что там к чему.

Также желательно, чтобы коммиты были логически изолированы. Например, в запале ты исправил сетевую подсистему и добавил кнопку в UI — не стоит объединять все это в один коммит, так как может случиться, что вы заходите эту новую кнопку в параллельной версии, и если это отдельный коммит, то перенести его можно будет простым слиянием или cherry-pick'ом. Наличие staging area (индекса) в git позволяет легко коммитить выборочно (причем даже файл по кускам). Для Mercurial я нашел более менее похожую возможность в TortoiseHG, когда при коммите можно отметить файлы, которые в него включаются.

А так как каждый коммит требует словесного описания, то волей неволей это заставляет тебя оглядывать в целом, что ты тут понаписал. Для экстренных коммитов в конце дня, когда все может быть тотально сломано, а коммитить надо, то я обычно ставлю префикс "UNFINISHED: " в описание, по которому с утра сразу видно, что в исходниках может быть засада.

Лирическое отступление. С некоторого времени у меня даже всякие самопальные скрипты в UNIXе (а у кого их нет?) и конфигурационные файлы типа .profile, .Xdefaults или .vimrc живут под контролем git'а. Другой пример: скачал я новый gdb-7.0. Развернул, скомпилил. При работе он начал иногда падать на определенных машинах с ошибкой. Интернет сказал, что это известный баг и есть патч. Так вот: сначала сразу после разворачивания оригинального архива дерево исходников gdb помещается в git (git init && git add * && git commit -m "Original gdb-7.0."), а только затем делается патч и тоже коммитится в git. Для чего? Чтобы понимать, что изменено, когда и почему.

Еще одно лирическое отступление. Ни что так помогает понять, насколько "нужен" тебе некий домашний хлам, как его датирование. Записал DVD с бэкапом — кроме названия диска еще надо надписать дату записи. Собрал документы по сданному проекту в архивую папку — поставил дату. Потом, через N лет, этот стикер с датой однозначно решит судьбу предмета и, возможно, определит его в помойку, освободив место в шкафу. В компьютере все это далается еще проще. Ну а история изменений/версий только приятно автоматизируют процесс.

Культура повсеместного использования контроля версий крайне позитивна. А распределенные системы (типа Git, Mercurial или Bazaar) позволяют приобщиться к прекрасному даже если все вокруг вас не хотят (пока!) принять эту культуру.

Посты по теме:

понедельник, 4 января 2010 г.

Виртуальные машины в быту

Лично я плохо представляю себе работу современного программиста сейчас без виртуальных машин. Даже на моем домашнем ноутбуке конфигурация выглядит так: "dark side" в виде Windows 7 в качестве хост-системы и пачка линуксовых виртуальных машин под VMware и VirtualBox.

Windows 7 для iTunes (увы, iPhone иначе толком не синхронизируешь), MS Office (в основном только ради Visio) и Visual Studio разнообразных версий. Все остальное происходит в виртуальных машинах. Благодаря аппаратной виртуализации в современных процессорах производительнось практически такая же (и у кого сейчас меньше двух ядер?). А умелое распределение ресурсов между виртуальными машиными вообще позволяет нивелировать потери.

Большинство современных виртуализаторов умеют очень ловко интегрировать десктоп гостевой системы в основную. Например, у меня окно той же виртуализированной Ubuntu выглядит обычным окном Windows, размер которого можно спокойно менять, при этом виртуальная среда автоматически подстраивает свой десктоп на лету под размер этого окна. Раньше, когда аппаратная поддержка виртуализации не была так распространена, и поэтому виртуальные машины реально тормозили, я долгое время использовал Cooperative Linux, так как он виртуализирует только память, и поэтому работает на полной скорости компьютера. Но coLinux не поддерживает многопроцессорность и требует особого ядра Линукса. С самим ядром уже не поиграешься.

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

Захотел подключить новый диск в систему или подменить развернутый Oracle на другую версию — пять минут работы. Захотел вернуть назад — еще две минуты. Да и клиенту дать образ настроенной виртуальной машины проще, чем объяснять, как все настраивать с нуля. А он потом еще все и сломает шаловливыми ручками.

Пока я вижу только один значительный минус при домашнем использовании — дисковое пространство, ибо для каждой системы счет сразу идет на гигабайты, а может и их десятки. 4-5 виртуальных машин, и начинаешь думать, куда бы сбросить временно неиспользуемые.

Но и тут есть выход. Например, у меня юниксовый раздел для домашнего (home) каталога используется в нескольких виртуальных машинах. Раздел с проектами тоже может быть замонтирован в разные машины. Повторюсь — управление дисковыми разделами в виде файлов крайне просто и удобно.

Для серверных решений весьма популярна система виртуальных операционных систем ESXi. Небольшой супервизор грузится в начале, и затем дает возможность управлять виртуализацией гостевых систем (диски, память, процессорное время и т.д.). То есть мой Windows 7 является простецким аналогом такого супервизора.

Подходим к сути. Так сейчас уже стало модно заменять стандартный BIOS на что-нибудь нужное, например Линукс с минимальным набором программ для интернета. Проекты coreboot и Splashtop уже давно существуют. Некоторое время назад лично я был очень впечатлен одним их видео:

Выходит, что логичным продолжением было бы зашить вместо BIOSа супервизор виртуальных машин.

Включаешь компьютер, мгновенно стартует супервизор, который дает тебе возможность управлять витуальными средами. Вот получится все одном флаконе на одном компьютере: и Windows, и Mac, и Linux и все на свете.

Проблемы конечно будут — надо делать драйвера виртуальных устройств под поддерживаемые операционные системы, но многое уже имеется в тех же VMware и VirtualBox.

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