Friday, April 18, 2014

Monday, March 3, 2014

Сделайте этот мир прекрасней с помощью Intellij IDEA и дополнениями к CheckStyle!

Сделайте этот мир прекрасней с помощью Intellij IDEA и дополнениями к CheckStyle!



Многие в курсе, что Intellij IDEA на то и Intellij чтобы предугадывать наши мысли. Во многом это благодаря встроенным проверкам (инспекциям). Инспекции — это средства для статического анализа кода, которые помогают найти слабые места нашего кода и улучшить его структуру. А как на счет читаемости кода для дальнейшей его поддержки? В этом нам поможет CheckStyle-IDEA plugin.

Данная статья содержит размышления об автоматической проверке кода и описание процесса подключения кастомных (non-standard) чеков для плагина Checkstyle-IDEA в Intellij IDEA. Всех тех, кому это может быть интересно, прошу под кат.

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

Чтобы исправить ситуацию есть два пути:
  • Первый. Очевидный. Ты вчитываешься в текст, масса редакций, вариантов, применяешь техники, копируешь чужой стиль. И в итоге ты уверен на 100% в своей идеальности, приходишь весь гордый сдавать работу и… тебя отправляют переделывать. Потому, что стиль никчемный, ошибок куча и вообще ничего не понятно. Жизнь закончена, приходишь домой к девяти в пустую квартиру и плачешь на табуретке над своей работой.
  • Второй. Умный. Ты вчитываешься в текст, масса редакций, вариантов, применяешь техники, копируешь чужой стиль. Но, во время всего процесса совершенствования ты регулярно советуешься со своим наставником, учителем или ментором. Он знает критерии достойного стиля, проверяет оформление и контролирует все это в процессе, а не по итогу. Это менее травматично и переносится не так сложно.


Все эти проблемы я встретил при написании кода. Компилятор проверял мои “орфографические ошибки”, а хорошим наставником для проверки моего стиля программирования стал Checkstyle. По мере изучения правил чистого стиля, я писал новые проверки для Checkstyle в рамках проекта Sevntu-Checkstyle, которыe работали в Eclipse и во время сборки использовались Maven-ом. Но, так как на моей работе рекомендовано работать на IDEA, я решил адаптировать мной написанные проверки для этой замечательной среды разработки и начинать внедрять свои наработки в рабочий процесс. 

Данная адаптация будет интересна тем, кто работает под IDEA, пишет на Java и хочет контролировать качество кода с помощью Checkstyle плагина. Также вы увидите на примере, как расширять возможности плагина с помощью самописных правил специфичных для ваших проектов и командных требований.

Собственные проверки я написал при участии в проекте под названием «SevNTU-Checkstyle». (для справки: СевНТУ — Севастопольский Национальный Технический Университет).


Установка CheckStyle-IDEA.

1. Открываем file>Settings>IDE Settings>plugins. 
Жмем кнопку Browse repositories…
Ищем «Checkstyle-idea» и устанавливаем плагин.



Конфигурация CheckStyle-IDEA. Добавление новых проверок.

1. Качаем sevntu-checkstyle-idea-extension-X.XX.X.jar из репозитория. Файл содержит дополнительные проверки от проекта «SevNTU-Checkstyle».
2. Качаем стандартную конфигурацию этих проверок checkstyle-default-configuration.xml
3. Открываем file>Settings>IDE Settings>CheckStyle



4. Добавляем сторонние проверки(Third-Party checks), скачанные ранее.



5. Добавляем файл конфигурации для third-party Cheks.





Конфигурируем инспектор(Inspection).

По умолчанию IDEA проверяет код множеством встроенных проверок. Для того чтобы настроить IDE под свои потребности, нужно создать и настроить новый профиль. В данном случае, для демонстрации, мы оставляем включенный только Checkstyle.

1. Открываем: Analyze > Inspect Code… 



2. Добавляем новый профиль.



3. Выбираем все интересующие нас инспекторы, или как в нашем случае, только Checkstyle.
4. Жмем «Apply» и «ok».

Активизируем CheckStyle-IDEA

1. Открываем Analyze>Inspect code…
2. Выбираем нужный профиль, область анализа и жмем «ok».



3. Как результат, получаем анализ нашего кода 



Заключение

SevNTU Checkstyle проект может служить примером того, как внедрять в CheckStyle-IDEA плагин самостоятельно написанные проверки или использовать наши. 

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

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

Более подробная инструкция: How to use SevNTU Checkstyle in Intellij IDEA
Google группа для разработчиков: sevntu-checkstyle
Проект на GitHub: SevNTU-Checkstyle содержит 25 дополнительных проверок
CheckStyle-IDEA плагин: checkstyle-idea 

Изображения в заголовке взяты из статьи “URSUS WEHRLI, OR THE IMPORTANCE OF BEING COMPULSIVELY TIDY”









Tuesday, November 12, 2013

Install Eclipse on Ubuntu 12.10 64bit

This article describes process about:
- installation of JVM;
- installation of Eclipse IDE;
- tunning the Eclipse IDE for starting  from launch panel.

Installation of JDK.

  1.  Go to Java SE Downloads page and download archive .tar.gz with newest version of JDK - jdk-XuXX-linux-x64.tar.gz.
  2. Go to Eclipse Download page and downdload Eclipse IDE for Java EE Developers for Linux 64 bit.
  3. Suggest that download catalog is ~/Download.
  4. Go to ~/Download

  5. cd /Download

    and unpacking our JDK - jdk-XuXX-linux-x64.tar.gz.

    tar xvfz JDK - jdk-XuXX-linux-x64.tar.gz
    
  6. move the JDK 7 directory to /usr/lib
    sudo mkdir -p /usr/lib/jvm
    sudo mv ./jdk.1.7.0_02 /usr/lib/jvm/jdk1.7.0
  7. Now run
    sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0/bin/java" 1
    sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.7.0/bin/javac" 1
    sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.7.0/bin/javaws" 1
  8. Correct the file ownership and the permissions of the executables:
    sudo chmod a+x /usr/bin/java sudo chmod a+x /usr/bin/javac
    sudo chmod a+x /usr/bin/javaws
    sudo chown -R root:root /usr/lib/jvm/jdk1.7.0
  9. Run
    sudo update-alternatives --config java
  10. If you have a problem with maven like this

    Missing artifact com.sun:tools:jar:1.5.0:system pom.xml

    You can have eclipse start up using your built in JDK by altering the eclipse.ini and adding something like

    -vm
    /usr/java/jdk1.7.0_17/bin/java

    The example of eclipse.ini in Linux:

    -startup
    plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
    --launcher.library
    plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.1.200.v20120913-144807
    -product
    org.eclipse.epp.package.jee.product
    --launcher.defaultAction
    openFile
    -showsplash
    org.eclipse.platform
    --launcher.XXMaxPermSize
    256m
    --launcher.defaultAction
    openFile
    -vm
    /usr/java/jdk1.7.0_17/bin/java
    -vmargs
    -Dosgi.requiredJavaVersion=1.5
    -Dorg.eclipse.swt.browser.DefaultType=webkit
    -Dhelp.lucene.tokenizer=standard
    -XX:MaxPermSize=256m
    -Xms40m
    -Xmx512m

    From stackoverflow.com
  11. If you have problem like this:

    Unhandled event loop exception No more handles [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)]

    I founded the solution here askubuntu

    Use Webkit instead of XULRunner
    Install the package  and configured Eclipse  to use Webkit instead of Xulrunner by adding this line to the eclipse.ini:

    -Dorg.eclipse.swt.browser.DefaultType=webkit

    Restart Eclipse.
  12. If you have problem like this:

    Event log:

    Unhandled event loop exception


    org.eclipse.swt.SWTError: No more handles
    at org.eclipse.swt.SWT.error(SWT.java:4445)
    at org.eclipse.swt.SWT.error(SWT.java:4334)
    at org.eclipse.swt.SWT.error(SWT.java:4305)
    at org.eclipse.swt.browser.Browser.<init>(Browser.java:103)

    Just:
    sudo apt-get install libwebkitgtk-1.0-0



Saturday, September 14, 2013

Work with org.apache.commons.configuration.PropertiesConfiguration

When standard tools (java.util.prefs.Preferences) not enough for solving your goals with saving some properties, org.apache.commons.configuration.PropertiesConfiguration can help you.

  1. Configuration file creation.

    private static final Logger LOGGER = LoggerFactory.getLogger(ClientSettings.class)
    String propertyPath = "/userdir";
    String fileName = "fileName.property";
    File propertyDir = new File(propertyPath);
    if(!propertyDir.exists()) {
        if (!propertyDir.mkdirs()) {
                    throw new IllegalStateException(String.format("Cannot create property folder: %s", propertyDir.getAbsoluteFile()));
        }
    }
          File propertiesFile = new File(propertyDir, fileName);
          if (!propertiesFile.exists()) {
              try {
                 if (!propertiesFile.createNewFile())
                    throw new IllegalStateException(String.format("Cannot create property file: %s", propertiesFile.getAbsoluteFile()));
              } catch (IOException e) {
                LOGGER.error("Cannot create configuration file: %s", e);
              }
           }

  1. Specify the location of the file this configuration is based on and load the configuration.

    try {
           //allows to specify the configuration source as a file
           configuration.setFile(propertiesFile);
           //Locate the specified file and load the configuration.
           configuration.load();
           //Save the configuration to the specified file.
           configuration.save(propertiesFile);
    } catch (ConfigurationException e) {
           LOGGER.error("Cannot initializing a Configuration object.",e);
           return null;
    }


    The following possibilities exist:
    • URLs: With the method setURL() a full URL to the configuration source can be specified. This is the most flexible way. Note that the save() methods support only file: URLs.
    • Files: The setFile() method allows to specify the configuration source as a file. This can be either a relative or an absolute file. In the former case the file is resolved based on the current directory.
    • As file paths in string form: With the setPath() method a full path to a configuration file can be provided as a string.
    • Separated as base path and file name: This is the native form in which the location is stored. The base path is a string defining either a local directory or a URL. It can be set using the setBasePath() method. The file name, non surprisingly, defines the name of the configuration file.
      The configuration source to be loaded can be specified using one of the methods described above. Then the parameterless 
      load() method can be called. 
  1. Get String properties.

    configuration.getString(String key);
  2. Set properties.
    configuration.setProperty(String key, Object value);
    configuration.save();

    If property with such key is exist, value will be overridden.
  3. Add new property.

    configuration.addProperty(String key, Object value);configuration.save();

    If property with such key is exist, new property will be add anyway.

Monday, September 9, 2013

Install Oracle Java 8 in Ubuntu 12.04.

Run in terminal simple comands:
  1. Update repositories and install Java:

    sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get update && sudo apt-get install oracle-java8-installer
  2. Check java version:

    java -version

    Output must be similar to:

    java version "1.8.0-ea"
    Java(TM) SE Runtime Environment (build 1.8.0-ea-b54)
    Java HotSpot(TM) Server VM (build 24.0-b21, mixed mode)
  3. If you have several version of Java, you can switch between them:

    Check all installed JVM  on your computer:
    sudo update-java-alternatives -l

    Choose JVM and switch:
    sudo update-java-alternatives -s java-8-oracle

Convertion Russian characters to one with Unicode-encoded characters for Java application


  1.  Online http://native2ascii.net .
  2. With utillity natime2ascii in Sun JDK.

    Documentation: http://docs.oracle.com

    Create a file:
    touch ~/Test.txt

    Write to file Russian characters:
    echo Русский > Test.txt

    Go to the Java jdk bin directory:
    cd 
    /usr/lib/jvm/jdk1.7.9/bin

    And run the natime2ascii:
    ./native2ascii -encoding UTF-8 ~/Test.txt ~/Test.txt

    Look in the file:
    less ~/Test.txt
     \u0420\u0443\u0441\u0441\u043a\u0438\u0439


Tuesday, May 7, 2013

Replacing the default Exception dialog in Netbeans RCP

If you building a Netbeans RCP application and you would like to replace the current Exception dialog by a customised one. There are two ways to replace the standard “unexpected exception” window:

  1. The Lookup supports extension to the JDK's standard. It allows a module to remove class registered by another one.
    1. Implement your own java.util.logging handler  (using "@ServiceProvider(service=Handler.class)"). For example my.company.MyErrorHandler.
    2. Adding a META-INF/services for java.util.logging.Handler in your source. 
    3. Add to this file:

      #-org.netbeans.core.NbErrorManager
      my.company.MyErrorHandler

      The reason why the removal line starts with #- is to keep compatibility with JDK's implementation. The # means comment and thus JDK will not interpret the line and will not get confused by the - before class name.

      bits.netbeans.org
  2. You can superseding NbErrorManager.
    1. Implement your own java.util.logging handler 
    2. Use:

      @ServiceProvider(service=Handler.class, supersedes ={"org.netbeans.core.NbErrorManager"})")

      Geertjan's Blog