пятница, 19 января 2018 г.

Intellij Edea File Template Entity without data base, as in Netbeans. Шаблон создания файла сущности в IDE Idea/

Давненько я свои заметки не публиковал :) Прошу прощения на форматирование текста, когда-нибудь я изменю шаблон и оберну весь код в спойлеры с красивым оформлением :)
На днях понял, что в Intellij Edea нет шаблона для создания обыкновенного файла сущности. Можно лишь создать его на основе таблицы в БД.
А вот если ты хочешь маппить данные в БД с помощью Hibernate, то создавать придется сначала класс, затем добавлять икьюалс, хешкод, туСтринг, геттеры, сеттеры, сериализацию, аннотации и т.д.

В Netbeans это делается в два клика, в Idea этого вообще нет, по крайней мере я долго искал и не нашел.
Недолго думая и имея в запасе немного время, создал шаблон.
По шагам, картинками и кодом, покажу как его добавить в свою Idea.
Есть в нем, конечно, недочеты, которые я бы устранил, возможно, будь у меня время и желание улучшать его дальше :)

Вот так сейчас выглядит в меню пункты для создания новых файлов, мы можете свой созданный шаблон назвать как угодно, у меня он назван просто Entity.
Ниже на скриншоте видно пункт:
Edit File Templates...
Сюда нам и нужно...




































Откроется окно, в нем жмем на плюс слева, переименовываем как хотим наш шаблон, а справа вставляем код на, как я понял, Apache Velocity:

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;
@Entity #if (${Class_Name} != ${Class_Name}) (name=${Class_Name}) #end
public class ${Class_Name} implements Serializable {
   ##set ( $id_field_type = "Integer")
   private static final long serialVersionUID = 1L;
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private ${id_field_type} id;
   
   public ${id_field_type} getId() {
        return id;
    }
    
    public void setId(${id_field_type} id) {
        this.id = id;
    }
        
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }
        
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof ${Class_Name})) {
            return false;
        }
        ${Class_Name} other = (${Class_Name}) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "src.${Class_Name}[ id=" + id + " ]";
    }
}

Обратите внимание на строку
##set ( $id_field_type = "Integer")
Если ее раскомментировать, т.е. убрать ОДИН символ решетки # в начале,
то вам не нужно будет при создании файла вводить значение переменной id_field_type.
#set ( $id_field_type = "Integer")
И окно при создании нашего файла Entity будет выглядеть не так:











А вот так:











Нам нужно будет ввести лишь имя, а поле id будет создано с типом Integer.
Как вы понимаете, если в коде шаблона изменить "Integer" на "Long", то и в созданном файле тип поля id будет с этим типом, т.е. по-умолчанию.
При закомментированной строке придется тип указывать ручками каждый раз при создании файла.
Кроме того, чтобы выглядело красиво можно вместо id_field_type ввести что-то типа Type_of_id_field и тогда в окне создания файла слева от поля будет Type of id field.

В итоге, мы получим в пару кликов и после ввода имени класса, например Contact, вот такой вот файл, который идентичен тому, что получается в Netbeans:

package com.opalev.models.contractor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;

@Entity
public class Contact implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Contact)) {
            return false;
        }
        Contact other = (Contact) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "src.Contact[ id=" + id + " ]";
    }
}

среда, 24 августа 2016 г.

Shutter count Canon 7d mark II, или как узнать количество срабатывания затвора

Добавлено 20.03.2017. Внимание, я только что сам проверил на своей камере, в общем, НЕ РАБОТАЕТ. Похоже, когда я в прошлый раз проверял, я попал под какую-то акцию или что-то вроде того и бесплатно проверил шуттерКаунт. Теперь же она не работает. Пробовал без интернета, оказалось, что она не работает без него. Расходимся господа.
п.с. А я то думаю, чо под постом ни одного комментария нет.

Решил перед продажей узнать, сколько же набегала за год моя очередная тушка и опять начались поиски бесплатного решения. Пришлось с полчасика порыть инет :)
Кстати, в одной из записей я уже писал как узнать пробег на Canon 6d
Удалось найти вариант и для 7dm2.
Вариант 1: заходим на китайский сайт http://www.eosmsg.com/ и жмем Download EOSMSG V5.0 4.5. К моменту чтения вами этой записи в блоге что-то может поменяться, поэтому:
Вариант 2: Качаем прогу с моего яндекс-диска, по этой ссылке

Прога под винду, у меня работает на вин7 х64.
После установки и запуска вы увидите такое вот окно:























Как видно на скриншоте, программа работает(но лично не проверял) еще и с Nikon и с некоторыми другими камерами.
Буду рад увидеть в комментариях мини-отчеты о том, что прога работает и работает с камерой такого-то производителя и такой-то модели. Если, конечно, не затруднит.

п.с. Посмотрел сколько она набегала и даже жалко теперь продавать :))

среда, 23 декабря 2015 г.

Canon EOS 7D Mark II, Auto ISO, manual mode and exposure compensation.

Статья будет на русском не смотря на название на английском :)
Кто уже понял в чем фишка, сразу читайте последний абзац о том как настроить компенсацию экспозиции на 7d mark2.

Наконец-то попала мне в руки эта репортажная камера, заглядывался я на нее с момента её презентации на Photokina 2014 и последующих первых обзоров в интернете.
Еще до выхода на различных форумах обсуждалась такая замечательная функция в Canon 1D X как экспокоррекция в ручном режиме при включенном AUTO ISO.

На первый взгляд звучит как-то странно, если не глупо, ведь режим на то и ручной, что всё ручками делается. Но если призадуматься, то становится ясно, что без экспокоррекции(то есть в обычном режиме) камера в зависимости от режима замера экспонометра выставляет в ручном режиме такое ISO, которое считает нужным, что не всегда совпадает с точкой зрения человека-фотографа.

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

Пример 1, больше затрагивает теорию контрастных сцен:
Снимаем летний закат внизу земля вверху небо на 24мм. Выставляем, например, значения 1/200, f/9, ISO auto. Что же мы получаем, повторюсь значения взяты из головы результат экспозамера так же взят с неба :) А получаем мы ISO 500.
Штатив, ISO 100 пока отбросим, снимаем с рук. Экспозамер в режиме замера по всему полю.
Берем в кадр больше неба, получаем ISO 100 и, как результат, провалы в черное на земле и правильно проэкспонированное небо.
Берем в кадр больше земли, получаем ISO 800 и, как результат, пересвет в небе и правильно проэкспонированную землю.

Выход в данном случае №1  - снимать со штатива и с брекетингом (или по тому же ISO или по выдержке) с фокусом в ручном режиме и одной и той же диафрагмой. Затем при постобработке совмещать изображения.
Выход №2 - снимать один кадр с последующим вытягиванием теней и приглушением светлых областей.
Есть еще варианты, в том числе совмещая оба выхода выше.


Пример 2:
Съемка птиц (это уже для меня актуально). Условия освещения при этом всегда разные, фон бывает светлым, темным, нормальным - предугадать невозможно, изменить точку съемки подчас сложно.
Снимаем птицу на ветке, имеем светлый фон (затянутое серыми облаками небо).
Птицы, как правило, очень подвижны, а особенно если заметят человека.
Снимать нужно быстро, тихо и желательно точно :)
Обычно я такие сцены снимал с приоритетом диафрагмы. Мне надо было получить правильно проэкспонированную птицу, Для этого в режиме Av я выставлял экспокоррекцию вверх на 1-1.3 и более стопа. В данном случае переэкспонированный фон значения уже не имел.
Проблема режима Av в том, что он может выставить слишком длинную выдержку, что может приводить к смазам на изображении.
Чтобы этого избежать я выставлял на Canon 6d в режиме Av  ISO 1000-1600 и снимал, то смещая экспокоррекцию вниз, то ставя ее на 0, то задирая до 2-3 в плюс. При этом выдержка гуляла как хотела. Конечно, можно выставить минимальную выдержку в настройках и поставить AUTO ISO, это вроде как должно помочь, но я так и не привык к этому режиму, получил в итоге два плавающих не понятно как параметра - ISO и выдержку.

Выход 1: снимать в Av при фиксированных ISO и при смене освещения в лучшую сторону получать излишне малую выдержку и избыточное ISO, в то время как можно было снять с большей выдержкой и меньшим ISO и получить менее шумный и всё еще резкий кадр.
Выход 2: выставить вручную и выдержку и диафрагму, а затем подстраивать ISO постоянно следя за его значением, а точнее за показаниями экспонометра и крутить ISO как нужно в конкретный момент.

Лирическое отступление :) Есть у меня знакомый зовут Сергей, день рождения у нас в один день :) Дак вот он не гнушается высокими ISO выставляя их значения 10-12 тысяч и снимая в режиме Av или автоисо + мануальный режим с очень короткими выдержками и зажатой до f/10 диафрагмой. Да, это выход, но я по натуре перфекционист и ISO выше 1600 для меня это слишком шумно. Возможно к этому приложили руку фотостоки, которые предъявляют высокие требования к шумам.

А теперь самое главное! В  7D Mark II можно очень быстро решить вопрос правильной/нужной экспозиции, а точнее освещенности итогового снимка (ведь экспозиция это сочетание двух параметров - диафрагма плюс время экспонирования, а ISO это уже восприятие матрицей выданного экспозицией света, по крайней мере такое я слышал/читал когда-то).
Выставляем режим M на камере, выставляем нужную для птиц выдержку, обычно это 1/500-1/2000, зажимаем диафрагму до f/5.6-11, ну в общем смотря как свет позволяет. Выставляем ISO AUTO, ограничиваем его, к примеру от 100 до 3200 в режиме авто в настройках камеры.
Идем снимать. Видим, птица на светлом фоне и будет явно недоэкспонирована, а нам нужны и глазки и клювик и подбородок чтоб был просматриваемым. Ничего не меняя тянем дополнительный рычажок что прямо в основании джойстика и крутим верхнее колесо вправо, корректируя экспозицию в плюс. Снимаем, смотрим результат (или не смотрим, зависит от опыта)  корректируем при необходимости и снова снимаем.

Или через меню или нажав кнопку Q под джойстиком у ЖКД, выбираем (кнопка set) "назначение  элементов управления". В нем в нижнем левом углу выбираем  (кнопка set) "рычажок выбора области AF"














Внутри назначаем ему ... эээ... не могу найти картинки, аппарат не с собой, 23 декабря часам к 22:00 допишу, главное не забыть )))

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

п.с. картинки экрана 7dm2 честно скопированы из этой статьи:
http://prophotos.ru/reviews/16254-canon-eos-7d-mark-ii-nedelya-s-ekspertom/2

вторник, 19 мая 2015 г.

Вконтакте ( vk.com ), как заблокировать рекламу с помощью Adblock plus.

Чтобы те, кто уже знаком с adblock plus, не тратить время на прочтение всей статьи, пишу кратко:
добавьте в adblock фильтр:
##div[data-ads]
////
Добавление записи от 25.05.2015:
vkontakte немного изменил название параметра, теперь нужно поменять фильтр на
##div[data-ad-view]
по той же схеме
////
С недавних пор, а именно с 18 мая 2015 года (хотя обещали с 15го :) ), Вконтакте добавили встраиваемую в ленту пользователей рекламу.
Эту рекламу нельзя закрыть, скрыть, пометить как спам и вообще как-то убрать из ленты новостей.
Недолго думая, я глянул на код этих элементов.
Обычно я пользуюсь chrome и в нем(как уже и во многих других браузерах), если щелкнуть правой кнопкой мыши на любом из сайтов, то в самом низу видно меню  "Просмотр кода элемента"













Щелкаем по нему и открывается код который и отображает нашу страницу или конкретный элемент.
Переходим к сайту Вконтакте, открываем ленту новостей и ищем наши новые незакрываемые рекламки. Щелкаем по любому месту в этом "посте", которое, по логике вещей, должно быть блоком, который нам нужно исследовать. Открываем "просмотр кода элемента" и изучаем этот рекламный блок и нормальные блоки, которые должны быть в новостях, ищем отличия.
Сразу скажу, что отличаются они наличием параметра data-ads, не сложно догадаться, что ads это сокращение английского слова advertising - реклама.































Далее, если еще у вас не установлен addblock, то срочно ставьте! Отсюда:
https://adblockplus.org/
Я дал ссылку на addblock plus, потому что в нем можно писать свои собственные фильтры.
И так, addblock установлен, что дальше?
Открываем сайт вконтакте, нажимаем в правом верхнем углу браузера красную иконку addblock plus и выбираем "Заблокировать элемент"

























Далее нужно щелкнуть абсолютно на любом месте сайта вконтакте и откроется окно программы, где уже будет что-то прописано. Это что-то мы удаляем и пишем свой текст фильтра, а именно:
##div[data-ads]
И жмем большую кнопку "Добавить."














Вот и все, теперь рекламные блоки не будут появляться. Я понимаю, что прибыль компании вконтакте, может сильно-сильно упасть, из-за этого))))))))) Шутка :) Им ничего не будет, деньги взяли, рекламу разместили и адиос амиго :)

Надо сказать, что моя строчка кода для фильтра не идеальна, так как я только вчера нашел и прочитал страницу на официальном сайте adblock о том как писать фильтры.
Поэтому, если что-то вдруг не станет работать или я перепишу более осмысленно текст фильтра, то обязательно здесь об этом напишу. А пока - работает и ладно.

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

Спокойного сёрфинга всем, без рекламы! ;)

вторник, 28 апреля 2015 г.

Java, Swing. How to change title text style of InternalFrame and width of minimized InternalFrame?

По воле случая пришлось вернуться к старому доброму SWING :)
Ну и тут началооось )))

Как поменять стиль текста у InternalFrame?
Очень просто. Если используем Look and Feel "Nimbus", то есть такая штука как переменные по-умолчанию. Весь их список можно найти здесь:
https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html

И так, нужно добавить в конструктор главного окна следующее:

Font f = new Font("SansSerif", Font.BOLD, 14); // создаем нужный нам текст, мне нужно было его увеличить до 14
 UIManager.put("InternalFrame.titleFont", f); // вставляем в переменные наш текст.

Вот и все.


Так же можно поменять цвет текста, используя переменную "InternalFrame:InternalFrameTitlePane[Enabled].textForeground"

Вот так:

UIManager.put("InternalFrame:InternalFrameTitlePane[Enabled].textForeground", Color.RED);

------

По-умолчанию, ширина свернутого окна, нашего InternalFrame, такова, что заголовок при сворачивании становится не виден. Решить проблему можно так же через переменные по-умолчанию. В данном случае это "InternalFrameTitlePane.contentMargins".
Нужно добавить:

java.awt.Insets insets = new Insets(5, 5, 0, 120);
UIManager.put("InternalFrameTitlePane.contentMargins", insets);

5 и 5 в Insets это отступ снизу и сверху, а 120 - получается здесь, что ширина.










вторник, 25 ноября 2014 г.

ireport return value from subreport to master

Возвращаем значение переменой из подотчета в главный отчет, в JasperReport используя iReport.

Задача - отобразить значение(в моем случае итоговое), которое получилось в подотчете (subreport) в главном отчете (master report).

В главном отчете создадим переменную (Variables), назовем ее NET_MARGIN_RETURNED.
Откроем подотчет, правой кнопкой щелкаем по нему на форме и выбираем Open subreport.
В нем есть переменная, которую я добавил ранее NET_MARGIN

Так как у меня тип значений везде BigDecimal, то и Variable Class выбран в обеих java.math.BigDecimal. Если нужно передать текст и исходные данные текстовые, то и выбираем для обеих java.lang.String

У переменной в подотчете NET_MARGIN параметры следующие:
У переменной в главном отчете NET_MARGIN_RETURNED куда будем передавать значение, такие:
обращаю внимание на Calculation, сначала я поставил System, так как везде где читал, ставят именно так. Но на самом деле этот параметр для передачи значения не важен (я (п)оставил Nothing), хотя многие ставят именно System, скорее всего в специфических ситуациях.

И так есть у нас отчет с подотчетом, выбираем в списке слева наш подотчет, ну или напрямую щелкаем по нему в "Дизайнере". Смотрим на Subreport properties, видим Return Values.


Щелкаем по троеточию и добавляем нашу переменную.

В списке Subreport variables переменной NET_MARGIN почему-то не оказалось, видимо косяк iReport, поэтому вписываем вручную.
Local distanation variable выбираем, если она не единственная и уже не выбрана, нашу переменную в мастер-отчете.
Если хотим передать только значение без изменений, то выбираем в пункте Calculation type значение Nothing.

С переменными все. Теперь надо отобразить значение нашей переменной в отчете.
Создаем Text Field. В его свойствах указываем нашу переменную в Text Field Expression.
Есть у него такой проперти как Evalution Time. Пока искал как передать переменную, наткнулся на то, что многие видят проблему именно в этом параметре. Кто-то пишет, что надо поставить там не Now, а Auto. Кто-то ставит Band.
Не заморачиваясь на том, что значит то или другое и вообще что за такой Evalution Time, я оставил Now, хотя работает и если поставить Band. Просто хотел обратить внимание, что при другой структуре отчета может возникнуть проблема в этом месте.

Вот собственно и все проблемы, с которыми я столкнулся, во время решения данной проблемы.
Надеюсь кому-нибудь пригодится, ну а мне останется как напоминание куда и зачем залазить, если в будущем столкнусь с подобной проблемой.











четверг, 11 сентября 2014 г.

Netbeans, Vaadin 7, maven и апдейт темы(styles.css). Как его отключить.

Решил со сборщика Ant в своем новом проекте перейти на Maven.
Разобрался с репозитарием, были традности, но в итоге все решилось, подробнее об этом в следующий раз.
Гораздо больше меня смутило то, что при запуске проекта, он берет и обновляет мою тему до значений по дефолту, что не есть гуд, так как в моем styles.css есть много моих собственных классов, которые удаляются и в итоге не применяются в итоге к запущенному приложению.
Решение оказалось довольно-таки банальным.
Открываем наш pom.xml, ищем там

                         1 <goal>clean</goal>
               2 <goal>resources</goal>
               3 <!--<goal>update-theme</goal>-->
               4 <!--<goal>update-widgetset</goal>-->
               5 <!--<goal>compile-theme</goal>-->
               6 <goal>compile</goal>

Строки 3, 4 и 5 я закомментировал. Это пришлось сделать в двух местах:
У плагина org.eclipse.m2e и com.vaadin
Теперь редактируем наш css файлик и запускаем проект.

Тадааам и все стили на месте.
Строку 4 я так же закомментрил, так как мне пока не нужно обновлять виджетсеты, если я что-то добавлю, то для одного запуска эту строчку я раскомментирую.

Теперь остался открытым еще один вопрос. Как сделать так, чтобы в контекстном меню при щелчке правой кнопкой мыши появился бы пункт Deploy? Будем разбираться :)