Как быстро научиться фотографии

Посвящается моей любимой жене, без которой не было бы этой мини-статьи!

Так получилось, что прогресс летит, а маркетологи навязывают всем подряд дешевеющие фотоаппараты, причём такого уровня, о котором десятки лет назад не могли и мечтать профессионалы. Эта мини-заметка нацелена на тех, кто имеет фотоаппарат и понимает что этого недостаточно, надо какие-то азы искусства фотографии. Замечу, что и новичок, и профессионал фотографирует одинаково, нажимая одну и ту же кнопку! Но профессионал перед нажатием делает магию, о которой я и расскажу, в трёх частях.

Часть 1, Художественная ценность.

Эта самая сложная часть, поэтому я по ней пройду вкратце, как для событийных фотографий, так и для пейзажных. События — перестаньте фотографировать натянуто улыбающихся истуканов!

_DSC7656
Фотоаппарат обманулся с экспозицией, человек стоит по центру и деревянно улыбается

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

_DSC7655
Взгляд обращённый за пределы кадра оставляет фантазии свободу
_DSC7650
Тёплые эмоции, это не «Сыр» и стеклянный взгляд в кадр
_DSC7652
Неподдельно!

Есть исключения — портреты, где хочется словить взгляд. В остальных случаях, соблюдайте правила хорошего кино, где актёры никогда не смотрят с экрана, а в нашем случае — со снимка. С пейзажами/природой легче и сложнее одновременно, ведь вы можете пытаться словить белку за долю секунды, или у вас будет целый час на запечатление заката. С животными художественная ценность почти всегда это удача, тогда как выразительность пейзажа это почти на 100% дело техники.

Часть 2, Композиция

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

_DSC7665
Думает, что делать с мужской головой, и куском колена.

Но даже если вы так делаете, то можно не полениться и дообрезать фотографию на компьютере.

_DSC7667
Нет обрезанных голов, композиция более удачна

А если вы будете соблюдать крайне простое правило «третей», то ваши фотографии вдруг станут выразительней, более содержательными и приятными глазу. Изучить композицию на уровне «для применения в повседневности» не займёт и часа, при наличии интернета.

Часть 3, Техническая, самая большая. Придётся прочитать все пункты, чтобы собрать себе воедино картинку.

1. Число F, или апертура. Старые и плохо видящие люди щурятся, чтобы навести резкость. Ваш фотоаппарат также это делает! Это он делает в режиме A или Av, кручением основного колёсика. Это мой любимый режим, который даёт возможность раскрыть «глаз» объективу на полную, что размоет фон, или прищурить его сильно-сильно, что добавит детализации на фон. Мера прищуренности называется число F, его можно увеличить до 22 или 32, тогда в фотоаппарат попадает совсем мало света (полезно на ярком солнце), или же уменьшить до предела возможности объектива, например до 3,5 или 1,8 или ещё какого-то, который написан на вашем объективе. При этом, фон размоется, что может нести художественную ценность.

_DSC7662
Фон размыт, смотрите на надпись на домике
_DSC7663
Фон более чёток, смотрите на надпись на домике

Что стоит запомнить, число F это именно мера прищуренности, и чем выше число, тем меньше света попадает в фотоаппарат, не наоборот.

2. Чувствительность ISO. Число ISO показывает насколько быстро ваш фотоаппарат будет «приглядываться» чтобы сделать картинку. Например, при ISO 100, ему может понадобиться целые секунды чтобы сделать снимок в домашнем помещении с одной лампочкой. А при ISO 6400, это уже будут доли секунды, и смазывания кадра не будет. Конечно есть и плохая сторона, чем быстрее фотоаппарат рисует кадр себе, тем больше он халтурит с микро деталями, но обычно это всё терпимо. Рекомендация — если вы разобрались уже со своим фотоаппаратом, то сделайте функцией программируемой кнопки Fn как раз смену ISO, это вам позволит подстраиваться под любую освещённость крайне быстро и удобно: зажали кнопку Fn, и поворотом колёсика уже регулируется не число F, а ISO. Отпустили — опять вы властны над числом F.

3. Экспозиция. Это некая комбинация ISO, выдержки затвора (время, за которое делается снимок) и числа F (мера прищуренности фотоаппарата), при которой для фотографии хватит света. Сама экспозиция нам не очень интересна, нам интересно её коррекция. Обычно это делается зажатием кнопочки с белым плюсиком и чёрным минусиком, и одновременным поворотом основного колёсика. Коррекцией экспозиции делают снимки светлее, или темнее. Я обычно пользуюсь коррекцией 0.7 или 1.0, когда надо фотографировать людей и есть яркое солнце. Пока же нам достаточно знать что есть такая возможность.

_DSC7660
Без экспокоррекции
_DSC7661
Экспокоррекция +0,7

4. Выдержка. Это время, на которое фотоаппарат открывает свой глаз, и делает снимок. Что удобно, в режиме A/Av, вы регулируете число F и ISO, а фотоаппарат сам подстраивает время под ваши пожелания. Время выдержки указывается на экранчике, когда вы наводите фотоаппарат на цель. Время указывается как доли секунды, например 200 значит что снимок сделается за 1/200 секунды, за это время можно более-менее словить дельфина в воздухе. Если же фотоаппарат показывает 10…40, то дела плохи, он хочет очень долго быть открытым, а микро-дрожания рук и объекта съёмки сделают всё-всё размытым, может мутным и скучным. 

_DSC7673
Большая выдержка приводит к неизбежному размытию

Что же делать? Надо повышать ISO, или уменьшать прищур (число F). Это делается колёсиками и кнопками, как вы уже помните. Если всё ещё недостаточно, то придётся уменшить экспозицию, мы как бы скажем фотоаппарату «Ладно, я понимаю что недостаточно света для хорошего снимка, но давай хоть сделаём тёмный». Если фотоаппарат показывает время как 1”, или 1.3” или ещё больше, то это уже не доли секунды, а целые секунды. Дело плохо, разве что у вас есть штатив и вы фотографируете звёзды.

5. Фокус. Это ваш друг! Это точка, или область, которая будет чёткой на снимке. В современных фотоаппаратах есть несколько режимов фокуса, одно- и много- точечные. Для начала лучше использовать одноточечный, чтобы потренироваться в композиции, и заодно всегда задавать себе вопрос, что же именно я снимаю. Сразу маленький хинт, если вы уже почитали в поиске про правило третей, то поставьте себе точку фокуса (в режиме съёмки она двигается крестовиной) в левую или правую верхнюю точку. Чего вы достигните — вам придётся убирать основной объект из центра в точку фокуса, иначе он будет не в фокусе, и почти наверняка станет мутным и нечётким.

_DSC7658
Фокус не на человеке приводит к красивой фотке веток, и размытому герою

И второй хинт, фокус не наведётся там где «нечем глазу зацепиться», например на однотонной коже. Лучше всего для фокуса подходят глаза, так как зрачок контрастный и имеет чёткий край, фотоаппараты почти никогда не ошибаются при фокусе на глазах.

_DSC7651
Точка фокуса нацелена на глаз, фотография получает выразительность

Надеюсь, моя статья поможет вам продвинуться на пути фотографа, и получать удовольствие от своих памятных фоток!

To be continued.

Playing with JMH

When I tried to measure something with JMH, I created few methods which returned simple ints.

Like this:

@GenerateMicroBenchmark
public int return0() { return 0; }
@GenerateMicroBenchmark
public int return1() { return 1; }
@GenerateMicroBenchmark
public int return2() { return 2; }

And I was very (VERY) surprised with results.

Benchmark Mode Thr Count Sec Mean Mean error Units
t.SimpleReturns.return0 thrpt 1 100 1 339506,793 5390,430 ops/ms
t.SimpleReturns.return1 thrpt 1 100 1 744749,512 15169,150 ops/ms
t.SimpleReturns.return2 thrpt 1 100 1 503420,254 16123,554 ops/ms
API replied benchmark score: 339506.7927333333 ops/ms over 100 iterations
API replied benchmark score: 744749.5115 ops/ms over 100 iterations
API replied benchmark score: 503420.2544833333 ops/ms over 100 iterations

jdk1.8.0_25 on Windows 8.1 was used.

You just think about this, returning 1 is faster than return 0!

What about your test results?…

 Update: Seems this difference was here due to JMH 0.1 version, in latest (1.6) these methods runs roughly same time.

Java Maven Deterministic Builds of Jar War Ear

How it happens that when you compile same code twice — you get different files? How to avoid this, how to get deterministic builds — builds, which are depends on what and how are building, and not when.  Or other question — how to make sure that these binaries are produced from this source code, and without extra manipulation?

That’s a serious question, currently raised amongst many project, like Debian, FreeBSD, bitcoinj and many more.

What about Java? Java itself not guaranteed same bytecode produced with different version of compiler; But at least if environment unchanged, then the code produced from *.java files are same.

So, in theory it’s not hard to get deterministic builds at least in one environment scope. In reality it’s harder than that, since classes usually packed in jar/war/ear (which all are really zip files under the hood). These archives storing timestamps of packed files, and what worse, Jar working differently with Manifest files.

To solve this problem, I created maven plugin (two actually) and it appears that they just works for me. To get deterministic builds in your project, just add these to build/plugins section in your pom.xml (you can even add this only to your parent pom.xml)

<plugin>
<groupId>org.javaz</groupId>
<artifactId>detarchive</artifactId>
<version>1.0</version>
<inherited>true</inherited>
<executions>
    <execution>
        <id>1. stamp files</id>
        <configuration>
            <stamp>20140101000000</stamp>
        </configuration>
        <phase>compile</phase>
        <goals>
            <goal>touch-classes</goal>
        </goals>
    </execution>
    <execution>
        <id>2. recreate archive</id>
        <phase>package</phase>
        <goals>
            <goal>repack</goal>
        </goals>
    </execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<inherited>true</inherited>
<executions>
    <execution>
        <id>3. Move deterministic archive into default name</id>
        <phase>package</phase>
        <configuration>
            <target>
                <move todir="${project.build.directory}" includeemptydirs="false">
                    <fileset dir="${project.build.directory}">
                        <include name="*ar"/>
                    </fileset>
                    <mapper type="regexp" from="(.*)-det.(.*)" to="\1.\2"/>
                </move>
            </target>
        </configuration>
        <goals>
            <goal>run</goal>
        </goals>
    </execution>
</executions>
</plugin>

So, what magic are happening there?

First execution of detarchive plugin is touch-classes goal, which changes all timestamps of all files inside «classes» directory (can be configured via configuration parameter targetDirectory). Files are stamped using configuration parameter stamp. If you don’t like default format — yyyyMMddHHmmss, you can use your own custom format, just don’t forget specify it via stampFormat.

After classes and resources stamped, it packed by maven into jar, and also could be jar dependencies, pom.xml and somethinng more. After packing maven jar, we need to polish it, using goal repack. This goal smart enough to run without parameters, but if you want something else — you can specify in configuration these parameters: outputDirectorystamp, stampFormat — same usage as in touch-classes goal. If they aren’t specified, timestamp coming from most frequent timestamp amongst *.class files.

And additional parameters

  • archiveSuffix (by default it’s «-det» )
  • archiveName (which archive to repack, by default it’s found automagically)
  • skipPomProperties (default true, due to maven change each time content of pom.properties — and really, who need this file anyway)
  • skipFiles (array of filenames, which files should not get into resulting jar, if you have some nasty file somehow packed into your archive, you can define here to skip it)
  • manifestName (default «META-INF/MANIFEST.MF» — in case you need to change default name into something weird)

After we repacked archive, let’s replace it into default name, it achieved via maven-antrun-plugin and regexp globber. Which I think mostly self-explanatory.

Enjoy you Java deterministic builds :)

Cali alpha release #2

Today I announce that Cali alpha #2 is ready for internal testing.

It took me about year to make basic documentation and internal structure, but it was fun!

So, for those who just joined — CALI is new programming language paradigm,  language and framework.

Main idea is that basic language unit is not function nor class, but it’s some abstract abstraction in abstract knowledge storage.

Doh, it was pretty hard to explain for my alpha-testers, I need to go work on better «getting started».

Anyway, CALI is happening soon, stay tuned!

Skype lagging as hell in Windows 8 — solved

There are some weird and obscure ways to program things. Such ways can lead to what we have currently in Skype under Windows 8/8.1:

If you have not IE as default browser, your Skype eats up CPU and lags as hell.

And make IE as your default browser is NOT a solution — since we don’t cooperate with bad guys and dirty methods 😉

Actually there is simpler workaround:

Turn off all systray event notices

Turn off «Display avatar in contact list»

That’s it! Maybe you’ll be forced to read all messages and restart Skype before lags stops, but at least you have now way.

My tech blog in my horrible english