<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-36430695</atom:id><lastBuildDate>Mon, 05 Dec 2011 06:47:37 +0000</lastBuildDate><category>literature</category><category>Omsk</category><category>rsdn</category><category>margincon</category><category>travel</category><category>semantic_web</category><category>crosspost</category><category>Altai</category><category>software</category><category>stupid translate</category><category>date/time system</category><category>geoid</category><category>declarative interface</category><category>software_design</category><category>bug_theory</category><category>maps</category><category>ICFP Contest</category><category>open source</category><category>metadata</category><category>usability</category><category>stupid</category><category>management</category><category>RuPyRu</category><title>Alive and stirring data</title><description /><link>http://miroff.blogspot.com/</link><managingEditor>noreply@blogger.com (Miroff)</managingEditor><generator>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AliveAndStirringData" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="aliveandstirringdata" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-5003137266430191503</guid><pubDate>Mon, 27 Jun 2011 12:13:00 +0000</pubDate><atom:updated>2011-06-27T19:16:18.778+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">margincon</category><category domain="http://www.blogger.com/atom/ns#">Omsk</category><title /><description>&lt;h2&gt;Msrgincon'11&lt;/h2&gt;&lt;br /&gt;
&lt;h3&gt;Подготовка&lt;/h3&gt;&lt;p&gt;Вот и прошел очередной &lt;a href="http://margincon.ru/"&gt;Margincon&lt;/a&gt;. Попробую рассказать, как оно было на этот раз. Незадолго до, ВНЕЗАПНО выяснилось, что докладов всего 4, и один из них мой. Прознав о моей беде, соратники по &lt;a href="http://osm.org/"&gt;OpenStreetMap&lt;/a&gt; предложили воспользоваться случаем и сделать lighting talk про OSM. Так что мне пришлось не только спешно дописывать основной доклад, а еще и готовиться к lighting talk. И все в последние два дня. Дальше традиционный поезд Нск-Омск. Twitter хорошо годится для поиска попутчиков. В соседнем купе две девчонки-второкурсницы из НИИЖДа целенаправленно склеили матерого железнодорожника так что он всю дорогу рассказывал им про &lt;a href="http://ru.wikipedia.org/wiki/Устройства_сигнализации,_централизации_и_блокировки"&gt;СЦБ&lt;/a&gt;. Затем Омск, традиционная прогулка по набережной с не менее традиционными поисками еды и транспорта до ОмГУ.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Регистрация&lt;/h3&gt;&lt;p&gt;Регистрация на Margincon прошла довольно тихо. Нововведение: теперь бейджи участников подписывались вручную прямо не месте. Большинство участников оказались знакомы по предыдущим конференциям или по твиттеру. Это и понятно, на этот раз у конференции на было широкой рекламной кампании, кто услышал, тот услышал.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Доклады&lt;/h3&gt;&lt;p&gt;Было всего три штуки. Федор Индутный с докладом про node.js до конференции не добрался чем навсегда испортил себе карму. А жаль, было о чем поговорить с человеком, использующим node.js в продакшене.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Оставшиеся два доклада очень понравились. Александр Гладыш произвел впечатляющий анализ визуальных редакторов бизнес-логики и ненавязчиво презентовал собственный редактор. Макс Трескин рассказал про язык Go. В качестве замены C этот язык выглядит перспективно, но сыровато. Вопрос, есть ли игра Го на Go остался нераскрытым.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Из-за отсутствия Федора участникам пришлось выкручиваться самостоятельно. Lighting talks дали затравку к обсуждению, которое плавно перетекло в open space и afterparty, где желающие могли наобщаться всласть.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Впечатления&lt;/h3&gt;&lt;p&gt;Все супер, но мало. И участников и докладов. Университетская аудитория с кафедрой, посаженным проектором и рваным экраном плохо подходит для конференции. Если с докладами еще ничего, то Open Space на ступеньках не очень удался, по сравнению с виски-пати на &lt;a href="http://codefest.ru"&gt;Codefest&lt;/a&gt;. Очень порадовала теплая, дружеская атмосфера. Только ради этого стоит ездить на Margincon. Огромное спасибо Юрию и все кто помогал в организации.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;На мой взгляд, формат Margincon'а, как конференции о маргинальных языках, себя исчерпал. Не так уж много этих языков и довольно мало людей могут рассказать что-нибудь помимо стандартного getting started. С другой стороны, хотелось бы избежать рассказов про "новый MVC фреймворк для PHP" или "мобильный битрикс", которые заняли львиную долю того же CodeFest. Хотелось бы услышать доклады про немейнстримные технологии: не-MVC веб-фреймворки, высоконагруженные архитектуры, noSQL и т.п.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Надеюсь, традиция Margincon'а будет продолжаться. Это прекрасный способ узнать что-то новое познакомиться с интересными людьми и услышать в поезде философскую идею Ruby on Rail.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;PS: Ни одной фотографии за всю поездку я так и не сделал, так что пост без фотографии.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;PSS: Использовать в качестве сайта конференции &lt;a href="http://lanyrd.com/2011/margincon"&gt;Lanyrd.com&lt;/a&gt; — отличная идея. Можно самому добавить ссылку на слайды не дожидаясь пока это сделают вечно занятые организаторы. Надеюсь, аудиозапись получилась и будет доступна.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-5003137266430191503?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2011/06/msrgincon11-margincon.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-3429742596677633283</guid><pubDate>Thu, 14 Oct 2010 03:45:00 +0000</pubDate><atom:updated>2010-10-14T10:45:00.231+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rsdn</category><category domain="http://www.blogger.com/atom/ns#">crosspost</category><category domain="http://www.blogger.com/atom/ns#">software_design</category><title /><description>&lt;h2&gt;Что писать в лог&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;Как-то получается, что когда есть о чем писать нет времени, а когда есть время, писать не о чем. Зато есть проверенные временем посты на RSDN, на которые изредка требуется ссылаться. Вот некрокросспостингом я сейчас и займусь.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Регулярно люди спрашивают как и что писать в логи. Могу рассказать как это сделано в одном реальном проекте. Способов применения логов ровно два: а) помогать инженерам отвечать на вопросы пользователей в стиле "Что я только сделал не так?", и б) помогать разработчикам воспроизводить баги. Для этого критично знать, что, как и в какой последовательности происходило в системе. Если по логу не удается локализовать баг с точностью до строчки кода -- не страшно. Задача лога примерно очертить место поиска.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Уровней логгирования используется всего четыре:&lt;/p&gt;&lt;li&gt;DEBUG&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;INFO&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;WARNING&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;ERROR&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Уровень CRITICAL не используется потому что изнутри системы невозможно обрушить ее целиком и навсегда. Поэтому вместо log.crit() вставлен код восстанавливающий систему после ошибки. Внешние сбои, конечно, могут обрушить что угодно, но они фиксируются внешними средствами. В данном случае в роли внешних средств выступает довольно серьезная система мониторинга на основе &lt;a href="http://www.cacti.net/"&gt;cacti&lt;/a&gt;. На практике не очень интересно, как именно система упала, если отвалился жесткий диск или рухнула сеть.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;На продакшене всегда включен уровень INFO. Очень редко, когда требуется воспроизвести особо злобный баг или проверить правильность алгоритма логгирование переключается на DEBUG. Снижать уровень до WARNING или ERROR не имеет смысла, потому что теряется необходимая информация. Если какая-то подсистема (чаще всего демон) забивает общий лог своими сообщениями, то для нее выделяется отдельный лог файл. Разные части системы пишут в собственные лог файлы. Все логи ротируются раз в сутки, а также при каждом перезапуске системы. Это полезно при апгрейдах, чтобы четко различать какие ошибки относятся к старой версии, а какие к новой.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Теперь о том, что и когда пишется в лог. Поскольку большая часть ошибок сосредоточена на границах модулей, там же происходит большая часть записей в лог. Далеко не все, что происходит достойно попадания в логи. Достаточно только той информации, которая без этого будет потеряна. Отсюда правило: ничто не должно логгироваться дважды.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;ERROR&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Логгирование с уровнем ERROR пишется в следующих местах:&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; там где мы бросаем исключение, при условии, что есть важная информация, которая не попадает в исключение. На самом деле это архитектурный косяк, но все бывает.  &lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="java"&gt;
if (phaseOfMoon.isIncorrect()) {     
    log.error("Incorrect phase of moon at " + someEnvironment);     
    throw new AstronomyException("Incorrect phase of moon"); 
} 
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;там, где мы преобразуем исключение в более общее с потерей информации. Обычно это происходит на границы системы, когда мы не хотим отдавать наружу специфичную информацию.  &lt;pre&gt;&lt;code class="java"&gt;
} catch (SQLException ex) {     
    log.error("Databse error", ex);
    throw new SomeInterfaceException("Шеф, все пропало, шеф.") 
} 
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;там, где исключение пробрасывается выше границы нашей системы&lt;/li&gt;

&lt;li&gt;там, где прекращается обработка исключения  &lt;br /&gt;
&lt;pre&gt;&lt;code class="java"&gt;
} catch (SomeException ex) { 
    log.error("Не шмогла, ну и ладно", ex); 
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;в случае ошибок, не связанных с исключениями &lt;br /&gt;
&lt;pre&gt;&lt;code class="java"&gt;
if (positiveValue &lt; 0) {
    log.error("Sanity check: positive is negative");
    return;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;Если есть исключение, вызвавшее ошибку, то оно всегда пишется лог. На одну ошибку достаточно одной записи в лог. Нет необходимости писать в лог на каждом уровне обработки ошибки.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;WARNING&lt;/h3&gt;&lt;p&gt;Общее правило: если какая-то неприятность произошла, но ее появление ожидаемо, неприятность не критична для работы или status quo может быть восстановлен автоматически, то это WARNING. Он пишется в момент обнаружения если неприятность невосстановима, или же в момент автоматического восстановления. Под warning попадают попытки восстановить соединение с сервером, перечитать файл, и т.п.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;INFO&lt;/h3&gt;&lt;p&gt;На уровне INFO логгируются события на уровне точек входа в систему: действия пользователя, вызовы API, запуск и остановка демонов и т.п.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;DEBUG&lt;/h3&gt;&lt;p&gt;Оставляется на усмотрение разработчика. Чаще всего логгируется в местах с нетривиальными алгоритмами и там где для отладки критично знать, по какой из ветвей пошло выполнение.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ну и напоследок несколько метрик. На 1000 строк кода приходится 5 записей в лог. Из них:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;51% — Error&lt;/li&gt;
&lt;li&gt;21% — Warning&lt;/li&gt;
&lt;li&gt;13% — Info&lt;/li&gt;
&lt;li&gt;15% — Debug&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-3429742596677633283?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2010/10/blog-post.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-1618821404528641908</guid><pubDate>Mon, 28 Jun 2010 04:45:00 +0000</pubDate><atom:updated>2010-06-28T12:38:13.403+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">RuPyRu</category><category domain="http://www.blogger.com/atom/ns#">margincon</category><category domain="http://www.blogger.com/atom/ns#">Omsk</category><title /><description>&lt;h2&gt;MarginCon'10&lt;/h2&gt;
&lt;p&gt;В субботу прошел очередной &lt;a href="http://margincon.ru"&gt;MarginCon'10&lt;/a&gt; (потомок &lt;a href="http://rupy.ru"&gt;RuPy.ru&lt;/a&gt;). На этот раз начало было в 0900, так что прогуляться по городу в поисках еды и лулзов не удалось. Ну и ладно, тоже неплохо. По дороге выяснилось, что билет на поезд Новосибирск - Омск можно купить онлайн, при этом его даже забирать не обязательно. Есть электронный check in, как в аэропорту. В следующий раз обязательно воспользуюсь. &lt;/p&gt;

&lt;p&gt;На самой конференции было шесть полновесных докладов, некоторое количество микро-докладов на 5 минут и 1 час свободного общения. Затем желающие собрались в заведении под вывеской "Колчак" на afterparty. Увы, билеты на поезд помешали в полной мере насладиться восточной кухней и живым общением, так что засвидетельствовав свое почтение, пришлось отправляться восвояси.&lt;/p&gt;

&lt;h3&gt;Что было хорошо&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Рекламная кампания. Я узнал о MarginCon'е за месяц, как миминиум из трех источников.&lt;/li&gt;

&lt;li&gt;Полновесные доклады были очень интересные. Практически не было пересказов мануалов.&lt;/li&gt;

&lt;li&gt;Видео-доклады были на высоте. Если в нашем углу нет мало интересных людей, их можно приглашать выступать онлайн. Снимаю шляпу перед блестящей идеей. Отдельное спасибо Льву Валкину за рассказ о собственно опыте.&lt;/li&gt;

&lt;li&gt;Twitter в качестве СМИ показал себя великолепно. Завел себе.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Что не очень&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Мало обсуждений. Скорее всего из-за того, что люди рассказывали о своем использовании чужих технологий. У них нет уникального знания, которого нельзя нагуглить самому. Разработчики, рассказывающие о собственных технологиях, вызывают гораздо больший интерес.&lt;/li&gt;

&lt;li&gt;Lighting talks. Мало, и большей частью ни о чем. Хотя рассказ о Common Lisp очень понравился.&lt;/li&gt;

&lt;li&gt;Open Spaces. Опять же общих тем для обсуждения не было. В результате все скатилось в привычное "Образование", "Gnome vs. KDE", "emacs vs. vim" и т.п. Идея с выбором тем, которые потом будут организованно обсуждать радостно провалилась. Народ просто не оставил достаточно заявок.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Что можно изменить&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Сменить акцент конференции с собственно маргинальных языков на разработку на 
маргинальных языках. Тогда под формат попадут вещи связанные с языком, вроде: "Какие новые либы вы пропустили", "Куда движется Python", "Что будет в новой версии Rail", "Когда наконец выйдет Scala 2.8". Понятно, что большинство из этих тем недостойны полновесных докладов и в любом случае будут пересказом чьих-то слов, но Lighting Talks ими вполне можно интересно заполнить.&lt;/li&gt;

&lt;li&gt;Выкинуть Open Spaces. После конференции можно сразу переместиться на afterparty (возможно более организованно) и уже там, под пиво, обсуждать. Ресторан для этого мало подходит. Скорее придется снять какое-нибудь кафе. Под такое дело, я даже готов сдать взнос. &lt;/li&gt;

&lt;li&gt;Ну и, я надеюсь, слайды и записи будут выложены на сайт.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-1618821404528641908?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2010/06/margincon10-margincon10-rupy.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-2534188268325331540</guid><pubDate>Wed, 10 Mar 2010 10:33:00 +0000</pubDate><atom:updated>2010-03-10T17:19:51.512+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rsdn</category><category domain="http://www.blogger.com/atom/ns#">software</category><category domain="http://www.blogger.com/atom/ns#">management</category><category domain="http://www.blogger.com/atom/ns#">software_design</category><title /><description>&lt;h2&gt;Versions&lt;/h2&gt;

&lt;p&gt;Я уже как-то писал про нумерацию версий на RSDN. Возникла нужда сослаться, так что выношу тот пост сюда с некоторыми изменениями.&lt;/p&gt;

&lt;p&gt;Для чего вообще нужна нумерация версий? Самый простой и очевидный ответ: для идентификации сборок выходящих из рук разработчиков. Номер версии должен помогать отвечать на вопросы: Это одинаковые версии или разные? Какая из них была выпущена раньше? Что поменялось со времени предыдущей версии? Что нужно сделать, чтобы собрать точно такую же версию?&lt;/p&gt;

&lt;p&gt;Не стоит путать внутренний и маркетинговый номера версий. Если меркетинг хочет чтобы какая-то версия называлась &lt;i&gt;Gold Enterprise Platinum Edition 7.0&lt;/i&gt; то это никак не влияет на внутренний номер версии.&lt;/p&gt;

&lt;p&gt;Простая и в то же время достаточная система именования версий используют комбинацию из четырех чисел, записанных через точку: &lt;i&gt;major&lt;/i&gt;.&lt;i&gt;minor&lt;/i&gt;.&lt;i&gt;hotfix&lt;/i&gt;.&lt;i&gt;build&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Первые три числа это уникальный номер той версии, которая выкатывается пользователю. Они нужны для того, чтобы одним взглядом оценивать различия между версиями и степень их совместимости. Эти числа назначаются по определенным правилам.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;major&lt;/b&gt; &amp;#151; основной номер версии. Переход от одной основной версии к другой означает существенные изменения, часто вызывающие несовместимость с предыдущей версией без дополнительных ухищрений. Смена формата данных, глобальный рефакторинг, редизайн, существенное изменение функционала &amp;#151; достаточные основания для увеличения версии. Исправления багов, даже самых злокозненных, нет. Это число может только инкрементироваться. Увеличение major версии на единицу сбрасывает minor и hotfix в ноль. Традиционно, до релиза major версии равен нулю, с тем, чтобы в момент релиза выкатить пользователям 1.0.0.xxxx и в дальнейшем считать от него.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;minor&lt;/b&gt; &amp;#151; дополнительный номер версии. Это номер небольшого изменения в рамках версии. Это может быть появление нового функционала, совместимое изменение формата данных и т.п.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;hotfix&lt;/b&gt; &amp;#151; порядковый номер хотфикса. Часто бывает, что все изменения в версии связаны с исправлением багов, а не с добавлением функционала. В этом случае изменяется номер хотфикса. Очень часто, такая версия отдается в виде патча для обновления с предыдущей версии.&lt;/p&gt;

&lt;p&gt;Четвертая цифра это порядковый номер билда. Номера билдов сквозные и не зависят от версий. Это необходимо для того чтобы иметь возможность воспроизвести баг, проявляющийся у клиента точно на той версии, какая установлена у него. Чаще всего используют последовательный номер или номер ревизии из VCS.&lt;/p&gt;

&lt;p&gt;В более сложных случаях, номер версии может включать другие переменные. Например, версия плагина, часто включает номер первой совместимой версии родительской системы. В случае, если пользователю выкатывается сборка из нескольких систем, каждая из которых имеет свою версию, сборка имеет собственную нумерацию версий.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-2534188268325331540?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2010/03/versions-rsdn.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-5995014334350757164</guid><pubDate>Mon, 01 Mar 2010 08:37:00 +0000</pubDate><atom:updated>2010-03-01T17:00:44.632+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bug_theory</category><title /><description>&lt;h2&gt;Bug theory - Initialization flow bug&lt;/h2&gt;

С простыми багами вроде покончено. Перейдем к более сложным. 

&lt;h3&gt;Initialization flow bug&lt;/h3&gt;
&lt;b&gt;Симптомы:&lt;/b&gt;

&lt;p&gt;Отдельние модули работоспособны, но при интеграции система не стартует. В простейшем случае баг легко воспроизводится и локализуется, но у этого бага может быть осложненние в виде многопоточности. В этом случае с воспроизведением бага могут быть проблемы.&lt;/p&gt;

&lt;b&gt;Критические места:&lt;/b&gt; 
&lt;p&gt;Инициализация модулей, добавление новых зависимостей, изменения порядка инициализации.&lt;/p&gt;

&lt;p&gt;Проблема в том, что инициализация отдельных компонентов происходит позже, чем их первое использование. В многопоточном случае все может быть осложнено возможным race condition.&lt;/p&gt;

&lt;b&gt;Профилактика:&lt;/b&gt;

&lt;p&gt;Локализовать инициализацию в одно месте, практиковать &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;Dependency injection&lt;/a&gt;, писать интеграционные тесты, при добавлении зависимости анализировать порядок инициализации для разных случаев.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-5995014334350757164?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2010/03/bug-theory-initialization-flow-bug.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-2121739850548678898</guid><pubDate>Wed, 24 Feb 2010 13:15:00 +0000</pubDate><atom:updated>2010-02-24T19:43:37.192+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bug_theory</category><title /><description>&lt;h2&gt;Bug theory - Redundant expectations&lt;/h2&gt;

&lt;h3&gt;Redundant expectations&lt;/h3&gt;
&lt;b&gt;Симптомы:&lt;/b&gt;
&lt;p&gt;В определенных условиях система делает не то, что ожидается. Баг проявляется только в частных случаях, все остальное время система работает нормально. При воспроизведении бага могут возникнуть проблемы, но если воспроизводить тестовый сценарий в точности баг всегда проявляется.&lt;/p&gt;

&lt;b&gt;Критические места:&lt;/b&gt; любые межмодульные взаимодействия, особенно слабо изученными сторонними модулями.

&lt;p&gt;Это типичный баг "на границе". В определенных условиях сторонний модуль ведет себя не так, как ожидалось. Чаще всего это происходит когда документация на интерфейс была прочитана невнимательно или изначально была неполна. Хороший пример, это NullPointerException при нарушении принципа Деметры.&lt;/p&gt;

&lt;div class="java" style="font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0;"&gt;person.&lt;span style="color: #006633;"&gt;getLeftHand&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getRingFinger&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;Для большинства людей это сработает, но на первом же одноруком мы получим NullPointerException.&lt;/p&gt;

&lt;b&gt;Профилактика:&lt;/b&gt; 

&lt;p&gt;Внимательно изучать документацию на межмодульный интерфейсы, писать интеграционный тесты захватывая крайние случаи, не верить документации и самостоятельно изучать код сторонних модулей, проектировать интерфейсы, которые ведут себя одинаково вне зависимости от условий, использовать &lt;a href="http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"&gt;контрактное программирование&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-2121739850548678898?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2010/02/insufficient-specification.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-1014817615703505050</guid><pubDate>Wed, 17 Feb 2010 12:29:00 +0000</pubDate><atom:updated>2010-02-17T18:32:49.404+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bug_theory</category><title /><description>&lt;h2&gt;Bug theory - TODO: Implement&lt;/h2&gt;

&lt;h3&gt;TODO: Implement&lt;/h3&gt;
&lt;b&gt;Симптомы:&lt;/b&gt;
&lt;p&gt;Не происходит то, что ожидалось. Выбрасывается NullPointerException, OperationNotSupportedException, InvalidArgumentException или любое другое похожее исключение. Такие баги легко обнаруживаются и легко воспроизводятся. При анализе в коде обнаруживается комментарий "&lt;b&gt;TODO: Implement&lt;/b&gt;" или просто отсутствие необходимого кода.&lt;/p&gt;

&lt;b&gt;Критические места:&lt;/b&gt; 
&lt;p&gt;Код после рефакторинга, новые фичи, реализации интерфейсов.&lt;/p&gt;

&lt;p&gt;Тоже простой и очевидный баг, который появляется когда разработчик по какой-то причине оставляет часть контракта нереализованной. Это может происходить по разным причинам. Лень заниматься пустой работой, противоречивый или слишком детальный интерфейс, отсутствие времени.&lt;/p&gt;

&lt;b&gt;Профилактика:&lt;/b&gt; 
&lt;p&gt;Избегать противоречивых и слишком сложных интерфейсов. После рефакторинга обязательно проверять появившиеся TODO/FIXME.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-1014817615703505050?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2010/02/bug-theory-todo-implement-todo.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-265463282653583203</guid><pubDate>Tue, 16 Feb 2010 13:04:00 +0000</pubDate><atom:updated>2010-02-24T19:38:25.147+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bug_theory</category><title /><description>&lt;h2&gt;Bug theory&lt;/h2&gt;

&lt;img src="http://www.bugzilla.org/img/buggie.png" alt="bugzilla logo" /&gt;

&lt;p&gt;Каждый день программисты делают баги. Большинство из них почти сразу же исправляются, но бывают и те, которые так никогда и не были обнаружены. Большую часть багов никто не замечает, иногда они приводят к смерти людей и крупным техногенным катастрофам. Многие баги легко исправить, но некоторые годами кочуют из версии в версию. В нескольких книгах я встречал главы, посвященные разбору классических ошибок, но какой-то общей классификации мне не попадалось. Чтобы исправить это упущение, я собираюсь написать несколько постов, посвященных ошибкам. 
&lt;/p&gt;

&lt;p&gt;Ну и для затравки:&lt;/p&gt;

&lt;h3&gt;Misprints&lt;/h3&gt;
&lt;b&gt;Симптомы:&lt;/b&gt;
&lt;p&gt;
Что-то происходит не так, как ожидается. Выбрасываются неожиданные исключения, возвращаются не те данные. Будучи обнаруженным, такой баг легко воспроизводится. Почти всегда опечатка легко обнаруживается и легко исправляется, но в тяжелых случаях она может прятаться годами. 
&lt;/p&gt;

&lt;b&gt;Критические места:&lt;/b&gt; 
&lt;p&gt;Любая математика, обилие копипсаста, любая не очевидная логика, похожие по звучанию идентификаторы отличающиеся лишь несколькими буквами.&lt;/p&gt;

&lt;p&gt;Опечатки это самые простые и известные ошибки. Сложно найти программиста, который ни разу с ними не сталкивался. Особенно такие баги любят гнездиться в математике. Стройная на бумаге формула превращается в коде в жуткую кашу в которой очень легко ошибиться.&lt;/p&gt;

&lt;b&gt;Профилактика:&lt;/b&gt; 
&lt;p&gt;Использовать строгую типизацию там, где это возможно. Избегать магических чисел. Избегать арифметики, а если избежать не удалось, изолировать ее и покрывать юнит-тестами. Писать сложные алгоритмы в стиле &lt;a href="http://en.wikipedia.org/wiki/Literate_programming"&gt;literate programming&lt;/a&gt;. Избегать похожих имен функций и переменных в одном контексте.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-265463282653583203?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2010/02/bug-theory.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-984977334147489288</guid><pubDate>Fri, 30 Jan 2009 07:00:00 +0000</pubDate><atom:updated>2009-01-30T13:35:27.821+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">software_design</category><title /><description>&lt;h2&gt;The validation problem&lt;/h2&gt;

&lt;p&gt;Сложно найти программиста, который бы никогда не сталкивался с задачей проверки пользовательских данных. Буквально на первой же лабе в институте, преподаватель "ломает" программу некорректным вводом. Почти все через это прошли и признают, что относится к входным данным нужно со здоровой паранойей. Вопрос лишь в том, где именно проверять входные данные. Возбужденные сторонники ООП поднимают на щит инкапсуляцию и провозглашают немедленную валидацию на уровне классов бизнес-сущностей, бородатые DBA ратуют за проверки на уровне БД, очкастые архитекторы стоят на вынесении валидаторов в отдельную сущность, аппелируя к SRP. Разумеется, все они правы по-своему.&lt;/p&gt;

&lt;p&gt;Есть такая штука, которая называется &lt;strong&gt;инвариантом системы&lt;/strong&gt;. Это такой набор утверждений, истинных в любом ее состоянии. Хороший пример такого инварианта -- бухгалтерский баланс. Сумма активов равна сумме пассивов. Если это не так, значит где-то произошла серьезная ошибка. Для отдельных компонентов могут быть свои инварианты, попроще. Например, &lt;em&gt;для любого счета всегда известна валюта&lt;/em&gt; или &lt;em&gt;метод никогда не возвращает null&lt;/em&gt;. В первую очередь инварианты нужны внутри самой системы. Если мы знаем, что для всех счетов всегда известна валюта, мы можем обращаться к ней без проверки не рискуя получить NullPointerException. Кто же ответсвенен за консистентное состояние системы? Очевидно, сама система. Технически это можно сделать разными способами. Годятся простые проверки, вынос обязательных полей в конструкторы, констрейнты на базе, ассерты, современные средства контрактного программирования и все прочее, что придет в голову. Однако у инварианта есть side effect в том, что каждое дополнительное утверждение снижает гибкость системы. Если какое-то состояние системы нарушает инвариант, оно невозможно, независимо от желаний программиста. Избыточность в инварианте системы приводит к тому, что вместо простых действий устраиваются танцы вприсядку с целью обойти инвариант.&lt;/p&gt;

&lt;p&gt;Чтобы избежать этой опасности, инвариант следует тщательно оберегать от распухания. Для того утверждения не влияющие на целостность системы целесообразно выделить в отдельный слой. Например, в системе никому не требуется номер паспорта клиента, но с точки зрения бизнеса это поле относится к обязательным, потому что по закону положено. Более того, часто возникают ситуации, когда в одних случаях поле является обязательным, а в других опциональным. Например, паспортные данные требуется от клиента клиент собирается получить деньги и небязательны если он принес деньги отдать.&lt;/p&gt;

&lt;p&gt;Проверки, которые не входят в инвариант стоит собирать в одном месте, что значительно упрощает внесение изменений. Тут хорошо годятся и отдельные классы *Validator, валидаторы на основе XML правил и т.п. Если правила меняются неприлично часто, хорошо помогает вообще отдать настройку правил валидации админу. Пусть он в рантайме поднимает галочки. Пользователи будут довольны.&lt;/p&gt;

&lt;p&gt;Почему бы инвариант системы тоже не оформить в виде набора отдельных валидаторов? Для внешних данных это имеет смысл, но проверки только внешних данных недостаточно. Любое изменение данных крайне желательно проверять на соответствие инварианту. Поэтому от дополнительных средств контроля целостности никуда не деться. Надеюсь, проблема валидации стала немного яснее.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-984977334147489288?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2009/01/validation-problem.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-8192769328625065120</guid><pubDate>Sun, 11 Jan 2009 07:00:00 +0000</pubDate><atom:updated>2009-01-11T12:58:43.916+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">usability</category><category domain="http://www.blogger.com/atom/ns#">metadata</category><category domain="http://www.blogger.com/atom/ns#">semantic_web</category><title /><description>&lt;h2&gt;Chinese classification&lt;/h2&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Z-sGuwkoyTw/SWmX5TL0UCI/AAAAAAAAACg/upcCNmKT45Q/s1600-h/Nine-Dragons1.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 174px;" src="http://1.bp.blogspot.com/_Z-sGuwkoyTw/SWmX5TL0UCI/AAAAAAAAACg/upcCNmKT45Q/s320/Nine-Dragons1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5289926247981535266" /&gt;&lt;/a&gt;

&lt;p&gt;Среди людей занимающихся семантикой распространен мем "китайская классификация" -- таксономия с "плавающим" основанием. Корни этого термина растут из эссе Борхеса "Аналитический язык Джона Уилкинса" в котором он упоминает некую китайскую энциклопедию под названием  "Небесная империя  благодетельных знаний". На ее древних страницах написано, что животные делятся на:
&lt;/p&gt;
&lt;blockquote&gt;  
&lt;ol&gt;
&lt;li&gt;принадлежащих императору;&lt;/li&gt;
&lt;li&gt;бальзамированных;&lt;/li&gt;
&lt;li&gt;домашних;&lt;/li&gt;
&lt;li&gt;молочных поросят;&lt;/li&gt;
&lt;li&gt;сирен;&lt;/li&gt;
&lt;li&gt;сказочных;&lt;/li&gt;
&lt;li&gt;бродячих псов;&lt;/li&gt;
&lt;li&gt;включённых в эту классификацию;&lt;/li&gt;
&lt;li&gt;бешеных;&lt;/li&gt;
&lt;li&gt;бессчетных;&lt;/li&gt;
&lt;li&gt;нарисованных тончайшей кистью из верблюжьей шерсти;&lt;/li&gt;
&lt;li&gt;прочих;&lt;/li&gt;
&lt;li&gt;только что разбивших кувшин;&lt;/li&gt;
&lt;li&gt;издалека кажущихся мухами.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;С точки зрения современного образованного человека китайская классификация выглядит дико. С другой стороны такие классификации встречаются повсеместно, достаточной вспомнить классификатор жанров FB2, библиотечный каталог, или классификатор МКБ-10. &lt;a href="http://ailev.livejournal.com/"&gt;ailev&lt;/a&gt; вообще высказал мысль о том, что &lt;a href="http://ailev.livejournal.com/633904.html"&gt;все онтологии -- это замаскированные китайские классификации, ибо именно таковые классификации лежат в основе мира, именно к таким классификациям привыкли люди.&lt;/a&gt; Если это так, возникает вопрос, откуда берутся "китайские классификации" и почему люди охотнее создают и пользуются ими вместо строгих таксономий?&lt;/p&gt;

&lt;p&gt;Не смотря на кажущуюся сумбурность, "китайская классификация" подчинена определенной внутренней логике. Строгая таксономия делит мир на классы согласно некоторого рационального критерия: принадлежит животное императору или нет; домашнее оно или дикое; существует оно в реальности или же оно вымышленное и т.п. Для "китайской" классификации в качестве основания выступает не рациональный критерий а степень важности некоторого класса. В каноническом примере, создателя классификации равно интересуют, как животные императора, так и домашние животные, независимо от того, кому они принадлежат. Если бы автор пожелал создать на тех же критериях строгую рациональную классификацию, она получилась бы в несколько раз больше и многие ее классы оказались бы невостребованными. "Китайские классификации" стоит рассматривать как оптимизации строгих таксономий под конкретные способы использования.&lt;/p&gt;

&lt;p&gt;Очевидно, что любую строгую иерархическую классификацицию можно сделать китайской. Достаточно присвоить классам разные веса и сгруппировать на одном уровне классы с одинаковым весом. Некоторый аналог такого приема в дизайне интерфейсов -- быстрые закладки для часто используемых функций. К сожалению, простого способа обратного преобразования не существует, поскольку невозможно автоматически выделить рациональные критерии из мешанины классов. Единственный достоверный способ на сегодня, это кропотливая ручная обработка. Неудивительно, что инициатива semantic web продвигается с таким скрипом. "Китайские" классификации это объективная часть природы человека, и хотим мы этого или нет, нам придется учиться с ними справляться.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-8192769328625065120?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/12/chinese-classification.html</link><author>noreply@blogger.com (Miroff)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Z-sGuwkoyTw/SWmX5TL0UCI/AAAAAAAAACg/upcCNmKT45Q/s72-c/Nine-Dragons1.jpg" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-2145435291779315282</guid><pubDate>Fri, 19 Dec 2008 14:00:00 +0000</pubDate><atom:updated>2008-12-19T20:25:40.802+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">metadata</category><category domain="http://www.blogger.com/atom/ns#">software_design</category><category domain="http://www.blogger.com/atom/ns#">semantic_web</category><title /><description>&lt;h2&gt;Data about data&lt;/h2&gt;

&lt;p&gt;Если открыть спецификацию какого-нибудь формата данных, в ней скорее всего обнаружится раздей посвященный метаданным. Иногда, такой раздел превышает остальную спецификацию в несколько раз по объему и по сложности. В то же время, на практике метаданные используют весьма и весьма нечасто. Существуют даже форматы, которые никто так  полностью и не имплементировал, по причине невостребованности. Например, тот же &lt;a href="http://www.id3.org"&gt;ID3v2&lt;/a&gt; (метаданные для MP3) с его несколькими сотнями тегов начиная от автора песни и заканчивая переводами лирики. Или &lt;a href="http://exif.org/"&gt;EXIF&lt;/a&gt;, которым пользуются ровно потому, что все современные камры пишут в него параметры съемки. Еще ни разу не видел, чтобы из него кто-нибудь использовал разделы описания или копирайта. Или &lt;a href="http://fictionbook.org/index.php/FictionBook"&gt;FB2&lt;/a&gt;, по поводу метаданных которого регулярно возникают споры на форумах о том, как их заполнять. Или MARC, с правильным заполнением которого проблемы даже у профессиональных библиотекарей, хотя им-то сам бог велел прекрасно разбираться в предметной области. И какой формат ни возьми, с метаданными будет плохо. Или мало, или много, или в самый раз, но совсем не то, что нужно.&lt;/p&gt;

&lt;p&gt;Для того чтобы понять почему так происходит, нужно определить, что такое метаданные. Лаконичное определение из заголовка, конечно, прекрасно, но оно ничего не говорит о том, какие это данные. Почти все факты о данных можно представить в виде утверждений &lt;code&gt;&amp;lt;субъект, свойство, значение&amp;gt;&lt;/code&gt;. А набор свойств из предметной области и доменов для значений суть онтология. Например, &lt;em&gt;фокусное расстояние&lt;/em&gt; это свойство, которое может принимать значение типа &lt;em&gt;длина&lt;/em&gt; (а не угол или скорость). В большинстве форматов онтология жестко зафиксирована, так что не бросается в глаза, но она всегда присутствует.&lt;/p&gt;

&lt;p&gt;Вернемся к проблеме. Разработчик формата всегда держит в голове какой-то способ использования этого формата. Иначе он в принципе не смог бы разработать ничего полезного. Однако, как только он фиксируеется на способе он начинает представлять себе предметную область с одной, узкой, точки зрения. В результате получается онтология, описывающая каую-то узкую область, которую разработчик считает верной. Однако, у пользователей совсем другое мнение на этот счет. Почти наверняка кто-то будет использовать формат по другому. ID3 созвался для музыки, но его можно использовать для кучи разных вещей: от записи телефонных разговоров, до калибровочных сигналов дефект-детекторов. EXIF хорошо описывает метаданные съемки, но не годится для описания преобразований, проделанных с оригинальным изображением. Проблема в том, что невоможно предусмотреть все способы использования метаданных и разработать всеобъемлющую онтологию. Более того, такие попытки почти всегда приводят либо к излишней общности либо к излишней сложности. И то и другое отталкивает пользователей от использования метаданных. Хуже, когда появляются несколько стандартов метаданных для одного формата. В итоге каждый софт какие-то форматы метаданных поддерживает, а какие-то нет, что еще сильнее отвращает пользователей. Никому не хочется описывать файл, если при следующей обработке или конвертации эти сведения потеряются.&lt;/p&gt;

&lt;p&gt;Как можно с этой проблемой справиться? Если вы разработчик формата, не пытайтесь думать за пользователей -- все равно не выйдет. Дайте им возможность определять собственные онтологии и снабдите их парой убедительных примеров для конкретных узких областей. Хороший пример движения в нужном направлении &lt;a href="http://www.adobe.com/products/xmp/"&gt;Adobe XMP&lt;/a&gt; основанный на RDF. Нельзя сказать, что этот формат идеален, но хоть что-то.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-2145435291779315282?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/12/data-about-data.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-6732853911453907537</guid><pubDate>Fri, 28 Nov 2008 10:30:00 +0000</pubDate><atom:updated>2008-12-11T19:50:12.481+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">management</category><category domain="http://www.blogger.com/atom/ns#">software_design</category><title /><description>&lt;h2&gt;Time to live&lt;/h2&gt;

У каждого предмета есть определенное время жизни. Рано или поздно он устареет, износится и потребует замены новым. Или просто исчезнет проблема, ради решения которой этот предмет создавался, как исчезли мундштуки, подстаканники, пресс-папье и буфеты. Это касается не только материальных объектов, но и информации, в том числе  и информационных систем. У каждой строчки кода, у каждого килобайта данных есть собственное время жизни. Время жизни есть даже у таких неосязаемых сущностей, как идеи или соглашения. Для того, чтобы научиться оценивать характерное время жизни, нужно хорошо понимать механизмы разрушения объектов. Например, автомобиль может разрушится в результате аварии, физического износа или морального устаревания. Если известно, что автомобиль морально устареет через 10 лет, нецелесообразно обеспечивать его надежную работу в течение большего срока. Все равно к тому времени он уже окажется под прессом. Знание характерного времени жизни позволяет поддерживать качество на необходимом уровне, не больше и не меньше. Зачем делать автомобиль надежным, если через 10 лет он все равно окажется на помойке, где не важно работает он или нет. 

&lt;h3&gt;Данные&lt;/h3&gt;
Оставим за скобками временные данные, которые на то и временные, что их время жизни невелико. Для данных постоянных время жизни составляет от 25 лет до бесконечности. Данные редко становятся не нужны, a накопленные за долгие годы данные невозможно ничем заменить. Например снимки допоптопных аппаратов советской серии Венера, несмотря на отвратительное качество будут жить еще долго. Сперва в качестве основного источника информации, затем для сравнения с современными снимками и анализа изменений. Обычно, вменяемые люди стараются не уничтожать данные, мало ли что еще пригодится. Вдруг завтра из них удастся извлечь новую информацию. Мне доводилось работать с базами, которые пережили три поколения бизнес-кода и переживут еще как минимум столько же. Поэтому к проектированию баз данных нужно относиться особо внимально. Любое ваше сиюминутное решение в угоду производительности или простоте кодирования будут с матюками вспоминать через много лет. Изменить что-то в унаследованной базе, в которой уже накопились гигабайты данных нереально сложно. 

&lt;h3&gt;Протоколы и стандарты&lt;/h3&gt;
Две причины, по которым устаревают стандарты и протоколы: они перестают отвечать изменившимся требованиям или появляется способ сделать то же самое проще. Поскольку технологии непрерывно меняются и то, что раньше требовало дестятка PhD, сегодня доступно школьнику, редкий стандарт проживет больше 10 -- 15 лет. Затем, если представится возможность, он отправится на помойку истории. К сожалению это происходит не всегда. Очень часто изменения уже внедренного стандарта, процесс настолько болезненный, что стандарт активно используется не смотря на то, что они окончательно устарели. В качестве вопиющих примеров можно вспомнить Z39.50, SMTP, FTP и HTTP. К проектированию стандартов имеет смысл относиться даже более внимательно, чем к проектированию баз данных. "Внимательно" в данном случае означает не "предусмотреть все возможные случаи", а обеспечить возможность изменений. Все равно предусмотреть все не удастся, а если и удастся, то этим все равно не станут пользоваться из за непомерной сложности. 

&lt;h3&gt;Код&lt;/h3&gt;
Срок жизни кода определяется сроком жизни требований и сроком жизни платформы. В любом случае, срок жизни прикладного кода составляет 5 -- 10 лет. К этому моменту он оказывается практически полнотью переписанным с нуля. Часто, код преписывают весь сразу, одновременно с переходом на современную платформу. Конечно, бывают и исключения. Чаще всего они связаны либо с неизменными в течение десятилетий требованиями, либо с очень высокой ценой апгрейда. Например, связанного с высокой ценой миграции данных. 

Код ядра живет дольше в силу того, что зависит не от зыбких пользовательских требований, а от технических ограничений. Однако и технические ограничения меняются: если раньше несколько процессоров встречались только в серьезных серверах, то теперь многоядерные процессоры добрались до ноутбуков. Даже если завтра ваши алгоритмы и не изменятся, не исключено, что им придется работать совсем в другой среде, что влечет за собой переписывание кода. 

&lt;h3&gt;Абстракции и модели данных&lt;/h3&gt;
Абстракции живут от нескольких минут до тех пор, пока их помнят или пока не придумают что-то получше. Двойная бухгалтерская запись была изобретена в XV веке, а используется по сей день, несмотря на то, что в эпоху компьютеров без нее легко можно обойтись. Даже если абстракция хреновая, она все равно не умирает. Слишком много всего от нее зависит. Тут и код, и привычки людей, и их внутрення картина мира. Если вы предложите бухгатерам отказаться от двойной записи, они вас съедят. Будьте осторожны, если ваша абстракция получит распространение, вы ее уже не остановите. 

&lt;h3&gt;Пользовательский интерфейс&lt;/h3&gt;
Пользовательский интерфейс протухает за 3-5 лет. Он подвержен тем же изменениям требований что и код, вдобавок новые интерфейсные технологии появляются ничуть не реже программных. Даже отличный интерфейс пятилетней давности выглядит малость устаревышим, а десятилетним интерфейсом современному человеку пользоваться неудобно, да и глаз режет. Метафоры за 10 лет успели сильно измениться. Если пользователи не могут сбежать, устаревший интерфейс удается сохранить два-три срока. Затем начинаются проблемы уже с поиском операторов, способных работать на таком старье.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-6732853911453907537?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/10/time-to-live.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-581699639375430362</guid><pubDate>Thu, 25 Sep 2008 11:02:00 +0000</pubDate><atom:updated>2008-09-25T18:39:26.405+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ICFP Contest</category><title /><description>&lt;h2&gt;ICFP Contest '08 Final results&lt;/h2&gt;
&lt;p&gt;На официальной странице &lt;a href="http://icfpcontest.org/results/final/"&gt;ICFP Contest&lt;/a&gt; выложены результаты, которые так долго ждали большевики. Было проведено 11 заездов, в результате которых был определен один победитель (Team Smartass) и 297 неудачников, которым не так повезло. К сожалению финальные карты еще не выложены, поэтому трудно сказать что пошло не так, но финалисты предыдущего чекпойнта "вылетели за ограждение". Как в прошлый раз, я подготовил таблицу с суммарными результатами. Команды отсортированы по количеству раундов, в которых они приняли участие независимо от результата. Команды, прошедшие одинаковое число раундов отсортированы по рейтингу. Напоминаю, чем меньше рейтинг, тем круче. Для каждой команды приведена статистика исходов по всем пяти заездам каждого раунда. В общем, можно меряться. Get it and use it well.
&lt;/p&gt;
&lt;p&gt;Моя команда называется Mosquito. Каким чудом она попала на 11 место, оставив позади страшных монстров, сам не понимаю. Видимо, новичкам везет.&lt;/p&gt;


&lt;table&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;Team&lt;/th&gt;&lt;th&gt;Rounds&lt;/th&gt;&lt;th&gt;Score&lt;/th&gt;&lt;th&gt;Home&lt;/th&gt;&lt;th&gt;Martian&lt;/th&gt;&lt;th&gt;Crater&lt;/th&gt;&lt;th&gt;Timeout&lt;/th&gt;&lt;th&gt;Error&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Team Smartass&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;512510&lt;/td&gt;&lt;td&gt;50&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;shinh&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;515370&lt;/td&gt;&lt;td&gt;49&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Error 404&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;541960&lt;/td&gt;&lt;td&gt;50&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;UBE&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;546000&lt;/td&gt;&lt;td&gt;48&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;LazyBear&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;556870&lt;/td&gt;&lt;td&gt;51&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;SzM&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;608630&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;souris aveugle&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;611620&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;frank324&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;643610&lt;/td&gt;&lt;td&gt;39&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;kstm.org&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;674530&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;fireinthedisco2&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;689400&lt;/td&gt;&lt;td&gt;45&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;11&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Mosquito&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;11&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;730040&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;41&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;Om Nom Nom Nom&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;743140&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;Giantslalom&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;748550&lt;/td&gt;&lt;td&gt;38&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;epriestley&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;765090&lt;/td&gt;&lt;td&gt;33&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;intelliarts&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;609050&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;cw&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;617070&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;The B-Team: 25/26ths as good as the A-Team&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;619280&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;Blue Iris&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;626860&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;Spore Sept 7th, only $49.99! Play Bejeweled @ popcap.com!&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;631580&lt;/td&gt;&lt;td&gt;38&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;team_bruno&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;649780&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;Hands Solo&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;652200&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;jabber.ru&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;654310&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;Celestial Dire Badger&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;659590&lt;/td&gt;&lt;td&gt;44&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;Side Effects May Include...&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;660740&lt;/td&gt;&lt;td&gt;38&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;Apathy Kings&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;665890&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;CNaml&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;672810&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;Cup&amp;lt;'t&amp;gt;&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;695250&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;TC2&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;703310&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;Team Meh&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;710430&lt;/td&gt;&lt;td&gt;38&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;Yeahbut&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;712870&lt;/td&gt;&lt;td&gt;43&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;td&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;716950&lt;/td&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;Purple Pointer Eaters&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;719560&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;33&lt;/td&gt;&lt;td&gt;TeamDJ&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;721200&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;ur 67P&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;723350&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;NMSU&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;732770&lt;/td&gt;&lt;td&gt;39&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;Actua&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;739020&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;Eger a Marson&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;739540&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;38&lt;/td&gt;&lt;td&gt;EdFred&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;742580&lt;/td&gt;&lt;td&gt;38&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;39&lt;/td&gt;&lt;td&gt;Arekuma&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;748030&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;little lemon&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;784960&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;Order of the Fridge&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;805310&lt;/td&gt;&lt;td&gt;33&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;HackerDom_1&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;442150&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;43&lt;/td&gt;&lt;td&gt;ais523&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;442380&lt;/td&gt;&lt;td&gt;38&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;44&lt;/td&gt;&lt;td&gt;ILL martians&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;448300&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;45&lt;/td&gt;&lt;td&gt;Sir Bedevere the Wise&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;450780&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;46&lt;/td&gt;&lt;td&gt;Kee&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;455360&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;47&lt;/td&gt;&lt;td&gt;Urxae&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;465070&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;48&lt;/td&gt;&lt;td&gt;Heklers&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;465790&lt;/td&gt;&lt;td&gt;33&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;49&lt;/td&gt;&lt;td&gt;Malfunctional Programmer&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;470250&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;50&lt;/td&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;477900&lt;/td&gt;&lt;td&gt;33&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;51&lt;/td&gt;&lt;td&gt;Slow&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;478020&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;52&lt;/td&gt;&lt;td&gt;LUHPI&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;484290&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;53&lt;/td&gt;&lt;td&gt;tidder&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;486570&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;54&lt;/td&gt;&lt;td&gt;elbereth@utmc&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;487230&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;55&lt;/td&gt;&lt;td&gt;Wile E.&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;492300&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;56&lt;/td&gt;&lt;td&gt;12a0&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;494180&lt;/td&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;57&lt;/td&gt;&lt;td&gt;PurelyFunctionalInfrastructure&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;501520&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;RHZ&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;501570&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;59&lt;/td&gt;&lt;td&gt;m1-speedygonzalez&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;515180&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;60&lt;/td&gt;&lt;td&gt;Five of Six&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;516800&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;61&lt;/td&gt;&lt;td&gt;Bobry&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;543260&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;62&lt;/td&gt;&lt;td&gt;a1k0n&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;553370&lt;/td&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;63&lt;/td&gt;&lt;td&gt;Team Sampou&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;572500&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;taxi driver&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;398800&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;65&lt;/td&gt;&lt;td&gt;BugbearR&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;411060&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;Dee Mon&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;428540&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;67&lt;/td&gt;&lt;td&gt;ayatuki&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;433350&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;68&lt;/td&gt;&lt;td&gt;HackerDom&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;434210&lt;/td&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;69&lt;/td&gt;&lt;td&gt;Too Simplicity and Beyond!&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;438920&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;70&lt;/td&gt;&lt;td&gt;I-cons-a-lot&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;448770&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;71&lt;/td&gt;&lt;td&gt;The Dibbies&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;448860&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;72&lt;/td&gt;&lt;td&gt;Hacking in the Rain&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;454330&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;73&lt;/td&gt;&lt;td&gt;Altair&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;462550&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;74&lt;/td&gt;&lt;td&gt;lazymonkeys&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;468020&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;75&lt;/td&gt;&lt;td&gt;'a infvec&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;471290&lt;/td&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;76&lt;/td&gt;&lt;td&gt;protocolocon&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;472150&lt;/td&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;77&lt;/td&gt;&lt;td&gt;Kharkiv MIND&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;479810&lt;/td&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;78&lt;/td&gt;&lt;td&gt;Begot&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;501070&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;79&lt;/td&gt;&lt;td&gt;Lazy elf&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;509630&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;80&lt;/td&gt;&lt;td&gt;astsmtl&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;313950&lt;/td&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;81&lt;/td&gt;&lt;td&gt;shitamachi no ue&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;319560&lt;/td&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;82&lt;/td&gt;&lt;td&gt;kounoike&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;323950&lt;/td&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;83&lt;/td&gt;&lt;td&gt;Java Jones and the Kingdom of the Crystal Crater&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;331520&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;84&lt;/td&gt;&lt;td&gt;TBD&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;331980&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;85&lt;/td&gt;&lt;td&gt;lepidum&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;333640&lt;/td&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;86&lt;/td&gt;&lt;td&gt;ktkr-cpp&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;339090&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;87&lt;/td&gt;&lt;td&gt;miyu&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;341220&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;88&lt;/td&gt;&lt;td&gt;Gcup&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;341560&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;89&lt;/td&gt;&lt;td&gt;Epsilon&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;353250&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;90&lt;/td&gt;&lt;td&gt;nanndemoiidesu&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;355670&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;91&lt;/td&gt;&lt;td&gt;pirapira&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;357200&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;92&lt;/td&gt;&lt;td&gt;barry, our driver, is reckless&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;366510&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;93&lt;/td&gt;&lt;td&gt;NAU ACM&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;372490&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;94&lt;/td&gt;&lt;td&gt;TheRoverers&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;373210&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;95&lt;/td&gt;&lt;td&gt;DotWeb&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;403330&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;96&lt;/td&gt;&lt;td&gt;SwtPl&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;403430&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;97&lt;/td&gt;&lt;td&gt;7-15&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;416680&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;98&lt;/td&gt;&lt;td&gt;Beer:Thirty&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;263510&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;99&lt;/td&gt;&lt;td&gt;Team DumbAss&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;278530&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;inforfun&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;278540&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;101&lt;/td&gt;&lt;td&gt;Team Lolemnity&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;284370&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;102&lt;/td&gt;&lt;td&gt;ntua 67P&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;285500&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;103&lt;/td&gt;&lt;td&gt;jan nasa&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;295270&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;104&lt;/td&gt;&lt;td&gt;Pear Programmers&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;295850&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;105&lt;/td&gt;&lt;td&gt;Christoph Breitkopf&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;297470&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;106&lt;/td&gt;&lt;td&gt;spotrover&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;297980&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;107&lt;/td&gt;&lt;td&gt;cashto&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;298450&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;108&lt;/td&gt;&lt;td&gt;The Weyburn Expatriates&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;299910&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;109&lt;/td&gt;&lt;td&gt;ORBIT&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;301320&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;110&lt;/td&gt;&lt;td&gt;Rhope Burn&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;301820&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;111&lt;/td&gt;&lt;td&gt;aruhimorinonaka&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;302020&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;112&lt;/td&gt;&lt;td&gt;green_tea&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;303570&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;113&lt;/td&gt;&lt;td&gt;Bob's Store&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;305870&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;114&lt;/td&gt;&lt;td&gt;WindowMakers &lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;307600&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;115&lt;/td&gt;&lt;td&gt;The Blind Hen&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;307990&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;116&lt;/td&gt;&lt;td&gt;bmm team&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;309570&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;117&lt;/td&gt;&lt;td&gt;Grasshoppers&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;309860&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;118&lt;/td&gt;&lt;td&gt;The Tcler&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;320610&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;119&lt;/td&gt;&lt;td&gt;ksk&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;321500&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;120&lt;/td&gt;&lt;td&gt;MIMUW 4060&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;325260&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;121&lt;/td&gt;&lt;td&gt;Florida Institute of Technology&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;325410&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;122&lt;/td&gt;&lt;td&gt;D&amp;D&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;327400&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;123&lt;/td&gt;&lt;td&gt;wjdogs&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;328260&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;124&lt;/td&gt;&lt;td&gt;Kerochan&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;329180&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;125&lt;/td&gt;&lt;td&gt;The Unchecked Exceptions&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;329930&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;126&lt;/td&gt;&lt;td&gt;In dumb we trust&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;335040&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;127&lt;/td&gt;&lt;td&gt;Curry On!&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;335190&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;128&lt;/td&gt;&lt;td&gt;KFL&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;335540&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;129&lt;/td&gt;&lt;td&gt;hibi@utmc.or.jp&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;336640&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;130&lt;/td&gt;&lt;td&gt;YBuzz&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;338630&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;131&lt;/td&gt;&lt;td&gt;Dragons&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;339210&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;132&lt;/td&gt;&lt;td&gt;Q42/Xopus&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;341840&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;133&lt;/td&gt;&lt;td&gt;Team Guyford&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;342030&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;134&lt;/td&gt;&lt;td&gt;Arsbit&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;351210&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;135&lt;/td&gt;&lt;td&gt;one canuck&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;354510&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;136&lt;/td&gt;&lt;td&gt;Chouser&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;355910&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;137&lt;/td&gt;&lt;td&gt;uguu.org&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;356690&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;138&lt;/td&gt;&lt;td&gt;midoj&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;367820&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;139&lt;/td&gt;&lt;td&gt;The Tweezer Minstrels&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;370960&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;140&lt;/td&gt;&lt;td&gt;bens&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;373000&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;141&lt;/td&gt;&lt;td&gt;apple2gs&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;378790&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;142&lt;/td&gt;&lt;td&gt;yarunee&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;381880&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;143&lt;/td&gt;&lt;td&gt;The Usual Suspects&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;382080&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;144&lt;/td&gt;&lt;td&gt;Ramen Holiday&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;383550&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;145&lt;/td&gt;&lt;td&gt;The Code Alchemists&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;384790&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;146&lt;/td&gt;&lt;td&gt;Team Rocket&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;389320&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;147&lt;/td&gt;&lt;td&gt;nekoneko &lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;393150&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;148&lt;/td&gt;&lt;td&gt;The Inmates&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;393770&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;149&lt;/td&gt;&lt;td&gt;camping gaz international&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;397790&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;150&lt;/td&gt;&lt;td&gt;solo r6&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;402650&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;151&lt;/td&gt;&lt;td&gt;GRoboCode&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;403340&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;152&lt;/td&gt;&lt;td&gt;ktkr-ocaml&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;411990&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;153&lt;/td&gt;&lt;td&gt;LazyBottoms&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;445710&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;154&lt;/td&gt;&lt;td&gt;spbsunt&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;176870&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;155&lt;/td&gt;&lt;td&gt;It's all about the Pentiums.&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;183290&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;156&lt;/td&gt;&lt;td&gt;Emory PChem&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;184270&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;157&lt;/td&gt;&lt;td&gt;Toasted Monkeys&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;186140&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;158&lt;/td&gt;&lt;td&gt;Le club des 5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;188750&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;159&lt;/td&gt;&lt;td&gt;suihan_jar&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;193440&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;160&lt;/td&gt;&lt;td&gt;Wobbla Team&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;193980&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;161&lt;/td&gt;&lt;td&gt;__ufo42&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;205480&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;162&lt;/td&gt;&lt;td&gt;Dis Functional&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;209550&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;163&lt;/td&gt;&lt;td&gt;POSTECH-PL&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;210090&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;164&lt;/td&gt;&lt;td&gt;The Higher Order Of Zeuxis&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;212910&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;165&lt;/td&gt;&lt;td&gt;Unary Operator&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;214170&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;166&lt;/td&gt;&lt;td&gt;POSCAT@POSTECH&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;222830&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;167&lt;/td&gt;&lt;td&gt;suzumiyaharuhiko&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;224050&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;168&lt;/td&gt;&lt;td&gt;Hidden Agenda&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;147770&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;169&lt;/td&gt;&lt;td&gt;Incompetent Design&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;148210&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;OCamlCore&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;153050&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;171&lt;/td&gt;&lt;td&gt;Knights of Cydonia&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;159050&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;172&lt;/td&gt;&lt;td&gt;Marcin Simonides&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;160540&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;173&lt;/td&gt;&lt;td&gt;td2&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;160620&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;174&lt;/td&gt;&lt;td&gt;efg&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;161220&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;175&lt;/td&gt;&lt;td&gt;AntiCylonDefenseTeamImpersonator&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;161650&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;176&lt;/td&gt;&lt;td&gt;ikon&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;162730&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;177&lt;/td&gt;&lt;td&gt;o(ry&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;164470&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;178&lt;/td&gt;&lt;td&gt;bucchigiri&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;165230&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;179&lt;/td&gt;&lt;td&gt;Dylan Hackers&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;165310&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;180&lt;/td&gt;&lt;td&gt;Team Gales&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;165700&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;181&lt;/td&gt;&lt;td&gt;The Rover Routers&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;166900&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;182&lt;/td&gt;&lt;td&gt;Anairiats&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;167190&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;183&lt;/td&gt;&lt;td&gt;Tigerfunk&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;170840&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;184&lt;/td&gt;&lt;td&gt;dot-emacs&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;173780&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;185&lt;/td&gt;&lt;td&gt;Fly (Yaroslavl)&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;175800&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;186&lt;/td&gt;&lt;td&gt;K&amp;R&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;175840&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;187&lt;/td&gt;&lt;td&gt;Mostly Harmless&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;178490&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;188&lt;/td&gt;&lt;td&gt;AyaCFP&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;178530&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;189&lt;/td&gt;&lt;td&gt;putzen along&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;178740&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;190&lt;/td&gt;&lt;td&gt;Enoch Root&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;179780&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;191&lt;/td&gt;&lt;td&gt;futurelabs&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;180990&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;192&lt;/td&gt;&lt;td&gt;Molotov Mocktail&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;186430&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;193&lt;/td&gt;&lt;td&gt;Servants of Barsoom&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;187290&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;194&lt;/td&gt;&lt;td&gt;NetHack&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;187550&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;195&lt;/td&gt;&lt;td&gt;Ruby Team&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;187930&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;196&lt;/td&gt;&lt;td&gt;Almaya&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;188130&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;197&lt;/td&gt;&lt;td&gt;gassa &amp; toxa&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;193000&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;198&lt;/td&gt;&lt;td&gt;(defun friends)&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;107180&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;199&lt;/td&gt;&lt;td&gt;The Lone TeXnician&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;107700&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;hogelog&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;108370&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;201&lt;/td&gt;&lt;td&gt;Insane Closure Posse&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;111800&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;202&lt;/td&gt;&lt;td&gt;Macrott&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;113310&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;203&lt;/td&gt;&lt;td&gt;Blazing Saddles&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;115370&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;204&lt;/td&gt;&lt;td&gt;yet another team&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;115550&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;205&lt;/td&gt;&lt;td&gt;honey_rooibos&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;116140&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;206&lt;/td&gt;&lt;td&gt;Evil Geniuses For a Better Tomorrow&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;117360&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;207&lt;/td&gt;&lt;td&gt;TeamNewshamBros&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;117630&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;208&lt;/td&gt;&lt;td&gt;Illudium Q-36 Explosive Space Modulator&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;118060&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;209&lt;/td&gt;&lt;td&gt;Giver&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;118500&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;210&lt;/td&gt;&lt;td&gt;rmathew&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;119120&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;211&lt;/td&gt;&lt;td&gt;SIMAP&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;119570&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;212&lt;/td&gt;&lt;td&gt;eugene_jeff&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;122240&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;213&lt;/td&gt;&lt;td&gt;polka&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;124300&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;214&lt;/td&gt;&lt;td&gt;Func-n-stein&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;125140&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;215&lt;/td&gt;&lt;td&gt;EddieHasNoPreferenceForName &lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;126480&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;216&lt;/td&gt;&lt;td&gt;Xebia&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;128110&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;217&lt;/td&gt;&lt;td&gt;Bad Science&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;129430&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;218&lt;/td&gt;&lt;td&gt;Stern Types &lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;130400&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;219&lt;/td&gt;&lt;td&gt;siti&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;132470&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;220&lt;/td&gt;&lt;td&gt;panard_groumpf&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;134380&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;221&lt;/td&gt;&lt;td&gt;SugarSun&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;134660&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;222&lt;/td&gt;&lt;td&gt;mfp&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;135860&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;223&lt;/td&gt;&lt;td&gt;NCSU ARC Alums&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;136960&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;224&lt;/td&gt;&lt;td&gt;The Bobcat Hackers&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;138980&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;225&lt;/td&gt;&lt;td&gt;Knights of the Crescent Moon&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;140250&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;226&lt;/td&gt;&lt;td&gt;isobe&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;140660&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;227&lt;/td&gt;&lt;td&gt;EarthFusion&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;144310&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;228&lt;/td&gt;&lt;td&gt;Epic Fail&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;146750&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;229&lt;/td&gt;&lt;td&gt;plai&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;147620&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;230&lt;/td&gt;&lt;td&gt;ozy4dm&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;157370&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;231&lt;/td&gt;&lt;td&gt;wheezards&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;57930&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;232&lt;/td&gt;&lt;td&gt;Soul Trader&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;77580&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;233&lt;/td&gt;&lt;td&gt;404 NOT FOUND&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;78470&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;234&lt;/td&gt;&lt;td&gt;WE NEED A TEAM NAME&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;78540&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;235&lt;/td&gt;&lt;td&gt;Not a Number&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;78910&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;236&lt;/td&gt;&lt;td&gt;Stanfy&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;79440&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;237&lt;/td&gt;&lt;td&gt;Bloody Camls&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;79500&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;238&lt;/td&gt;&lt;td&gt;Team Sparrow&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;79740&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;239&lt;/td&gt;&lt;td&gt;Too much free time&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;80430&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;240&lt;/td&gt;&lt;td&gt;Linkage Failure&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;80660&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;241&lt;/td&gt;&lt;td&gt;kt3k&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;81230&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;242&lt;/td&gt;&lt;td&gt;Suzumiya Haruhiko wo Ooini Shizumeru Fullbocco-dan&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;81960&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;243&lt;/td&gt;&lt;td&gt;University of Western Australia&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;83980&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;244&lt;/td&gt;&lt;td&gt;Littlechina&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;84830&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;245&lt;/td&gt;&lt;td&gt;Drifter's Revenge&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;85150&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;246&lt;/td&gt;&lt;td&gt;Erraen&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;85860&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;247&lt;/td&gt;&lt;td&gt;cthulhuivore&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;86940&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;248&lt;/td&gt;&lt;td&gt;ktkr-java&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;89390&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;249&lt;/td&gt;&lt;td&gt;Ocamlman&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;89500&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;250&lt;/td&gt;&lt;td&gt;Team Cow&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;90130&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;251&lt;/td&gt;&lt;td&gt;Rhinos&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;90200&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;252&lt;/td&gt;&lt;td&gt;Cup&amp;lt;T&amp;gt;&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;92040&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;253&lt;/td&gt;&lt;td&gt;The Chun Council&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;92340&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;254&lt;/td&gt;&lt;td&gt;FUN&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;92460&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;255&lt;/td&gt;&lt;td&gt;ICSkies of Blue and F(P)&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;92550&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;256&lt;/td&gt;&lt;td&gt;Felspar&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;92560&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;257&lt;/td&gt;&lt;td&gt;Happy Camels&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;92670&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;258&lt;/td&gt;&lt;td&gt;The Teddyborg&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;92850&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;259&lt;/td&gt;&lt;td&gt;drunken ants&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;92860&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;260&lt;/td&gt;&lt;td&gt;foognostic&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;92950&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;261&lt;/td&gt;&lt;td&gt;Marti&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;93070&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;262&lt;/td&gt;&lt;td&gt;StreetMagic&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;94650&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;263&lt;/td&gt;&lt;td&gt;Cal Poly Pomona Computer Science Society&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;97530&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;264&lt;/td&gt;&lt;td&gt;nishiohirokazu&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;98510&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;265&lt;/td&gt;&lt;td&gt;United Coding Team&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;98880&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;266&lt;/td&gt;&lt;td&gt;KuntbucketsAndKuntrags&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;100630&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;267&lt;/td&gt;&lt;td&gt;Turn Right Left&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;100670&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;268&lt;/td&gt;&lt;td&gt;mazeSolver@UTMC&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;102330&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;269&lt;/td&gt;&lt;td&gt;Schwarzschild&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;107120&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;270&lt;/td&gt;&lt;td&gt;gpfault id-alex &lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;107250&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;271&lt;/td&gt;&lt;td&gt;aalto high school&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;115320&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;272&lt;/td&gt;&lt;td&gt;The Dudes&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;115510&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;273&lt;/td&gt;&lt;td&gt;Engineers Without Boulders&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;116710&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;274&lt;/td&gt;&lt;td&gt;The Al-Gore-Rhythms AKA The Doug Boat&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;117700&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;275&lt;/td&gt;&lt;td&gt;Team_XIII &lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;119200&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;276&lt;/td&gt;&lt;td&gt;The Armstrongs&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;124310&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;277&lt;/td&gt;&lt;td&gt;casillero del diablo&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;125570&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;278&lt;/td&gt;&lt;td&gt;gzoluble&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;130690&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;279&lt;/td&gt;&lt;td&gt;Chvex Stucture&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;148470&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;280&lt;/td&gt;&lt;td&gt;SATiriker&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;36160&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;281&lt;/td&gt;&lt;td&gt;The unmoving notogawa&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;282&lt;/td&gt;&lt;td&gt;Monkeyget&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;283&lt;/td&gt;&lt;td&gt;Sim&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;284&lt;/td&gt;&lt;td&gt;P Squared&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;285&lt;/td&gt;&lt;td&gt;gb&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;286&lt;/td&gt;&lt;td&gt;mokehehe &lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;287&lt;/td&gt;&lt;td&gt;ocaml users anonymous&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;288&lt;/td&gt;&lt;td&gt;LISA~HackLab-FI&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;289&lt;/td&gt;&lt;td&gt;zetafish&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;290&lt;/td&gt;&lt;td&gt;Puddingforce&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;291&lt;/td&gt;&lt;td&gt;Chicago Blubs&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;42300&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;292&lt;/td&gt;&lt;td&gt;Nodal Asymmetry&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;84000&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;293&lt;/td&gt;&lt;td&gt;incognito&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;84000&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;294&lt;/td&gt;&lt;td&gt;Monadic Cows&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;84000&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;295&lt;/td&gt;&lt;td&gt;Late Ocamler&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;84000&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;296&lt;/td&gt;&lt;td&gt;Rufus2&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;84000&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;297&lt;/td&gt;&lt;td&gt;greedy&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;84000&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;298&lt;/td&gt;&lt;td&gt;The Shiniest of Heisenbugs&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;84000&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-581699639375430362?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/09/icfp-contest-08-final-results-icfp.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-6112544087976407966</guid><pubDate>Mon, 08 Sep 2008 07:45:00 +0000</pubDate><atom:updated>2008-09-08T14:42:56.374+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">software_design</category><title /><description>&lt;h2&gt;Закон больших&amp;nbsp;чисел&lt;/h2&gt;
&lt;p&gt;В&amp;nbsp;теории вероятностей есть такая штука, которую математики называют законом больших чисел. Штука эта фундаментальная, поскольку устанавливает связь между теоретическими расчетами и&amp;nbsp;экспериментом. Для программистов у&amp;nbsp;этого закона есть одно важное следствие, не&amp;nbsp;менее&amp;nbsp;фундаментальное:&lt;/p&gt;
&lt;blockquote&gt;На&amp;nbsp;большой выборке даже маловероятные события становятся&amp;nbsp;наблюдаемыми.&lt;/blockquote&gt;
&lt;p&gt;На&amp;nbsp;практике этот закон означает полную неприменимость &amp;laquo;наивной&amp;raquo; аналитики и, как следствие, &amp;laquo;наивного&amp;raquo; тестирования при проектировании информационных систем. Если не&amp;nbsp;предусмотреть редкие случаи ещё при проектировании они больно стукнут на&amp;nbsp;стадии эксплуатации, причем далеко не&amp;nbsp;сразу, а&amp;nbsp;лишь по&amp;nbsp;прошествии некоторого инкубационного периода. Это чревато хотя&amp;nbsp;бы тем, что багфиксинг на&amp;nbsp;внедренной системе, в&amp;nbsp;которой уже накоплен значительный объем данных&amp;nbsp;&amp;mdash; отдельное&amp;nbsp;развлечение.&lt;/p&gt;
&lt;p&gt;Ещё одно проявление Закона больших чисел в&amp;nbsp;том, что невозможно построить информационную систему гарантированно не&amp;nbsp;содержащую ошибок в&amp;nbsp;данных. Простой пример: Оператор вводит данные вручную. Оператор не&amp;nbsp;идеален, поэтому он&amp;nbsp;делает одну ошибку на&amp;nbsp;100 записей. Это означает, что на&amp;nbsp;1&amp;nbsp;000&amp;nbsp;000 введенных записей будет порядка 10&amp;nbsp;000 ошибок. Поскольку такое количество ошибок нас не&amp;nbsp;устраивает, мы&amp;nbsp;садим поверх оператора контроллера, который будет проверять правильность ввода. Пусть контроллер более внимателен и&amp;nbsp;продуктивен, однако и&amp;nbsp;он&amp;nbsp;не&amp;nbsp;идеален, поэтому допускает одну ошибку на&amp;nbsp;1000 записей. Тогда вероятность ошибки снижается&amp;nbsp;до&amp;nbsp;10&lt;sup&gt;-5&lt;/sup&gt; на&amp;nbsp;запись. Однако, на&amp;nbsp;миллионе записей это даст примерно 10 ошибок. Если количество данных неограниченно растет, а&amp;nbsp;так бывает почти всегда, никаким контролем не&amp;nbsp;добиться гарантированного отсутствия ошибок. Даже оценить вероятность ошибки и&amp;nbsp;то&amp;nbsp;не&amp;nbsp;всегда возможно. Люди не&amp;nbsp;механические приборы, к&amp;nbsp;ним паспортов точности&amp;nbsp;не&amp;nbsp;полагается.&lt;/p&gt;
&lt;p&gt;&lt;nobr&gt;По-хорошему&lt;/nobr&gt;, при проектировании хоть &lt;nobr&gt;сколько-то&lt;/nobr&gt; сложных информационных систем нужно анализировать источники ошибок и&amp;nbsp;оценивать их&amp;nbsp;количество в&amp;nbsp;накопленных данных, однако я&amp;nbsp;не&amp;nbsp;слышал, чтобы &lt;nobr&gt;кто-нибудь&lt;/nobr&gt; всерьез этим заботился. Поэтому, используя чужие данные, вы&amp;nbsp;чаще всего ничего не&amp;nbsp;можете сказать об&amp;nbsp;их&amp;nbsp;качестве. С&amp;nbsp;этой проблемой поступают одним из&amp;nbsp;трех&amp;nbsp;способов:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Признают, что качество данных не&amp;nbsp;имеет значения для&amp;nbsp;бизнеса;&lt;/li&gt;
&lt;li&gt;Контролируют качество собственными&amp;nbsp;силами;&lt;/li&gt;
&lt;li&gt;Выбирают один из&amp;nbsp;наборов данных и&amp;nbsp;признают его&amp;nbsp;эталонным.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Это всего лишь частные эффекты. На&amp;nbsp;практике достаточно хорошо осознавать, что чем больше данных, тем сильнее проявляется Закон больших чисел, влияние которого нужно учитывать при проектировании, в&amp;nbsp;разработке&amp;nbsp;и&amp;nbsp;в&amp;nbsp;тестировании.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-6112544087976407966?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/08/blog-post.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-8622135224906260646</guid><pubDate>Mon, 11 Aug 2008 11:07:00 +0000</pubDate><atom:updated>2008-08-16T11:01:36.737+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ICFP Contest</category><title /><description>&lt;h2&gt;ICFP '08&amp;nbsp;Results&lt;/h2&gt;
&lt;p&gt;Опубликованы &lt;a href="http://icfpcontest.org/results/final/"&gt;результыты первых восьми&amp;nbsp;заездов&lt;/a&gt;. Для удобства фаллометрии свел все в&amp;nbsp;одну табличку. Get it&amp;nbsp;and use&amp;nbsp;it&amp;nbsp;well.&lt;/p&gt;
&lt;p&gt;Score&amp;nbsp;&amp;mdash; сумма по&amp;nbsp;всем восьми&amp;nbsp;заездам.&lt;/p&gt;
&lt;p&gt;Команды не&amp;nbsp;допущенные до&amp;nbsp;девятого заезда в&amp;nbsp;табличку&amp;nbsp;не&amp;nbsp;включены.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPD:&lt;/strong&gt; Добавил восьмой заезд. Плюс организаторы вернули еще 16 команд, дисквалифицированных по техническим причинам.&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;th&gt;Team&lt;/th&gt;&lt;th&gt;Score&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;UBE&lt;/td&gt;&lt;td&gt;327090&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;td&lt;/td&gt;&lt;td&gt;329520&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Celestial Dire Badger&lt;/td&gt;&lt;td&gt;330350&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Hands Solo&lt;/td&gt;&lt;td&gt;330560&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Blue Iris&lt;/td&gt;&lt;td&gt;331800&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Team Meh&lt;/td&gt;&lt;td&gt;332900&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;shinh&lt;/td&gt;&lt;td&gt;333270&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;NMSU&lt;/td&gt;&lt;td&gt;333390&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;team_bruno&lt;/td&gt;&lt;td&gt;333590&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;Team Smartass&lt;/td&gt;&lt;td&gt;334470&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;CNaml&lt;/td&gt;&lt;td&gt;334680&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;Error 404&lt;/td&gt;&lt;td&gt;334770&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;cw&lt;/td&gt;&lt;td&gt;336130&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;HackerDom_1&lt;/td&gt;&lt;td&gt;336740&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Actua&lt;/td&gt;&lt;td&gt;337670&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;ILL martians&lt;/td&gt;&lt;td&gt;337870&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;Yeahbut&lt;/td&gt;&lt;td&gt;338630&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;fireinthedisco2&lt;/td&gt;&lt;td&gt;340290&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;ais523&lt;/td&gt;&lt;td&gt;340450&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;Arekuma&lt;/td&gt;&lt;td&gt;341070&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;TC2&lt;/td&gt;&lt;td&gt;341190&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;elbereth@utmc&lt;/td&gt;&lt;td&gt;341290&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;Spore Sept 7th, only $49.99! Play Bejeweled @ popcap.com!&lt;/td&gt;&lt;td&gt;341510&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;Apathy Kings&lt;/td&gt;&lt;td&gt;342900&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;LazyBear&lt;/td&gt;&lt;td&gt;347940&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;SzM&lt;/td&gt;&lt;td&gt;348090&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;Wile E.&lt;/td&gt;&lt;td&gt;352650&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;Sir Bedevere the Wise&lt;/td&gt;&lt;td&gt;353750&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;TeamDJ&lt;/td&gt;&lt;td&gt;353980&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;Kee&lt;/td&gt;&lt;td&gt;355170&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;jabber.ru&lt;/td&gt;&lt;td&gt;356170&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;frank324&lt;/td&gt;&lt;td&gt;356270&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;33&lt;/td&gt;&lt;td&gt;Urxae&lt;/td&gt;&lt;td&gt;358030&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;Malfunctional Programmer&lt;/td&gt;&lt;td&gt;358770&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;Heklers&lt;/td&gt;&lt;td&gt;359580&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;PurelyFunctionalInfrastructure&lt;/td&gt;&lt;td&gt;361340&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;Cup&lt;'t&gt;&lt;/td&gt;&lt;td&gt;362370&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;38&lt;/td&gt;&lt;td&gt;Side Effects May Include...&lt;/td&gt;&lt;td&gt;362960&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;39&lt;/td&gt;&lt;td&gt;Purple Pointer Eaters&lt;/td&gt;&lt;td&gt;363780&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;intelliarts&lt;/td&gt;&lt;td&gt;365870&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;Slow&lt;/td&gt;&lt;td&gt;366260&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;EdFred&lt;/td&gt;&lt;td&gt;367150&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;43&lt;/td&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;367510&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;44&lt;/td&gt;&lt;td&gt;The B-Team: 25/26ths as good as the A-Team&lt;/td&gt;&lt;td&gt;371520&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;45&lt;/td&gt;&lt;td&gt;a1k0n&lt;/td&gt;&lt;td&gt;373610&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;46&lt;/td&gt;&lt;td&gt;RHZ&lt;/td&gt;&lt;td&gt;373950&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;47&lt;/td&gt;&lt;td&gt;souris aveugle&lt;/td&gt;&lt;td&gt;374140&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;48&lt;/td&gt;&lt;td&gt;LUHPI&lt;/td&gt;&lt;td&gt;374310&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;49&lt;/td&gt;&lt;td&gt;little lemon&lt;/td&gt;&lt;td&gt;375620&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;50&lt;/td&gt;&lt;td&gt;kstm.org&lt;/td&gt;&lt;td&gt;376070&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;51&lt;/td&gt;&lt;td&gt;m1-speedygonzalez&lt;/td&gt;&lt;td&gt;377810&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;52&lt;/td&gt;&lt;td&gt;Team Sampou&lt;/td&gt;&lt;td&gt;378210&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;53&lt;/td&gt;&lt;td&gt;Five of Six&lt;/td&gt;&lt;td&gt;378920&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;54&lt;/td&gt;&lt;td&gt;Mosquito&lt;/td&gt;&lt;td&gt;381240&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;55&lt;/td&gt;&lt;td&gt;Eger a Marson&lt;/td&gt;&lt;td&gt;381530&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;56&lt;/td&gt;&lt;td&gt;ur 67P&lt;/td&gt;&lt;td&gt;385050&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;57&lt;/td&gt;&lt;td&gt;tidder&lt;/td&gt;&lt;td&gt;385790&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;12a0&lt;/td&gt;&lt;td&gt;389440&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;59&lt;/td&gt;&lt;td&gt;Giantslalom&lt;/td&gt;&lt;td&gt;390270&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;60&lt;/td&gt;&lt;td&gt;epriestley&lt;/td&gt;&lt;td&gt;408520&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;61&lt;/td&gt;&lt;td&gt;Om Nom Nom Nom&lt;/td&gt;&lt;td&gt;409070&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;62&lt;/td&gt;&lt;td&gt;Bobry&lt;/td&gt;&lt;td&gt;412030&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-8622135224906260646?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/08/icfp-08-results.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-5637543620499200992</guid><pubDate>Tue, 29 Jul 2008 11:41:00 +0000</pubDate><atom:updated>2008-08-11T18:06:51.055+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">software_design</category><title /><description>&lt;h2&gt;Nomen est&amp;nbsp;omen&lt;/h2&gt;
&lt;p&gt;Представим себе гипотетическую ситуацию: некий &lt;nobr&gt;юноша-с-косичкой&lt;/nobr&gt; подрядился писать программу. Ну&amp;nbsp;хотя&amp;nbsp;бы учет посетителей в&amp;nbsp;библиотеке. (Ещё ни&amp;nbsp;одной приличной не&amp;nbsp;видел) И&amp;nbsp;вот доходят у&amp;nbsp;него руки до&amp;nbsp;учета пользователей и&amp;nbsp;он&amp;nbsp;радостно создает в&amp;nbsp;базе табличку visitors {firstName, lastName, middleName}. А&amp;nbsp;что, у&amp;nbsp;всех буквально есть фамилия, имя и&amp;nbsp;отчество. Вот у&amp;nbsp;его знакомых в&amp;nbsp;родном Крыжополе точно у&amp;nbsp;всех. Да&amp;nbsp;и&amp;nbsp;&lt;nobr&gt;девочка-библиотекарь&lt;/nobr&gt;, которая заместо аналитика, говорит что так правильно. И&amp;nbsp;вот поступает такая система в&amp;nbsp;эксплуатацию. А&amp;nbsp;там кого только нет: и&amp;nbsp;&lt;nobr&gt;Александров-Погорельский&lt;/nobr&gt;,&amp;nbsp;Ли Син Цин, и&amp;nbsp;Хосе Луис Мария Педро Фернандос. И&amp;nbsp;вот мучаются библиотекари, стараясь всунуть чуждые имена в&amp;nbsp;прокрустово ложе программы, сыплются проклятья и&amp;nbsp;летят в&amp;nbsp;сторону незадачливого юноши лучики&amp;nbsp;поноса.&lt;/p&gt;
&lt;p&gt;Произошло это потому, что незадачливый программист не&amp;nbsp;разобрался в&amp;nbsp;сути моделируемых явлений. На&amp;nbsp;больших объемах данных такой подход очень редко сходит с&amp;nbsp;рук&amp;nbsp;&amp;mdash; всегда найдутся выпадающие данные, даже если на&amp;nbsp;первый взгляд их&amp;nbsp;быть не&amp;nbsp;должно. Хороший пример: тройные фамилии вроде&amp;nbsp;бы как запрещены законодательно, по&amp;nbsp;крайней мере просто так её&amp;nbsp;взять не&amp;nbsp;получится. Возникает соблазн добавить проверку, и&amp;nbsp;соблазн довольно опасный. Вероятность того, что системе попадется человек с&amp;nbsp;тройной фамилией довольно велика на&amp;nbsp;большой выборке. Аллах знает, как у&amp;nbsp;них это получается, но&amp;nbsp;сменить человеку фамилию можно только через&amp;nbsp;суд.&lt;/p&gt;
&lt;p&gt;Ещё одна распространенная ошибка&amp;nbsp;&amp;mdash; трактовать отчество как &lt;nobr&gt;middle-name&lt;/nobr&gt;. Мне попадался даже один декан, который подписывался Boris A. Gladkih, видимо, не&amp;nbsp;подозревая, что читается это как Борис Афанасий Гладких, что суть нонсенс. Второе имя это именно самостоятельное имя, которое можно использовать отдельно, пусть даже оно и&amp;nbsp;дается в&amp;nbsp;честь отца или деда. Отчество&amp;nbsp;же без имени употребляется исключительно в&amp;nbsp;качестве прозвища и&amp;nbsp;только отдельно от&amp;nbsp;фамилии: &amp;laquo;Кузмич&amp;nbsp;&amp;mdash; за&amp;nbsp;пивом пойдет&amp;raquo;. На&amp;nbsp;эти грабли качественно наступили создатели формата&amp;nbsp;fb2.&lt;/p&gt;
&lt;p&gt;В&amp;nbsp;наш век всеобщей глобализации правильнее не&amp;nbsp;задумываться над традициями присвоения имен, а&amp;nbsp;признать, что человек может сам выбрать как ему называться. Технологически, ничего сложного в&amp;nbsp;этом нет, если только вы&amp;nbsp;не&amp;nbsp;хотите поддерживать все возможные традиции именования. Зато, если завтра к&amp;nbsp;вам придет посетитель, у&amp;nbsp;которого в&amp;nbsp;паспорте написано &amp;laquo;БОЧ рВФ 260602 Вячеславович &lt;nobr&gt;Воронин-Фролов&lt;/nobr&gt;&amp;raquo; вы&amp;nbsp;будете к&amp;nbsp;этому&amp;nbsp;готовы.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-5637543620499200992?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/07/nomen-est.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-5263470648290439991</guid><pubDate>Wed, 16 Jul 2008 10:19:00 +0000</pubDate><atom:updated>2008-09-25T18:15:20.489+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ICFP Contest</category><title /><description>&lt;h2&gt;ICFP '08&amp;nbsp;Contest&lt;/h2&gt;
&lt;p&gt;Контест завершился, завалы на&amp;nbsp;работе разобраны, настало время небольшого отчета, &lt;nobr&gt;куда-ж&lt;/nobr&gt; без&amp;nbsp;него.&lt;/p&gt;
&lt;h3&gt;Preambula&lt;/h3&gt;
&lt;p&gt;Про ICFP contest я&amp;nbsp;узнал начитавшись отчетов и&amp;nbsp;сразуже захотел попробовать. Этот контест выгодно отличается от&amp;nbsp;ненавистных мне &amp;laquo;академических&amp;raquo; олимпиад и&amp;nbsp;их&amp;nbsp;идиотскими заданиями, не&amp;nbsp;имеющими ни&amp;nbsp;малейшего отношения к&amp;nbsp;реальности. Поскольку по&amp;nbsp;одним субъективными отчетам трудно достоверно оценить явление было решено потрогать воду лапкой прежде чем готовиться к&amp;nbsp;участвовать всерьез. Что и&amp;nbsp;было проделано с&amp;nbsp;величайшим удовольствием. Однако, некоторую подготовку я&amp;nbsp;все&amp;nbsp;же провел: настроил NetBeans с&amp;nbsp;Ruby, создал необходимую структуру папок для проекта, поднял на&amp;nbsp;всякий случай Linux под виртуальной машиной, скачал и&amp;nbsp;запустил&amp;nbsp;LiveCD&lt;/p&gt;
&lt;h3&gt;Day 0.&amp;nbsp;Landing&lt;/h3&gt;
&lt;p&gt;За&amp;nbsp;час до&amp;nbsp;начала вылезаю на&amp;nbsp;канал&amp;nbsp;&lt;code&gt;#&lt;nobr&gt;icfp-contest&lt;/nobr&gt;&lt;/code&gt; и&amp;nbsp;наблюдаю там больше 200 человек. С&amp;nbsp;трудом дожидаюсь публикации задания. Большого смысла в&amp;nbsp;этом нет, но&amp;nbsp;хочется уже прочесть его, составить план штурма и&amp;nbsp;отправится спать. Время &lt;nobr&gt;из-за&lt;/nobr&gt; разницы во&amp;nbsp;времени довольно позднее. В&amp;nbsp;час &amp;laquo;X&amp;raquo; вся эта толпа, коей набралось уже за&amp;nbsp;300 человек радостно тянется качать задание и&amp;nbsp;на&amp;nbsp;несколько минут роняет сервер. Наконец я&amp;nbsp;добираюсь до&amp;nbsp;нужного документа и&amp;nbsp;погружаюсь в&amp;nbsp;чтение. Итак, задача этого года, в&amp;nbsp;моем кратком&amp;nbsp;изложении&lt;/p&gt;
&lt;blockquote&gt;
Есть квадратное поле заданных размеров, представляющее поверхность Марса. На&amp;nbsp;поверхности&amp;nbsp;имеются:
&lt;ol&gt;
&lt;li&gt;кратеры, в&amp;nbsp;которые можно упасть, насмерть,&amp;nbsp;много;&lt;/li&gt;
&lt;li&gt;валуны, о&amp;nbsp;которые можно стукнуться, больно, тоже&amp;nbsp;много;&lt;/li&gt;
&lt;li&gt;марсиане, которые норовят сожрать, самоходные,&amp;nbsp;много;&lt;/li&gt;
&lt;li&gt;база, дружественная,&amp;nbsp;одна;&lt;/li&gt;
&lt;li&gt;марсоход, свой,&amp;nbsp;один.&lt;/li&gt;
&lt;/ol&gt;
На&amp;nbsp;поверхность в&amp;nbsp;произвольной точке высаживают марсоход (с&amp;nbsp;довольно реалистичной физической моделью) для которого нужно написать программу управления (общающуюся с&amp;nbsp;сервером по&amp;nbsp;TCP/IP), приводящую его к&amp;nbsp;базе в&amp;nbsp;обход кратеров, валунов и&amp;nbsp;марсиан. Соревноваться в&amp;nbsp;итоге будут программы между собой, у&amp;nbsp;кого лучше, тот&amp;nbsp;и&amp;nbsp;победитель.
В&amp;nbsp;деталях, &lt;a href="http://smlnj.org/icfp08-contest/task.html"&gt;оригинал на&amp;nbsp;12&amp;nbsp;страницах&lt;/a&gt;.
&lt;/blockquote&gt;
&lt;p&gt;Прочитав задание, понимаю, что Ruby тут не&amp;nbsp;при делах. Марсоход&amp;nbsp;&amp;mdash; железка глупая, не&amp;nbsp;станет ждать пока досчитается, укатится к&amp;nbsp;черту на&amp;nbsp;рога. Решаю применить запасной вариант и&amp;nbsp;использовать Java. Пока разворачивается IDE, лезу качать симулятор, но&amp;nbsp;его ещё не&amp;nbsp;выложили. Основных проблем в&amp;nbsp;задании видится&amp;nbsp;три:
1) Сетевой&amp;nbsp;протокол;
2) Алгоритм&amp;nbsp;управления;
3) Визуализатор для&amp;nbsp;отладки.
За&amp;nbsp;пару часов реализую сетевой протокол, описываю необходимые структуры данных и&amp;nbsp;с&amp;nbsp;чистой совестью отправляюсь&amp;nbsp;спать&lt;/p&gt;
&lt;h3&gt;Day 1. Doctrine:&amp;nbsp;Mobility&lt;/h3&gt;
&lt;p&gt;Пока я&amp;nbsp;спал, организаторы выложили симулятор, а&amp;nbsp;участники в&amp;nbsp;чате и&amp;nbsp;рассылке развели невообразимый флейм. Быстро скачав симулятор, проверяю свой код. Сетевой протокол работает без отладки. В&amp;nbsp;симуляторе оказывается встроенный визуализатор, так что от&amp;nbsp;одной задачи я&amp;nbsp;на&amp;nbsp;некоторое время избавлен. Несколько часов уходит на&amp;nbsp;то, чтобы научить марсоход ехать в&amp;nbsp;заданную точку. Дело продвигается медленно, потому как тригонометрию я&amp;nbsp;напрочь забыл, уж&amp;nbsp;слишком давно не&amp;nbsp;делал ничего подобного. Когда первая карта проходит отправляюсь кататься на&amp;nbsp;велосипеде, а&amp;nbsp;вечером принимаюсь за&amp;nbsp;объезд препятствий. Лобовое решение, отворачивать от&amp;nbsp;препятствия расположенного в&amp;nbsp;опасном угле по&amp;nbsp;курсу работает плохо. Объехав первый кратер, марсоход сослепу ухает во&amp;nbsp;второй. Мне подкидывают идею, предсказывать положение марсохода на&amp;nbsp;несколько ходов. Решаю заняться этим завтра и&amp;nbsp;отправляюсь&amp;nbsp;спать.&lt;/p&gt;
&lt;h3&gt;Day 2. Doctrine:&amp;nbsp;Flexibility&lt;/h3&gt;
&lt;p&gt;Со&amp;nbsp;вчерашнего дня обнаружилась ещё одна проблема: перерегуляция, приводящая к&amp;nbsp;том, что марсоход пролетает мимо базы. Решил сперва побороть её&amp;nbsp;и&amp;nbsp;ввел эвристики, запрещающие крутые повороты вдали от&amp;nbsp;базы для наведения на&amp;nbsp;цель. С&amp;nbsp;предсказанием все плохо, марсоход едет довольно паршиво, часто падает в&amp;nbsp;кратеры и&amp;nbsp;стукается о&amp;nbsp;валуны. Приседания с&amp;nbsp;параметрами дают немного. Это продолжается до&amp;nbsp;тех пор, пока я&amp;nbsp;не&amp;nbsp;начинаю проверять точность предсказаний в&amp;nbsp;реальном времени. Сперва обнаруживается, что я&amp;nbsp;забыл учесть трение и&amp;nbsp;предсказания скорости не&amp;nbsp;слишком точны. Добавив систему оценки трения и&amp;nbsp;ускорения, получаю точность предсказания скорости до&amp;nbsp;четвертого знака. Выглядит хорошо, но&amp;nbsp;точность предсказания расстояния не&amp;nbsp;изменилась. Проверяю расчеты калькулятором и&amp;nbsp;обнаруживаю, что &lt;code&gt;java.lang.Math&lt;/code&gt; принимает аргументы синусов и&amp;nbsp;косинусов в&amp;nbsp;радианах, а&amp;nbsp;я&amp;nbsp;считаю углы в&amp;nbsp;градусах. Правлю и&amp;nbsp;точность hgtlcrfpfybq достигает требуемой. Поскольку нет необходимости в&amp;nbsp;играх с&amp;nbsp;параметрами, устанавливаю предсказания на&amp;nbsp;5 секунд вперед. Все три тестовые карты проходятся, так что я&amp;nbsp;начинаю искать, на&amp;nbsp;чем&amp;nbsp;бы ещё протестировать. Поскольку возможности достать и&amp;nbsp;померяться прямо в&amp;nbsp;процессе организаторы не&amp;nbsp;предусмотрели народ во&amp;nbsp;всю обсуждает результаты и&amp;nbsp;выкладывает собственные карты. Пытаюсь протестировать на&amp;nbsp;чужих картах и&amp;nbsp;обнаруживаю два&amp;nbsp;факта:
а) на&amp;nbsp;рандомных картах сходных с&amp;nbsp;тесовыми все работает&amp;nbsp;идеально;
б) стенки, &amp;laquo;рюмки&amp;raquo;, &amp;laquo;бутылки&amp;raquo;, лабиринты и&amp;nbsp;прочие непрерывности вводят марсоход в&amp;nbsp;ступор. На&amp;nbsp;этой прекрасной ноте отправляюсь&amp;nbsp;спать.
&lt;/p&gt;
&lt;h3&gt;Day 3. Doctrine:&amp;nbsp;Initiative&lt;/h3&gt;
&lt;p&gt;Пенедельник&amp;nbsp;&amp;mdash; день рабочий, поэтому за&amp;nbsp;марсоход удается приняться только к&amp;nbsp;вечеру. Проверять на&amp;nbsp;каждом шаге полноценное дерево решений чтобы выбрать оптимальное мне влом. Судя по&amp;nbsp;отзывам не&amp;nbsp;меньше половины участников этим не&amp;nbsp;заморачивались, уповая на&amp;nbsp;отсутствие в&amp;nbsp;реальных тестах стенок. Так что я&amp;nbsp;решаю посвятить оставшееся время отладке и&amp;nbsp;доводке. На&amp;nbsp;марсинан также решено забить. Мой марсоход едет быстро и&amp;nbsp;непредсказуемо, так, что даже я&amp;nbsp;не&amp;nbsp;всегда могу предполагать куда он&amp;nbsp;свернет. Перехватить его марсианином, задача гораздо менее тривиальная, чем объезд препятствий, так что с&amp;nbsp;марсианином он&amp;nbsp;может столкнуться только по&amp;nbsp;чистой случайности. Вычисление радиуса поворота в&amp;nbsp;эвристиках для определения необходимого положения руля значительно помогло. Теперь марсоход едет быстро, оптимально и&amp;nbsp;опасно. Решаю оставить как есть в&amp;nbsp;надежде, что он&amp;nbsp;не&amp;nbsp;свалится в&amp;nbsp;кратер больше двух раз. Пробую ещё пару идей, но&amp;nbsp;они не&amp;nbsp;работают. Сперва пытаюсь объединить пересекающиеся препятствия в&amp;nbsp;одно большое, но&amp;nbsp;точности это не&amp;nbsp;увеличивает, зато существенно замедляет работу. Затем пытаюсь настроить москитный маневр (вместо движения прямо, рулить попеременно &lt;nobr&gt;влево-вправо&lt;/nobr&gt; для затруднения перехвата), но&amp;nbsp;это ухудшает точность предсказаний, которые на&amp;nbsp;него не&amp;nbsp;рассчитаны. Допиливать предсказания не&amp;nbsp;хочется, поэтому сабмичу, как есть. Выложат результаты, будет видно насколько мои предположения оправдались.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;p&gt;Участвовать в&amp;nbsp;этом можно, но&amp;nbsp;одному не&amp;nbsp;это делать не&amp;nbsp;слишком приятно. Кучу побочных задач я&amp;nbsp;пропустил, так, а&amp;nbsp;они могли существенно улучшить результат. Если&amp;nbsp;бы у&amp;nbsp;меня был собственный рендерер выводящий внутренне представление, ошибка с&amp;nbsp;предсказаниями была&amp;nbsp;бы отловлена сразу&amp;nbsp;же и&amp;nbsp;хватило&amp;nbsp;бы времени на&amp;nbsp;более изощренный алгоритм. Генератор карт существенно облегчил&amp;nbsp;бы отладку. Даже ознакомиться с&amp;nbsp;достижениями конкурентов не&amp;nbsp;хватило времени. В&amp;nbsp;следующий раз, я&amp;nbsp;планирую собрать команду и&amp;nbsp;подойти к&amp;nbsp;делу&amp;nbsp;серьезно.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-5263470648290439991?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/07/icfp-08-preambula-icfp-contest.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-9051011248993360206</guid><pubDate>Thu, 03 Jul 2008 05:01:00 +0000</pubDate><atom:updated>2008-07-03T12:02:44.884+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">date/time system</category><category domain="http://www.blogger.com/atom/ns#">software_design</category><title /><description>&lt;h2&gt;Date, Time, Interval, and&amp;nbsp;Duration&lt;/h2&gt;
&lt;p&gt;С&amp;nbsp;представлением времени в&amp;nbsp;большинстве систем творится полный бардак. Ладно, RDF с&amp;nbsp;OWL&amp;rsquo;ем, там и&amp;nbsp;без этого все плохо, но&amp;nbsp;даже в&amp;nbsp;стандартных библиотеках самых что ни&amp;nbsp;на&amp;nbsp;есть мейнстримных языков полный бардак. Ну&amp;nbsp;что нужно курить чтобы&amp;nbsp;в&amp;nbsp;&lt;strong&gt;стандартный&lt;/strong&gt; класс Date добавить преобразование к&amp;nbsp;Юлианскому календарю? Ни&amp;nbsp;разу не&amp;nbsp;встречал человека, которому&amp;nbsp;бы это потребовалось. Зато вычислять интервал между двумя событиями приходится вручную. Давайте попробуем спроектировать библиотеку для работы со&amp;nbsp;временем правильно. Может хоть &lt;nobr&gt;кому-нибудь&lt;/nobr&gt; живой пример вправит&amp;nbsp;мозги.&lt;/p&gt;
&lt;p&gt;Итак, что такое время для программиста? Это одна координатная прямая, на&amp;nbsp;которой определена выделенная точка &amp;laquo;сейчас&amp;raquo;, делящая прямую на&amp;nbsp;&amp;laquo;прошлое&amp;raquo; и&amp;nbsp;&amp;laquo;будущее&amp;raquo;. Примитивные племена на&amp;nbsp;этом и&amp;nbsp;останавливаются, оперируя тремя понятиями: &amp;laquo;было&amp;raquo;, &amp;laquo;есть&amp;raquo; и&amp;nbsp;&amp;laquo;будет&amp;raquo;. Современному человеку требуется больше: время должно быть&amp;nbsp;&lt;strong&gt;измеримо&lt;/strong&gt;. Это позволит производить вычисления (до&amp;nbsp;сеанса осталось полчаса) и&amp;nbsp;учитывать порядок событий ([сначала]он&amp;nbsp;мне в&amp;nbsp;глаз, а&amp;nbsp;[затем] я&amp;nbsp;ему в&amp;nbsp;ухо) от&amp;nbsp;которого и&amp;nbsp;до&amp;nbsp;&lt;nobr&gt;причинно-следственной&lt;/nobr&gt; связи недалеко. Для того чтобы сделать время измеримым на&amp;nbsp;прямую произвольным образом добавляют фиксированную выделенную точку &amp;laquo;0&amp;raquo;. Исторически сложилось так, что в&amp;nbsp;разных культурах эту точку добавляли &lt;nobr&gt;по-своему&lt;/nobr&gt;. Это мог быть день коронования императора, начало определенного года, произвольно выбранный момент времени и&amp;nbsp;даже время &amp;laquo;сотворения мира&amp;raquo;. В&amp;nbsp;мире UNIX, например, это полночь 1 января 1970&amp;nbsp;года.&lt;/p&gt;
&lt;p&gt;С&amp;nbsp;другой стороны люди привыкли к&amp;nbsp;довольно неудобной для вычислений системе предстваления времени, связанной с&amp;nbsp;циклами вращения Земли. Опять&amp;nbsp;же, в&amp;nbsp;разных культурах к&amp;nbsp;этой проблеме подходили по&amp;nbsp;разному. В&amp;nbsp;результате год начинается в&amp;nbsp;разное время и&amp;nbsp;по&amp;nbsp;разному делится на&amp;nbsp;месяцы в&amp;nbsp;зависимости от&amp;nbsp;культуры. Более того, в&amp;nbsp;разных культурах привычные способы записи времени сильно отличаются, даже если системы счисления времени совпадают. Та&amp;nbsp;же американская ММ/ДД/ГГ и&amp;nbsp;русская&amp;nbsp;ДД.ММ.ГГ.&lt;/p&gt;
&lt;p&gt;&lt;nobr&gt;Из-за&lt;/nobr&gt; привычки людей к&amp;nbsp;солнечному времени, в&amp;nbsp;один и&amp;nbsp;тот&amp;nbsp;же момент время отличается в&amp;nbsp;разных часовых&amp;nbsp;поясах. Как будто этого мало, многие страны используют летнее/зимнее время для экономного использования светового дня. В результате, вычисление времени в определенной локации становится довольно неудобной задачей, по крайней мере для человека.&lt;/p&gt;
&lt;p&gt;Поскольку продолжительность суток растет, каждые несколько лет к&amp;nbsp;UTC добавляют секунду, чтобы компенсировать замедление. Это тоже усложняет точные расчеты, однако, пока не&amp;nbsp;вызывает проблем, поскольку единой системы точного времени затрагивающую все&amp;nbsp;&amp;mdash; от&amp;nbsp;GPS приемников до&amp;nbsp;кофеварок&amp;nbsp;не&amp;nbsp;создано.&lt;/p&gt;
&lt;p&gt;Теперь, когда требования ясны, займемся проектированием. Будет удобно, если внутри системы время будет хранится единообразно, в&amp;nbsp;собственной системе координат, а&amp;nbsp;преобразоваться в&amp;nbsp;нужную будет только на&amp;nbsp;входе и&amp;nbsp;выходе. По&amp;nbsp;крайней мере это избави программиста от&amp;nbsp;ручных расчетов и&amp;nbsp;преобразований&amp;nbsp;форматов.&lt;/p&gt;
&lt;p&gt;Первое, что нам требуется, это момент времени (Timestamp) заданный с&amp;nbsp;максимальной возможной точностью в&amp;nbsp;некоторой системе отсчета, хоть UNIX time. Этот класс является платформозависимым, поскольку умеет работать с&amp;nbsp;системным таймером. Никаких преобразований или вычислений этот класс делать не&amp;nbsp;должен. Очень часто требуется работать с&amp;nbsp;моментами времени с&amp;nbsp;точностью до&amp;nbsp;минуты, дня или года, в&amp;nbsp;этом случае максимальное разрешение тут только мешает. Для некоторой частых случаев можно определить классы Date и&amp;nbsp;DateTime и&amp;nbsp;точностью, соответственно, до&amp;nbsp;дня и&amp;nbsp;до&amp;nbsp;секунды. Timestamp должен корректно поддерживать сравнение отметок времени с&amp;nbsp;максимальной и&amp;nbsp;ограниченной&amp;nbsp;точностью.&lt;/p&gt;
&lt;p&gt;Второе&amp;nbsp;&amp;mdash; интервал между двумя моментами времени (Interval) Интервал можно представить двумя моментами времени: начало интервала и&amp;nbsp;конец интервала. Интервал должен уметь вычислять свою продолжительность. Кроме того, нужна возможность зная начало или конец интервала и&amp;nbsp;продолжительность, получить&amp;nbsp;интервал.&lt;/p&gt;
&lt;p&gt;Третье&amp;nbsp;&amp;mdash; продолжительносить (Duration) Внутри продолжительность хранится в&amp;nbsp;максимально возможной системной&amp;nbsp;точностью.&lt;/p&gt;
&lt;p&gt;Для каждой из&amp;nbsp;трех сущностей потребуется два интерфейса: *Parser и&amp;nbsp;*Formatter имплементации которых служат для преобразования сущностей из&amp;nbsp;строки и&amp;nbsp;к&amp;nbsp;строке (или прочим типам). Кроме форматирования, их&amp;nbsp;зона ответственности&amp;nbsp;&amp;mdash; преобразование к&amp;nbsp;другим системам представления времени, например к&amp;nbsp;тому&amp;nbsp;же юлианскому&amp;nbsp;календарю.&lt;/p&gt;
&lt;p&gt;В&amp;nbsp;основном, этого достаточно. Естественно, в&amp;nbsp;некоторых языках можно добавить собственные удобности, например профайлинг&amp;nbsp;в&amp;nbsp;Ruby:&lt;/p&gt;
&lt;code&gt;
&lt;pre&gt;
duration = Duration.measure do
...
end
&lt;/pre&gt;
&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-9051011248993360206?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/06/date-time-interval-and.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-2675711802813794926</guid><pubDate>Tue, 24 Jun 2008 02:54:00 +0000</pubDate><atom:updated>2008-12-09T15:02:52.844+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">RuPyRu</category><category domain="http://www.blogger.com/atom/ns#">Omsk</category><title /><description>&lt;h2&gt;&lt;a href="http://www.rupy.ru/"&gt;RuPyRu&lt;/a&gt; 2008.&amp;nbsp;Конференция&lt;/h2&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SGBhn858Z5I/AAAAAAAAABg/2uAuBDocjms/s1600-h/Resize+of+P6211946.JPG"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SGBhn858Z5I/AAAAAAAAABg/2uAuBDocjms/s320/Resize+of+P6211946.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5215275707486988178" /&gt;&lt;/a&gt;
&lt;p&gt;Пару слов о&amp;nbsp;самой конференции. В&amp;nbsp;целом&amp;nbsp;&lt;a href="http://www.rupy.ru/"&gt;RuPyRu&lt;/a&gt; оправдала мои ожидания: хорошая, добротная провинциальная&amp;nbsp;конференция.&lt;/p&gt;
&lt;p&gt;Техническая организация была на&amp;nbsp;высоте. Обошлось без критических задержек, технических перерывов и&amp;nbsp;прочих накладок. Во&amp;nbsp;всяком случае я&amp;nbsp;таковых&amp;nbsp;не&amp;nbsp;заметил.&lt;/p&gt;
&lt;p&gt;Качество докладов оставляет желать лучшего. Было очень много рассказов своими словами об&amp;nbsp;использовании чужих технологий, разбавленных собственным опытом. По&amp;nbsp;большому счету такие доклады бесполезны, поскольку такую информацию легко почерпнуть в&amp;nbsp;мануале, а&amp;nbsp;все, кто &amp;laquo;в&amp;nbsp;контексте&amp;raquo; давно прочитали обзорные статьи в&amp;nbsp;блогах и&amp;nbsp;форумах. Вопросы в&amp;nbsp;стиле &amp;laquo;Почему это сделано именно так?&amp;raquo; таким докладчикам тоже задавать бессмысленно, не&amp;nbsp;они технологию разрабатывали, откуда&amp;nbsp;им&amp;nbsp;знать.&lt;/p&gt;
&lt;p&gt;Познать механизм деления докладов на&amp;nbsp;&amp;laquo;общий&amp;raquo; и&amp;nbsp;&amp;laquo;специальный&amp;raquo; потоки мне не&amp;nbsp;удалось. Интересные доклады были и&amp;nbsp;там и&amp;nbsp;там. Я&amp;nbsp;бы предложил деление на&amp;nbsp;&amp;laquo;пользовательский&amp;raquo; и&amp;nbsp;&amp;laquo;авторский&amp;raquo; потоки. В&amp;nbsp;первом&amp;nbsp;&amp;mdash; краткие обзорные доклады, посвященные чужим технологиями, во&amp;nbsp;втором&amp;nbsp;&amp;mdash; доклады авторов о&amp;nbsp;собственных разработках и&amp;nbsp;доклады экспертов. Понравилось, что Ruby и&amp;nbsp;Python не&amp;nbsp;были разнесены на&amp;nbsp;отдельные потоки, что позволило познакомиться с&amp;nbsp;конкурентными&amp;nbsp;технологиями.&lt;/p&gt;
&lt;p&gt;Совершенно зря перед конференцией не&amp;nbsp;были собраны и&amp;nbsp;опубликованы тезисы. &lt;nobr&gt;Все-таки&lt;/nobr&gt; по&amp;nbsp;одному названию доклада трудно понять, стоит&amp;nbsp;ли его слушать. Впрочем, докладов было мало и&amp;nbsp;особых неудобств от&amp;nbsp;этого&amp;nbsp;не&amp;nbsp;было.&lt;/p&gt;
&lt;p&gt;Идея круглых столов с&amp;nbsp;едой, хороша, но&amp;nbsp;реализация не&amp;nbsp;слишком хорошо удалась. Стоило составить физические столы так, чтобы народ сидел лицом друг к&amp;nbsp;другу, обозначить вопросы на&amp;nbsp;обсуждение и&amp;nbsp;&lt;nobr&gt;как-то&lt;/nobr&gt; организовать дискуссию. Темы круглых столов тоже не&amp;nbsp;слишком удались. Здесь&amp;nbsp;бы стоило разнести Ruby и&amp;nbsp;Python на&amp;nbsp;разные столы, поскольку в&amp;nbsp;таком формате обычно обсуждаются довольно тонкие вопросы, пользователям конкурентной технологии&amp;nbsp;не&amp;nbsp;интересные.&lt;/p&gt;
&lt;p&gt;Из&amp;nbsp;интересного для меня оказались совершенно не&amp;nbsp;раскрыты темы развертывания Rails и&amp;nbsp;Django приложений, использования динамических языков для кодогенерации, использования Ruby и&amp;nbsp;Python в&amp;nbsp;качестве скриптовых языков внутри приложения и&amp;nbsp;создания DSL на&amp;nbsp;базе динамических&amp;nbsp;языков.&lt;/p&gt;
&lt;p&gt;Несколько раз пожалел, что приехал с&amp;nbsp;пустыми руками. Увы, времени нормально подготовиться после Алтая категорически не&amp;nbsp;было, а&amp;nbsp;докладываться экспромтом я&amp;nbsp;зарекся. Надеюсь, традиция продолжится и&amp;nbsp;в&amp;nbsp;&lt;nobr&gt;2009-ом&lt;/nobr&gt; конференция&amp;nbsp;состоится.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-2675711802813794926?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/06/rupu.html</link><author>noreply@blogger.com (Miroff)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SGBhn858Z5I/AAAAAAAAABg/2uAuBDocjms/s72-c/Resize+of+P6211946.JPG" height="72" width="72" /><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-7978467501332875985</guid><pubDate>Tue, 24 Jun 2008 02:44:00 +0000</pubDate><atom:updated>2008-12-09T15:02:54.148+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">travel</category><category domain="http://www.blogger.com/atom/ns#">Omsk</category><title /><description>&lt;h2&gt;&lt;a href="http://www.rupy.ru/"&gt;RuPyRu&lt;/a&gt; 2008. Омск&lt;/h2&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SGBgNVvyqTI/AAAAAAAAAAo/eIjWSbqP9J0/s1600-h/Resize+of+P6211816.JPG"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SGBgNVvyqTI/AAAAAAAAAAo/eIjWSbqP9J0/s320/Resize+of+P6211816.JPG" border="0" alt="памятник Ленину" id="BLOGGER_PHOTO_ID_5215274150787197234" /&gt;&lt;/a&gt;

&lt;p&gt;Дожидаясь начала конференции удалось прогуляться по Омску. Увы, было ранее субботнее утро, поэтому оценить вид города в час пик не удалось. Утром выходного дня все города выглядят одинаково хорошо. На вокзале нас встретил традиционный бронзовый Ленин, твердой рукой указующий почему-то на здание вокзала. Видимо, это должно означать: "Убирайтесь, откуда пришли".&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Z-sGuwkoyTw/SGBgRmIyUAI/AAAAAAAAAAw/KCLEwxI-JxU/s1600-h/Resize+of+P6211829.JPG"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand; clear: right;" src="http://3.bp.blogspot.com/_Z-sGuwkoyTw/SGBgRmIyUAI/AAAAAAAAAAw/KCLEwxI-JxU/s320/Resize+of+P6211829.JPG" border="0" alt="памятник Оленям" id="BLOGGER_PHOTO_ID_5215274223906476034" /&gt;&lt;/a&gt;

&lt;p&gt;Встречаются в Омске и новые скульптуры, в духе современной моды. На набережной Иртыша, великой судоходной реки, нам попался памятник Оленям, воспевающий трогательную заботу, нежность и дальновидность.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Z-sGuwkoyTw/SGBhnPmY2NI/AAAAAAAAABY/rWKMBdxlJhk/s1600-h/Resize+of+P6211876.JPG"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_Z-sGuwkoyTw/SGBhnPmY2NI/AAAAAAAAABY/rWKMBdxlJhk/s320/Resize+of+P6211876.JPG" border="0" alt="памятник Сантехнику" id="BLOGGER_PHOTO_ID_5215275695325370578" /&gt;&lt;/a&gt;

&lt;p&gt;
В центре города нам встретился памятник &lt;s&gt;Говночерпию&lt;/s&gt; Сантехнику, из вечно актуальной серии памятников рабочему классу (памятники Электрику и Дворнику в Томске) Расположенный прямо на тротуаре, он символизирует близость рыцаря труб и задвижек к народу, а умиротворенное выражение лица убеждает в чистоте его намерений. 
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Z-sGuwkoyTw/SGBgRw8l3TI/AAAAAAAAAA4/ReTpSM6CwrY/s1600-h/Resize+of+P6211849.JPG"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_Z-sGuwkoyTw/SGBgRw8l3TI/AAAAAAAAAA4/ReTpSM6CwrY/s320/Resize+of+P6211849.JPG" border="0" alt="граффити" id="BLOGGER_PHOTO_ID_5215274226808118578" /&gt;&lt;/a&gt;

&lt;p&gt;Из современных форм искусства нам встретилось вот такое трафаретное граффити в стиле Fallout. Сложно сказать, что оно должно означать, но прикольно. Я всегда считал, что за трафаретным граффити будущее уличной живописи.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Z-sGuwkoyTw/SGBhn2ilScI/AAAAAAAAABo/VdkoDbf00xg/s1600-h/Resize+of+P6211949.JPG"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_Z-sGuwkoyTw/SGBhn2ilScI/AAAAAAAAABo/VdkoDbf00xg/s320/Resize+of+P6211949.JPG" border="0" alt="мотоцикл" id="BLOGGER_PHOTO_ID_5215275705778391490" /&gt;&lt;/a&gt;

&lt;p&gt;Омские байкеры настолько суровы, что способны ездить даже на таком странном звере. К сожалению застать его едущим нам не удалось.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SGBgR040euI/AAAAAAAAABA/P6fshLpluBE/s1600-h/Resize+of+P6211860.JPG"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SGBgR040euI/AAAAAAAAABA/P6fshLpluBE/s320/Resize+of+P6211860.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5215274227866041058" /&gt;&lt;/a&gt;

&lt;p&gt;Старый центр Омска похож на все прочие старые города Сибири. Те же трех-четырехэтажные здания не разваливающиеся на глазах только за счет многовекового слоя лепнины, штукатурки и краски. Те же узкие улочки. Что в Омске догадались сделать хорошо, так это отгородили тротуар с деревьями от проезжей части железной решеткой. И припарковаться на тротуаре не дает и народ где попало через улицу не бегает.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SGBgRx_42VI/AAAAAAAAABI/YyciSh5vhGk/s1600-h/Resize+of+P6211862.JPG"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SGBgRx_42VI/AAAAAAAAABI/YyciSh5vhGk/s320/Resize+of+P6211862.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5215274227090381138" /&gt;&lt;/a&gt;

&lt;p&gt;Первые этажи зданий, заняты магазинами, которые, иногда, вполне гармонично вписываются в окружающую лепнину и белую штукатурку.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-7978467501332875985?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/06/rupy.html</link><author>noreply@blogger.com (Miroff)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SGBgNVvyqTI/AAAAAAAAAAo/eIjWSbqP9J0/s72-c/Resize+of+P6211816.JPG" height="72" width="72" /><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-504772690106737487</guid><pubDate>Wed, 18 Jun 2008 04:32:00 +0000</pubDate><atom:updated>2008-12-09T15:02:54.579+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">travel</category><category domain="http://www.blogger.com/atom/ns#">Altai</category><title /><description>&lt;h2&gt;Just few&amp;nbsp;photos&lt;/h2&gt;
Вернулись со&amp;nbsp;сплава по&amp;nbsp;Средней Катуни. Выяснилось несколько забавных&amp;nbsp;вещей:
&lt;ul&gt;&lt;li&gt;Камера &lt;a href="http://www.olympus.com.ru/consumer/29_mju_770_sw.htm"&gt;&amp;micro; 770&amp;nbsp;SW&lt;/a&gt; + запасной аккумулятор + 2Гб флешка категорически рулят. Мочить камеру водой не&amp;nbsp;страшно, поэтому вдохновившись радостно наснимали 1.5Гб фотографий, из&amp;nbsp;которых, правда, половина&amp;nbsp;&amp;mdash; &lt;nobr&gt;чье-то&lt;/nobr&gt; весло или&amp;nbsp;каска.&lt;/li&gt;
&lt;li&gt;С&amp;nbsp;каждым годом количество крупных вещей уменьшается, а&amp;nbsp;мелких&amp;nbsp;&amp;mdash; растет приближаясь к&amp;nbsp;стандарту &amp;laquo;все необходимое можно распихать&amp;nbsp;по&amp;nbsp;карманам&amp;raquo;&lt;/li&gt;
&lt;li&gt;В&amp;nbsp;следующий раз в&amp;nbsp;качестве полезной вещи нужно брать термос с&amp;nbsp;горячим чаем. Правильно зафиксированный, он, скорее всего,&amp;nbsp;не&amp;nbsp;разобьется.&lt;/li&gt;
&lt;li&gt;Свой котелок и&amp;nbsp;горелку мы&amp;nbsp;совершенно напрасно не&amp;nbsp;взяли, понадеявшись на&amp;nbsp;общественный. В&amp;nbsp;результате, большую часть времени обходились без чая потому, как дождавщись когда он&amp;nbsp;согреется, уже никакого чая&amp;nbsp;не&amp;nbsp;хочется.&lt;/li&gt;
&lt;li&gt;После Алтая воняет даже&amp;nbsp;Академгородок:-(&lt;/li&gt;
&lt;/ul&gt;

Несколько пейзажей без сюжета:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SFiQwGKjRWI/AAAAAAAAAAQ/Q_NQEbtcrgI/s1600-h/P6131482.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SFiQwGKjRWI/AAAAAAAAAAQ/Q_NQEbtcrgI/s320/P6131482.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5213075724644336994" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Z-sGuwkoyTw/SFiQwbPY0uI/AAAAAAAAAAY/lZRm9BRgNqY/s1600-h/P6131486.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_Z-sGuwkoyTw/SFiQwbPY0uI/AAAAAAAAAAY/lZRm9BRgNqY/s320/P6131486.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5213075730301768418" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Z-sGuwkoyTw/SFiQwTkM8yI/AAAAAAAAAAg/ZlwY6MKBWIE/s1600-h/P6131533.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_Z-sGuwkoyTw/SFiQwTkM8yI/AAAAAAAAAAg/ZlwY6MKBWIE/s320/P6131533.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5213075728241586978" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-504772690106737487?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/06/just-few.html</link><author>noreply@blogger.com (Miroff)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Z-sGuwkoyTw/SFiQwGKjRWI/AAAAAAAAAAQ/Q_NQEbtcrgI/s72-c/P6131482.JPG" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-2776753865582406669</guid><pubDate>Wed, 11 Jun 2008 05:38:00 +0000</pubDate><atom:updated>2008-06-11T17:04:21.729+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">usability</category><category domain="http://www.blogger.com/atom/ns#">declarative interface</category><category domain="http://www.blogger.com/atom/ns#">software</category><title /><description>&lt;h2&gt;Declarative interface&lt;/h2&gt;

&lt;a href="http://gineer.livejournal.com/"&gt;Gineer&lt;/a&gt;, попросил меня описать, что я понимаю под декларативным интерфейсом. Признаться, идея пришла мне в голову &lt;a href="http://vitus-wagner.livejournal.com/285732.html?thread=9103908#t9103908"&gt;прямо здесь&lt;/a&gt;, но я попытаюсь оформить ее в разумную форму. 

Любой прибой, по сути своей является черным ящиком для пользователя. Разговаривая по телефону, можно ничего не знать о модуляции, СВЧ технике или принципах маршрутизации голосового траффика. Декларативным я называю интерфейс, построенный в терминах &lt;strong&gt;потребностей&lt;/strong&gt; пользователя, а не &lt;strong&gt;средств&lt;/strong&gt; их достижения. 

По идее, любой интерфейс любого прибора может быть декларативным, однако, на практике это не так. Например, мой телефон требует для установки будильника следующей последовательности команд: Меню &amp;gt; Развлечения &amp;gt; Будильники &amp;gt; Выбор одного из трех возможных &amp;gt; Включение &amp;gt; Установка времени &amp;gt; Установка режима "повторять ежедневно/по будням/никогда" &amp;gt; Выбор мелодии &amp;gt; Подтверждение. Это идиотский интерфейс, потому что он заставляет меня думать не об исходной потребности, а о деталях реализации. Мне нужно, чтобы телефон разбудил меня в указанное время. Все остальное лишь опции. Для чего мне знать, сколько у телефона будильников (готов спорить, их три, только для того, чтобы влезли на один экран в интерфейсе), которые из них включены и как именно он меня собирается будить. Декларативным будет примерно такой интерфейс: &lt;code&gt;&lt;i&gt;разбуди_меня&lt;/i&gt; вермя|интервал [периодичность] [способ]&lt;/code&gt;, где вермя может быть в любом формате от "в 1130" до "завтра в 8", а то и вовсе интервал: "через 2 часа". Конечно, это потребует продвинутого date/time picker, но изваять такой уже давно не проблема. Еще понадобятся две функции: &lt;code&gt;&lt;i&gt;покажи_список_будильников&lt;/i&gt;&lt;/code&gt; и &lt;code&gt;&lt;i&gt;отмени_будильник&lt;/i&gt; &amp;gt; выбор  будильника&lt;/code&gt; 

Может показаться, что приведенный синтаксис относится только к CLI, однако это не так. Аргументы команды вполне могут выбираться самостоятельным диалогом. В GUI команду можно представить в качестве мастера, опциональные параметры которого легко пропустить или установить в любом порядке.

Из идеи декларативного интерфейса есть одно интересное следствие, которое стоит обдумать. Если более строго описать синтаксис UNIX команд с учетом зависимостей, типов и связей параметров, возможно, удастся помирить GUI с CLI. Хотя бы посредством автогенерации интерфейсов.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-2776753865582406669?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/06/declarative-interface.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-2150312777537597033</guid><pubDate>Thu, 01 May 2008 02:28:00 +0000</pubDate><atom:updated>2010-03-01T17:07:38.402+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">management</category><category domain="http://www.blogger.com/atom/ns#">software_design</category><title /><description>&lt;h2&gt;What do you need to know&lt;/h2&gt;

&lt;p&gt;Как вести проектную документацию? Оставим в стороне ГОСТы, RUP, фантазии некомпетентных и прочую фигню и сосредоточимся на одном вопросе: "Какая документация вам нужна в проекте, рассчитанном на несколько лет?" Проекты в стиле "Сделал и забыл" (а это большая часть аутсорсинга) в документации не нуждаются и останутся за скобками. Итак, поехали:&lt;/p&gt;

&lt;p&gt;Первое, что нам нужно, это требования. У натуралистов есть такое правило: "Не записано ― не наблюдалось" Это именно то, чем стоит руководствоваться при работе с требованиями. Почему это важно? Да потому, что без требований "в бумаге" через три месяца вы не сможете отличить баг от реально затребованной кем-то фичи, через полгода у вас появятся "гуру" обладающие редким знанием о том, что именно и зачем вы делаете, через три года вы обзаведетесь прекрасными образцами устного фольклора, которые останутся единственным источником информации об истории проекта, а через пять лет, когда вы захотите все переписать с использованием современных технологий, вам придется нанять археолога.&lt;/p&gt; 

&lt;p&gt;Как именно работать с требованиями много говорили и без меня. Единственное, что стоит отметить: чем глубже проанализированы требования, тем легче. Требование "заказчик хочет зеленую кнопку" менее ценно чем "интерфейс должен, по возможности, соответствовать программе X с которой у пользователей есть опыт работы". В случае, если кнопку не удастся сделать зеленой, хотя бы понятно с какой стороны начинать переговоры по поиску компромисса.&lt;/p&gt;

&lt;p&gt;На втором месте высокоуровневая архитектура. Ее имеет смысл описывать потому, что из кода архитектурные концепты видны очень плохо. Это приводит к тому, что в реализации, а уж тем более в поддержке, хорошие идеи забываются, игнорируются и в конце концов теряются. В результате проект превращается в подобие &lt;a href="http://en.wikipedia.org/wiki/Tree_of_life_%28Kabbalah%29"&gt;дерева сефирот&lt;/a&gt;, в котором все связано со всем. Как документировать архитектуру хорошо известно. Единственный сложный момент здесь, в том, что однажды созданная, документация должна постоянно актуализироваться. Поэтому нужно заранее планировать активности по актуализации и верификации архитектурной документации.&lt;/p&gt;

&lt;p&gt;Третье, история принятия решений. Обычно этот момент выпадает из документации, что приводит к довольно печальным последствиям. Решение остается, а причины побудившие его принять постепенно забываются. В результате через несколько лет проект изобилует странными решениями, которые в свое время были приняты совершенно осознанно, но поддерживаются в актуальном состоянии только потому, что "здесь так принято". Поскольку от них нельзя отказаться не проанализировав все возможные последствия, эти решения тормозят развитие проекта.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-2150312777537597033?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/05/what-do-you-need-to-know-rup.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-996928752136566687</guid><pubDate>Thu, 24 Apr 2008 04:36:00 +0000</pubDate><atom:updated>2008-04-28T13:59:33.079+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">maps</category><category domain="http://www.blogger.com/atom/ns#">geoid</category><title /><description>&lt;h2&gt;Geoid&lt;/h2&gt;

&lt;blockquote&gt;
Земля имеет форму&amp;nbsp;шара,
Забавно видеть хуй&amp;nbsp;омара.
&lt;i&gt;Азбука&lt;/i&gt;&lt;/blockquote&gt;

А&amp;nbsp;вот хрен&amp;nbsp;&amp;mdash; возвопят просвещенные&amp;nbsp;&amp;mdash; не&amp;nbsp;шара,&amp;nbsp;а&amp;nbsp;&lt;i&gt;геоида&lt;/i&gt;. Эта феерическая глупость передается из&amp;nbsp;уст в&amp;nbsp;уста. Не&amp;nbsp;исключено, что она уже просочилась даже в&amp;nbsp;школьные учебники. По&amp;nbsp;крайней мере в&amp;nbsp;русскую википедию&amp;nbsp;просочилась:
&lt;blockquote&gt;Геоид- фигура, отражающая форму Земли, важное понятие&amp;nbsp;в&amp;nbsp;геодезии.&lt;/blockquote&gt;

Помилуйте, геоид не&amp;nbsp;имеет решительно никакого отношения к&amp;nbsp;форме Земли. Более того, изобретать просто так фигуру &amp;laquo;описывающую форму Земли&amp;raquo; бессмысленно. Однако, математики давно прослыли чудаками и&amp;nbsp;эта бессмысленность не&amp;nbsp;бросается обывателю в&amp;nbsp;глаза. Если вы&amp;nbsp;приглядитесь к&amp;nbsp;картинке, геоид довольно слабо напоминает форму&amp;nbsp;Земли.

&lt;img src="http://upload.wikimedia.org/wikipedia/commons/5/56/Geoids_sm.jpg" border="0"&gt;

Откуда&amp;nbsp;же он&amp;nbsp;взялся? На&amp;nbsp;самом деле геоид имеет вполне практическое применение. Как вы&amp;nbsp;все наверняка знаете, географические координаты (те&amp;nbsp;которые широта и&amp;nbsp;долгота) суть координаты сферические. Однако, поскольку земля не&amp;nbsp;сфера и&amp;nbsp;не&amp;nbsp;эллипс, возникает вопрос: относительно какой сферы задаются географические координаты? Математики давно предложили работающее решение: использовать мнимый эллипсоид вращения &lt;nobr&gt;как-то&lt;/nobr&gt; &lt;nobr&gt;худо-бедно&lt;/nobr&gt; совпадающий с&amp;nbsp;земной поверхностью. Для вычислений идеально, однако, стоя в&amp;nbsp;чистом поле довольно трудно этот эллипсоид обнаружить. Он&amp;nbsp;же математическая&amp;nbsp;абстракция.

Мудрые математики и&amp;nbsp;тут не&amp;nbsp;сплошали. Они расположили эллипсоид так, чтобы короткая ось его совпадала с&amp;nbsp;осью вращения земли, в&amp;nbsp;центр его совпадал с&amp;nbsp;центром масс Земли или был смещен относительно него на&amp;nbsp;&lt;nobr&gt;какое-то&lt;/nobr&gt; расстояние. Из&amp;nbsp;физики мы&amp;nbsp;знаем, что ось вращения проходит через центр масс. Осталась малость, вычислить его положение относительно поверхности. Для это была проведена&amp;nbsp;&lt;a href="http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D0%B2%D0%B8%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%8F_%28%D0%B3%D0%B5%D0%BE%D0%B4%D0%B5%D0%B7%D0%B8%D1%8F%29"&gt;гравиразведка&lt;/a&gt; все поверхности земли и&amp;nbsp;построен геоид&amp;nbsp;&amp;mdash; фигура на&amp;nbsp;поверхности которой сила тяжести постоянна и&amp;nbsp;совпадает со&amp;nbsp;средней силой тяжести на&amp;nbsp;поверхности моря. Этого достаточно чтобы определить центр масс геоида, который совпадает с&amp;nbsp;центром масс Земли. Зная, где находится центр масс, мы&amp;nbsp;можем поместить в&amp;nbsp;центр земли эллипсоид (умозрительно, конечно) и&amp;nbsp;использовать его для определения&amp;nbsp;координат.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-996928752136566687?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/04/geoid.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-36430695.post-3967056712891147737</guid><pubDate>Thu, 10 Apr 2008 04:15:00 +0000</pubDate><atom:updated>2008-04-17T13:28:14.448+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">management</category><title /><description>&lt;h2&gt;&lt;nobr&gt;Half-life&lt;/nobr&gt;&lt;/h2&gt;
Период полураспада для большинства нововведений составляет две недели. Вне зависимости от&amp;nbsp;того в&amp;nbsp;чем состоит идея: вести документацию в&amp;nbsp;wiki или штрафовать за&amp;nbsp;неположенное распитие пива. Каждый может припомнить несколько довольно хороших (или ужасных) идей, которые &amp;laquo;не&amp;nbsp;пошли&amp;raquo;. 

Связано&amp;nbsp;ли это с&amp;nbsp;тем, что идеи плохие? Нет, распадаются и&amp;nbsp;вполне хорошие начинания. Со&amp;nbsp;стороны видно, что внедрить &lt;nobr&gt;что-то&lt;/nobr&gt; сложнее чем кажется. Любая система обладает некоторым запасом инерции и&amp;nbsp;социальные системы не&amp;nbsp;исключение. После того как программистам наказали указывать номер бага при коммите обязательно придется некоторое время следить чтобы это правило выполнялось. И&amp;nbsp;лишь через &lt;nobr&gt;какое-то&lt;/nobr&gt; время оно перейдет в&amp;nbsp;разряд &amp;laquo;здесь так принято&amp;raquo;. Никогда, ни&amp;nbsp;одно правило не&amp;nbsp;будет выполняться только потому, что оно есть. Время принятия зависит от&amp;nbsp;того, насколько нововведение выгодно конкретным исполнителям. Дневные отчеты могут быть офигенно полезными для проекта и&amp;nbsp;для компании в&amp;nbsp;целом, но&amp;nbsp;если программисты не&amp;nbsp;видят в&amp;nbsp;них смысла, они будут забрасываться при каждом удобном случае. В&amp;nbsp;идеальном случае, когда все без исключения исполнители понимают, какую пользу им&amp;nbsp;принесет нововведение, они способны сами его внедрить. На&amp;nbsp;практике это случается довольно&amp;nbsp;редко.

Итак, несколько практических&amp;nbsp;рекомендаций:
&lt;ul&gt; &lt;li&gt;Продумывая любое изменение обязательно оцените ресурсы потребные на&amp;nbsp;его&amp;nbsp;внедрение;&lt;/li&gt; &lt;li&gt;Назначьте ответственных&amp;nbsp;за&amp;nbsp;внедрение;&lt;/li&gt; &lt;li&gt;Донесите до&amp;nbsp;исполнителей выгоды, которые им&amp;nbsp;сулит&amp;nbsp;нововведение;&lt;/li&gt; &lt;li&gt;Если нововведение не&amp;nbsp;сулит ничего хорошего исполнителям, обеспечьте им&amp;nbsp;выгоду&amp;nbsp;искусственно;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36430695-3967056712891147737?l=miroff.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://miroff.blogspot.com/2008/04/half-life.html</link><author>noreply@blogger.com (Miroff)</author><thr:total>0</thr:total></item></channel></rss>

