Автор: vit

  • Desktop wallpaper в качестве инструмента проверки браузера под различным разрешением

    Используем обои для рабочего стола

    У моего монитора разрешение 1680×1050, а в работе иногда нужно время от времени смотреть как будет выглядеть содержимое браузер например под разрешением 1024×768 или 1280×800.

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

    Инструмент готов к использованию. Конечно это не так радует глаз как какая-нибудь супрематическая конструкция, но зато вполне утилитарно. Теперь для того, чтобы быстро проверить верстку в 1024×768 — подгоняем размер браузера под нужный прямоугольник и смотрим.

    При желании можно поместить в свободное пространство какую-нибудь приятную вам картинку. Я поместил Дюка (жавный маскот с красным носом). Он сейчас стал опенсорснутым, то есть вы его можете свободно (т.е. на халяву и безболезненно) использовать в различных целях. Например выкладывать в блогах и на своих веб страничках. Подробнее можно прочитать в “Open Source Duke”.

    Сами картинки с Дюком можно взять здесь.

  • Звездочка (*) в шестёрке и хитрые 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”

  • Test-driven development (TDD) и Постпозитивизм

    Давным-давно, когда я учился в аспирантуре физтеха по специальности “Моделирование, численные методы и комплексы программ”, одним из предметов которые нужно было изучать была философия. Лично для меня предмет не самый интересный, но благодаря  нашему преподавателю философии после пары лекций  учение Сэра Карла Раймунда Поппера вызвало  парадигм_шифт в сознании…

    Краеугольным камнем этого сдвига является критерий Поппера или фальсифицируемость (принципиальная опровержимость утверждения, опровергаемость).  Цитируя википедию, привожу следующее определение: “Критерий фальсифицируемости требует, чтобы теория или гипотеза не была принципиально неопровержимой.”

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

    Следуя правилам TDD мы с помощью набора тестов создаем условия, при которых наша программа ( “гипотеза“) может быть опровергнута! Далее,  в процессе разработки ПО мы добиваемся состояния, когда все тесты выполняются успешно  и “загорается зеленый свет”!

    А дальше у многих в голове происходит страшное…

    Люди начинают путать фальсифицируемость и верифицируемость(то есть доказуемость). Если все тесты прошли успешно, это не доказывает, что наша программа работает корректно. Соблюдение критерия Поппера — есть необходимое условие, но не достаточное.  Другими словами, если все тесты прошли успешно, этого недостаточно! Нельзя   утверждать, что программа работает корректно.

    Зачем же тогда писать юнит-тесты? Затем, чтобы в тех случаях когда тест не срабатывает мы точно знали — у нас есть ошибки. Это важно знать, иначе в программировании будет торжествовать мистика и мракобесие.

  • 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 :(" )
        }
    
  • мини-справочник по PKCS-ам

    Мой мини-справочник по PKCS-ам:

    PKCS#7 – Подпись и сертификаты  (Cryptographic Message Syntax Standard)

    PKCS#8 – Секретные ключи

    PKCS#10 – Запрос к УЦ на выпуск сертификата (Certification Request Standard)

    PKCS#11 – API для криптотокенов

    PKCS#12 – Хранилище секретных  ключей и сертификатов (Personal Information Exchange Syntax Standard)

    Как работать с подписью, ключами и сертификатами  в Java можно прочитать в официальном туториале

    Если лень, то готовые примеры можно взять на java2s.com

  • jenabean id (hashCode)

    В одной из предыдущих статей я уже писал об использовании связки: jena + jenabean. Следует обратить особое внимание на генерацию идентификаторов объектов в jenabean.

    Вот цитата с официального сайта:

    WhatsUpWithThat

    Questions about Jenabean

    Q: Why do I need to annotate my beans with an Id?

    Jenabean will create a URI for you, but it needs to know what makes your bean instance unique. Its class path and class name are useful, but it’s still necessary to distinguish between multiple instances of the same class. In the absence of an @Id annotated field or method, Jenabean will use the object’s hash code value (via the hashCode() method of java.lang.Object) but be warned, this is no unique, and will change when the bean is reconstituted from the triple store.

    Таким образом, если явно не указать идентификатор, то он будет генерироваться далеко не самым  надежным способом – через hashCode()!


  • Как программисты видят друг друга. Java, C, PHP, Ruby, Haskell

    Как программисты видят друг друга:

    как программисты видят друг друга

    Авторство, к сожалению, определить не смог, картинка сильно разошлась в интернете. Изначально, наткнулся на подобную картинку в комментариях к посту в блоге Алены С++ про программистов различных специальностей.  Еще интересная картинка,  которая меня порадовала как бывшего LISP-программиста: (далее…)