Sunday 8 November 2009

boolean - боремся за Java память...

У Вас когда-либо случались такие ситуации, когда Ваше Java приложение трещит по швам? В моём случае это случилось из-за нехватки доступной оперативной памяти. И, естественно, обнаружилась нехватка в самый неподходящий момент: на носу очередной долгожданный релиз, один из серверов остановлен для обновления кода и данных и реинкарнация старого кода уже невозможна, в ближайшие дни запланировано несколько совещаний и собеседований, что сильно отвлекает от процесса оптимизации - в общем, ЧП не прошло незамеченным. 

К слову сказать, сделай я правильный backup и экстренные работы по восстановлению жизнеспособности прошли бы гораздо более спокойно, но это была бы уже совсем другая история. Итак в моём распоряжении есть код, которому не хватает 15Gb оперативной памяти для нормального функционирования и очень длительный и дорогостоящий процесс запуска (около 5 часов), в ходе работы которого можно только сидеть со скрещенными пальцами и надеятся, что в этот раз заветные слова OutOfMemoryError не появятся в консоли удалённого сервера. 

Не буду описывать всех ухищрений, которые пришлось проделать, чтобы восстановить остановленный сервер в течении трёх дней, но одним своим мини открытием поделюсь - boolean - это не тот тип данных, который Вы хотите использовать в высоконагруженных системах. Внимание вопрос: 

Как Вы думаете, сколько памяти занимает boolean например на Ubuntu server x64? 

Правильным ответом будет: неизвестно и зависит только от реализации JVM. 

Рассмотрим распространённую Sun JVM и прочтем в спецификации виртуальной машины, что boolean типа в ней нет как такового, вместо него используется int! А это означает, что для хранения значения типа "да\нет" используется ровно 32 бита, независимо от архитектуры процессора. Правда в том же разделе мы видим, что произведена оптимизация для работы с массивами boolean, которые преобразуются в массив байт, что даёт прирост доступной памяти в 4 раза. И всё же платить за хранение нолика или еденички семью лишними битами - иногда просто кощунство и издевательство над серверами (особенно при размерах массивов в 500 миллионов элементов). 

Спасением в таких случаях будет класс BitSet, который ведёт себя подобно массиву boolean, но упаковывает данные так, что для одного бита выделяется всего один бит памяти (с небольшими издержками для всего массива). BitSet хранит внутри себя массив типа long, а при запросе или установке значения определенного бита - высчитывает индекс нужного long и пользуясь побитовыми операциями и операциями сдвига производит вычисления над единственным битом. 

Существует еще более интересная реализация BitSet, OpenBitSet - Apache реализация, которая используется для Lucene. Она гораздо быстрее, но упускает некоторые проверки, проводимые в оригинальном BitSet. Что использовать - решать Вам.

archive

Friday 23 October 2009

Рефлексы

А Вы тоже держите свободную от разговора по мобильному руку в кармане джинс?

archive

Friday 9 October 2009

JMeter. Automated testing.

Тестирование. Я думаю, у многих это слово не вызывает приятных эмоций. Для разработчика это драгоценное время, потраченное на "ненужное" написание функциональных тестов, для тестера это проверка функциональности в кратчайшие сроки, для менеджера страх за приложение, который после беглого взгляда идёт в релиз.
Почему так происходит? Рассмотрим простейшую ситуацию, которая не редко проиходит на просторах отечественного девелопмента. Предположим, разработку оценили в 5 дней, еще 3 дня запланировали на тестирование и день на сам релиз и подготовку окружения. Разработка опаздывает на день-полтора и, конечно же, сроки не сдвигаются, а страдает фаза тестирования. Причем каждая из трех сторон бермудского треугольника "разработчик-ПМ-тестировщик" давит на другую и каждая чем-то не довольна.

С
егодня я не хочу разбирать причины или правильные действия в таких ситуациях, я хочу показать преимущества автоматического тестирования и, в качестве примера, описать JMeter. Аналогов у данной программы множество, но к основным плюсам я могу отнести открытый код и как следствие лёгкую расширяемость под собственные нужды в случае необходимости, возможность распределенного тестирования, понятная документация, стабильность и множество полезных out-of-the-box компонент. К числу минусов я пожалуй отнесу квалификацию человека, пишущего тесты - дело в том, что более ли менее серьезные тесты должен писать человек, хоть немного программирующий и хотя бы поверхностно знакомый с XPath или RegExp.

Итак, автоматические тесты позволяют потратить Вам на тестирование меньшее количество времени при единожды написанных тестах под конкретную функциональность. Что можно создавать с помощью JMeter?
- интеграционные тесты. Функциональные тесты показывают Вам как работает каждая из компонент системы/приложения, но изменяя компонент, часто изменяют и тесты под него, не выясняя как это отразится на двух десятках приложений использующих компонент. Здесь на выручку приходят интеграционные тесты. Основным полезным инструментом JMeter здесь являются JMeter Assertions.
- нагрузочные тесты. Сколько активных пользователей могут одновременно работать при конвертации ста загружаемых изображений на серверной стороне? А при 10 000 изображений? А если быть более точным, то вопрос состоит в обнаружении кол-ва пользователей, которым данные отдаются с задержкой не более секунды, например. Здесь полезны JMeter Controllers, JMeter Timers для эмулирования пользовательских действий.
- стресс тесты. Данная группа тестов призвана обнаружить тот предел, при котором приложение не способно обслуживать запросы, выяснить поведение системы при предельных нагрузках и зарегистрировать возможные потери данных/уязвимости при наступлении критических ситуаций. Здесь поможет распределенное тестирование и всё что уже упоминалось ранее.

В данной статье я хочу остановиться на разного рода HTTP тестировании и некоторых нюансах, хотя ничто не мешает Вам использовать предоставляемую JMeter'ом возможность тестировать FTP, WebServices, DB, LDAP, JMS, Mail.

JMeter представляет собой приложение на Java, которое прекрасно запускается под любыми операционными системами (проверено собственноручно), как в GUI, так и в консольном режиме (что позволяет сделать выбор между визуализацией и производительностью). Ознакомиться с основными компонентами можно в отличной документации или просто запустив приложение и ознакомившись с контекстным меню. Как видно после первого запуска, в приложении есть 2 основных рабочих пространства:
- Test Plan - используется для создания собственно теста, как и следует из названия. Все основные операции проводяться здесь.
- WorkBench - используется для хранения временных компонент теста и некоторых важных не тестирующих компонент. Основное свойство - не сохраняется вместе с сохранением теста.

Варианты создания теста:
1. Создать тест вручную в пространстве Test Plan, пользуясь контекстным меню и примерами из документации.

2. JMeter прекрасно работает как Proxy и умеет записывать все выполняемые Вами запросы. Для такого способа создания теста Вам понадобиться добавить в WorkBench-> Add-> Non-test elements-> HTTP Proxy Server. Из настроек следует указать как минимум:
* Port. Это порт, который будет слушать JMeter. Я обычно ставлю 9090.
* Target Controller. Создайте новый Thread Group в Вашем Test Plan и выберите его в выпадающем списке Target Controller. Именно в эту группу будут записаны все запросы, прошедшие через прокси.
* URL patterns to Include/Exclude. Данный пункт позволит Вам указать c помощью RegExp, какие именно запросы, прошедшие через прокси, нужно сохранить в тест план. Советую для экспериментов попробовать сначала не заполнять данный пункт, а затем отфильтровать только ".*html" к примеру, чтобы почувствовать разницу.
Не забывайте перенаправить свой браузер на вновь созданный прокси (я, например, пользуюсь FoxyProxy для быстрого переключения режимов прокси в браузере) и стартовать/останавливать JMeter HTTP Proxy Server.

3. Создание теста программно. Дело в том, что Test Plan сохраняется в XML, который не сложно создать программно, если есть такая потребность.


О JMeter помимо документации:
- Помимо расширяемых модулей, поддерживает 2 скриптовых языка JavaScript и BeanShell. BeanShell - это полноценная скриптовая Java.
- Поддерживает Cookies, что позволяет авторизировать/регистрировать пользователей прямо в тесте.
- Практически в любом поле JMeter можно ввести переменную вместо значения. Вообще работа с переменными достаточно гибкая и удобная.
- Пользуясь PostProcessor'ами можно вычленять из ответа сервера информацию и сохранять её в переменных для последующих запросов.
- Есть помошь по функциям Main menu-> Options-> Function Helper Dialog
- В HTTP Sampler есть галочка "Retrieve all embedded resources from HTML files", которая бывает полезной для эмулирования полноценных пользовательских действий.

Горячие клавиши и неявные настройки.
- Если Ваш JMeter стартует за прокси сервером и ему нужен доступ наружу, Вам помогут ключи при старте -H <host> -P <port> -u <user> -a <password> -N <non-proxy-hosts>
- При включенном GUI и графических слушателях JMeter использует достаточно много ресурсов компьютера - для нагрузочного и стресс тестов используйте non-GUI опции запуска
- Распределённое тестирование управляется одним инстансом JMeter, который может распространить нужный тест, собрать результаты со всех нод, и производить некоторое управление распределённых нод.
- Ctrl+R - запустить тест
- Ctrl+. - остановить тест
- Ctrl+E - очистить результаты

archive

Monday 5 October 2009

CloudMade in action

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

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

CloudMade - компания, которая сумела запустить сразу несколько интересных проектов на базе OSM данных и при этом внести ощутимую лепту в развитие картографического сообщества.
- Поскольку это одна из ранних компаний использующих OpenStreetMap, она успела накопить и сформировать достаточно большое количество всевозможных фильтров данных (напомню, что OSM построена по принципу Wiki, а потому там иногда появляются дороги по экватору, подводные магистрали и т.п. вещи, которые Вы не увидите в продуктах CloudMade). Более того, все преобразованные данные доступны для публичного доступа.
- Разработаны всевозможные библиотеки для создания условий комфортного внедрения разработчиками карт от CloudMade.
- CloudMade занимается организацией Mapping parties, впрочем как и многие другие, но на мой субъективный взгляд гораздо более активно. А многие активисты CloudMade создают локальные комьюнити.
- Доступны карты как таковые, с большим спектром возможностей: построение маршрутов, геокодирование, векторными SVG картами, прекрасным редактором стилей, возможностью выгрузки построенного маршрута в GPX (формат, понятный для GPS устройств), равно как и загрузка карт на GPS устройства.
- В процессе финальных тестирований редактор OSM карт, который позволит пользователям более интуитивно справляться с задачей маппинга и автоматизировать некоторые трудоёмкие процессы.
- И многие другие приятные мелочи по ошибке или по другим причинам не включенные в данный обзор.

Будут вопросы - обращайтесь, расскажем что к чему.

archive

Saturday 26 September 2009

Мнимая единица

"Доверяй, но проверяй" гласит народная мудрость и с ней нельзя не согласится. После прочтения задачки про прямоугольные треугольники решил вспомнить своё творение. Собственно о собственном авторстве я возможно преувеличил - раньше много занимался математикой, может где и подсмотрел, но многие слышали эту задачку от меня впервые, так что предложу её на суд более широкой общественности. 

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

Итак, более формально:
Определение: Мнимой единицей называется корень квадратный из минус единицы и обозначается следующим образом

Собственно загвоздка, которую способен обнаружить любой школьник:  
Пояснения: 
1. Первое равенство пришло из определения. 
2. Второе образовалось из понимания того, что любое (подчеркиваю: любое) число разделенное на единицу равно само себе. 
3. Далее имеем полное право умножить числитель и знаменатель на одно и то же число, отличное от нуля, в данном случае это число -1. При этом получаем в числителе единицу, а в знаменателе -1. 
4. Корень из дроби равен корню из числителя поделенному на корень из знаменателя. 
5. Корень из единицы есть не что иное, как сама единица. 
6. Из определения можем смело заменить корень из -1 на i

Итого:  

7. Домножим обе части равенства на i (на вполне законных основаниях, поскольку коэффициент домножения отличен от нуля):  
8. Однако исходя из определения (а точнее нашего определения возведённого в квадрат) следует, что:  

Результат:  

Собственно вопрос: Какое из утверждений/преобразований не верно?

archive

Wednesday 2 September 2009

FreeMarker SimpleHash problem

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

Подробнее о FreeMarker можно узнать по приведенной ссылке, а я сегодня хотел остановиться на некоторой особенности данной библиотеки. Работа с фримаркером начинается с настройки конфигурации, подготовки модели данных и собственно шаблона. Фримаркер - это инструмент отображения вашей модели, потому каждый объект модели оборачивается в специальный класс-обёртку, который не позволяет изменять модель данных из шаблона, а также закрывает доступ к небезопасным методам, которые могут кардинально изменить ход исполнения вашего приложения. Обёртками управляет инстанс ObjectWrapper класса.
Собственно проблема: java.util.Map оборачивается в обёртку, которая оперирует ТОЛЬКО ключами типа String. И если вдруг в Вашей модели попадается что-то вроде java.util.Map<Integer, SomeObject> - ну что ж Вам не повезло... Из данной ситуации есть выход - сменить ObjectWrapper (в поставке от FreeMarker их два) , либо написать свою реализацию, что немного затратно и неудобно. Смена фабрики обёрток ни к чему хорошему не приводит - появляются другие проблемы. Для знакомых с синтаксисом фримаркера:

<#list map?keys as key>
${key}=${map[key]}
<#list>

Начинает возвращать не только ключи мапы, а и названия методов, что очень не удобно для итерирования и естественно выдаёт исключение в ${map[key]}

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


this.configuration = new Configuration(); this.configuration.setDefaultEncoding("UTF-8");
this.configuration.setURLEscapingCharset("UTF-8"); this.configuration.setBooleanFormat("true,false");
this.configuration.setDateFormat( DateFormatUtils.ISO_DATETIME_FORMAT.getPattern() );
this.configuration.setWhitespaceStripping(true);
this.configuration.setLocalizedLookup(true);
this.configuration.setClassForTemplateLoading(this.getClass(), "/your/package/here");

if ( null != autoincludes )
this.configuration.setAutoIncludes(autoincludes);

BeansWrapper objectWrapper = BeansWrapper.getDefaultInstance();
objectWrapper.setStrict(true);
objectWrapper.setExposeFields(true);
objectWrapper.setSimpleMapWrapper(true);
this.configuration.setObjectWrapper(objectWrapper);


Собственно основное внимание должно быть уделено использованию BeansWrapper и objectWrapper.setSimpleMapWrapper(true);
После этого итерирование по мапе с ключами в виде чисел сводиться к немного изменённому синтаксису (обратите внимание на использование круглых скобок вместо квадратных):

<#list map?keys as key>
${key}=${map(key)}
<#list>

archive

Monday 31 August 2009

Crash functionality

Помните загадку: "У Буратино было 5 яблок. Три яблока он отдал Мальвине. Сколько яблок у Мальвины?", ответом на которую было совсем не три, а моралью: "Инициализируйте переменные господа"?
Сегодня столкнулся с кодом, который инициализировал некоторое целочисленное количество числом 2, а затем уже производились необходимые подсчеты. Надо ли говорить, что не из чистого любопытства я попал на данный участок кода, а из-за плавающей ошибки, которая изредка, но проявлялась. Оказалось всё просто - перед инициализацией нужно вникать в логику действий.
На данном простом примере, я хотел бы показать, что людям свойственно/проще не думать, а выполнять свои обязанности механически. И вправду, зачем вникать в логику вещей, если видно же, что в сумме не хватает еденички? Добавим недостающее при инициализации и забудем о сделанном навсегда. А то, к чему это может привести - это уже забота кого-то другого.

archive

Wednesday 29 July 2009

"Curriculum Vitae" в полный рост

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

Именование

Называйте файл так, чтобы он не затерялся в папке "Мои документы" девушки из отдела кадров. Представте сколько CV_eng.doc насобирается у неё за пару лет работы, если даже у меня за последние 2 недели таких файлов появилось 6 штук. Не ленитесь писать длинное название файла и запомните: латиница в названии - хороший тон.
Что-то вроде CV_PopovAnton_java_2003_06_25.eng.rtf вполне подойдёт.

Содержимое

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

Язык резюме

Практически все направления IT на данный момент хоть как-то связаны с иностранцами - аутсорсинг в нашей стране процветает. Пишите резюме на таком английском, который прочтёт не только Ваш сосед по парте, а и Anders из Скандинавии. Старайтесь опускать местоимение I в тексте резюме - зачастую его можно просто выкинуть.
Уже не помню где, но когда-то прочёл дельный совет про шрифт: "Times New Roman хорошо смотриться на бумаге, Verdana - отличный выбор для монитора, поэтому пишите всё в Arial" (с) непомню.

Благодарный читатель

Всегда думайте о том, кто будет читать Ваше резюме! Только от него/неё и вашей фантазии зависит структура документа. Поверьте мне за весь мой опыт работы с резюме, я, как технический специалист, читал резюме либо за 10 минут до начала собеседования, либо вообще на самом собеседовании. Редко эта практика нарушается. Основным же читателем будет HR.
Что интересно HR? Skill Matrix, из которой он(а) повыбирает требующиеся для вакансии умные слова и проверит насколько Ваше резюме соответствует вакансии. Облегчите жинь HR - напишите сколько времени Вы работали с самыми основными технологиями . В Skill Matrix не стоит сильно расплёскиваться, но и недооценивать её значение тоже не стоит.
Что интересно техническому специалисту? Карьерный рост, глубина знаний технологий, адекватность, умение работать в команде, самостоятельность в принятии решений и т.д. Попробуйте предоставить информацию хотя бы о части из перечисленного: импровизируйте, анализируйте и предоставте информацию в удобном виде. Поверьте, иногда по резюме сразу видно, что человек способен к тому или иному просто по тому, как он представил данные о себе.

Опыт работы

Каждая из записей о работе должна отвечать на несколько вопросов: Период работы? Что за компания? Размер команды? Описание проекта? Используемые технологии? Ваша позиция? Ваши полномочия и зоны ответственности?
Не бойтесь разбить 2-3 года работы на одном проекте на 2-3 записи о работе, чтобы показать рост, смещение акцентов и ваши интересы.

Overall

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

Удачи Вам в поиске работ!

Update: Нашел! Совет про шрифт взят отсюда. Да и как оказалось, всё моё видение хорошего резюме на 90% совпадает с приведенной ссылкой.

archive

Tuesday 21 July 2009

Google Code Jam 2009

Google Code Jam - это соревнование, которое позволяет попробовать свои силы в решении разнообразных задач в ограниченном временном пространстве. Естественно речь идет об IT задачах.
Конкурс обычно организовывается очень качественно, язык программирования - любой на ваш вкус. Оценивание идет по правильности прохождения шаблонных тестов: скачиваете тест - пошел отсчет времени; с помощью написанной Вами программы, генерируете результат и посылаете на сайт вместе с исходниками (в виде zip например); в лучшем случае сразу (зависит от типа скачанного теста), в худшем по окончании раунда узнаете правильность Вашего решения.
Соревнование обычно проходит в несколько раундов: Квалификация, On-Line Отборочные раунды, Onsite отборочные и World Final.

Всем советую попробовать свои силы! Для доп. информации можно посмотреть Google Code Jam 2008:
- FAQ 2008
- Rules 2008
- Tasks 2008 (справа список раундов 2008 года)

archive

Monday 20 July 2009

Open Street Map

Когда-то все мы с вами пользовались толстыми словарями, вместо доступных сейчас on-line изданий. Я помню как лично вычитывал витиеватые описания слов в четырёхтомнике Даля. На данный же момент Wikipedia уже давно получила пальму первенства среди подобных источников.
Wikipedia несомненно стала идейным прорывом, но есть в ней и большая доля авантюры. С одной стороны, создать такое кол-во статей не под силу одному человеку, а сообща это делается быстро. С другой же стороны, никто и никогда не может гарантировать качество статей. Качество определяет многое - я думаю многие из вас знают хотя бы парочку ресурсов (блогов/форумов), которые почили в безвестности из-за резкого падения качества (да что далеко ходить - посмотрите хотя бы на Рамблер, не в обиду ему будет сказано). А Wikipedia жива и процветает - феномен, я бы сказал.
Не так давно я познакомился с аналогичной попыткой произвести на свет нечто феноменальное - своего рода Wikipedia в области карт. OpenStreetMap(OSM) - это векторные карты, которые создаются сообществом, которое насчитывает более 100 000 человек по всему миру. Каждый и любой может зайти в редактор (либо на самом сайте,либо сторонний, например JOSM) и отредактировать любой кусочек карты. Удивительное в том, что OSM карты на сегодняшний день для государств Великобритании, Голландии и Германии (этот список можно продолжать) гораздо более точны, нежели любая другая карта.
Вы справедливо спросите, а зачем нужны OSM карты? Неужели не хватает карт Google/Yahoo/Yandex/Microsoft? Не хватает. Причин много: лицензия (Никто ведь не читает лицензию, с которой соглашается, когда получает MapAPI key from Google), скорость обновления карт (для OSM появление односторонней улицы в крупном городе Германии отражается на картах в течении недели), предоставляемые сервисы (о них в следующем посте) и т.д.

archive

Friday 17 July 2009

Contraction hierarсhies

Работа с графами достаточно часто встречается при разработке IT задач. Естественно есть список классических задач для которых существуют решения, продуманные и проверенные многими поколениями программ. А проблемы наступают, когда ограничения в мощностях начинают поджимать или объемы обрабатываемых данных зашкаливают за общепринятые нормы.
Для таких случаев приходиться искать обходные пути - далеко не всегда удачные и оптимальные. Вот и в моём случае XML с описанием графа, в запакованном виде (bz2) занимает порядка 7Gb, что не может не радовать. Найти расстояние между двумя точками этого графа, с учётом его нагруженности, стандартным алгоритмом Дейкстры (метод взрыва/растекания) является задачей, которая проваливает все ожидания спецификации и клиентов.
Выход нашелся совершенно неожиданно и в этот раз обеспечил такой задел, что даже неоптимальный код уровнем выше не может повлиять на состояние дел. Contraction hierarchies - экспериментальный алгоритм, разработанный кафедрой немецкого университета, который позволяет осуществлять поиск оптимального маршрута за сотни микросекунд(!) на графе, подобном описанному.
Алгоритм уже привлек внимание общественности, а программа, написанная студентом в чисто академических целях, как приложение к магистерской работе по данной тематике используется в Production системах более чем успешно. Более того, надо отдать должное человеку, не побоявшемуся взять неизвестный экспериментальный код за основу серьезного сервиса - это позволило сервису конкурировать на самых ранних этапах своего развития.

P.S. Учитесь учится, господа...

archive

Wednesday 15 July 2009

Old School Workshop

Есть слова, которые отражают суть настолько хорошо, что переводить их можно либо слишком сложно, либо очень нелепо.

А как бы Вы перевели термин "Workshop"?

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

Поскольку данное действо было уже вторым за последний месяц-два на ум приходит аналогия со Startup Crash Test и само собой всплывает название "Old School Workshop". Надеюсь он будет продолжать радовать регулярностью, как и SCT.

archive

Tuesday 14 July 2009

Overall mockup

Блог будет скорее всего связан с моими техническими буднями, потому начнем в этом ключе.

Кому не приходилось проэктировать интерфейсы тот никогда не узнает насколько это трудоёмкий и затратный по времени процесс. Про usability в интерфейсах я вообще молчу. Когда-то давно один строгий преподаватель пытался навязать студентам свои правила построения интерфейсов - из-за отвращения к ним я и освоил эту науку.

А буквально сегодня пришлось снова столкнуться с интерфейсами и помошником в этом деле стало прикольное приложение для построения Mockups. Дорогое, но судя по trial оно того стоит. Как пример могу привести двухминутный мокап, который мне сегодня прислали:

archive

Monday 13 July 2009

Поехали!

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

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

Хорошей всем рабочей недели.

archive