Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus "Освітні вимірювання, адаптовані до стандартів ЄС". В рамк...

Благодаря Интернету количество писателей и поэтов увеличивается в геометрической прогрессии. Поголовье читателей начинает заметно отставать.

среда, 6 января 2016 г.

Пишем на Java в Arduino / Программирование на Java



В статье расскажу как можно писать на Java для Arduino.

Почему Java? Если кратко — just for fun!

Я Java программист и в свободное время играюсь с Arduino и хотелось перенести свои знания Java в мир микроконтроллеров и embedded устройств.

На данный момент есть несколько возможностей запускать Java на embedded устройствах. В этой статье я рассмотрю их.

Официальная JVM


Первое — это официальная JVM для embedded:
www.oracle.com/technetwork/java/embedded/embedded-se/overview/index.html
habrahabr.ru/post/243549 Запускаем Java Runtime на 256KB оперативной памяти

Тут практически настоящая JVM которая исполняет byte-code. Но есть большие минусы — это работает только для Raspberry Pi и Freescale K64F (может я что то упустил, если так — добавьте, пожалуйста в комментариях). Поддержка Raspberry Pi определённо хорошо, но это по сути компьютер, хоть и одноплатный. На нём можно и простую JVM запустить. Да и стоит он от 3 т.р. K64F — это уже dev board с Cortex M4 на борту. Но стоит тоже от 3 т.р. Что гораздо дороже распространённого Arduino Uno.


Есть несколько VM которые позволяют запускать Java на микроконтроллерах — это LeJOS ( www.lejos.org ) и HaikuVM ( haiku-vm.sourceforge.net )
LeJOS — позволяет запускать Java приложения на Lego MindStorm. HaikuVM — на микрокомпьютерах AVR. Сейчас LeJOS разделён на две части:
— для последнего, EV3, используется настоящая JVM, от Oracle (www.oracle.com/technetwork/java/embedded/downloads/javase/javaseemeddedev3-1982511.html ). О ней я сказать больше ничего не могу — просто JVM.
— для предыдущих версий, NXJ и RCX, используется JVM на основе TinyVM (tinyvm.sourceforge.net ). Вот о ней стоит рассказать подробнее.

Т.к. в микроконтроллерах очень мало памяти (в Arduino Uno 28kB Flash и 2kB SRAM) то настоящую JVM, с которая бы интерпретировала class файлы, там не запустить. Но можно преобразовать byte code программы и скомпилировать его в native код, вырезав при этом всё не нужное, весь не используемый runtime. При компиляции теряется часть функциональных возможностей Java (например, reflection). Но программа будет работать!

HaikuVM работает также — берёт Java код, компилирует его с JRE из LeJOS (альтернативная реализация некоторых стандартных классов — String, StringBuilder, Integer и т.п. — нужна для оптимизации) вместо JRE из оригинальной JVM (rt.jar в HotSpot), получившиеся class файлы преобразует в C++ код, добавляет runtime из HaikuVM (в нём поддержка потоков, GC, exception) и компилирует всё это с помощью avr-gcc. И таким образом удаётся запустить Java программу вплоть до ATMega8 c 8kB flash памяти!

image
Алгоритм работы HaikuVM. Картинка взята с сайта haiku-vm.sourceforge.net

Пример преобразования кода

Java код:
public static void setup() {
  Serial.begin(57600);
  while (!Serial.isOpen()) {
  }
}


Byte code:
public static setup()V
 L0
  LINENUMBER 140 L0
  GETSTATIC processing/hardware/arduino/cores/arduino/Arduino.Serial : Lprocessing/hardware/arduino/cores/arduino/HardwareSerial;
  LDC 57600
  INVOKEVIRTUAL processing/hardware/arduino/cores/arduino/HardwareSerial.begin (J)V
 L1
  LINENUMBER 141 L1
 FRAME SAME
  GETSTATIC processing/hardware/arduino/cores/arduino/Arduino.Serial : Lprocessing/hardware/arduino/cores/arduino/HardwareSerial;
  INVOKEVIRTUAL processing/hardware/arduino/cores/arduino/HardwareSerial.isOpen ()Z
  IFNE L2
  GOTO L1
 L2
  LINENUMBER 144 L2
 FRAME SAME
  RETURN
  MAXSTACK = 3
  MAXLOCALS = 0


Сгенерированный C код:

#undef  JMETHOD
#define JMETHOD ru_timreset_IrTest_setup_V
const           ru_timreset_IrTest_setup_V_t JMETHOD PROGMEM ={
0+(2)+3,    0,    0,    

OP_GETSTATIC_L,      SADR(processing_hardware_arduino_cores_arduino_Arduino_Serial), 
                                                                       
OP_LDC2_W_L,         CADR(Const0003),                                  
OP_INVOKEVIRTUAL,    B(2), LB(MSG_begin__J_V),                         
OP_GETSTATIC_L,      SADR(processing_hardware_arduino_cores_arduino_Arduino_Serial), 
                                                                       
OP_INVOKEVIRTUAL,    B(0), LB(MSG_isOpen___Z),                         
OP_IFNE,             TARGET(21),                                       
OP_GOTO,             TARGET(9),                                        
OP_RETURN,                                                             
};


Как видно из примера выше — HaikuVM практически один в один переносит byte code в C.

Помимо поддержки Java, HaikuVM позволяет вызывать C функции напрямую — с помощью аннотаций NativeCppFunction/NativeCFunction и содержит методы по работе с памятью и прерываниями.

В целом проект мне понравился — я даже попробовал перевести его на Gradle (github.com/TimReset/HaikuVMGradle ), но так как HaikuVM содержит в себе довольно сложную логику в bat/sh файлах, полностью это сделать это пока не удалось.

Но тут есть минусы — так как в микроконтроллерах памяти и частоты процессора мало, то, пусть даже небольшой, overhead в виде GC (хотя можно GC отключить, но это слабо помогает) и преобразования byte code в C вносит ощутимые задержки. Это выражается, например, в невозможности работать с Serial на больших частотах ( больше 57600 kb/s ) — данные начинают теряться. Поэтому я начал разрабатывать свой (с тестами и поддержкой библиотек) вариант запуска Java в Arduino.

Преобразования Java кода в Wiring


Что бы не было overhead в виде GC и native интерпретатора byte code можно преобразовывать Java код напрямую в Wiring (язык программирования в Arduino, тот же C++). Готовых реализаций я не нашёл, поэтому решил написать свою (github.com/TimReset/arduino-java ), благо синтаксис Java на C очень похож. Для этого использовал анализ AST из Eclipse ( help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fdom%2FASTNode.html )

Алгоритм преобразования

Есть абстрактный класс с абстрактными методами loop() и setup() и со служебными константами и методами digitalRead(int), analogRead(int) и т.п. Абстрактные методы loop/setup нужны для обязательного переопределения. Служебные методы и константы должны эмулировать поведение Wiring — в скетчах для Arduino можно так обращаться к этим методам/константам.

Скетч наследует этот базовый класс (я его назвал BaseArduino) и имплементирует методы setup и loop.

Далее просто пишем логику. Можно создавать методы, использовать переменные. Для использования сторонних библиотек нужно создать stub классы на Java, которые бы содержали методы из этих библиотек и в коде использовать эти классы. Stub классы должны находится в пакете с названием библиотеки, которую эти классы реализуют. Сами библиотеки должны находиться в папке parser/src/main/c в папке с названием библиотеки. При компиляции уже Wring кода эти библиотеки будут использоваться.

И наконец, преобразование Java класса происходит с помощью Visitor, наследника класса org.eclipse.jdt.internal.core.dom.NaiveASTFlattener (www.cs.utep.edu/cheon/download/jml4c/javadocs/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.html ), в котором переопределены некоторые методы:
boolean visit(VariableDeclarationStatement), boolean visit(FieldDeclaration), boolean visit(MethodDeclaration) — для отслеживания использования классов из библиотек и удаления всех модификаторов (final, модификаторы видимости и static). Возможно это излишне, но пока работает так.
Так же заменяет создание объекта:
decode_results results = new decode_results(); преобразует в decode_results results();

boolean visit(MethodInvocation) — для отслеживания обращения к классам библиотек и при передаче их в методы передаёт ссылки на них (через &):
irrecv.decode(results) преобразует в irrecv.decode(&results)

Если тут будут знатоки C++, подскажите, так всегда нужно передавать объекты или есть какие-нибудь ещё варианты?

6) Всё это обвёрнуто Gradle скриптом который позволяет запускать верификацию и загрузку скетча.

Пример:

Компиляция скетча


Загрузка скетча

В качестве примера возьму программу преобразования ИК сигналов для колонок (там долгая история — колонки Microlab Speakers Solo 6C с пультом, пульт через несколько месяцев перестал работать, оригинал не нашёл, пришлось заменить универсальным пультом, но он был большого размера, в итоге сделал преобразователь сигналов на Arduino из маленького пульта chipster.ru/catalog/arduino-and-modules/control-modules/2077.html в сигналы для колонок).

Java код:
public class IrReceiverLib extends BaseArduino {

    public static final long REMOTE_CONTROL_POWER = 0xFF906F;
    public static final long REMOTE_CONTROL_VOL_UP = 0xFFA857;
    public static final long REMOTE_CONTROL_VOL_DOWN = 0xFFE01F;
    public static final long REMOTE_CONTROL_REPEAT = 0xFFFFFFFF;

    public static final long SPEAKER_IR_POWER = 2155823295L;
    public static final long SPEAKER_IR_VOL_DOWN = 2155809015L;
    public static final long SPEAKER_IR_VOL_UP = 2155841655L;
    public static final long SPEAKER_IR_BASS_UP = 2155843695L;
    public static final long SPEAKER_IR_BASS_DOWN = 2155851855L;
    public static final long SPEAKER_IR_TONE_UP = 2155827375L;
    public static final long SPEAKER_IR_TONE_DOWN = 2155835535L;
    public static final long SPEAKER_IR_AUX_PC = 2155815135L;
    public static final long SPEAKER_IR_REPEAT = 4294967295L;

    public static final int IR_PIN = A0;

    public final IRrecv irrecv = new IRrecv(IR_PIN);

    public final IRsend irsend = new IRsend();

    long last_value = 0;

    @Override
    public void setup() {
        irrecv.enableIRIn();
    }

    @Override
    public void loop() {
        decode_results results = new decode_results();
        if (irrecv.decode(results) != 0) {
            final long value = results.value;
            if (value == REMOTE_CONTROL_POWER) {
                last_value = SPEAKER_IR_POWER;
                irsend.sendNEC(SPEAKER_IR_POWER, 32);
                irrecv.enableIRIn();
            } else if (value == REMOTE_CONTROL_VOL_DOWN) {
                last_value = SPEAKER_IR_VOL_DOWN;
                irsend.sendNEC(SPEAKER_IR_VOL_DOWN, 32);
                irrecv.enableIRIn();
            } else if (value == REMOTE_CONTROL_VOL_UP) {
                last_value = SPEAKER_IR_VOL_UP;
                irsend.sendNEC(SPEAKER_IR_VOL_UP, 32);
                irrecv.enableIRIn();
            } else if (value == REMOTE_CONTROL_REPEAT) {
                if (last_value != 0) {
                    irsend.sendNEC(last_value, 32);
                    irrecv.enableIRIn();
                } else {
                }
            } else {
                last_value = 0;
            }
        }
    }

}


Преобразуется в этот код:
#include <IRremote.h>
public static long REMOTE_CONTROL_POWER=0xFF906F;
public static long REMOTE_CONTROL_VOL_UP=0xFFA857;
public static long REMOTE_CONTROL_VOL_DOWN=0xFFE01F;
public static long REMOTE_CONTROL_REPEAT=0xFFFFFFFF;

public static long SPEAKER_IR_POWER=2155823295L;
public static long SPEAKER_IR_VOL_DOWN=2155809015L;
public static long SPEAKER_IR_VOL_UP=2155841655L;
public static long SPEAKER_IR_BASS_UP=2155843695L;
public static long SPEAKER_IR_BASS_DOWN=2155851855L;
public static long SPEAKER_IR_TONE_UP=2155827375L;
public static long SPEAKER_IR_TONE_DOWN=2155835535L;
public static long SPEAKER_IR_AUX_PC=2155815135L;
public static long SPEAKER_IR_REPEAT=4294967295L;

public static int IR_PIN=A0;

IRrecv irrecv(IR_PIN);
IRsend irsend;
long last_value=0;

void setup(){
  Serial.begin(256000);
  irrecv.enableIRIn();
}

void loop(){
  decode_results results;
  if (irrecv.decode(&results) != 0) {
  long value=results.value;
    if (value == REMOTE_CONTROL_POWER) {
      last_value=SPEAKER_IR_POWER;
      irsend.sendNEC(SPEAKER_IR_POWER,32);
      irrecv.enableIRIn();
    }
    else
    if (value == REMOTE_CONTROL_VOL_DOWN) {
      last_value=SPEAKER_IR_VOL_DOWN;
      irsend.sendNEC(SPEAKER_IR_VOL_DOWN,32);
      irrecv.enableIRIn();
    }
    else
    if (value == REMOTE_CONTROL_VOL_UP) {
      last_value=SPEAKER_IR_VOL_UP;
      irsend.sendNEC(SPEAKER_IR_VOL_UP,32);
      irrecv.enableIRIn();
    }
    else
    if (value == REMOTE_CONTROL_REPEAT) {
      if (last_value != 0) {
        irsend.sendNEC(last_value,32);
        irrecv.enableIRIn();
      }
      else {
      }
    }
    else {
      last_value=0;
    }
  }
}


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

И тест на преобразование сигналов:
@RunWith(Parameterized.class)
public class IRReceiverTest {
    @Parameterized.Parameters(name = "{index}: Type={0}")
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {"Power", IrReceiverLib.REMOTE_CONTROL_POWER, IrReceiverLib.SPEAKER_IR_POWER},
                {"Vol down", IrReceiverLib.REMOTE_CONTROL_VOL_DOWN, IrReceiverLib.SPEAKER_IR_VOL_DOWN},
                {"Vol up", IrReceiverLib.REMOTE_CONTROL_VOL_UP, IrReceiverLib.SPEAKER_IR_VOL_UP}
        });
    }

    private final long remoteSignal;
    private final long speakerSignal;

    public IRReceiverTest(String type, long remoteSignal, long speakerSignal) {
        this.remoteSignal = remoteSignal;
        this.speakerSignal = speakerSignal;
    }

    @Test
    public void test() {
        IrReceiverLib irReceiverLib = new IrReceiverLib();
        irReceiverLib.setup();        
        Assert.assertTrue(irReceiverLib.irrecv.isEnabled());

        irReceiverLib.irrecv.receive(remoteSignal);
        irReceiverLib.loop();
        Assert.assertEquals(speakerSignal, irReceiverLib.irsend.getLastSignal());
    }
}


Для теста я дописал методы в stub классы библиотеки IRremote, что бы можно было эмулировать приём и передачу сигнала. В тесте я инициализирую и передаю сигнал в скетч, далее проверяю, что отправленный из скетча сигнал соответствует ожидаемому.

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

В общем, пока для себя я остановился на своём варианте преобразования Java в C.

Ремарка по поводу преобразования Java кода на другие языки. Java код можно конвертировать в JS. Сейчас есть несколько рабочих вариантов: GWT (www.gwtproject.org ) и TeaVM ( github.com/konsoletyper/teavm ). И они также используют два различных подхода — GWT преобразует исходный код в JS, TeaVM — байт код.

Источник: http://habrahabr.ru/post/274571/

Смотри также:


вторник, 5 января 2016 г.

Форос. Горы издали / Фото из личного архива


Смотри также Форос:

Файл слишком велик для конечной файловой системы / Для "чайников"

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

Причина возникновения ошибки, с сообщением файл слишком велик для конечной файловой системы, очень проста. Дело в том, что большинство флеш накопителей продаются с файловой системой FAT32. Одной из особенностей данной файловой системы является то, что она не поддерживает файлы размером больше 4 гб. В результате, когда пользователь пытается записать на флешку образ DVD диска размером 4.7 гигабайта или любой другой большой файл, появляется сообщение об ошибке.
Решить эту проблему можно двумя путями:
  • форматирование флешки в файловую систему NTFS;
  • конвертация флешки в файловую систему NTFS.
Файловая система NTFS более современна и не имеет серьезных ограничений на размер файла, поэтому после того как вы переведете флешку на файловую систему NTFS вы сможете записывать на нее файлы любого размера. Если на флешке нет важных файлов, или вы можете временно перенести файлы с флешки на другой диск, то лучше всего выполнить форматирование флешки в NTFS. Это проще, быстрее и надежней. Если же на флешке много нужных вам файлов и вы не хотите временно переносить их в другое место, то вы можете выполнить конвертацию. В этом случае смена файловой системы с FAT32 на NTFS пройдет без потери данных. Сейчас мы рассмотрим оба этих варианта.
Вариант № 1. Форматирование флешки в NTFS.
Если сообщение «файл слишком велик для конечной файловой системы» вам изрядно надоело, и вы хотите решить проблему быстро и радикально, то форматирование ваш вариант. Но, перед тем как начинать форматирование не забудьте перенести все нужные вам файлы с флешки на другой накопитель.
Откройте «Мой компьютер» и щелкните правой кнопкой мышки по вашей флешке. В открывшемся коне выберите пункт «Форматировать».
После этого откроется окно для форматирования диска. Здесь нужно сменить файловую систему с FAT32 на NTFS.
Остальные настройки можете не трогать. После выбора файловой системы NTFS просто нажмите на кнопку «Начать». Дальше перед вами появится сообщение об удалении всех данных с флешки. Нажмите «OK» для того чтобы запустить процесс форматирования. После форматирования в NTFS вы сможете записывать файлы большого размера и сообщение «файл слишком велик для конечной файловой системы» больше не будет появляться.
Вариант № 2. Конвертация файловой системы в NTFS.
Если вы не хотите удалять все данные с флешки, то можете выполнить конвертацию файловой системы из FAT32 в NTFS. Для этого откройте командную строку и введите команду «convert X: /FS:NTFS». При этом «X» нужно заменить на букву, которая присвоена вашей флешке.
После выполнения команды «convert X: /FS:NTFS» начнется конвертация файловой системы флешки в NTFS. Время конвертации зависит от скорости работы флешки и количества файлов на ней. После завершении процесса конвертации в командной строке появится сообщение «Преобразование завершено» После этого можете закрывать командную строку и приступать к использованию флешки.

Источник: http://osnova-pk.ru/osnovapk/fayl-slishkom-velik-dlya-konechnoy-faylovoy-sistemyi.html

Смотри также:

суббота, 2 января 2016 г.

Дай лапу, кот! / Забавные и милые


Видео лучших докладов Java-конференции JPoint 2015 — Часть 1 / Программирование на Java

image

Год подходит к концу, впереди длинные каникулы. Для многих каникулы — это отличная возможность посидеть и посмотреть вокруг, что же у нас нового и интересного происходит нынче в профессиональном джавовском мире.

В апреле в Москве мы провели в Москве большую Java-конференцию — JPoint 2015. Конференция собрала более тысячи разработчиков на площадке, еще несколько сотен — смотрели конференцию онлайн. Мы экспериментировали и с открытием (лекция Дмитрия Галкина о современном искусстве и программировании действительно шокировала многих) и с новыми форматами (круглые столы и экспертные дискуссии). Но ключевой темой конференции были и остаются доклады.

Видеозаписи всех докладов конференции лежат на Youtube. Мы, как всегда, собрали статистику из отзывов участников и посчитали рейтинг докладов. В этом посте — традиционный обзор лучших докладов конференции. Я сделаю короткий обзор десяти лучших докладов конференции с тем, чтобы вы немного больше знали о них и посмотрели именно то, что интересно вам.
Итак, поехали.



10 место


Сергей Walrus Куксенко, Oracle — Железные счётчики на страже производительности
Средняя оценка: 4.28



Этот доклад получил специальный приз жюри в номинации «аццкий хардкор». Общая идея доклада сводится к следующему: представьте, что вы уже наоптимизировали в своем приложении все, что можно — посмотрели на сеть, ОС, JVM и т.д. и поняли, что все уперлось в процессор. После этого мы попрофилировали, работать стало быстрее, но все равно процессор загружен на 100%. Что делать?

Оказывается, внутри процессора есть разные счетчики событий. Называется этот механизм Hardware Performance Counters. Архитектура современных процессоров очень сложна, в них может происходить очень много разного. Фокус в том, что мы можем включить некоторые счетчики внутри процессора, которые будут считать количество произошедших событий. То есть, некоторый железный профилировщик внутри процессора.

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



В этом году Сергей снова прилетит к нам в Москву — правда уже не из Питера, а из Калифорнии. С темой он определится в январе. Скорее всего это будет снова что-то про оптимизацию производительности.




9 место


Барух jbaruch Садогурский, JFrog — Как писать асинхронные многопоточные HTTP-приложения
Средняя оценка: 4.29



В этом докладе Барух изложил некоторый опыт, который они с парнями из JFrog накопили в процессе написания своих систем. Если говорить техническими терминами — они пишут сервера, одна из главных задач которых — быстро раздавать бинарники. То есть, многопоточные HTTP-приложения, на Java, асинхронные.

Доклад разбился на две части. В первой Барух рассказывал о том, как они у себя выбирали библиотеки для асинхронной работы с HTTP. Какими принципами имеет смысл руководствоваться при выборе? Как сравнивать производительность таких библиотек и имеет ли это смысл? Какую библиотеку выбрать, в конце концов?! Во второй части доклада Барух рассказал о том, что не так с HTTP 1.1 и чем хорош грядущий HTTP/2 и как он поможет всем нам.



В апреле Барух снова приедет к нам на JPoint. И тоже из Калифорнии. Но главное не это, а то, что Барух сейчас определяется с темой доклада и проводит соответствующее голосование. Кто собирается на JPoint — кликните по этой ссылке и помогите нам с выбором докладов.




8 место


Никита Сальников-Тарновский, Plumbr — Где моя память, чувак?!
Средняя оценка: 4.38



Не очень сложный и хорошо структурированный доклад о том, как себя вести в случае, если ваш продакшен начитает вываливаться с OutOfMemoryError. В первой части доклада Никита довольно много рассказывает про то, какие регионы памяти есть в Java, зачем они нужны и как с ними работают сборщики мусора. Далее речь пошла про симптомы утечки памяти, а так же о том, что является, а что не является утечкой. В последней части доклада Никита делает демки на MAT (Memory Analyzer Tool) и показывает, как этот инструмент помогает в реальной жизни. Ничего особо сложного, зато очень эффективно в повседневной жизни.



Никита пока не уверен, сможет ли он приехать на JPoint в этот раз — на конец апреля у него уже запланирован отпуск. Но мы еще, как говорится, поборемся. Шантаж, угрозы, пытки — и вот он уже выступает на конференции! Как вы поняли, этот вопрос практически решен.




7 место


Владимир vladimirsitnikov Ситников, NetCracker — Выражаемся регулярно
Средняя оценка: 4.40



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

Парсинг текстов регулярками, парсинг XML, наиболее распространенные ошибки, анализ того, что и где может тормозить. Не обошлось и без тестов производительности разных регэспов на боевых примерах.



На JPoint 2016 Владимир расскажет о том, какие типичные проблемы возникают с производительностью разных опенсорсных решений, которые очень любят использовать в современных Java-проектах — Spring, Postgres JDBC Driver, Wildfly и др. С практической точки зрения, полагаю, будет очень интересно.




6 место


Антон antonkeks Кекс, Codeborne — Архитектура интернет-банка без Enterprise
Средняя оценка: 4.43



Антон Кекс, прежде всего, известен в России своей знаменитой критикой «кровавого Enterpise» (часть 1, часть 2). А точнее, критикой того, что большинство разработчиков тащат себе в новые проекты разные тяжелые технологии, практически не задумываясь о том, что практически всегда можно обойтись чем-то существенно более легковесным и простым в использовании.

В этом докладе Антон рассказал о том, какие легковесные технологии они у себя в Codeborne используют при разработке интернет-банков и почему эти технологии им нравятся больше, чем общепринятые в индустрии стеки на базе Java EE, Spring и прочих замечательных решений.



Чем нас порадует Антон на JPoint 2016 в апреле — пока неизвестно. Но мы работаем над этим. В январе будет понятно.




Ну и минутка рекламы в конце поста. Билет на JPoint 2016 — хороший подарок на новый год вам, вашим друзьям и коллегам. В каждую нашу конференцию мы вкладываем множество усилий, и поэтому я гарантирую вам, что вы не разочаруетесь.

Нашел под Елкой билет на #jpoint. Вот теперь в сомнениях толи письмо до Деда дошло, то ли девушка подслушала? На Деда мало надежды. :-(
— Ilya Kuchmin (@ikuchmin) 28 декабря 2015


Льготная регистрация на JPoint заканчивается уже завтра. Поэтому не тяните с покупкой.

среда, 30 декабря 2015 г.

Это - рок. 200 лучших песен. Черный Кофе. Леди Осень

Группа "Черный кофе" входит в "ТОП-10" советского рока. Она была самой коммерчески успешной в нашей стране, в 90- х годах, именно ее пластинки выходили наибольшим тиражом. Основал ее в 1984 году вокалист и гитарист Дмитрий Варшавский, кроме него участниками группы были бас-гитара Федор Васильев и ударник Игорь Шатуновский, в июле того же года была записана их дебютная лента под названием «Приди и все возьми», она сразу же стала популярна по всей стране. 
В конце 80-х музыка группы стает более мягкой и мелодичной. Именно к такой музыке относится и "Леди Осень".

Смотрим и слушаем:  https://www.youtube.com/watch?v=J0YuNhVH0z8

Предыдущие посты Это - рок. 200 лучших песен


Accept. Balls To The Wall. http://fetisovvs.blogspot.com/2015/04/200-accept-balls-to-wall.html
Aerosmith. Crazy. http://fetisovvs.blogspot.com/2015/03/200-aerosmith-crazy.html
Aerosmith. Dream On. http://fetisovvs.blogspot.com/2015/08/200-aerosmith-dream-on.html
Alannah Myles. Black Velvet. http://fetisovvs.blogspot.com/2015/03/200-alannah-myles-black-velvet.html
Alcatrazz. Suffer Me. http://fetisovvs.blogspot.com/2015/03/200-alcatrazz-suffer-me.html
Alice Cooper. Poison. http://fetisovvs.blogspot.com/2014/05/200-alice-cooper-poison.html
Axel Rudi Pell. Hellolujah. http://fetisovvs.blogspot.com/2014/09/axel-rudi-pell.html
Beatles. A Hard Day's Night. http://fetisovvs.blogspot.com/2014/09/200-beatles-hard-days-night.html
Beatles. And I Love Her. http://fetisovvs.blogspot.com/2015/03/200-beatles-and-i-love-her.html
Beatles. Drive My Car. http://fetisovvs.blogspot.com/2014/05/200-beatles-drive-my-car.html 
Beatles. Hello Goodbye. http://fetisovvs.blogspot.com/2014/12/200-beatles-hello-goodbye.html
Beatles. Helter Skelter. http://fetisovvs.blogspot.ru/2014/06/200-beatles-helter-skelter.html
Beatles. Hey Jude. http://fetisovvs.blogspot.com/2014/07/200-beatles-hey-jude.html
Beatles. Lady Madonna. http://fetisovvs.blogspot.com/2015/10/200-beatles-lady-madonna.html
Beatles. Let It Be. http://fetisovvs.blogspot.com/2014/08/200-beatles-let-it-be.html
Beatles. Obla Di Obla Da. http://fetisovvs.blogspot.com/2014/10/200-beatles-obla-di-obla-da.html
Beatles. Yesterday http://fetisovvs.blogspot.com/2014/04/200-beatles-yesterday.html
Bon Jovi. Always. http://fetisovvs.blogspot.com/2015/04/200-bon-jovi-always.html
Bon Jovi. It's My Life. http://fetisovvs.blogspot.com/2014/10/200-bon-jovi-its-my-life.html
Bon Jovi. Livin' on a prayer. http://fetisovvs.blogspot.com/2015/08/200-bon-jovi-livin-on-prayer.html
Creedance Clearwater Revival. Have You Ever Seen the Rain? http://fetisovvs.blogspot.com/2014/11/creedance-clearwater-revival-have-you.html
Creedance Clearwater Revival. Hey Tonight. http://fetisovvs.blogspot.com/2015/04/200-creedance-clearwater-revival-hey.html
Creedence Clearwater Revival. Who'll Stop The Rain. http://fetisovvs.blogspot.com/2015/04/200-creedence-clearwater-revival-wholl.html
Deep Purple. Into The Fire. http://fetisovvs.blogspot.com/2014/05/200-deep-purple-into-fire.html
Deep Purple. Perfect Strangers. http://fetisovvs.blogspot.com/2015/09/200-deep-purple-perfect-strangers.html
Deep Purple. Smoke On the Water. http://fetisovvs.blogspot.com/2014/05/200-deep-purple-smoke-on-water.html
Depeche Mode. Personal Jesus. http://fetisovvs.blogspot.com/2014/11/200-depeche-mode-personal-jesus.html
Dire Straits. Money For Nothing. http://fetisovvs.blogspot.com/2015/06/200-dire-straits-money-for-nothing.html
Eagles. Hotel California. http://fetisovvs.blogspot.ru/2014/06/200-eagles-hotel-california.html
Electric Light Orchestra. Don't Bring Me Down. http://fetisovvs.blogspot.com/2015/04/200-electric-light-orchestra-dont-bring.html
Electric Light Orchestra. Ma Ma Ma Belle. http://fetisovvs.blogspot.com/2015/09/200-electric-light-orchestra-ma-ma-ma.html
Electric Light Orchestra. Ticket To The Moon. http://fetisovvs.blogspot.com/2015/02/200-electric-light-orchestra-ticket-to.html
Europe. The Final Countdown. http://fetisovvs.blogspot.com/2015/06/200-europe-final-countdown.html
HammerFall. Glory To The Brave. http://fetisovvs.blogspot.com/2014/10/200-hammerfall-glory-to-brave.html
Helloween. A Tale That Wasn't Right. http://fetisovvs.blogspot.com/2015/02/200-helloween-tale-that-wasnt-right.html
Helloween. Forever And One. http://fetisovvs.blogspot.com/2015/06/200-helloween-forever-and-one.html
Garry Moore. Parisienne Walkwsys. http://fetisovvs.blogspot.com/2014/07/200-gary-moore-parisienne-walkways.html
Gary Moore. Still Got The Blues. http://fetisovvs.blogspot.com/2015/02/200-gary-moore-still-got-blues.html
George Harrison. Got My Mind Set On You. http://fetisovvs.blogspot.com/2015/02/200-george-harrison-got-my-mind-set-on.html
Guns N' Roses. This I Love. http://fetisovvs.blogspot.com/2015/06/200-guns-n-roses-this-i-love.html
Joe Cocker. My Father's Son. http://fetisovvs.blogspot.com/2015/01/200-joe-cocker-my-fathers-son.html
Joe Cocker. Unchaine My Heart. http://fetisovvs.blogspot.com/2015/01/200-joe-cocker-unchaine-my-heart.html
Judas Priest. Breaking The Law. http://fetisovvs.blogspot.com/2015/05/breaking-law-british-steel-1979.html
Judas Priest. Private Property. http://fetisovvs.blogspot.com/2015/01/200-judas-priest-private-property.html
Judas Priest. Turbo Lover. http://fetisovvs.blogspot.com/2015/10/200-judas-priest-turbo-lover.html
Kiss. I was Made For Loving You. http://fetisovvs.blogspot.com/2015/05/200-kiss-i-was-made-for-loving-you.html
Kiss. Sure Know Something. http://fetisovvs.blogspot.com/2015/10/kiss-sure-know-something.html
Led Zeppelin. All My Love. http://fetisovvs.blogspot.com/2014/04/200-led-zeppelin-all-my-love.html
Led Zeppelin. Hot dog. http://fetisovvs.blogspot.com/2014/07/led-zeppeling.html
Led Zeppelin. Kashmir. http://fetisovvs.blogspot.com/2014/10/200-led-zeppelin-kashmir.html
Led Zeppelin. Whole Lotta Love. http://fetisovvs.blogspot.com/2015/01/200-led-zeppelin-whole-lotta-love.html
Metallica. The Unforgiven. http://fetisovvs.blogspot.com/2015/07/200-metallica-unforgiven.html
MSG. Anytime. http://fetisovvs.blogspot.com/2015/12/200-msg-anytime.html

Muse. Uprising. http://fetisovvs.blogspot.com/2015/07/200-muse-uprising.html
Nazareth. Bad Bad Boy. http://fetisovvs.blogspot.com/2014/07/200-nazareth-bad-bad-boy.html 
Nazareth. Hair Of The Dog. http://fetisovvs.blogspot.com/2015/01/200-nazareth-hair-of-dog.html
Omega. Pearls In Her Hair. http://fetisovvs.blogspot.com/2014/12/200-omega-pearls-in-her-hair.html
OMEGA. Russian Winter (Lena). http://fetisovvs.blogspot.com/2015/12/200-omega-russian-winter-lena.html

Pink Floyd. Another Brick In The Wall. http://fetisovvs.blogspot.com/2014/10/200-pink-floyd-another-brick-in-wall.html
Pink Floyd. Comfortably Numb. http://fetisovvs.blogspot.com/2014/04/200-pink-floyd-comfortably-numb.html
Pink Floyd. Have a Cigar. http://fetisovvs.blogspot.com/2014/11/200-pink-floyd-have-cigar.html
Pink Floyd. Money. http://fetisovvs.blogspot.com/2014/06/200-pink-floyd-money.html
Pink Floyd. Time. http://fetisovvs.blogspot.com/2014/08/200-pink-floyd-time.html
Pink Floyd. Wish You Were Here. http://fetisovvs.blogspot.com/2015/01/200-pink-floyd-wish-you-were-here.html
Paul McCartney. Monkberry Moon Delight. http://fetisovvs.blogspot.com/2015/07/200-paul-mccartney-monkberry-moon.html
Paul McCartney. Ms Vanderbild. http://fetisovvs.blogspot.com/2014/09/200-paul-mccartney-ms-vanderbild.html
Queen. Bohemian Rhapsody. http://fetisovvs.blogspot.com/2015/05/200-queen-bohemian-rhapsody.html
Queen. The Show Must Go On. http://fetisovvs.blogspot.com/2015/10/200-queen-show-must-go-on.html
Queen. Rock'n'Roll Medley. http://fetisovvs.blogspot.com/2014/10/200-queen-rocknroll-medley.html
Queen. We Will Rock You. http://fetisovvs.blogspot.com/2015/01/200-queen-we-will-rock-you.html
Rainbow. Ariel. http://fetisovvs.blogspot.com/2015/05/200-rainbow-ariel.html
Rainbow. Can't Let You Go. http://fetisovvs.blogspot.com/2014/12/200-rainbow-cant-let-you-go.html
Rainbow. Hunting Humans. http://fetisovvs.blogspot.com/2015/10/200-rainbow-hunting-humans.html
Rainbow. The Template Of the King. http://fetisovvs.blogspot.com/2014/11/200-rainbow-template-of-king.html
Ringo Starr. Back Off Boogaloo. http://fetisovvs.blogspot.com/2015/12/200-ringo-starr-back-off-boogaloo.html

Roger Waters. What God Wants. http://fetisovvs.blogspot.com/2015/07/200-roger-waters-what-god-wants.html
Santana. Europe. http://fetisovvs.blogspot.com/2014/08/200-santana-europe.html
Santana. I Love you Much Too Much. http://fetisovvs.blogspot.com/2014/12/200-santana-i-love-you-much-too-much.html
Scorpions. Blackout. http://fetisovvs.blogspot.com/2014/05/200-scorpions-blackout.html
Scorpions. Coast to Coast. http://fetisovvs.blogspot.com/2014/07/200-scorpions-coast-to-coast.html
Scorpions. Is There Anybody There. http://fetisovvs.blogspot.com/2015/04/200-scorpions-is-there-anybody-there.html
Scorpions. No One Like You. http://fetisovvs.blogspot.com/2015/06/200-scorpions-no-one-like-you.html
Scorpions. Rock You Like a Hurricane. http://fetisovvs.blogspot.com/2014/08/200-scorpions-rock-you-like-hurricane.html
Scorpions. The Zoo. http://fetisovvs.blogspot.com/2014/11/200-scorpions-zoo.html
Scorpions. When You Came Into My Life. http://fetisovvs.blogspot.com/2015/11/200-scorpions-when-you-came-into-my-life.html
Shocking Blue. Never Marry a Railroad Man. http://fetisovvs.blogspot.com/2015/07/200-shocking-blue-never-marry-railroad.html
Shocking Blue. Venus. http://fetisovvs.blogspot.com/2015/02/200-shocking-blue-venus.html
Simon & Garfunkel. The Sound of Silence. http://fetisovvs.blogspot.com/2015/12/200-simon-garfunkel-sound-of-silence.html

Slade. Get Down And Get With It. http://fetisovvs.blogspot.com/2015/05/200-slade-get-down-and-get-with-it.html
Slade. Ooh La La. http://fetisovvs.blogspot.com/2015/11/200-slade-ooh-la-la.html
Smokie. I'll Meet You At Midnight. http://fetisovvs.blogspot.com/2015/03/200-smokie-ill-meet-you-at-midnight.html
Smokie. Oh Carol. http://fetisovvs.blogspot.com/2015/08/200-smokie-oh-carol.html
Smokie. What Can I Do. http://fetisovvs.blogspot.com/2015/03/200-smokie-what-can-i-do.html
Status Quo. In The Army Now. http://fetisovvs.blogspot.com/2014/11/200-status-quo-in-army-now.html
Stray Cats. Ubangi Stomp. http://fetisovvs.blogspot.com/2015/07/200-stray-cats-ubangi-stomp.html
Stratovarius. Years Go By. http://fetisovvs.blogspot.com/2014/09/200-stratovarius-years-go-by.html
Styx. Boat On The River. http://fetisovvs.blogspot.com/2015/11/200-styx-boat-on-river.html

The Animals. House of the Rising Sun. http://fetisovvs.blogspot.com/2015/02/200-animals-house-of-rising-sun.html
The Doors. People Are Strange. http://fetisovvs.blogspot.com/2015/11/200-doors-people-are-strange.html

The Offspring. Come Out and Play. http://fetisovvs.blogspot.com/2015/07/200-offspring-come-out-and-play.html
The Rasmus. Shot. http://fetisovvs.blogspot.com/2015/09/200-rasmus-shot.html
The Rolling Stones. Paint It, Black. http://fetisovvs.blogspot.com/2015/08/200-rolling-stones-paint-it-black.html
U.D.O. Cry Soldier Cry. http://fetisovvs.blogspot.com/2015/09/200-udo-cry-soldier-cry.html
UFO. Belladonna. http://fetisovvs.blogspot.com/2015/08/200-ufo-belladonna.html
Uriah Heep. July Morning. http://fetisovvs.blogspot.com/2014/05/200-uriah-heep-july-morning.html
Uriah Heep. Lady In Black. http://fetisovvs.blogspot.com/2015/05/200-uriah-heep-lady-in-black.html
Uriah Heep. Look At Your Self. http://fetisovvs.blogspot.com/2014/08/200-uriah-heep-look-at-your-self.html
Uriah Heep. Return To Fantasy. http://fetisovvs.blogspot.com/2015/11/200-uriah-heep-return-to-fantasy.html
Uriah Heep. Sunrise. http://fetisovvs.blogspot.com/2014/10/200-uriah-heep-sunrise.html
Uriah Heep. Sympathy. http://fetisovvs.blogspot.com/2015/02/200-uriah-heep-sympathy.html
Zihard. Strange Time without You. http://fetisovvs.blogspot.com/2014/12/200-zihard-strange-time-without-you.html
ZZ Top. Jailhouse Rock. http://fetisovvs.blogspot.com/2015/08/200-zz-top-jailhouse-rock.html
Агата Кристи. Как на войне. http://fetisovvs.blogspot.com/2014/06/200.html
Агата Кристи. Каменное сердце (Черная луна). http://fetisovvs.blogspot.com/2015/04/200_16.html
Агата Кристи. Сказочная тайга. http://fetisovvs.blogspot.com/2015/09/200.html
АлисА. Вот так. http://fetisovvs.blogspot.com/2014/06/blog-post_9785.html
АлисА. Рок-н-ролл - это мы. http://fetisovvs.blogspot.com/2014/09/200.html
Ария. Улица роз. http://fetisovvs.blogspot.com/2015/03/200.html
Би-2. Полковнику никто не пишет. http://fetisovvs.blogspot.com/2014/09/200-2.html
Би-2. Последний герой. http://fetisovvs.blogspot.com/2015/02/200-2.html
Бутусов и Ю-Питер. Песня идущего домой. http://fetisovvs.blogspot.com/2014/08/200.html
Гарик Сукачев и Неприкасаемые. Дорожная. http://fetisovvs.blogspot.com/2014/07/200.html
Гарик Сукачев. Ольга. http://fetisovvs.blogspot.com/2015/04/200.html
ДДТ. Белая река (Агидель). http://fetisovvs.blogspot.com/2014/06/200_27.html
ДДТ. В последнюю осень. http://fetisovvs.blogspot.com/2014/07/200_31.html
ДДТ. Дождь. http://fetisovvs.blogspot.com/2015/04/200_22.html
ДДТ. Родина. http://fetisovvs.blogspot.com/2014/10/200_9.html
ДДТ. Что такое осень. http://fetisovvs.blogspot.com/2014/12/200_11.html
Земляне. Трава у дома. http://fetisovvs.blogspot.com/2015/05/200.html
Кино. Мы ждем перемен. http://fetisovvs.blogspot.com/2015/05/200_28.html
Кипелов. Я свободен. http://fetisovvs.blogspot.com/2014/04/200.html
Король и Шут. Лесник. http://fetisovvs.blogspot.com/2014/05/200_28.html
Король и Шут. Проклятый старый дом. http://fetisovvs.blogspot.ru/2014/08/200_27.html
Король и шут. Танец злобного гения. http://fetisovvs.blogspot.com/2015/01/200.html
Машина времени. Брошенный богом мир. http://fetisovvs.blogspot.com/2014/05/200_21.html
Машина времени. Мой друг лучше всех играет блюз. http://fetisovvs.blogspot.com/2014/06/200_19.html
Машина времени. Однажды мир прогнется под нас. http://fetisovvs.blogspot.com/2014/07/200_23.html
Машина времени. Синяя птица. http://fetisovvs.blogspot.com/2014/09/200_18.html
Моральный кодекс. Первый снег. http://fetisovvs.blogspot.com/2014/11/200.html
Моральный кодекс. Тёмные реки. http://fetisovvs.blogspot.com/2015/08/200.html
Наутилус Помпилиус. Взгляд с экрана (Ален Делон)http://fetisovvs.blogspot.com/2014/05/200.html
Наутилус Помпилиус. Железнодорожник. http://fetisovvs.blogspot.com/2015/04/200_29.html
Наутилус Помпилиус. Князь тишины. http://fetisovvs.blogspot.com/2014/10/200.html
Наутилус Помпилиус. Одинокая птица. http://fetisovvs.blogspot.com/2015/06/200.html
Наутилос Помпилиус. Последнее письмо (“Гуд-бай, Америка”). http://fetisovvs.blogspot.com/2014/12/200.html
Наутилус Помпилиус. Скованные одной цепью http://fetisovvs.blogspot.com/2014/07/200_16.html
Наутилус Помпилиус. Хлоп-хлоп. http://fetisovvs.blogspot.com/2014/10/200_23.html
Наутилос Помпилиус. Христос (Мне снилось) http://fetisovvs.blogspot.com/2014/06/200_12.html
Наутилос Помпилиус. Я хочу быть с тобой. http://fetisovvs.blogspot.com/2015/11/200.html
Несчастный случай. Генералы песчаных карьеров. http://fetisovvs.blogspot.com/2015/08/200_19.html
Ольга Кормухина. Путь. http://fetisovvs.blogspot.com/2015/09/200_10.html
Пикник. Египтянин. http://fetisovvs.blogspot.com/2014/04/200_25.htm
Пикник. Из мышеловки. http://fetisovvs.blogspot.com/2014/11/200_26.html
Пикник. Кукла с человеческим лицом. http://fetisovvs.blogspot.com/2015/09/200_30.html
Сплин. Линия Жизни. http://fetisovvs.blogspot.com/2015/11/200_19.html
Чайф. Аргентина-Ямайка 5:0. http://fetisovvs.blogspot.com/2015/12/200-50.html

Чиж и Ко. Еду, еду. http://fetisovvs.blogspot.ru/2014/08/200_20.html
Чиж и Ко. Фантом. http://fetisovvs.blogspot.com/2014/12/200_25.html

Вполне допускаю, что кое-кто из читателей захочет скачать себе понравившуюся композицию. В этом случае целесообразно конвертировать ее в общепринятый видео-формат, например, AVI или MKV. Очень просто это сделать при помощи хорошей и к тому же бесплатной программы Freemake Video Converter. Разобраться с ее работой достаточно просто, а - кроме того - можно почитать о том, как это сделать, да и вообще о ее возможностях в моей статье, опубликованной в белорусском интернет-журнале "Компьютерные вести" http://www.kv.by/content/freemake-video-converter-konvertor-video-i-ne-tolko