Рубрика: 1. Языки программирования

  • UML в Javadoc через maven+umlgraph

    UPD из 2025. Сайт UMLGraph похоже перестал поддерживаться, попробуйте PlantUML

     

    Где-то год назад писал про различные UML-редакторы.

    К сожалению, ситуация толком не изменилась, пока действительно удобного на 100% для себя инструмента для создания UML-диаграмм не нашел.
    UMLet – хорошо спасает в 80% случаев для быстрого прототипирования, но иногда его не хватает.

    Сейчас речь пойдет не о нем, а о UMLGraph.
    Это инструмент, который позволяет осуществлять декларативный способ рисования uml-диаграмм. Другими словами UML диаграммы создаются в текстовом виде, а не рисуется мышкой. Некоторым программистам (в частности мне) работать с текстом несколько удобней, чем с мышкой и со множеством графических объектов.

    Возможностей у UMLGraph довольно много, но лично меня интересовали только следующие его возможности:

    1. Рисование только диаграмм классов. Использование umlgraph для создания диаграмм последовательности, развертывания и т.д. мне не интересно.
    2. Встраивание полученных диаграмм в JavaDoc.
    3. Связка с maven-ом.

    В результате некоторых манипуляций, можно получить следующий результат:
    (далее…)

  • Java 7. Строки в переключателе


    В предыдущей статье я написал про некоторые новшества в Java 7
    (входящие в Project Coin) а именно:

    – Бриллиантовый оператор (Improved type inference for generic instance creation diamond)
    – Автоматически закрывающиеся ресурсы (try-with-resource).

    Конечно, это очень приятные вещи, но больше всего я рад появлению Strings in switch!
    Возможность использовать строки в switch люди ждут уже (далее…)

  • Дельфин, монета и бриллиантовый оператор.

    Релиз Java 7 должен выйти 28 Июля.
    В связи с этой знаменательно датой, я наконец-то решил посмотреть, что нас всех ждет. Поскольку в последнее время в основном занимаюсь Scala, то на новые языковые фичи в Java не обращал серьезного внимания (только на тусовках java-программистов, плюс поглядывал что пишут в разных блогах жависты).

    Итак Java 7.
    Продолжая традиции именования (Java 5 – тигр, Java 6 – мустанг), у нового релиза кодовое имя “Дельфин”.
    Список фич можно посмотреть здесь: http://www.oracle.com/technetwork/java/7-138633.html.

    Технических новшеств очень много. Среди них самое интересное место занимает так называемый “Проект Монета (Project Coin)“.
    (далее…)

  • do while false

    “Делать пока ложно”.

    Пару дней назад пытался кратко рассказать товарищу через аську про использование
    do { } while(false); для переписывания длинных ветвящихся if-ов.

    Кратко объяснить не получилось, в итоге решил написать в блоге.

    Метод довольно спорный, хотя и встречается в некоторых авторитетных источниках (например
    в “Совершенном Коде” С. Макконела).

    Идея довольно простая.
    0. Код помещаем в “do { …много_кода… } while(false);” блок. Если что-то не так вызываем break.
    1. Оператор break перекинет нас в конец блока do.
    2. Поскольку указан while(false), то повторного выполнения кода не будет.

    Конечно можно использовать для таких целей исключения, вспомогательные переменные и т.д., но думаю полезно знать и про такой способ, ведь некоторые его используют.
    Обычно он подходит для ситуаций когда идут ветвящиеся проверки if-else, а потом (если все хорошо) делается что-то сложное или важное.

    Примитивный (выдуманный) пример:

            boolean error = false;
            if (x > 10) {
                error = true;
            } else if (x > 0 && x < = 10) {
                y = foo();
                if (y > 0 && y < 10) {
                    error = true;
                } else {
                    x = y;
                }
            } // много if-else кода
            
            if (!error) {
                doSomething(x, y);
            }
    

    С помощью break-ов такой код приобретает более понятный (не для всех!) вид.

        do {
                if (x > 10) {
                    break;
                } 
                
                if (x > 0 && x < = 10) {
                    y = foo();
                    if (y > 0 && y < 10) {
                        break;
                    } else {
                        x = y;
                    }
                }
                // много кода для проверок
                doSomething(x, y);
            } while (false);
    
  • Мои хинты для Netbeans 7

    Недавно нужно было заново установить Netbeans 7.
    Вот некоторые действия, которые всегда приходится делать после установки “коробочной” версии,
    а именно: поддержка Scala, интерфейс на английском и quick file chooser.

    Установка

    Заходим на официальный сайт: netbeans.org
    Нажимаем на [Download FREE] и переходим на ссылку http://netbeans.org/downloads/index.html
    Скачиваем, устанавливаем и запускаем.

    Итак, что приходится делать:

    0. Обновления.

    На всякий случай проверить наличие обновлений:
    Меню → Help → Check for Updates

    1. Русский → English

    Чтобы вернуть обратно английский нужно:
    – Найти файл “netbeans.conf” (для Windows-пользователей: он должен находится где-то здесь – “C:\Program Files\NetBeans 7.0\etc\” )
    – Указать в настройках –locale en:US

    netbeans_default_options="МНОГО_БУКВ   --locale en:US"
    

    UPD: Почистить домашнюю папку “.netbeans/7.x” перед сменой локали, а то “Службы” и некоторые другие сообщения могут остаться на русском. Предварительно сделайте бэкап.

    2. File Chooser

    Сразу же установить плагин Quick File Chooser:
    Меню → Тools → Plugins → Available Plugins
    Это намного более шустрый и удобный (на мой взгляд) диалог для выбора файлов.

    3. Scala

    Ставим plugin для работы со Scala.
    Для версии 2.8.x: http://plugins.netbeans.org/plugin/36598/nbscala-2-8-x
    Подробнее можно прочитать на вики нетбинсов:
    http://wiki.netbeans.org/Scala
    или на портале с плагинами:
    http://plugins.netbeans.org/

  • Scala и пустота

    В Scala есть несколько разных сущностей для обозначения несуществующих, пустых или неопределенных объектов.
    Начнем с самого привычного для Java-программистов случая.

    Null

    Null – это trait. Объект null (с маленькой буквы) — это как раз и есть объект типа Null. Он находится внизу иерархии типов в Scala, в противовес AnyRef.
    Благодаря этому вы всегда можете как-бы “занулить” любую ссылку, т.е. присвоить ссылки значение null:

    scala> var x = "String"
    x: java.lang.String = String
    scala> var i = List(3)
    i: List[Int] = List(3)
    scala> i = null
    i: List[Int] = null
    scala> x = null
    x: java.lang.String = null
    

    Null работает только для ссылочных типов, для более общего случая, есть “ничто (Nothing)” .

    Nothing

    Nothing – это тоже trait. Nothing находится на самом дне иерархии типов, в противовес Any. Соответственно, это более общий тип, чем Null и подходит даже для AnyVal объектов (числа, буквы, правда/ложь и т.д.).

    В отличие от Null, Nothing не может иметь экземпляров (на то оно и ничто).
    Другими словами нет аналога null для Nothing.

    Возникает вопрос, где такое самое “нижнее ничто” может использоваться?
    В документации по API можно найти несколько примеров:

    // пакет scala.sys
    def error(message: String): Nothing = throw new RuntimeException(message)
    

    Этот метод никогда ничего не возвращает, поэтому возвращаемый тип Nothing.

    Unit

    Unitкласс, чем-то похоже на void, который используется в Java. В Scala тип Unit применяется тогда, когда нужно показать, что функция возвращает пустое значение (но все-таки что-то возвращает, хоть и пустое).

    Если открыть документацию, то можно увидеть что:

    class Unit extends Any with AnyVal
    

    Внимание! AnyVal, а не AnyRef. Это значит, что Unit это не ссылочный тип ( в отличие от Null). Можно сказать, что Unit-у как бы “ближе по родству” будут числа, буквы и другие примитивные типы (которые тоже AnyVal).

    В отличие от Nothing, Unit повезло больше. Он может иметь свой объект, правда в единственном экземпляре. Он обозначается двумя круглыми скобками: (). Например:

    scala> val u = ()
    u: Unit = ()
    

    Другими словами Nothing уместен тогда, когда функция в принципе ничего не возвращает, а Unit – это когда возвращает, но оно пустое.
    Это отличие существенно. Например результат вызова функции с Unit может быть присвоено (в Java с void такой фокус не выйдет).

    scala> def foo():Unit = {}
    foo: ()Unit
    scala> val u = foo()
    u: Unit = ()
    

    Nil

    Nilобъект, пустой список (extends List[Nothing]).
    Поскольку Nil – это список, хоть и пустой, у него как у любого списка есть метод :: (два двоеточия), с помощью которого удобно создавать списки:

    scala> var x = 1 :: 2 :: Nil
    x: List[Int] = List(1, 2)
    

    Это возможно благодаря тому, что название метода заканчивается на : (двоеточие), в таком случае метод применяется к правому операнду (работает для операторной нотации вызова метода).

    Другими словами, это аналогично вызову: (Nil.::(2)).::(1)

    None

    None – это такой хитрый объект (extends Option[Nothing]) , который используется в случае, если мы хотим получить что-то, например, из Map, а его там нет.

    Например:

    scala> var m = Map(1->2)
    m: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)
    scala> val n = m.get(100)// ну нет такого элемента
    n: Option[Int] = None
    

    None примечателен тем, что:

    • это объект (т.е. синглтон)
    • это кейс-объект
    • наследуется от Option[Nothing]

    В случае попытки получить значение (вызвав метод n.get()), мы получим исключение:java.util.NoSuchElementException.

    Если у None вызывать метод isEmpty() – мы получим true.

    Поскольку None – объект кейс-класса, то мы можем его “матчить” (сопоставлять по шаблону).

    scala> n match { 
     case Some(x) => println("x:" + x) 
     case None => println("none") 
    }
    

    Если у None вызвать метод toList – мы получим пустой список (т.е. Nil).

    scala> n.toList() == Nil
    res21: Boolean = true
    

    Поскольку None объявлен как extends Option[Nothing], а Nothing – “самое нижнее ничто”, то None может работать с любыми типами (как с ссылочными так и с примитивными).

  • EncryptableProperties и защита от дурака

    Все знают, что не следует хранить в конфигурационных файлах (например properties) критически важную информацию в открытом виде.
    Например логины и пароли от базы данных, почты и т.д.
    Не стоит этого делать, т.к. “случайный” сисадмин или пользователь сможет открыть этот ваш файлик и увидеть пароль.

    С учетом того, что довольно часто пароли придумывают люди, то запомнить их бывает очень просто.
    Более того, некоторые пароли настолько поражают воображение, что их очень сложно забыть. Как правило они выглядят так: 123456, sa, manager и т.д…
    Конечно это личное дело каждого, но выставлять на обозрения такие свои пароли, как-то не совсем прилично.

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

    Как вариант можно использовать Jasypt. Этот довольно большой проект и его можно использовать и в других целей, но мы будем разбирать простой и конкретный случай: предотвратить хранение паролей в открытом виде в properties файле.
    Главное, что нужно понимать, мы не строим защиту от серьезного злобного хакера, а делаем простую защиту от дурака!

    Для этого: (далее…)

  • Main args, netbeans

    Пара простых вещей (про аргументы командной строки + Java/Scala и чуть-чуть про NetBeans)

    Самый популярный и набивший оскомину пример HelloWorld встречается, наверное, уже во всех учебниках по программированию:

    // Пример из туториала: http://download.oracle.com/javase/tutorial/getStarted/application/index.html
    class HelloWorldApp {
        public static void main(String[] args) {
            System.out.println("Hello World!"); // Display the string.
        }
    }
    

    Здесь String[] args — аргументы командной строки.
    Например:
    java HelloWorldApp 1 2 означает, что args будет равно {“1”, “2”}.

    Рассмотрим как работать с этими аргументами.
    Если передается всего один аргумент (например, “debug”), то все очень просто — можно подсмотреть пример из туториала: cmdLineArgs.

    В случае, если аргументов много (как в гнусных линуксовых командах), то можно использовать какую-нибудь готовую библиотеку:

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

    В том случае, если аргументы не такие сложные и не слишком простые, а что-то среднее, то тянуть для этих целей дополнительную библиотеку нет никакого смысла. Например, если нужно передать что-то вроде: “-x -size 1024 -v”.
    Обычно это бывает, когда требуется небольшая, почти “одноразовая” программа…

    Многие настолько не любят писать разбор таких аргументов, что лепят все параметры в системные свойства (java … -Dfoo=”some string”), чтобы потом дергать их через System.getProperty().
    Это конечно удобно, но не всегда нормально.

    Проще написать разбор обычными стандартными средствами:

    public class App {
    
        public static void main(String[] args) {
            boolean v = false, x = false;
            int size = 0;     
            for (int i=0;iSnippet: Match Arguments.
    Что-то очень сложное – подключаем сторонние библиотеки для разбора аргументов командной строки (ту же апачевскую или jopt).
    В том случае, если что-то среднее, то можно написать на чистой Scala:

    object App  {
      def main(args:Array[String]) = {
          var v = false; var x = false; var size = 0   
         ("" +: args :+ "") reduceLeft ( (i, j) => {
            i match {
              case "-v"     => v = true
              case "-size"  => size = j.toInt
              case "-x"     => x = true
              case _ =>
            }; j
         })
        println("v =" + v )
        println("x = " + x)
        println("size = " + size)
       }
    }
    

    Пару слов про reduceLeft. По сути этот тот же foldLeft, только начинается с первого элемента коллекции. Подробнее можно почитать в Scala API по работе с коллекциями.

    Про другую известную многим фишку, о которой хотел рассказать — макросы в NetBeans-ах.
    Точнее, про самый популярный макрос - debug-var. Вызывается по нажатию: Ctrl-J D.
    Вообще макросы в нетбинсах есть уже много лет, по-крайне мере, когда я только начинал использовать нетбинс (3.* версии), они уже там были.
    Например, для Scala можно сделать макрос, который будет вставлять в код: println("var=" + var)

    Настроить можно здесь:
    Tools -> Option -> Editor -> Macros

    Про другие полезные макросы можно почитать здесь

  • Немного карри

    Использовать карринг в Scala одно удовольствие.
    Само определение каррирования(или карринга, названо в честь Хаскелла Карри):

    Для функции h типа h : (A × B) → C оператор каррирования Λ выполняет преобразование
    Λ(h) : A → (B → C)

    Отметим, что Λ – это оператор, то есть “функция над функциями”.
    Например берем функцию foo(x,y), каррируем и получаем moo(x)(y) – функцию от x которая возвращает функцию от y. (далее…)

  • Java + Excel файлы (Apache POI)


    С периодичностью раз в два-три года сталкиваюсь с проектами, в которых опять нужно работать с Excel файлами.
    Наверно это у меня что-то кармическое…
    Сейчас, в очередной раз приходиться реализовать полуавтоматический разбор сотен excel-файлов с прайсами.
    В прошлых своих проектах использовал JExcelApi.
    Ничего плохого про эту библиотеку сказать не могу, но хочется какого-то разнообразия в жизни поэтому в этот раз с товарищем решили попробовать Apache POI.

    Apache POI поддерживает как формат для обычных *.xls файлов (HSSF) так и *.xlsx файлы (XSSF).

    Кстати, формат для *.xls файлы в Apache POI они обзывают “HSSF – Horrible SpreadSheet Format”, то есть “Вселяющий ужас формат для электронных таблиц”.
    Для того, чтобы приступить к работе, как обычно прописываем зависимости в pom.xml:

      
            
                org.apache.poi
                poi
                
                3.7
            
        
    

    Для примера, приведу очень простой файл – список ФИО, сумма + Итог:

    Если нужно просто вытащить текст, можно использовать “класс-извелкатель”: ExcelExtractor (далее…)