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

  • Звездочка (*) в шестёрке и хитрые bat-файлы

    Запуск java-программы из командной  строки.

    Представим такую ситуацию

    В результате вашей работы в качестве java программиста у вас получился один JAR-файл (для простоты назовем его mytools-1.0-SNAPSHOT.jar). Кроме него вы планируете использовать более десятка других jar-файлов.

    Ваша программа должна запускаться из командной строки, а не из супер-пупер IDE которую вы обычно используете в работе. Например Вашу программу нужно отправить другому человеку, у которого нет такой же как у вас среды разработки (Eclipse, NetBeans, IDEA и т.д.) или запустить на удаленном сервере доступ к которому осуществляется только через SSH. Таким образом, для запуска вашей программы вам нужно собрать все требуемые для работы jar-файлы, прописать их  в CLASSPATH и для удобства написать простой runme.bat файл или (runme.sh для линукса).

    Рецепт 1.

    Требуется: maven, maven-assymbly-plugin

    Если вы используете maven, то возможно Вам будет удобно воспользоваться  maven-assymbly-plugin. Найти информацию по нему можно здесь: http://maven.apache.org/plugins/maven-assembly-plugin/

    В результате вы можете собрать в один JAR-файл, который содержит всё необходимое для работы.

    Для этого:
    1. добавляем в pom.xml настройки для maven-assymbly-plugin.

    <project>
      [...]
      <build>
        [...]
        <plugins>
          <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-5</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
            </configuration>
            [...]
    </project>

    2. Запускаем сборку

    mvn assembly:assembly

    3. Получаем jar файл со всеми зависимостями:

    target/mytools-1.0-SNAPSHOT-jar-with-dependencies.jar

    Подробную информацию как работать со сборками можно получить открыв ссылку приведенную выше.

    Дальше, я предпочитаю копировать jar-файл в отдельную папку lib. После этого остается только создать простой BAT-файл в котором будет содержаться строка:

    java -cp mytools-1.0-SNAPSHOT-jar-with-dependencies.jar com.programmisty.Main %*

    %* – означает что все аргументы командной строки будут переданы в main-класс.

    Минусы: Если необходимо заменить только одну зависимость, приходится распаковывать и перепаковывать весь этот монолитный jar-файл.

    Рецепт 2

    Собираем все необходимые jar-файлы в одну директорию. Например с помощью maven это можно сделать командой

    mvn dependency:copy-dependencies

    Если вы не используете maven, можно просто скопировать руками все необходимые вам файлы.
    Затем копируем наш mytools-1.0-SNAPSHOT-jar и все дополнительные jar-файлы в папку lib.

    Если у нас windows, создаем BAT-файл runme.bat. В итоге у нас получается что-то вроде этого:

    .
    |_lib
    | |_mytools-1.0-SNAPSHOT-jar
    | |_commons-lang-2.4.jar
    | |_commons-logging-1.1.1.jar
    | |_commons-httpclient-3.1.jar
    | |-...
    |_runme.bat

    Теперь, возможно старым java программистам будет интересно узнать, что в Java 6 наконец-то в classpath можно использовать звездочку (*).
    Раньше многие делали так:

    set CP=lib/mytools-1.0-SNAPSHOT-jar
    set CP=%CP%;lib/commons-lang-2.4.jar
    rem "и так до самого конца"
    java -cp %CP% com.programmisty.Main %*

    Те кто похитрее делал так:

    setlocal ENABLEDELAYEDEXPANSION
    set CP=
    for %%i in (lib/*.jar) do set CP=!CP!lib/%%i;
    java -cp %CP% com.programmisty.tools.Main %*

    Если вы работаете в Linux, то для настоящего линуксоида получить список jar-файлов в директории и присвоить значение переменной — задачка “школьного” уровня. По этой ссылке можно найти несколько способ ее решения http://www.sql.ru/Forum/actualthread.aspx?bid=38&tid=569498

    Но теперь, если у вас java 6 это вообще не проблема, файл runme.bat может выглядеть следующим образом:

    java -cp "lib/*" com.programmisty.tools.Main %*

    Под линуксом wildcard (то есть звездочка) также успешно работает. Подробнее можно прочитать здесь: http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html в разделе “Understanding class path wildcards”

  • Camel Case

    camel caseCamel Case, он же — Верблюжий Регистр, он же — Горбатый Стиль.

    Определение из википедии — “стиль написания составных слов, при котором несколько слов пишутся слитно без пробелов, при этом каждое слово пишется с заглавной буквы. Стиль получил название CamelCase, поскольку заглавные буквы внутри слова напоминают горбы верблюда

    Такой стиль используется в языке программирования  Java. Для названия классов используют UpperCamelCase (верблюд поднял голову – первая буква большая),  для методов и объектов класса — lowerCamelCase (верблюд опустил голову).

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

    Не будь верблюдом, не плюй на других, используй верблюжий регистр!

    Пожалуйста, соблюдайте доброжелательное отношение к другим людям!

  • Hibernate. Update. Популярные грабли

    hibernate
    Сейчас многие любят реализовывать Data Access Object (DAO) на базе Hibernate.
    Хотелось уделить особое внимание работе с объектами в различных состояниях.
    Пример из документации :

       DomesticCat cat = (DomesticCat) sess.load( Cat.class, new Long(69) );
       cat.setName("PK");
       sess.flush();  // changes to cat are automatically detected and persisted
    

    Некоторые думают, что нужно делать так:

       DomesticCat cat = (DomesticCat) sess.load( Cat.class, new Long(69) );
       cat.setName("PK");
       sess.update(cat); // НЕ НАДО, ОНО САМО СОХРАНИТСЯ !!!! REMOVE THIS LINE
       sess.flush();  // changes to cat are automatically detected and persisted
    

    (далее…)

  • Редактор UML. Альтернатива

    Кончено, для создания UML диаграмм можно использовать такие продукты как   Rational Software Modeler (Rational/IBM)или например Visual Paradigm for UML. Если открыть википедию, то в разделе про UML-редакторы можно найти около 30 ссылок на различные инструменты UML моделирования.

    И все-таки, не смотря на такой большой список, хотелось выделить несколько довольно интересных редакторов.

    UMLet – www.umlet.com

    Этот редактор обладает убийственной простотой.  В нём все просто и без излишеств – без закругленных уголков, выпендрежных иконок и градиентной заливки.  Аскетичный,  но при этом удобный. Он содержит только то, что нужно для работы с UML. Приблизительно так выглядят диаграммы, когда мы их рисуем на листе бумаги (только с ровными линиями). (далее…)

  • Опять Scala

    Начал формировать небольшой справочник с примерами на Scala для собственного пользования.

    Импорт

    import java.util.{Date,Calendar}
    import java.util.logging._
    

    Простой цикл

    for ( x < - 1 to 10)  {
         println(x)
    }
    

    Получить класс

    classOf[String]
    // Например: LoggerFactory.getLogger(classOf[Foo])
    

    Создать список

    val x = new scala.collection.mutable.ListBuffer[Int];
    x+=1998
    x+=2000
    x+=2001
    x(0)=1999 // изменить элемент
    

    Простой match

    val x = "admin";
    x match {
         case "admin" => println ("Hello master!");
         case unknown => println("Hello " + unknown);
    }
    

    Простой try – catch

    try {
          //
          throw new IllegalAccessException("access!")
        } catch {
          case e: IllegalAccessException  =>
            println("IllegalAccess:" + e)
          case e: InstantiationException  =>
            println("Instantiation:" + e)
          case e =>
              // все остальные
              println("Unknown :(" )
        }
    
  • Учебное пособие по Scala. Вольный перевод.

    В связи с малым количеством (на момент публикации этого поста) полноценных учебных материалов по языку программирования Scala на русском языке , постарался сделать простой перевод краткого пособия.
    Оригинальная статья лежит здесь http://www.scala-lang.org/docu/files/ScalaTutorial.pdf
    Корректура текста будет осуществляться после публикации, по ходу получения отзывов, комментариев и повторной вычитки. Возможно, через некоторое время выложу PDF-версию.

    Scala Tutorial.

    Авторы: Michel Schinz, Philipp Haller. Версия 1.3. 15 марта, 2009

    Учебное пособие по Scala. Вольный перевод.

    Автор перевода: Вит. 30 марта 2010.

    Введение

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

    Первый пример

    В качестве первого пример мы возьмём стандартную программу Hello World. Возможно это не самый обворожительный примерчик, но зато он легко демонстрирует использование Scala и при этом не требует особых знаний самого языка.

    object HelloWorld {
        def main(args: Array[String]) {
            println("Hello, world!")
        }
    }
    

    Структура такой программы должна быть знакома Java-программистам. Она состоит из main-метода, который получает аргументы командной строки в виде массива строк в качестве параметров. Тело метода состоит из единственного метода println, в качестве аргумента которому передаётся «Hello, World!». Метод main ничего не возвращает, поэтому нет необходимости явно указывать тип возвращаемых данных.

    Java программиста может смутить в самом начале слово object в котором содержится main метод. (далее…)

  • Сортировка за O(N)-время

    Случайно наткнулся на статью на java.dzone.comFast O(n) Integer Sorting Algorithm!

    Всегда считал что O(n*log(n) ) это очень хороший показатель.  Например, стандартная реализация сортировки в Java 6 является слегка модифицированным вариантом merge sort, которая  соответственно дает время n*log(n).  Получить ультра ускорялку сортировки можно используя дополнительные хитрости: используя дополнительные знания о самих объектах которые мы сортируем + ограничения на возможные их значения.

    Если верить википедии Гарольд Сьюард (Harold H. Seward) в 1954 году из MIT изобрел ультра крутой способ сортировки  – radix sort (поразрядная сортировка), а также разработал counting sort (сортировка подсчетом).
    При такой сортировки мы не используем Comparator, т.е. сравнение и перестановка элементов как в обычной сортировки не происходит. С другой стороны, такой метод требует дополнительной памяти и
    особо эффективен в тех случаях, когда мы сортируем большое количество натуральных чисел ограниченных по возможным принимаемым значениям. Например: массив из 1000000 целых чисел, которые принимают значения от 0 до 1000.
    (далее…)

  • UML. Диаграммы классов. Отношения

    Мини-справочник по обозначениям которые приняты в UML диаграммах классов для отношений между различными классами.

    Обозначаются стрелками.

    Отношения на уровне классов.

    Generalization. Наследование.


    Самое обычное наследование: class A extends B {    }

    Implementation. Имплементация.


    Реализация интерфейса: class A implements I {   }

    Отношения на уровне объектов

    Association. Ассоциация.


    Семейство отношения между объектами классов.  “Студент” – “Преподаватель”, “Покупатель” – “Продавец” и т.д.  Может обозначаться вообще без стрелки.
    Агрегация и Композиция  –  подтипы ассоциации.

    Aggregation. Агрегация.


    Подтип ассоциации. Например один класс содержит (агрегируют) объекты другого класса.

    Composition. Композиция.


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

    Просто отношение

    Dependency. Зависимость.

    диаграмма классов зависимость

    Классы “каким либо образом” зависят друг от друга. Например, если у одного класса меняются методы, конструкторы или поля, и поэтому приходится переписывать другой класс, то значит они зависимы.  Одна из самых слабеньких связей.  Например объекты одного класса передаются как параметр в методы другого класса и т.д.

    Полезные ссылки

    1. Cтатья на  wikipedia. Рекомендую прочитать также эту же статью на английской википедии.
    2. Официальный сайт UML. Спецификация и т.д.
    3. uml2.ru – в целом по UML
  • Диаграмма последовательности (Sequence Diagram)

    Диаграмма последовательности (Sequence Diagram)

    Удобное средство для обозначения очередности следования друг за другом различных стимулов (сообщений), с помощью которых объекты взаимодействуют между собой.
    Например, когда нужно проработать буквально по шагам какой-то очень важный участок выполнения программы.
    Главный акцент – порядок и динамика поведения, т.е. как и в каком порядке происходят события.
    Отличие от диаграммы классов:
    Диаграмма классов дает статическую картинку, т.е. описание которое не меняется во время выполнения программы.
    Отличие от диаграммы коммуникаций (или как она раньше называлась colaboration):
    Диаграмма последовательности фокусирует наше внимание на очередности выполнения по времени, а диаграмма коммуникаций – на составляющих элементах.
    Обычно нормальные люди стараются описывать одной диаграммой только один определенный кейс (UseCase, вариант использования), например: “оставить коммент к сообщению в блоге”, “стать постоянным читателем” и т.д…
    Диаграммы последовательности,
    которые описывают всю систему сразу, представляют из себя монстра, пожирающего внимание, сознание, силы, время и мозг разработчика.

    Итак, предлагаю рассмотреть простенькую диаграмму последовательности.
    Возьмем банальный пример:

    диаграмма последовательности

    (далее…)