среда, 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? Будем разбираться :)


пятница, 25 апреля 2014 г.

Количество срабатываний затвора Canon 6d (пробег камеры)

Всем привет! Решил тут проверить сколько же нащелкано у меня уже кадров.
Оказалось что не все так просто, перебрал несколько вариантов, как узнать пробег.
И платный через какой-то сайт, где надо 1.74 бакса кинуть и просто EOSInfo.
В итоге нашел все-таки нужную версию программы EOSInfo и вот выкладываю ее сюда, дабы не потерялась и, возможно, пригодилась кому-нибудь.

Мой Canon 6D программа определила и все показала.














Прошел почти год... 17 марта 2015, пробег немного увеличился.











Так же исправил ссылку на файл, она была не рабочей, потому как я случайно удалил файлы на яндекс-диске, впредь постараюсь не трогать :)
https://yadi.sk/d/2QSF6565fJwDp
а вот, на всякий случай, вторая ссылка откуда я скачивал этот же файл.
http://dropcanvas.com/jkthh/2

Если вдруг не будет здесь, нагуглите по запросу "EOS Camera Info 1.2"

Добавлено 05.09.2016: Отдельно написал пост про то как и чем измерить пробег на более современных камерах Canon, хотя прога поддерживает и другие камеры.

среда, 5 февраля 2014 г.

Vaadin 6.xx, решение проблемы с обновлением данных в таблицах

Здравствуйте!

Только что нашел решение (и успешно внедрил его в свой проект) старой (для меня) проблемы.

Суть заключалась в следующем.
Пользователь переводил таблицу в режим редактирования и менял в ней значения.
При этом, каждое изменение тут же записывалось в БД и сохранялось в ней.
Так же это значение сохранялось и на экране пользователя, в его таблице.
Но!
Как только пользователь переходил (к примеру в таблице 3 строчки) сначала от первой ко второй, от второй к третьей и затем обратно к первой, но значения менял уже в другой ячейке, данные в первой строчке первой редактируемой ячейке визуально оставались измененными, а в реальности, в представлении модели таблицы, значение в выбранной строке были все теми же. В результате, после выхода из режима редактирования, данные в ячейках, не сохранялись.
А точнее они сначала обновлялись, но затем обновлялись вновь на старые значения.

Мне удалось найти тикет, который описывает данный баг http://dev.vaadin.com/ticket/10993
Приведу скрины таблицы от исходных данных, до момента редактирования и его последовательности и получившийся результат.














Как вы видите, данные в первых двух столбцах не изменились, хотя в процессе они менялись, но при выборе первой строки, данные для объекта подтягивались не обновленные, а старые, то есть значения "1". В результате только данные из последнего столбца сохранялись в БД нужным образом.

Решение нашлось на форуме Vaadin, там же я нашел и ссылку на тикет с багом.
Я сделал просто - создал отдельный класс и стал вызывать его при каждом создании таблицы.
Привожу код класса:

import com.vaadin.data.Container;
import com.vaadin.data.Container.ItemSetChangeEvent;
import com.vaadin.ui.Table;
import java.util.Collection;

import java.util.Collections;
/**
 *
 * @author nix
 */
public class UpdateTableSelectionOnItemSetChange implements Container.ItemSetChangeListener {

    private Table table;
    
    
    public  UpdateTableSelectionOnItemSetChange(final Table table) {
        super();
        this.table = table;
    }

    @Override
    public void containerItemSetChange(ItemSetChangeEvent event) {
        final Collection<Object> itemIds = (Collection<Object>) table.getContainerDataSource().getItemIds();
        if (itemIds.isEmpty()) {
            // a previously filled table is now empty ==> remove its value since its selection is outdated this also
            // updates dependent forms via a resulting value change event
            table.setValue(null);
        } else {
            final Object tableVal = table.getValue();
            if (tableVal instanceof Collection && tableVal != null && !((Collection) tableVal).isEmpty()) {
                final Object selectedItemId = ((Collection<Object>) tableVal).iterator().next();
                // FIXME: needs to be adapted for multiselect tables

                for (final Object itemId : itemIds) {
                    if (itemId.equals(selectedItemId) && itemId != selectedItemId) {
                        table.setValue(null); // otherwise the next set value will be discarded since
                        // oldVal.equals(newVal)
                        table.setValue(Collections.singleton(itemId));
                        break;
                    }
                }
            }
        }
    }
}

Теперь в класс где у нас создается табличка просто добавляем создание экземпляра этого класса. Конечно, лучше его указывать сразу в списке переменных и затем вызывать только конструктор.

UpdateTableSelectionOnItemSetChange onItemSetChange =  new UpdateTableSelectionOnItemSetChange(table);

Можно найти более элегантное применение, если у вас оно есть - поделитесь, лишним не будет. Я же пока оставлю так. Главное, что данные теперь всегда "свежие" :)