Рубрики
3. Инструментарий Java

Про настройку шрифтов в IDE (Netbeans) под Linux.

Какой самый лучший шрифт для программиста?
Каждому своё.
Одним нравятся округлые очертания, другому наоборот тонкие и острые. Поэтому выбор шрифта — дело вкуса, хотя конечно есть базовые требования.
Самое главное и очевидное — шрифт должен быть моноширинным, т.е. все символы должны быть одной ширины. Это очень важно для того, чтобы сохранить структуру кода, т.к. иначе будут плыть все отступы и исходный код будет плохо читаться.
Если человек пришел в программирование с дизайнерским/типографским прошлым, такой шрифт его может раздражать. Моноширинные шрифты не самые приятные для чтения, хотя их используют не только программисты-техногики, но и люди искусства.
Например, если верить википедии, в западной театральной и кинематографической традиции сценаристы используют шрифт Courier-12. Одна страница такого сценария длится примерно одну минуту. Вроде это какой-то даже у них стандарт де-факто в отрасли.

Кроме моноширинности, при выборе следует обратить внимание на следующее:
- Цифра 0 (ноль) должна отличаться от буквы O.
- Цифра 1 (один) должна отличаться от буквы l (маленькая L).

Что касается меня, то сейчас я использую шрифт Consolas.

Специфика Linux.

На момент написания этой статьи у некоторых пользователей Linux (Ubuntu) есть определенное недовольство качеством отображения шрифтов в IDE.
Итак, что можно попробовать сделать.

Во-первых, я ставлю набор микрософтовских шрифтов:

$sudo apt-get install ttf-mscorefonts-installer

Во-вторых, особо чувствительные к шрифтам могут поставить Infinality.

В-третьих и самое главное. Это не сильно помогает, т.к. на момент написания этой статьи в Java (точнее в её графической подсистеме AWT/Swing) есть какие-то проблемы с красивым отображением шрифтом в Ubuntu. Другими словами проблема актуальна для Netbeans и Android Studio.

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

Рубрики
3. Инструментарий Java

DCE VM + HotSwap

Горячая замена.

Исходной предпосылкой было как-то упростить процесс разработки/отладки. В некоторых ситуациях, например когда запуск-перезапуск приложения или теста занимает продолжительное время, очень удобно пользоваться возможностью подправить логику работы уже запущенной программы.
В поисках решения наткнулся на довольно занятное решение - Dynamic Code Evolution VM. Данная виртуальная машина является результатом работ проведенных в рамках исследовательского проекта Институтом системного программного обеспечения им. Иоганна Кеплера в г. Линце (Австрия).

Если грубо описать полученный результат - это специальная "пропатченная" Java VM, которая позволяет на лету править классы в работающей машине. Главная плюшка - если обычно при дебаге вы можете "на горячую" менять содержимое метода, то в DCE VM можно еще и добавлять/удалять методы и поля в классе.

К сожалению с установкой DCE VM у меня не заладилось с самого начала. Инсталлятор не сработал, в итоге пришлось просидеть полночи в попытках заполучить эту чудную VM. К решению этой задачи пробовал подступиться с разных сторон. Пытался собрать исходники. Собирать пришлось из под cygwin-а (в очередной раз пожалел, что сейчас у меня рабочая операционка не Linux). Потом возникли сложности с установкой "Microsoft SDKs Windows v7.1", который почему-то не хотел устанавливаться. В итоге, правдам и неправдами, перед самым рассветом, перерыв кучу ссылок в интернете различными кривыми путями мне удалось стать счастливым обладателям этой машинки. Конечно сейчас, оглядываясь назад, у меня создается впечатление, что на самом деле я сделал кучу лишних шагов и про установку DCE VM информации более чем достаточно, главное внимательно читать инструкцию.

Мои эксперименты.

После того как всё настроил Hot Swap заработал сразу на:

  • Простых Java SE проектах.
  • Java Web проектах под Apache Tomcat.

Схема работы простая. Запускаем под дебагом → Делаем изменения → Жмем Apply Changes.

apply_code_changes

Если речь идёт о более экзотических случаях, например разработка Rich приложений на Netbeans Platform - то горячая замена у меня не заработала. Чуть позже у меня появилась гипотеза, что возможно это связано с тем, что у Netbeans Platform свой ClassLoader. Возможно гипотеза неверна и дело в настройках, думаю в свободное время посмотреть более внимательно исходники проекта и утилит, которые идут вместе с ним.

Рубрики
3. Инструментарий Java

Java и десктоп приложения. Впечатления от Netbeans Platform.

Последнее время проектирую и разрабатываю десктоп приложение на Java. После нескольких лет разработки веб/мобильных решений было очень интересно вернуться к десктопу. Сейчас, в эпоху расцвета различных веб-фреймворков (только среди Java: Spring MVC, GWT, JSF, Tapestry, Wicket, Vaadin и т.д.), для разработки десктопных приложений на Java не такой уж большой выбор.
На мой взгляд, на данный момент есть всего три более-менее популярных подхода:

0. Чистый Swing/JavaFX
1. Использовать Eclipse RCP (Rich Client Platform)
2. Netbeans Platform

Поскольку с самого начало было понятно, что предстоит разработать сложную систему с несколько десятков различных формочек, множеством сложных таблиц с группировкой/сортировкой данных, а в перспективе графики, схемы и другие компоненты, то естественно у меня не было желание использовать чистый Swing/JavaFX, а воспользоваться какой-нибудь из платформ.

Первым делом были мысли использовать все-таки Eclipse (в прошлом у меня был опыт работы с ним). Конечно впечатления были не самые лучшие, но прошло больше 8 лет с тех пор как я имел с ним дело и многое могло измениться. Просмотрел изменения и одновременно начал опрашивать друзей, писал ли кто-нибудь в последнее время для Eclipse RCP. В итоге про Eclipse я услышал мало хорошего. Если резюмировать, главный вывод, который можно было сделать после бесед с друзьями — Eclipse RCP использовать можно, но скажем деликатно, без особого удовольствия. В конечном счете я решил переключиться на Netbeans, к которому присматривался уже давно.
Забегая вперед скажу, что в целом мне платформа пока нравится.

Рубрики
3. Инструментарий Java Scala

Мои хинты для 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/

Рубрики
4. Полезняшки Java Scala

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;i<args .length;++i) {
            String arg = args[i];
            if (arg.equals("-v")) {
                v = true;
            } else if (arg.equals("-size")) {
                size = Integer.parseInt(args[++i]);//да, здесь может быть ArrayIndexOutOfBoundsException
            } else if (arg.equals("-x")) {
                x = true;
            }
        }
        System.err.println("v = " + v);
        System.err.println("x = " + x);
        System.err.println("size = " + size);
    }
}

В Scala все то же самое.
Тривиальный случай – делаем как в примере на официальном сайте: Snippet: 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

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

Рубрики
4. Полезняшки Scala

Читерство в NetBeans. Ввод и использования мат. символов и букв греческого алфавита.

Оригинальная идея взята из поста Gabriel's software development blog. Статья довольно старая, опубликована еще в прошлом году .

Если коротко:

def(x:Double)=Math.sqrt(x)
def(r:Range)(f:Int => Int)=r.foldLeft(0)(_+ f(_))
def(r:Range)(f:Int => Int)=r.foldLeft(1)(_* f(_))
val s=(1 to 100)(x=>(x))

Это обычный Scala код! Выглядит он прикольным, потому что мы используем знакомые всем со школы/института символы. Но как сделать так, чтобы было удобно вводить эти символы для меня было загадкой.

В итоге недавно случайно придумал как это можно сделать просто и удобно средствами IDE, а точнее в NetBeans.

Я вбил все нужные мне символы в Code Templates (Tools → Options → Editor → Code Templates) и сделал два макроса для [Alt+<] = "←" и [Alt+>] = "⇒".

Как это работает можно посмотреть здесь:

То есть вы вводите например alpha и жмете [Tab], в результате в код вставляется α. Самое главное, это настраивается только для нужного языка (в частности Scala), таким образом это не мешает в работе с другими языками. Также если вы хотите написать просто alpha, без преобразования, вы просто НЕ нажимайте [Tab] и всё!

Самое главное! Исходники должны быть в UTF-8 (ну или другой юникодной кодировке)!
P.S.: На самом деле вбивать весь греческий алфавит довольно скучное занятие, можно найти файл вроде этого:

C:\Documents and Settings\<USER_NAME>\.netbeans\6.9\config\Editors\text\x-scala\CodeTemplates\org-netbeans-modules-editor-settings-CustomCodeTemplates.xml

и сгенерить туда все аббревиатуры.

Вот пример моего файла - CustomCodeTemplates.zip. Внимание! Это только пример, возможно он Вам не подойдет.
Будьте аккуратны, перед обновлением сделайте резервную копию!

Рубрики
3. Инструментарий

GWT 2.0 + GXT (Ext GWT) + Maven

1. GWT (Google Web Toolkit, произноситься: /'gwit/). На момент написания поста текущая версия  - 2.0.3.  Загрузить можно с официальной страницы GWT - http://code.google.com/intl/ru/webtoolkit/download.html.

Вкратце механизм работы GWT можно описать так.  Исходный код пишется на Java, затем он транслируется в JavaScript,  в результате получаются несколько версий программ для разных браузеров (Firefox, IE, Safari, Google Chrome, Opera 9.0). Полученный JavaScript код неплохо оптимизирован - название переменных и методов сокращенны, убраны комментарии и лишние пробелы. В итоге получается его естественная обфускация.  (Пример кусочка полученного кода: function Y7(a){W7();LE(a);a.Vb=NOc;return a} ).

После выхода версии  GWT 2.0 появилась возможность разбивать полученный JavaScript код (runAsync)  на отдельные файлы, которые затем загружаются асинхронно по мере надобности.  Так уменьшается размер первоначального скрипта и как следствие время загрузки и запуска приложения.

Подробное описание есть на официальном сайте GWT.

Рубрики
Без рубрики

Чтобы заработал enhancer от DataNucleus нужно в NetBeans
Project Properties -> Build / Compiling -> Turn Off "Compile on Save"

Рубрики
Без рубрики

Scala и UTF-8

При работе со Scala в Netbeans возникают проблемы с русскими буквами.
Нужно
1. *.scala должны быть в UTF-8
2. в C:\Program Files\NetBeans 6.1\etc\netbeans.conf
добавить к параметру netbeans_default_options значение: -J-Dfile.encoding=UTF-8

Рубрики
Без рубрики

Scala и Netbeans

для того чтобы заработала scala в нетбинсе нужно указать в
"C:\Program Files\NetBeans 6.1\etc\netbeans.conf"

netbeans_default_options= .. -J-Dscala.home=< Путь_к_скале>

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