Рубрики
Scala

Scala. Pattern Matching


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

Сопоставление по образцу (pattern matching). Начало.

Рубрики
3. Инструментарий Java

XMPP (Jabber) + Smack

Недавно с товарищем начал работу над одним проектом, в котором нужно было написать программу для отправки сообщений пользователям по протоколу XMPP (т.е. через jabber).

Список библиотек для работы нашли на официальном сайте xmpp.org.
После серии небольших испытаний решили для интеграции с серверной частью написанной на Java использовать библиотеку Smack. Не факт, что будем использовать ее в продакшн, пытаемся распробовать. Пока продукт внушает доверие.

1. Подключается к проекту элементарно (т.к. есть maven-овском репозитории):

Рубрики
4. Полезняшки Scala

Netbeans Scala Maven

Если вам приходилось работать в связке Netbeans 6.9.1 + Scala + Maven, то вы могли заметить, что компиляция происходит сильно медленнее, чем если бы вы НЕ использовали maven-scala-plugin.
Дело в том, что по умолчанию компиляция запускается в режиме "компилировать все классы". Это не очень приятно, учитывая то, что Scala компилятор не очень-то быстрый.
К счастью, такое поведение можно изменить, указав в настройках для recompileMode значение modified-only (компилировать только измененные). По-умолчанию оно all.
В некоторых случаях перевод в режим modified-only удобен, например если ваша задача не выпуск финальной версии продукта, а работа над определенным куском кода в режиме "написал, нажал Shift-F6, посмотрел что получилось...".
Внимание! Перевод recompileMode в режим modified-only может привести к нежелательным последствиям и побочным эффектам. Как говорится, не уверен - не обгоняй (а уверен - обгоняй).

Пример возможной (но далеко не оптимальной) модификации pom.xml.

<plugin>
    <groupid>org.scala-tools</groupid>
    <artifactid>maven-scala-plugin</artifactid>
     <configuration> 
           <recompilemode>modified-only</recompilemode>
     </configuration>
</plugin>
Рубрики
3. Инструментарий 4. Полезняшки Java

Работа с видео и аудио в Java. Xuggle

Первый раз мне пришлось столкнуться с обработкой видео на Java лет 10-12 назад. Я еще был студентом и работал над проектом, в котором мы пытались сделать видео проигрыватель в виде апплета.
В те времена, для перекодирования видео мы пробовали использовать JMF (Java Media Framework). Нам нужно было сделать хитрую предварительную обработку видео, т.к. показ видео осуществлялся апплетом с помощью самописного алгоритма. В итоге пришлось отказаться от JMF в пользу приложения написанного на С++, т.к. JMF оказался не особо функциональным...

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


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

Рубрики
Java

Быстрый обратный корень на Java

Fast Inverse Square Root, он же Fast InvSqrt() или 0x5f3759d5 - способ вычисления обратного квадратного корня из числа = 1/sqrt(x). Изобретен еще в 90-х годах.
Если верить википедии, то этот алгоритм использовался в Quake III.
Главная фишка метода в использовании "магической" константы - 0x5f3759d5, с помощью которой можно получить первое приближенное значение.
Затем обычным методом Ньютона получаем улучшенное приближение.
Подробнее можно прочитать здесь и здесь.

public static float invSqrt(float x) {
    float xhalf = 0.5f*x; // x пополам
    int i = Float.floatToIntBits(x); // битовое представление числа. 
    i = 0x5f3759d5 - (i >> 1); //  отрицательные x не волнуют, т.к. из отриц. корень брать нельзя
    x = Float.intBitsToFloat(i); // вот оно, первое прибл. значение
    x = x*(1.5f - xhalf*x*x);
     // x = x*(1.5f - xhalf*x*x);
    return x;
}
Рубрики
Scala

Принцип работы FFT и Scala

Разбор алгоритма быстрого преобразования фурье (он же Fast Fourier transform, он же FFT).

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