01 января 2014

Информация о git бранче и версии в командной строке SBT

06 октября 2010

Maven tips. Опции для многомодульных проектов

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

1. rf опция.
Большинство больших проектов разбиваются на несколько модулей, при этом запустив сборку родительского проекта запускается сборка всех дочерних. При падении сборки на одном из последних дочерних проектов, исправление ошибки и повторный перезапуск сборки приведёт к сборке всех всех модулей. Специально для таких случаев придумана опция resume(mvn -rf [родительский проект]), которая запустит билд с последнего поломанного проекта, не пересобирая уже собранные.
2. pl опция.
Ещё одна опция упрощающая жизнь, позволяет собирать только указанные проекты. В тех случаях когда нет необходимости собирать весь проект, а нужны только некоторые его модули можно воспользоваться опцией pl:
mvn -pl [модуль1],[модуль2] clean install


UPD.
Эмпирическим путём было установлено что опция pl является транзитивной. Тоесть если ваша структура проекта выглядит следующим образом:
корень
-модуль1
-модуль2
--сын_модуля2
-модуль3
--дочь_модуля3
И если вам необходимо сбилдить модуль1 и дочь_модуля3, то это возможно сделать с помощью следующей команды:
mvn -pl <модуль1>,<модуль3\дочь_модуля3> clean install


по мотивам 5 Maven Tips by Shekhar Gulati

Андрей Аксёнов. Прекращаем писать код.

Видео о BEST PRACTICES в программировании.

05 октября 2010

Apache Commons. Вывод всех "пропертей бина"

Работа программиста полна рутинных задач, которые делают её скучной и не интересной. Одной из таких задач есть переопределение стандартных методов: equals, hashCode, toString и др.
Не знаю как вы, но я метод toString в своих классах использую в основном для логгирования всей возможной информации об экземпляре класса. Так вот, в классах с большим числом пропертей (бинах) зачастую метод toString выглядит ужасно архаично. Кроме того при добавлении новых пропертей зачастую забывается добавить его вывод в toString, что добавляет проблем при будущих исследованиях ошибок. Рассмотрим на примере класса Student.

class Student {

String name;
Integer course;

public String toString() {
return "Имя: " + name + "Курс: " + course==null?"":course.toString();
}
}

Всё просто и примитивно, но не красиво, сложно и не сразу понято.
Специально для решения данных проблем в Apache Commons был создан класс ToStringBuilder, который самостоятельно соберёт строку или несколько строк из всех пропертей вашего класса. В результате использования данного класса наш пример примет следующий вид:

class Student {
String name;
Integer course;

public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
П.С.: По аналогии с ToStringBuilder в указанной библиотеке есть EqualsBuilder, HashCodeBuilder, CompareToBuilder которые также являются весьма полезными.

26 марта 2010

Мониторинг Java процессов

Линукс предоставляет замечательную утилиту ps, которая с опциями -ex позволяет получить полную информацию о запущеных java процессе, вместе с его Id(pid), и передаными параметрами. Но что же делать Windows пользователям? Диспечер задач довольно скуден и выбрать из списка в 5-6 java.exe интересующую просто не возможно.
Но выход есть. JDK предоставляет утилиту для мониторинга процессов под названием Java Virtual Machine Process Status (jps).

Использование:
cd %JAVA_HOME%\bin
и выполняем
>jps
для того что бы получить список запущеных Java процессов (JVM) и их ид.
>jps -v - кроме выше указаного выдаст нам детальную информацию о параметрах запуска.

23 февраля 2010

Использование целочисленного типа данных для размещения логических переменных

Представим себе что у нас есть некоторый объект, который описывается рядом логических параметров (флагов). Например объект у нас будет "спорткомплекс" , а параметрами
1) наличие тренажёрного зала - да/нет
2) наличие басейна - да/нет
3) наличие фитнес центра - да/нет
4) наличие футзала - да/нет
5) наличие боксёрского ринга - да/нет
и т.д.
Задача довольно проста, найболее эффективным образом хранить эти все параметры.
Самым тривиальным является вариант создания 5 булевых членов нашего класса, каждый из которых будет отвечать за свой параметр. Кроме простоты реализации, в памяти эти параметры для каждого экземпляра класса будут занимать всего лишь по 5 бит (1 boolean = 1 bit). Но, что произойдёт если надо передавать такую информацию по сети, да ещё и в более менее осмысленном виде, например в хмл. Каждый из параметров обростёт дополнительными тегами, в результате чего его размер возрастёт в несколько раз. Более того, формирование такого хмл самого по себе потребует определённых ресурсов. Необходимо найти более оптимальный метод хранения этих флагов.
Для решение этой задачи можно воспользоваться типом данных int. Как известно, целочисленный тип данных в джаве состоит из 4 байт - 32 бит. Если представить int в двоичном формате, то это будет ряд из 32х нулей и единиц, а это значит что мы можем разместить в нём аж 32 логических переменных. Для оптимального сохранения boolean переменных в int переменной удобно воспользоваться операцией побитового сдвига.
Например, для размещения флагов из выше изложенного примера, мы воспользуемся первыми 6тью битами целого числа (1й бит будет рабочим, и флаг в нём храниться не будет).
Итак, для примера, что-бы сохранить первые два флага в общей int переменной можно воспользоватся следующим кодом:

// set flag 1
int flag1 = 1; // flag = 0 / 1
int flagPosition = 1;
i = i + (flag1<<flagPosition);
// set flag 2
int flag2 = 1; // flag = 0 / 1
flagPosition = 2;
i = i + (flag2<<flagPosition);
System.out.println(i);

В результате на экран выведется число 6. В двоичной системе 6 = 110, и если отбросить первый служебный 0, то видим что оба флага установлены в единицу. Данный пример можно преобразовать в унифицированную функцию, например следующего вида:
...
int flags = 0;

void setFlags(int flagValue, int flagPosition) {
flags = flags | (flagValue<<flagPosition);
}
...

Данная оптимизация не даст выиграша в памяти при хранения экземпляра класса, но даст возможность более эффективно (де)сериализировать, и пересылать набор флагов по сети.

21 октября 2009

Своё - родное. Кирилица в java

Вступление...
Хотелось ли вам когда нибудь изобрести свой язык программирования, который бы позволял всё писать на кирилице и идентификаторы, и названия процедур-функций, и команды. Что то вроде:

Цикл ( целый И = 0 ; И < КоличествоДвигателей ; И++ )
Если (НеобходмаяМощность[И] < ДоступныйРесурс[И] ) Тогда
выделитьЕщёРесурсов(НеобходмаяМощность);
И--;
Иначе
запуститьПроцессПереработки();
Конец Если;
Конец Цикл;

Скажете бред. Вовсе нет, среди множества русскоговорящих программистов около 60% владеют английским языком на уровне pre-intermediate(ниже среднего) или еще ниже. Так что код, в котором все слова были бы интуитивно понятны вероятно для них был бы роднее. Так считаю не только я.
В любимом всеми читателями этого бложка язык программирования JAVA также сделал первый шаги в эту сторону. Нет, выше приведенный сегмент кода не будет работать, он даже не скомпилируется.
Продолжение...
Но вот следующий пример красочно демонстрирует лояльность java к кирилице, и совсем уж не ясно почему на просторах интернетов столько тем с комбинациями с трёх слов: java+кирилица+проблемы.


public class Гражданин {
private String Фамилия;
private String Имя;
private String Отчество;
private String Родина;
private int Возраст;
private boolean Беспартийный;
private boolean Судимый;

public String getФамилия() {
return Фамилия;
}
public void setФамилия(String фамилия) {
Фамилия = фамилия;
}
public String getИмя() {
return Имя;
}
public void setИмя(String имя) {
Имя = имя;
}
public String getОтчество() {
return Отчество;
}
public void setОтчество(String отчество) {
Отчество = отчество;
}
public String getРодина() {
return Родина;
}
public void setРодина(String родина) {
Родина = родина;
}
public boolean isБеспартийный() {
return Беспартийный;
}
public void setБеспартийный(boolean беспартийный) {
Беспартийный = беспартийный;
}

public boolean isСудимый() {
return Судимый;
}
public void setСудимый(boolean судимый) {
Судимый = судимый;
}
public void setВозраст(int возраст) {
Возраст = возраст;
}
public String toString(){
return
(Беспартийный?"Беспартийный":"Партийный")+" гражданин "+
Фамилия+" "+Имя+" "+Отчество+
" проживающий в "+Родина+
" "+Возраст+" лет отроду"
+(Судимый?" имеет судимости":" судимостей не имеет");
}

public static void Распечатать(Object подозреваемыйОбъект){
System.out.println(подозреваемыйОбъект);
}

public static void main(String []строчка){
Гражданин петров = new Гражданин();
петров.setФамилия("Иванов");
петров.setИмя("Иполит");
петров.setОтчество("Васильевич");
петров.setРодина("КНДР");
петров.setВозраст(45);
петров.setБеспартийный(false);
петров.setБеспартийный(false);
Распечатать(петров);

}

}


И получаем следующий вывод:

d:\projects\eclipse\Test\bin>java Гражданин
Партийный гражданин Иванов Иполит Васильевич проживающий в КНДР 45 лет отроду судимостей не имеет


Как показывает пример - идентификаторы, параметры, названия методов, и даже названия классов могут состоять из кирилических символов. Единственное что остаётся для меня пока тайной - в какой версии была введена такая возможность, существовала ли она всегда. Десяти минутное насилование googla не дало ответ на этот вопрос.

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

10 мая 2009

[Oracle PL/SQL] Преобразование строки в маcсив

Несколько дней назад перед мною стала интересная задача : необходимо список сокращений, представленных в виде строки через запятую, преобразовать в массив.
На ум сразу приходит самое простое но не очень эстетическое решение - написать Pl/Sql процедуру, которая будет выполнять такую задачу.


SQL> CREATE OR REPLACE FUNCTION convert_comma_to_table(p_list IN VARCHAR2)
2 RETURN test_type
3 AS
4 l_string VARCHAR2(32767) := p_list || ',';
5 l_comma_index PLS_INTEGER;
6 l_index PLS_INTEGER := 1;
7 l_tab test_type := test_type();
8 BEGIN
9 LOOP
10 l_comma_index := INSTR(l_string, ',', l_index);
11 EXIT WHEN l_comma_index = 0;
12 l_tab.EXTEND;
13 l_tab(l_tab.COUNT) := SUBSTR(l_string, l_index, l_comma_index - l_index);
14 l_index := l_comma_index + 1;
15 END LOOP;
16 RETURN l_tab;
17 END f_convert;
18 /
Довольно простая функция, которая успешно выполнит поставленную задачу.
Потратив некоторое время на поиски , я натолкнулся на вариант покрасивее. В системном пакете dbms_utility есть функция comma_to_table , которая выполняет аналогичную функциональность. Пример использования :
SQL> DECLARE
2 l_tab dbms_utility.uncl_array;
3 l_tablen number;
4 BEGIN
5 dbms_utility.comma_to_table('A,B,C', l_tablen, l_tab);
6 dbms_output.put_line('TABLE LENGTH : '|| l_tablen);
7 dbms_output.put_line('TABLE COUNT : '|| l_tab.COUNT);
8 for i in 1..l_tablen
9 loop
10 dbms_output.put_line(l_tab(i));
11 end loop;
12 END;
13 /
Замечание! На самом деле эта процедура используется для внутренних целей Oracle, поэтому имеется ряд требований к элементам будущего массива:
- это не должны быть числа, в т.ч. слова начинающиеся на цифры;
- это не должны быть зарезервированные слова;
- это не должны быть строки длиннее 30 символов.
Первые два условия я обошёл добавляя перед каждой запятой спец строку, а после преобразования удаляя её, так что в итоге удалось воспользоватся этой удобной поцедуркой из dbms_utility.

Судьба блога 2009

Уже почти год как я поменял специализацию - теперь я программирую на PL/SQL под Oracle. Так что тематика статей далее тоже немного изменится. Это не значит что я перестану писать о Java. Нет. Кровь Java девелопера всё ещё течёт в моих жилах, так что я продолжу развиватся в этом направлении. Но обстоятельства таковы, что я на данный момент прокачиваюсь в области Oracle и готов делится кое какими своими наработками.

Спасибо за внимание. Читайте с удовольствием.

05 декабря 2008

Java FX 1.0 релиз состоялся

Вчера, 04.12.2008, состоялся релиз Java FX 1.0. Посмотреть примеры работы, изучить туториалы и скачать SDK можно с сайта http://www.javafx.com/

Sun's JavaFX 1.0 platform opens a vast global market for developers and content authors who want to deploy their content, services and experiences across all the screens of their customers' lives. Worldwide industry estimates show that Java technology is already on more than 90 percent of desktops and laptops, 85 percent of mobile devices and is a technology leader in next-generation televisions, Blu-ray disc players and TV set-top boxes.