Как стать автором
Обновить
132
0
Михаил Крестьянинов @krestjaninoff

Пользователь

Отправить сообщение

Распознавание речи для чайников

Время на прочтение9 мин
Количество просмотров167K

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

Читать дальше →
Всего голосов 71: ↑61 и ↓10+51
Комментарии20

HighLoad 2012

Время на прочтение14 мин
Количество просмотров37K
На днях в Москве прошла «конференция разработчиков высоконагруженных систем» HighLoad++, участником которой мне посчастливилось стать. Ниже я хочу кратко пройтись по докладам, которые посетил в рамках конференции, выделив в них интересные на мой взгляд моменты.

Сразу предупрежу, что какие-то вещи я мог понять неправильно, какие-то переврать. Если для вас это важно — не читайте этот пост, а приходите на следующую конференцию лично!
Читать дальше →
Всего голосов 72: ↑68 и ↓4+64
Комментарии39

Потоковое видео в Android

Время на прочтение7 мин
Количество просмотров198K
В этой заметке я хочу рассказать о некоторых подводных камнях, с которыми можно столкнуться при работе с потоковым видео в Android приложениях. Конкретно, речь пойдёт о конвертации видео и протоколах доставки/воспроизведения видео.
Сразу оговорюсь, что экспертом я в данной области не являюсь, а лишь хочу поделится недавно полученным опытом.


Читать дальше →
Всего голосов 26: ↑26 и ↓0+26
Комментарии15

LINQ for Java: LambdaJ

Время на прочтение3 мин
Количество просмотров19K
Как часто вам приходилось видеть или писать одни и те же несколько строчек кода, которые постоянно используются вместе для решения одной и той же задачи? Взять, например, перебор или сортировку (некоторую манипуляцию) коллекций. Такие участки кода программистам приходится писать каждый день. Конечно, есть различные IDE, в которых можно использовать snippet'ы и шаблоны. Тем не менее, подобные конструкции загромождают код, делая его более подходящим для обработки компьютером, а не для восприятия программистом.

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

Рассмотрим пример использования LambdaJ. Найдём возраст самого юного покупателя, который совершил покупку более, чем на 50'000.

Классический (итеративный) способ:
int age = Integer.MAX_VALUE;
for (Sale sale : sales) {
  if (sale.getCost() > 50000.00) {
    int buyerAge = sale.getBuyer().getAge();
    if (buyerAge < age)
      age = buyerAge;
  }
}


LambdaJ способ:
int age = min(forEach(select(sales, having(
  on(Sale.class).getCost(), greaterThan(50000.00)).getBuyer()))),
  on(Person.class).getAge());


Читать дальше →
Всего голосов 41: ↑33 и ↓8+25
Комментарии24

Знакомство с АОП

Время на прочтение10 мин
Количество просмотров127K

Парадигмы программирования


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

У каждой парадигмы есть свои особенности, однако, главным фактором, различающим их, является понятие основной единицы программы. Вот самые популярные из них:
  • инструкция (императивное программирование, FORTRAN/C/PHP),
  • функция (функциональное программирование, Haskell/Lisp/F#/Scala),
  • прототип (прототипное программирование, JavaScript),
  • объект (объектно-ориентированное программирование, С++/Java),
  • факт (логическое программирование, PROLOG).

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

В этой статье я хочу рассказать о сравнительно молодой, но крайне, на мой взгляд, полезной парадигме программирования – аспектно-ориентированном программировании.

Читать дальше →
Всего голосов 105: ↑101 и ↓4+97
Комментарии70

Масштабирование нагрузки web-приложений

Время на прочтение6 мин
Количество просмотров59K
С ростом популярности web-приложения его поддержка неизбежно начинает требовать всё больших и больших ресурсов. Первое время с нагрузкой можно (и, несомненно, нужно) бороться путём оптимизации алгоритмов и/или архитектуры самого приложения. Однако, что делать, если всё, что можно было оптимизировать, уже оптимизировано, а приложение всё равно не справляется с нагрузкой?
Читать дальше →
Всего голосов 109: ↑98 и ↓11+87
Комментарии38

«Hello World» BPMN2.0 или введение в Activiti

Время на прочтение12 мин
Количество просмотров34K
В данной статье я хочу рассмотреть пример создания простого приложения с использованием движка Activiti.

Activiti” — это легковесная платформа (framework) для работы с бизнес-процессами (Business Process Managment), адаптированная для деловых людей, разработчиков и системных администраторов. Платформа основана на быстром и надёжном java-движке BPMN2-процессов. Проект OpenSource’ный и распространяется под лицензией Apache. Activiti может запускаться либо как часть вашего java-приложения, либо самостоятельно на сервере, кластере или облаке. Кроме того, она прекрасно интегрируется со Spring’ом.
Читать дальше →
Всего голосов 29: ↑23 и ↓6+17
Комментарии21

Hibernate: использование lazy initialization в разработке клиент-серверного приложения

Время на прочтение3 мин
Количество просмотров51K
При проектировании доменов приложения, разрабатываемого с использованием Hibernate, разработчику необходимо сделать выбор: инициализировать ли свойства домена, соответствующие коллекциям связанных доменов, сразу (FetchType=EAGER) или же делать это только при обращении к ним (FetchType=LAZY). На самом деле в случае, когда предметная область имеет сколь-либо сложную структуру связей между объектами, выбор уже сделан – загружать полбазы ради одного объекта, как это было бы при FetchType=EAGER, мягко говоря, неразумно. Поэтому ленивая инициализация в случае коллекций есть наиболее предпочтительная стратегия инициализации связанных объектов.

Однако, не всё так просто. Ленивая инициализация реализуется за счёт создания прокси-объекта с помощью JDK Dynamic Proxy или библиотеки CGLIB. В обоих случаях проксирование соответствующих get-методов сводится к обращению к сессии Hibernate для получения необходимых данных. Последнее же в свою очередь означает, что обращение к ленивым свойствам объекта может быть осуществлено только при наличии сессии Hibernate. В противном случае, попытка получить свойство объекта приведёт к незабвенному исключению «LazyInitializationException: could not initialize proxy — the owning Session was closed».

Читать дальше →
Всего голосов 24: ↑19 и ↓5+14
Комментарии46

Непрерывная интеграция на примере Hudson

Время на прочтение10 мин
Количество просмотров33K
Все мы прекрасно понимаем, что тестирование является неотъемлемой частью жизненного цикла разработки ПО. Чем чаще мы тестируем наш код, тем быстрее мы сможем обнаружить ошибку, вкравшуюся в него в ходе разработки, и быстрее её исправить. При этом стоит понимать, что тестирование крайне желательно проводить в окружении, максимально близком к боевому (ОС, ПО, Hardware, Нагрузка), что бы иметь возможность обнаружить ошибки, которые не проявляются на сервере разработки, но могут появиться в бою. Компануя два вышесказанных тезиса вместе мы получаем концепцию, называемую Continuous Integration.

Суть CI заключается в постоянной (например, после каждого commit'а) сборке и тестировании разрабатываемого ПО в максимально приближенной к боевой среде с целью как можно более раннего обнаружения ошибок и оповещения о них разработчиков. Сама идея CI принадлежит Martin Fowler, подробно описавшему её в своей статье.

Для автоматизации процесса непрерывной сборки существуют готовые решения (Hudson, CruiseControl), интеграцию одного из которых (Hudson) я и опишу в этой статье.

Читать дальше →
Всего голосов 40: ↑38 и ↓2+36
Комментарии21

Извлечение фактов

Время на прочтение3 мин
Количество просмотров13K
Задача извлечения информации из текста сама по себе не нова: в этом направлении проделано довольно много работы как со стороны крупных компаний aka Яndex и Google, так и со стороны независимых разработчиков. Однако, говорить о том, что данная задача окончательно решена, увы, не приходится. В этой статье я хочу немного упорядочить свои знания по данному вопросу, поверхностно разобрав наработки, с которыми мне недавно пришлось столкнуться.
Читать дальше →
Всего голосов 62: ↑58 и ↓4+54
Комментарии21

Параллельный импорт данных

Время на прочтение8 мин
Количество просмотров3.6K
Представим, что у нас есть некоторый набор задач, допускающих возможность параллельного выполнения. К примеру, нам нужно организовать RSS-агрегатор, обновляющий через заданный промежуток времени все свои ленты. Понятно, что основное и при этом вполне ощутимое время будет уходить на загрузку данных с удалённого источника. Учитывая это, организация такого импорта путём последовательной загрузки лент лишена смысла, так в случае сколь-либо большого количества лент, импорт не будет укладываться в отведённые ему сроки.
Читать дальше →
Всего голосов 57: ↑46 и ↓11+35
Комментарии29

Singleton и Late static binding

Время на прочтение3 мин
Количество просмотров8.1K
Количество Singleton'ов в проекте зачастую прямо пропорционально его сложности и размеру. Естественно, что описывать закрытый конструктор, статическое свойство-объект и метод его получения для сколь-либо ощутимого количества классов немного утомительно, да и пожалуй неверно. Отсюда встаёт вопрос: как «вынести за скобки» реализацию Singleton'а?
Читать дальше →
Всего голосов 58: ↑43 и ↓15+28
Комментарии61

Использование deb-пакетов для дистрибъюции кода

Время на прочтение8 мин
Количество просмотров5.7K
В этой статье я хочу рассказать, о том, как можно внедрить систему сборки deb-пакетов для некоторого абстрактного проекта. Плюсов в распространении и развёртывании ПО на основе пакетов несколько:
  • Атомарность пакета (представление продукта в виде одного файла);
  • Наличие скриптов пред/пост установки/удаления ПО;
  • Возможно указания зависимостей для ПО.
Кроме того, при развёртывании ПО на основе пакетов, а не на основе SVN, вы гарантировано защищены от проблем с .svn-папками.
Читать дальше →
Всего голосов 33: ↑28 и ↓5+23
Комментарии26

Информация

В рейтинге
Не участвует
Откуда
Новосибирск, Новосибирская обл., Россия
Дата рождения
Зарегистрирован
Активность