What is groovy

Рубрика: Development, Groovy, Java | 26 January 2007, 18:31 | Vadim Voituk

Около полугода назад я впервые познакомился с Groovy – динамическим языком для платформы Java.
Он включает разнообразный syntax-sugar (как бы так правильно перевести?) из Python, Ruby, Smalltalk но при этом использует всю мощь JRE и близкий к Java синтаксис.
Вариантов для использоавния такого чуда техники масса: от написания рабочих простеньких утилит и shell-скриптов, до продуктивной разработки web-приложений, тест-кейсов, и сценариев сборки.
Кстати для последних двух задач у Groovy есть встроенные средства: поддержка Ant и JUnit на уровне языка.
Т.к. Groovy компилируется в .class – файлы, то связать поделки на Groovy с Java-программой труда не составляет.
Таким образом проект может быть запрототипирован на Groovy, а потом, при необходимости, понемногу заменять его Java-кодом.

Программа HelloWorld на Groovy будет выглядеть так:

println "Hello world!" // ";" можно не ставить 

Компиляция

groovyс Hello.groovy

На выходе получаем Hello.class
Запуск

groovy Hello

Т.к. в динамических языках фаза компиляции часто опускается, достаточно просто

 groovy Hello.groovy

По аналогии с Python у Groovy есть графическая (groovyConsole) и текстовая (groovysh) консоль.
Ввод команд в консоль необходимо завершать вызовом команды “go”.
Также достаточно интересной мне кажется команда “inspect” – открывает Groovy Object Browser на последней выполненой операции – такая себе минимальная IDE.

Но это все мелочи жизни.
Самое интересное в Groovy это поддержка на уровне синтаксиса списков, хэш-таблиц и замыканий:

[ 10, 20, 40, "Vadim", "Hello" ].each({println it});

или ещё веселее

["Brett":100, "Pete":"Did not finish", "Andrew":86.87934 ].each{it,val ->
println it  + "=>" + val
}

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

import javax.swing.*
def x = new JFrame(title:"Hello", size:[200, 300],
defaultCloseOperation:JFrame.EXIT_ON_CLOSE)
x.visible = true

Для “затравки” приведу ещё ссылку на статью “GUI in IronPython, Groovy and JRuby“, предлагается построить простенький GUI на 3х скриптовых языках, а также ссылку на колонку “Practically Groovy” на сайте IBM.

Переезд…

Рубрика: Блоггинг | 22 January 2007, 15:05 | Vadim Voituk

Для тех кто-то заметил, что несколько дней блог был “Under construction…” приношу свои извинения.
Дело в том, что этот ресурс долгое время работал на виртуальной UML машине, предоставляемой небезизветсным Максом Тульевым. Но на прошлой неделе всей этой системе пришел долгожданный пи конец.
Собственно вялый с моей стороны поиск нового хостинга и стал причиной столь длительного downtime-а.

Метки в Java – прозрение

Рубрика: Development, Java | 11 January 2007, 11:12 | Vadim Voituk

Сегодня утром был искренне поражен узнав что в Java есть метки.
Да-да, именно те самые метки какие есть в других языках и на какие можно “делать goto”.
К моей огромной радости оказалось, что ненавистного оператора goto все-таки в Java нет.
Но есть возможность выполнить continue или break с указанием метки.
continue <label> – это безусловный переход к началу блока (почти goto).
break <label> – это выход из блока кода помеченного меткой.
Практичных применений этому я пока не нашел но подозреваю, что можно использовать например выхода из набора вложенных циклов:

public class Test {

  public static void main(String[] argv) {
    lab1: for (int i=0; i<10; i++) {
      for (int j=0; j<10; j++) {
        if (j>=5 && i>5)
          break lab1;
        System.out.println(i + " / " + j);
      }
    }
  }

}

MySQL index usage and LIMIT statement

Рубрика: Development, MySQL, Работа | 5 January 2007, 10:28 | Vadim Voituk

Хочу рассказать об одной достаточно важной особенности SQL-оптимизатора MySQL.
Предположим в таблице почти 390 миллионов (389239897) записей.

Обычный запрос, выбирающий 10 записей за октябрь 2006 г.

EXPLAIN
SELECT *
FROM my_table
WHERE
    c_time>='2006-10-01 00:00:00' AND
    c_time<'2006-11-01 00:00:00'
LIMIT 10;

Обращаем внимаени на значения:
key: i_c_time
rows: 89221170

Такой же запрос, но без указания LIMIT:

EXPLAIN
SELECT *
FROM my_table
WHERE
    c_time>='2006-10-01 00:00:00' AND
    c_time<'2006-11-01 00:00:00';

key: NULL
rows: 389239897

Видно что разница в том, что во втором запросе не используется индекс по полю c_time (key:NULL)
Следовательно происходит полное сканирование таблицы.

Насильно указываем использовать индекс по c_time:

EXPLAIN
SELECT *
FROM my_table FORCE INDEX (i_c_time)
WHERE
  c_time>='2006-10-01 00:00:00' AND
  c_time<'2006-11-01 00:00:00';

Получаем заветные
key: i_c_time
rows: 89221170

Выясняем каким образом LIMIT влияет на использование индексов в запросах.

Указываем в LIMIT число, меньшее чем количество записей в таблице

... LIMIT 389239890

Получаем заветные
key: i_c_time
rows: 89221170

Указываем в LIMIT число равное количеству записей в таблице:
[sql]… LIMIT 389239897[/sql]
Имеем
key: NULL
rows: 389239897

И аналогичный запрос с указанием LIMIT бОльшим чем записей в таблице

... LIMIT 389239899

И аналогичный результат
key: NULL
rows: 389239897
т.е. полное сканирование всей таблицы

Следовательно при указании значения LIMIT >= количества записей,
оптимизатор MySQL выполняет полное сканирования таблицы.

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

Если же в запросе указать значение оператора LIMIT меньше чем записей в таблице,
то в выборке будет участвовать индекс.

За неименением свободного времени я не стал проводить тесты,
указывая в LIMIT диапазоны значений (например LIMIT 20000,30000),
но что-то мне подсказывает что ситуация будет аналогичная.