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

  • 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

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

  • Простые хаки и Greasemonkey


    Недавно обратил внимание на то, что шрифты на сайте java.net какие-то неприятные – мутные и плохо читаются. Может они всегда были такими, а я стал чуть-более придирчивым, а может быть стали такими после мега_перезагрузки_сайта.
    На самом деле не столь важно почему, важно понять как подправить…

    Могу предложить два способа из разряда “быстрых хаков”.

    Способ 1. Простой и скучный (и только для только для пользователей Firefox-а).
    Нужно в файле: C:\Documents and Settings\\Application Data\Mozilla\Firefox\Profiles\\chrome\userContent.css
    добавить настройку для конкретного домена:

    @-moz-document domain(java.net) {
      body {
        font-family: Arial,Helvetica,sans-serif !important; 
      }
    }
    

    Способ 2. Простые хитрости Greasemonkey.

    Greasemonkey (замасленная обезьяна, “механик”) – удобная тулза для различного рода кастомизации, переделавание и допиливания страничек. Один из моих любимых инструментов для подобного рода экспериментов.
    Если кратко, используя Greasemonkey вы сможете запускать свои скрипты на JavaScript-е у себя в браузере для определенных сайтов.

    Приведу несколько очень полезных ссылок:

    Кстати Greasemonkey сейчас работает в Google Chrome “из коробки”. Для установки вы просто драг-анд-дропаете в окно браузера ваш файлик (что-то типа sitefix.user.js) и он будет воспринят как обычное расширение.
    Для Firefox, как и раньше нужно поставить плагин https://addons.mozilla.org/ru/firefox/addon/greasemonkey/.

    Примерный скрипт для подмены шрифтов выглядит следующим образом:

    // ==UserScript==
    // @name           FontFix
    // @namespace      programmisty
    // @include        http://*.java.net/*
    // ==/UserScript==
    var head = document.getElementsByTagName("head")[0];
    var style = document.createElement("style");
    style.setAttribute("type", 'text/css');
    style.innerHTML = " body { font-family: arial,helvetica,sans-serif} ";
    head.appendChild(style); 
    

  • Удобный небезопасный кастинг

    Удобный автоматический кастинг

    Вещь не новая, но для тех, кто начинал программировать на Java в 90-ые и не очень привык к Generics-ам, это может быть интересно.

    Пример использования. Вам нужен метод, который возвращает объекты разных классов. Это могут быть обычные объекты – String, Integer, List, а могут быть и какие-то “свои” сложные бизнес-объекты вроде – ABController, XYZComponent, QWERTYHelper, FooManager (название зависит от возраста и предпочтений программиста).

    Так писали некоторые до Java 5.

        Helper helper = ....; // Какой-то вспомогательный класс, который хранит всякую ерунду
    
        String  path = (String) helper.get("storage.path");  // да, я знаю, хардкодить константы плохо. 
        Integer maxSize  = (Integer) helper.get("max.size"); 
        MyAwesomeDocumentManager manager = (MyAwesomeDocumentManager) helper.get("manager");

    Сейчас можно писать попроще. Конечно это сахар, но код выглядит полегче:
    (далее…)

  • Netbeans Scala Maven

    Если вам приходилось работать в связке Netbeans 6.9.1 + Scala + Maven, то вы могли заметить, что компиляция происходит сильно медленнее, чем если бы вы НЕ использовали maven-scala-plugin.
    Дело в том, что по умолчанию компиляция запускается в режиме “компилировать все классы”. Это не очень приятно, учитывая то, что Scala компилятор не очень-то быстрый.
    К счастью, такое поведение можно изменить, указав в настройках для recompileMode значение modified-only (компилировать только измененные). По-умолчанию оно all.
    В некоторых случаях перевод в режим modified-only удобен, например если ваша задача не выпуск финальной версии продукта, а работа над определенным куском кода в режиме “написал, нажал Shift-F6, посмотрел что получилось…”.
    Внимание! Перевод recompileMode в режим modified-only может привести к нежелательным последствиям и побочным эффектам. Как говорится, не уверен – не обгоняй (а уверен – обгоняй).

    Пример возможной (но далеко не оптимальной) модификации pom.xml.

    
        org.scala-tools
        maven-scala-plugin
          
               modified-only
         
    
    
  • Работа с видео и аудио в Java. Xuggle

    Первый раз мне пришлось столкнуться с обработкой видео на Java лет 10-12 назад. Я еще был студентом и работал над проектом, в котором мы пытались сделать видео проигрыватель в виде апплета.
    В те времена, для перекодирования видео мы пробовали использовать JMF (Java Media Framework). Нам нужно было сделать хитрую предварительную обработку видео, т.к. показ видео осуществлялся апплетом с помощью самописного алгоритма. В итоге пришлось отказаться от JMF в пользу приложения написанного на С++, т.к. JMF оказался не особо функциональным…

    С тех пор прошло много времени, я участвовал в различных более масштабных и менее сумасшедших (и наоборот) Java-проектах (никак не связанных с видео), а тот проект проект был благополучно сдан и забыт. При этом какие-то знания по способам хранения и сжатия мультимедийной информации оказалось прочно засели у меня в голове (и даже некоторое время мучили ночными кошмарами)…


    Говорят история развивается по спирали. В прошлом году взялся за проект, в котором опять-таки требуется работа с видео/аудио потоками. Небольшие исследования показали, что JMF с тех пор особо не прогрессировал. Нельзя сказать, что этот фреймворк стоял на месте, но прогресс шел явно медленней, чем развитие технологий работы с видео в целом.
    К счастью спасение пришло от проекта (далее…)

  • printf

    Небольшой справочник “для себя” по работе с джавным printf().

    Для простоты текста заменил System.out.printf() на printf().

    Базовые конструкции.

    %s → String или toString().

    printf("Hello %s!", "World"); //  "Hello World!"
    

    %n → Перенос строки.

    Byte, Short, Int, Long.

    %d → В десятеричном.
    %x → В шестнадцатеричном.

    %7d → В десятеричном. Минимальная ширина строки 7 знаков.

    printf("%7d", 1); //  "      1"

    %07d → Минимальная ширина строки 7 знаков. Начало забить нулями.

    printf("%07d", 1); //  "0000001"

    Float, Double.

    %f → Десятичное  число с точкой.
    %e → Десятичное  число с точкой и экспонентой.

    %.10f → С точностью 10 знаков после запятой.

    printf("%.10f", Math.PI); //  "3,1415926536"

    Date, Calendar.

    %tF → Дата в формате “год-месяц-день”.

    printf("%tF", new Date()); //  "2011-01-27"

    %tT → Время в формате “час:минута:секунда”.

    
    
    printf("%tT", new Date()); //  "22:42:37"
    
  • Читерство в 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. Внимание! Это только пример, возможно он Вам не подойдет.
    Будьте аккуратны, перед обновлением сделайте резервную копию!

  • Мизинец программиста

    Постановка задачи

    Если Вы программист и используете среду разработки (IDE) более интеллектуальную чем блокнот, то скорее всего Вам часто приходится пользоваться различными горячими клавишами. В большинстве случаев это комбинации содержащие нажатие клавиши Ctrl. Например в NetBeans:

    • Ctrl + Пробел = Автодополнение
    • Ctrl+ Q = К месту последнего редактирования
    • Ctrl +W = Закрыть окно
    • Ctrl + / = Комментировать строку
    • Ctrl + E = Удалить строку
    • Ctrl + K = Следующее слово
    • и т.д.

    Таким образом мы часто держим нажатой клавишу [Ctrl]. При этом расположение этой клавиши не совсем подходящее.  Одновременное нажатие  [Ctrl] и какой-нибудь кнопки левой рукой (например: Ctrl + E), может вызывать легкий дискомфорт в результате скрючивания мизинца на левой руке.

    Известные способы решения

    (далее…)

  • Самый лучший Singleton

    Из всех существующих на момент написания этого поста реализаций шаблона Singleton (одиночка) мне больше всего нравится эта:

     public class Singleton {
       // Private constructor prevents instantiation from other classes
       private Singleton() {}
    
       /**
        * SingletonHolder is loaded on the first execution of Singleton.getInstance()
        * or the first access to SingletonHolder.INSTANCE, not before.
        */
       private static class SingletonHolder {
         private static final Singleton INSTANCE = new Singleton();
       }
    
       public static Singleton getInstance() {
         return SingletonHolder.INSTANCE;
       }
     }
    

    Эту реализацию придумал  Bill Pugh. Это гениальный и очень простой способ. При помощи элегантного использования внутреннего класса Вы получаете ленивый (объект Singleton не инициализируется до моменты вызова метод getInstance())  и потоко-безопасный Singleton.

    Поскольку в классе Singleton нет статических полей которые нужно инициализировать, класс беспрепятственно загрузится. То есть Вам не нужно ждать, пока мы создадим объект Singleton в самом начале, когда загружаются классы.
    Смотрим дальше, когда объект INSTANCE будет создан? Тогда, когда мы вызовем метод getInstance(), что повлечет загрузку внутреннего класса SingletonHolder, что спровоцирует создание объекта INSTANCE. Поскольку фаза инициализации класса гарантировано (спецификацией) “не конкурента“, то у нас нет необходимости использовать synchronized и volatile. Ура!