воскресенье, 18 ноября 2012 г.

О книге Кириевски "Рефакторинг с использованием шаблонов"

Продолжая историю с шаблонами у меня наконец дошли руки до давно мною купленной книги "Рефакторинг с использованием шаблонов" Джошуя Кериевски.

Книга очень сильна по своей структуре напоминает книгу Фаулера о рефакторинге - те же перечисление различных рефакторингов вместе с правилами их применения и примерами. Все примеры, кстати, на java.

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

Из плюсов отметил бы не плохие примеры использования TDD при разработки, сами примеры взяты из реальной практики и книга не затянута. Так же книга содержит вполне умеренные дозы UML. Из недостатков: раздела "механика" зачастую тривиальны и просто занимают кучу места не неся какой-то реальной пользы (впрочем тогда их можно просто пропускать).

В общем отличная книга - после Фаулера и Гаммы с Ко обязательна к прочтению.

воскресенье, 11 ноября 2012 г.

Опять double

Недавно занимался проблемой кластеризации наборов объектов из нескольких разных источников. После написания первой версии алгоритма решил проверить алгоритмы на вшивость класторизовав данные от одного источника с самими собой. Понятно, что я рассчитывал 100% совпадение всех объектов и какого же было мое удивление когда из ~250 тысяч объектов не класторизованными оказались примерно 7 тысяч объектов. Чудеса. Принялся копать и искать волшебника.

Изучение логов прояснило ситуацию.

Одним из факторов при кластеризации является дистанция между объектами, вычисленная на основе долготы и широты. Код для этого дела широко распространен в интернете и выглядит примерно так:
   static private double distance(double lat1, double lon1, double lat2, double lon2) {
        double theta = lon1 - lon2;
        double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
        dist = Math.acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60 * 1.1515 * 1.609344;
        return dist;
    }
Расстояние возвращается в километрах. Функция работает вполне себе нормально в большинстве случаев. Но логи подсказали написать вот такой волшебный тест:
@Test
public void testEqualDistance2() throws Exception {
        SomeObject object1 = new SomeObject();
        SomeObject object2 = new SomeObject();

        double lat = 51.4902008376945;
        double lon = 4.28921666956459;
        object1.setLatitude(lat);
        object1.setLongitude(lon);

        object2.setLatitude(lat);
        object2.setLongitude(lon);

        System.out.println("Distance between " + object1 + " and " + object2 + ": " + object1.distance(object2) + " reverse=" +
                object2.distance(object1));

        assertEquals(object2.distance(object1), 0.0, 0.00000001);
}

И о чудо - тест проваливается - и отладчик показывает что расстояние между object1 и object2 равно NaN. Приплыли. Проход в дебаггере показал, что брался арккосинус от значения едва больше единицы (что-то в вроде 1.00000000002) что оказалось фатальным. Добавление

 
dist = Math.min(dist, 1);
перед 4 строкой спасло отца русской демократии и чудеса закончились.

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

воскресенье, 30 сентября 2012 г.

На кухне крутых кодеров

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

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

Вообще очень сильный уклон в сторону довольно возрастных программистов из молодых выделяется разве что Брэд Фицпатрик, создатель livejournal. Вообще читая его интервью (ему тогда было 28 лет) увидел как много у таких успешных программистов зависит от таких вещей как программирование в школе, отношения родителей к компьютерам, встреча с правильными людьми, правильный университет и т.п. Кажется что в этом месте очень многое было мной упущено (как впрочем и у очень многих детей из бывшего СССР), но тут уже ничего не поделаешь, остается только пытаться все догнать уже сейчас.

Как наконец выучить все эти паттерны

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

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

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

О двухтомнике Core Java


Недавно производственная необходимость и просто любопытство подтолкнуло меня к написания продакшен систем на Java. Знакомство с этим новым для меня языком я решил начать с довольно известного в узких кругах двухтомника Core Java от Кея Хорстманна и Гари Корнелла.

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

Первый том содержит описание языка и самый основы работы с библиотеками, а второй том содержит описание остальных частей библиотеки и различные тонкие моменты работы с языком (например, такие как безопасность).

Полезно было почти все, разве что работа с UI пока мне абсолютно не нужно и солидную часть его описание во втором томе я просто пропустил.

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

В общем надо быстро освоить Java если ты хорошо знаком с С++ - Core Java совсем неплохой выбор.

вторник, 4 сентября 2012 г.

Развращенные Iдеей

У нас много и со вкусом пишут на IntelliJ Idea да и на прочих продуктах jetbrains (типа WebStorm, PyCharm и т.п.), благо лицензия позволяет.
С недавнего времени и я вступил в клуб активных пользователей данных продуктов  - ну прежде всего идеи, но и PyCharm с AppCode уже успел пощупать.
Да продукт крутой, спору нет. Его магия по предсказанию того что ты хочешь сказать иногда просто завораживает и кажется что так просто не может быть - и иногда проскакивает мыслишка: "а как он вообще смог догадаться!?".
Но, совершенно случайно, знакомясь с новым для меня языком программирования и задавая всякие наивные вопросы более опытным по этим делам коллегам, я выяснил, что же, черт побери, это интеллектуальная идея творит?!
Невинный вопрос: если передать String в функцию и там ее поменять, то вызвавший код увидит изменения - т.е. значения передаются по значению или по ссылке? Ответ: эээ, мы так не делаем - не в курсе.. Вопрос решился после написания коротенького теста.
Дальше: Как правильно, то писать параметры шаблона функции
Pair<A, T>.of или может Pair.of<A, T> или все-таки так Pair.<A, T>of?! Ответ: хм, не знаю - идея говорит, что это тут лишнее - значения и так выведутся из параметров функции. Но все таки, как правильно то писать? Хм, ну давай попробуем вставить во все возможные места и поймаем момент когда идея перестанет подсвечивать красным. WTF?!
А может не стоит начинать сразу с идеи?! Возьмите старый добрый mcedit или может даже vi - просто ручками попишите старый добрый жава код. Ручками откомпилируйте его и протестирует. Уверен тогда будут приобретены сокровища неведомых знаний. И уж в конце, когда все станет совсем ясно и понятно можно запустить идею что бы писать код на пару порядков быстрее. Именно в таком порядке надо учиться и именно так правильно.

воскресенье, 5 августа 2012 г.

Тайм менеджмент и "Правила Джобса" от Кармина Галло

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

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

Через некоторое время мне в руки попалась книга "Правила Джобса" Кармина Галло.
Сама по себе книга на троечку - очень много воды и сомнительных примеров. Книга разделена на 7 частей исходя из 7 принципов которые, как бы, были взяты у Стива Джобса:

1. Делайте то, что любите.
2. Оставьте след во вселенной.
3. Встряхните ваше сознание.
4. Продавайте мечты, а не продукты.
5. Скажите "нет" тысяче вещей.
6. Создайте безумно великий опыт.
7. Овладейте посланием.

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

суббота, 5 мая 2012 г.

Отличная книга по майнингу

Недавно закончил читать первое издание Web Data Mining от Bing Liu и спешу поделиться впечатлениями.

Если вкратце, то книга отличная как введение в область дата майнинга. В ней отлично гармонируют (почти во всех главах) как теоретическая состовляющая так и практическая.

Теперь поподробнее. В книге освещены следующие темы:

- ассоциативные правила (очень хорошо описано, особенно априорный алгоритм)
- машинное обучение (с учителем, без и половинчатая) - все алгоритмы описаны достаточно подробно
- основные части поиска (достаточно беглый обзор): ранжирование, сбор, анализ линков и пользовательских кликов
- извлечение структуритрованной информации из дикого веба (в частности wrapper induction, multiple alignment)
- извлечение мнения из текста (естественно английского)

Все алгоритмы приведены на удобном псевдоязыке так что нет необходимости знать какой-то определенный ЯП. Английский язык простой. В первых главах автор даже приводит какие-то теоремы с доказательствами )).

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


понедельник, 9 апреля 2012 г.


Программируем Коллективный разум.


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

  • байесовский классификатор
  • деревья решений
  • нейронные сети
  • метод опорных векторов
  • k-ближайших соседей
  • кластеризация - иерархическая и методом k-средних
  • многомерное шкалирование
  • неотрицательная матричная факторизация
  • оптимизация методом отжига и генетическим алгоритмом
  • генетическое программирование

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

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

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

воскресенье, 29 января 2012 г.

Планы на ближайшие месяцы

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

1. Расширить свои теоретические познания в области data mining. В списке сейчас 3 книги:
- Web Data Mining от Bing Liu (прочитано 70%). Отличное введение в майнинг и поисковые технологии
- Программируем коллективный разум отТоби Сегаран (просчитано 10%). Книга с практическим уклоном с периметрами на python.
- Введение в информационный поиск от Маннинга и компания. Чем то похоже на первую книгу - читать пока не начал.

2. Написать свое первое приложение для iOS и выложить в стор. Кажется что это будет очень интересно - во всяком случае первые впечатления от документации Apple оставили очень принятые впечатления. Objective C пока кажется несколько странным, но посмотрим...

3. Углубить знания в области Python. Все скрип ты писать исключительно на нем (вместо Perl) и изучить недавно купленный справочник по сему очень интересному языку.

Из планов которые находятся во второй очереди по приоритетам:

4. Продолжать изучать Java.
- дочитать двухтомник Хортсманна Java 2 (первый почитан на 80%)
- продолжить изучение IntellyJ IDE
- возможно достанется какой-то проект на нем что-бы по практиковаться

5. Попасть на конференцию по интересующим сейчас тематикам (C++, mining, high load computations, iOS).

6. Попробовать реанимировать изучение English - перед этим придется найти стимул для этого.

7. Дождаться ту пару книжек по boost которые я заказал и прочитать их.


Уф, ну вроде на ближайшие 3-4 месяца интересных занятий мне хватит.

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

wiki и производительность труда

Совершенно случайно открыл для себя удивительно продуктивный способ увеличить КПД на работе.

Небольшое вступление. У нас в процессе работы активно используется wiki для очень многих вещей - описание продуктов, процессов, задач, планов и т.п. Эта wiki достаточно продвинута - например можно написать:
с кем:логин
и в итоге это, при просмотре, преобразуется в
c Васей Пупкиным.
Или можно напсать номер тикета из jira:
MINIVERTIS-12
и он преобразуется в
MINIVERTIS-12[ --Создание очередной поделки-- ]( логин ).
Естественно поддерживаются всякие подсветки синтаксиса, списки, таблицы, автоматическое оглавление и т.п.

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

=== 19
  * разбирался с проблемами индексации в работе. Такая конфигурация работает, но надо доп. проверки:
    %%
   
common_title : job_name,company_name
_ : _
    %%
   * работал над MINIVERTIS-12 - релевантность уже прокидывается в protobuf. Осталось получить неплохое число для него
   * помогал кому:логин с пакетом для тезауруса
   * совещался с кем:1, кем:2, кем:3 по поводу нового проекта спецсниппетов для законов. Пока больше вопросов чем ответов. Точно придутся поднимать бету среднего. Свой визард. Возможно даже базовый.


=== 20
  * говорил с кем:логин1 - он будет помогать нам встраиваться в бленднер. Запросил для него права.
  * совещался с кем:1, кем:2, кем:3, кем:4, кем:5 по поводу законов. с меня json после получ. тикета от Лены. prewalrus сильно менять не надо будет. 
  * хурал. скоро релиз дин. аттрибутов
  * говорыл с кем:6 - обещал все на след. недели
  * подготовил серп для постройки идеальной выдачи
  * почти готов MINIVERTIS-12 - остались мелкие штрихи

=== 23
  * готов MINIVERTIS-12 - выкачен на сервер
  * консультировал кого:логин по поводу работы с dsindexer
  * подробоно отвечал на вопросы Сегаловича по сервису поиска по мобильным приложениям
  * переделал серп для идеальной выдачи

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

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

Emacs и style guide

У нас на работе для части (основной) С++ кода поменялся style guide - добавлися pre-commit hook, который запрещает коммитить файлы, в которых  есть пробелы в конце строки. Оказалось что в моем любимом emacs справиться с данной напастью оказалось очень легко. Помог отличный пакет
show-wspace, который уже был установлен. Осталось только добавить строку
(add-hook 'c-mode-common-hook 'show-ws-highlight-trailing-whitespace)

и вуаля - все проблемные строки сразу подсвечиваются.

Все настройки для emacs можно найти тут:
emacs-configuration (сам файл для посдветки пробелов находится тут: ai/colorize.el

up.
Как мне напомнили в комментах (спасибо Ваня!) можно еще автоматически удалять пробелы при сохранении файла. Сделать это только для С/С++ режима можно так:
(add-hook 'c-mode-common-hook
      (lambda()
        (add-hook 'local-write-file-hooks
              '(lambda()
                 (save-excursion
                   (delete-trailing-whitespace))))))

воскресенье, 15 января 2012 г.

Новый способ ведения блога

Купил BlogPress для iPad - вроде на первый взгляд удобно. Будем надеяться, что это поможет реанимировать блог - благо многое прочитал и многое написал - есть что рассказать. Всех с наступившим НГ!