Rock 'N' Code

From Software Development to Rock Music.... by Michael Plöd

Donnerstag, 21. Oktober 2010

My opinion on the Java deprecation in Mac OS X

The IT-News space regarding software development had quite a hot story yesterday. Apple announced that they are deprecating Java and that they won't allow software written with deprecated technology into their app store. It is obvious that the introduction of the app store to Mac OS X was the last driver for apple to do that decision. Of course it would be easy to start ranting about Apple's policy I think the answers aren't "Apple sucks" and "Yes they are right". Let's look at different points of views here and start with Apple's:

For Apple themselves Java is not important anymore. With the introduction of iOS and the SDK for iPhone and iPad they cleary decided to walk the Cocoa / Objective-C way. This was obvious. So in the end they had to support a technology called Java that is from a plain technical view irrelevant to them. And let's be honest they supported it halfheartedly. Remember the delays for Java SE 1.6? So they ended up spending money and development resources for what?

The growing market of potential Mac Buyers called Java Developers. If I look through our offices at Senacor or if I look at the ever growing Mac share at development related conferences it is obvious that Java Developers love Macs. I'd say 60-70% of the Java Devs working as my colleagues use Macs. If I look at conferences I see a share somewhere between 40-80% and most of the speakers are Mac enthusiasts as well (me included). And let's be honest: Java Developers aren't the 999 € customers in most cases they buy the big machines with care protection that are somewhere around 2.500 - 3.000 €. So Apple risks quite a bunch of money with that move.

On the other hand we now have Oracle. They don't care about Apple's Mac business at all since it's not their business. And in addition to that. Mac OS X Server is not a very common solution for hosting Java EE applications. So for Oracle, if you look at a plain business point of view there is little reason to start porting Java SE to the Mac. On the other hand Oracle has a) Open JDK and b) currently a little image problem in Java space (sueing Google for Android, lame road map and so on).

Looking at all these topics I come to the conclusion that the best solution for anybody would be that Oracle starts an Open JDK based development stream for Mac OS X. By that step they make MANY Java Developers VERY happy and promote Open JDK with a very strong statement. On the other hand they should walk over to Apple and tell them "we help you in not loosing millions of € and you help us by co-funding the development for OS X for a defined time frame". Then there is one more company in the game that is not soooo obvious: Google. Even if they are in a current legal battle with Oracle regarding Android they are _HEAVY_ Mac users (I think the biggest Mac buyer in the market) and I'm pretty sure that the legal battle with Oracle will be settled with some sort of a bullet payment. They have a huge interest in keeping the Mac as a development platform for Android. So maybe they might get in the boat as well. Would make perfect sense to do so.

This is a situation where everybody involved wins:
- Oracle wins in popularity and states that they take Open JDK very serious
- Apple wins by not loosing a growing amount of good customers buying their big machines
- The Java Community wins by having a great new JDK that is at the pace of time with regards to new versions

-- Just my two cents

Freitag, 3. April 2009

Hibernate Statistics Wicket Page

I spent the last couple of days in Vienna and had two talks at the ejugdays. One of the talks was about Hibernate Tuning and during that talk I usually show a demo of a web application that has a very simple wicket page displaying the Hibernate's statistics. Once again I got asked by a few people if they could have the source code of that page. I decided to post the source code of the Wicket page to my blog.
As you might have already guessed: this code example is based on Apache Wicket, my favorite web framework. I'm sure that refactoring the page to JSF, Tapestry or whatever will not be too hard to achieve. As an entrance point I inject the Hibernate SessionFactory through the @SpringBean Annotation (part of Wicket's Spring support). If you don't use Spring you will have to code the SessionFactory's lookup. That shouldn't be too hard either.

HibernateStatisticsPage.java

package de.allschools.view.admin;

import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.hibernate.SessionFactory;
import org.hibernate.stat.CollectionStatistics;
import org.hibernate.stat.EntityStatistics;
import org.hibernate.stat.QueryStatistics;
import org.hibernate.stat.SecondLevelCacheStatistics;
import org.hibernate.stat.Statistics;


public class HibernateStatisticsPage extends WebPage {
@SpringBean(name = "sessionFactory")
private SessionFactory sf;

public HibernateStatisticsPage(PageParameters parameters) {
super(parameters);

final WebMarkupContainer st = new WebMarkupContainer("stats");
final CompoundPropertyModel model = new CompoundPropertyModel(new LoadableDetachableModel() {
protected Object load() {
return sf.getStatistics();
}
});
st.setModel(model);
st.add(new Label("isStatisticsEnabled"));
st.add(new Label("startTime"));
st.add(new Label("sessionOpenCount"));
st.add(new Label("sessionCloseCount"));
st.add(new Label("flushCount"));
st.add(new Label("connectCount"));
st.add(new Label("prepareStatementCount"));
st.add(new Label("closeStatementCount"));
st.add(new Label("entityLoadCount"));
st.add(new Label("entityUpdateCount"));
st.add(new Label("entityInsertCount"));
st.add(new Label("entityDeleteCount"));
st.add(new Label("entityFetchCount"));
st.add(new Label("collectionLoadCount"));
st.add(new Label("collectionUpdateCount"));
st.add(new Label("collectionRemoveCount"));
st.add(new Label("collectionRecreateCount"));
st.add(new Label("collectionFetchCount"));
st.add(new Label("secondLevelCacheHitCount"));
st.add(new Label("secondLevelCacheMissCount"));
st.add(new Label("secondLevelCachePutCount"));
st.add(new Label("queryExecutionCount"));
st.add(new Label("queryExecutionMaxTime"));
st.add(new Label("queryExecutionMaxTimeQueryString"));
st.add(new Label("queryCacheHitCount"));
st.add(new Label("queryCacheMissCount"));
st.add(new Label("queryCachePutCount"));
st.add(new Label("commitedTransactionCount"));
st.add(new Label("transactionCount"));
st.add(new Label("optimisticFailureCount"));
add(st);
String[] entities = ((Statistics) model.getObject()).getEntityNames();
List entityNames = new ArrayList();
for (int i = 0; i < entities.length; i++) {
entityNames.add(entities[i]);
}
ListView entityStats = new ListView("entities", entityNames) {
protected void populateItem(ListItem item) {
String entityName = (String) item.getModelObject();
final EntityStatistics entityStat = ((Statistics) model.getObject()).getEntityStatistics(entityName);
item.add(new Label("deleteCount", new Model(entityStat.getDeleteCount())));
item.add(new Label("updateCount", new Model(entityStat.getUpdateCount())));
item.add(new Label("fetchCount", new Model(entityStat.getFetchCount())));
item.add(new Label("insertCount", new Model(entityStat.getInsertCount())));
item.add(new Label("loadCount", new Model(entityStat.getLoadCount())));
item.add(new Label("optimisticFailureCount", new Model(entityStat.getOptimisticFailureCount())));
item.add(new Label("entityName", new Model(entityName)));
}
};
add(entityStats);

String[] collections = ((Statistics) model.getObject()).getCollectionRoleNames();
List collectionNames = new ArrayList();
for (int i = 0; i < collections.length; i++) {
collectionNames.add(collections[i]);
}
ListView collectionStats = new ListView("collections", collectionNames) {
protected void populateItem(ListItem item) {
String collName = (String) item.getModelObject();
CollectionStatistics collectionStatistics = ((Statistics) model.getObject()).getCollectionStatistics(collName);
item.add(new Label("recreateCount", new Model(collectionStatistics.getRecreateCount())));
item.add(new Label("updateCount", new Model(collectionStatistics.getUpdateCount())));
item.add(new Label("fetchCount", new Model(collectionStatistics.getFetchCount())));
item.add(new Label("removeCount", new Model(collectionStatistics.getRemoveCount())));
item.add(new Label("loadCount", new Model(collectionStatistics.getLoadCount())));
item.add(new Label("collName", new Model(collName)));
}
};
add(collectionStats);

String[] queries = ((Statistics) model.getObject()).getQueries();
List queryNames = new ArrayList();
for (int i = 0; i < queries.length; i++) {
queryNames.add(queries[i]);
}
ListView queryStats = new ListView("queries", queryNames) {
protected void populateItem(ListItem item) {
String queryName = (String) item.getModelObject();
QueryStatistics queryStatistics = ((Statistics) model.getObject()).getQueryStatistics(queryName);
item.setModel(new CompoundPropertyModel(queryStatistics));
item.add(new Label("cacheHitCount"));
item.add(new Label("cacheMissCount"));
item.add(new Label("cachePutCount"));
item.add(new Label("executionCount"));
item.add(new Label("executionRowCount"));
item.add(new Label("executionAvgTime"));
item.add(new Label("executionMaxTime"));
item.add(new Label("executionMinTime"));
item.add(new Label("categoryName"));
}
};
add(queryStats);

String[] caches = ((Statistics) model.getObject()).getSecondLevelCacheRegionNames();
List cacheNames = new ArrayList();
for (int i = 0; i < caches.length; i++) {
cacheNames.add(caches[i]);
}
ListView cacheStats = new ListView("caches", cacheNames) {
protected void populateItem(ListItem item) {
String cacheName = (String) item.getModelObject();
SecondLevelCacheStatistics cacheStatistics = ((Statistics) model.getObject()).getSecondLevelCacheStatistics(cacheName);
item.setModel(new CompoundPropertyModel(cacheStatistics));
item.add(new Label("hitCount"));
item.add(new Label("missCount"));
item.add(new Label("putCount"));
item.add(new Label("elementCountInMemory"));
item.add(new Label("elementCountOnDisk"));
item.add(new Label("sizeInMemory"));
item.add(new Label("categoryName"));
}
};
add(cacheStats);

add(new org.apache.wicket.markup.html.link.Link("switch_stats") {

@Override
public void onClick() {
sf.getStatistics().setStatisticsEnabled(!sf.getStatistics().isStatisticsEnabled());
sf.getStatistics().clear();
final CompoundPropertyModel model = new CompoundPropertyModel(new LoadableDetachableModel() {
protected Object load() {
return sf.getStatistics();
}
});
st.setModel(model);

}

});
}

}

HibernateStatisticsPage.html

<html>
<body>
<div id="header">Hibernate Statistics</div>
<a href="#" wicket:id="build_index">Create Search Index</a>
<a href="#" wicket:id="switch_stats">En- or Disable Statistics</a>
<div wicket:id="stats">
<table width="100%">
<tr><td>isStatisticsEnabled</td><td><span wicket:id="isStatisticsEnabled"/></td></tr>
<tr><td>startTime</td><td><span wicket:id="startTime"/></td></tr>
<tr><td>sessionOpenCount</td><td><span wicket:id="sessionOpenCount"/></td></tr>
<tr><td>sessionCloseCount</td><td><span wicket:id="sessionCloseCount"/></td></tr>
<tr><td>flushCount</td><td><span wicket:id="flushCount"/></td></tr>
<tr><td>connectCount</td><td><span wicket:id="connectCount"/></td></tr>
<tr><td>prepareStatementCount</td><td><span wicket:id="prepareStatementCount"/></td></tr>
<tr><td>closeStatementCount</td><td><span wicket:id="closeStatementCount"/></td></tr>
<tr><td>entityLoadCount</td><td><span wicket:id="entityLoadCount"/></td></tr>
<tr><td>entityUpdateCount</td><td><span wicket:id="entityUpdateCount"/></td></tr>
<tr><td>entityInsertCount</td><td><span wicket:id="entityInsertCount"/></td></tr>
<tr><td>entityDeleteCount</td><td><span wicket:id="entityDeleteCount"/></td></tr>
<tr><td>entityFetchCount</td><td><span wicket:id="entityFetchCount"/></td></tr>
<tr><td>collectionLoadCount</td><td><span wicket:id="collectionLoadCount"/></td></tr>
<tr><td>collectionUpdateCount</td><td><span wicket:id="collectionUpdateCount"/></td></tr>
<tr><td>collectionRemoveCount</td><td><span wicket:id="collectionRemoveCount"/></td></tr>
<tr><td>collectionRecreateCount</td><td><span wicket:id="collectionRecreateCount"/></td></tr>
<tr><td>collectionFetchCount</td><td><span wicket:id="collectionFetchCount"/></td></tr>
<tr><td>secondLevelCacheHitCount</td><td><span wicket:id="secondLevelCacheHitCount"/></td></tr>
<tr><td>secondLevelCacheMissCount</td><td><span wicket:id="secondLevelCacheMissCount"/></td></tr>
<tr><td>secondLevelCachePutCount</td><td><span wicket:id="secondLevelCachePutCount"/></td></tr>
<tr><td>queryExecutionCount</td><td><span wicket:id="queryExecutionCount"/></td></tr>
<tr><td>queryExecutionMaxTime</td><td><span wicket:id="queryExecutionMaxTime"/></td></tr>
<tr><td>queryExecutionMaxTimeQueryString</td><td><span wicket:id="queryExecutionMaxTimeQueryString"/></td></tr>
<tr><td>queryCacheHitCount</td><td><span wicket:id="queryCacheHitCount"/></td></tr>
<tr><td>queryCacheMissCount</td><td><span wicket:id="queryCacheMissCount"/></td></tr>
<tr><td>queryCachePutCount</td><td><span wicket:id="queryCachePutCount"/></td></tr>
<tr><td>commitedTransactionCount</td><td><span wicket:id="commitedTransactionCount"/></td></tr>
<tr><td>transactionCount</td><td><span wicket:id="transactionCount"/></td></tr>
<tr><td>optimisticFailureCount</td><td><span wicket:id="optimisticFailureCount"/></td></tr>
</table>
</div>
<br>
<div id="header">Entity Statistics</div>
<table witdh="100%" border ="1">
<tr>
<td>Entity</td>
<td>Load Count</td>
<td>Fetch Count</td>
<td>Insert Count</td>
<td>Delete Count</td>
<td>Update Count</td>
<td>Optimistic Failure Count</td>
</tr>
<tr wicket:id="entities">
<td><span wicket:id="entityName"/></td>
<td><span wicket:id="loadCount"/></td>
<td><span wicket:id="fetchCount"/></td>
<td><span wicket:id="insertCount"/></td>
<td><span wicket:id="deleteCount"/></td>
<td><span wicket:id="updateCount"/></td>
<td><span wicket:id="optimisticFailureCount"/></td>
</tr>
</table>
<br>
<div id="header">Collection Statistics</div>
<table witdh="100%" border ="1">
<tr>
<td>Collection</td>
<td>Load Count</td>
<td>Fetch Count</td>
<td>Recreate Count</td>
<td>Remove Count</td>
<td>Update Count</td>
</tr>
<tr wicket:id="collections">
<td><span wicket:id="collName"/></td>
<td><span wicket:id="loadCount"/></td>
<td><span wicket:id="fetchCount"/></td>
<td><span wicket:id="recreateCount"/></td>
<td><span wicket:id="removeCount"/></td>
<td><span wicket:id="updateCount"/></td>
</tr>
</table>
<br>
<div id="header">Query Statistics</div>
<table witdh="100%" border ="1">
<tr>
<td>Query</td>
<td>Execution Count</td>
<td>Execution Row Count</td>
<td>Avg Time</td>
<td>Min Time</td>
<td>Max Time</td>
<td>Cache Hit Count</td>
<td>Cache Miss Count</td>
<td>Cache Put Count</td>
</tr>
<tr wicket:id="queries">
<td><span wicket:id="categoryName"/></td>
<td><span wicket:id="executionCount"/></td>
<td><span wicket:id="executionRowCount"/></td>
<td><span wicket:id="executionAvgTime"/></td>
<td><span wicket:id="executionMinTime"/></td>
<td><span wicket:id="executionMaxTime"/></td>
<td><span wicket:id="cacheHitCount"/></td>
<td><span wicket:id="cacheMissCount"/></td>
<td><span wicket:id="cachePutCount"/></td>
</tr>
</table>
<br>
<div id="header">Cache Statistics</div>
<table witdh="100%" border ="1">
<tr>
<td>Cache</td>
<td>Hit Count</td>
<td>Miss Count</td>
<td>Put Count</td>
<td>Elements in Memory</td>
<td>Elements on Disk</td>
<td>Size in Memory</td>
</tr>
<tr wicket:id="caches">
<td><span wicket:id="categoryName"/></td>
<td><span wicket:id="hitCount"/></td>
<td><span wicket:id="missCount"/></td>
<td><span wicket:id="putCount"/></td>
<td><span wicket:id="elementCountInMemory"/></td>
<td><span wicket:id="elementCountOnDisk"/></td>
<td><span wicket:id="sizeInMemory"/></td>
</tr>
</table>

</body>
</html>


Montag, 29. Dezember 2008

Interview mit mir auf SE-Radio

SE-Radio hat heute eine Interview, welches Arno Haase mit mir geführt hat, veröffentlich. Inhalt des Interviews ist das Thema "OR-Mapper".

Arno und ich unterhalten uns in dem Interview über Konzepte von OR-Mappern und gehen auch auf Tools in dem Umfeld ein. Abschliessend gehen wir noch auf entsprechende Architekturkonzepte ein.

Das Interview ist hier zu finden.

Montag, 15. Dezember 2008

Tips and Tricks around concert photography







Metallica @ O2 World Berlin (Death Magnetic Release Party)
Metallica @ O2 World Berlin (75mm 1/15 sec 4.5f ISO 100) 

Usually I post to this blog in German but since I think that this topic is very interesting to a very wide audience I decided to write in English. Another new thing to this dusty blog is the topic: photography. I spent the last 8 or something years shooting images at all kinds of concerts for my online magazine Allschools Network (www.allschools.de). Most of my experience relates to taking pictures ate Metal, Punk(rock) and Hardcore shows be it in really small clubs with 50 - 200 people in attendance to festivals like With Full Force or bigger shows in arenas. I always thought about sharing my experiences and that's what I will do right now.

Concert photography is quite a challenge, isn't it? You are facing all the hard things that you encounter when taking pictures: extremely low light, a lot of movement, a pushing crowd and quite a few rules. This guide aims to provide you with a few hints that I personally learned hands on throughout the last few years. The main part of that guide focuses on photographers with a photo pass, however I will also provide a bunch of tips for people using a compact camera from the audience.


Rob Flynn of Machine Head
Rob Flynn of Machine Head (50mm 1/60 sec 2.8f ISO 400)

The rules


The usual rule is that you are not allowed to bring any professional camera equipment to a concert unless you have a photo pass. Most bands and promoters consider a DSLR as "professional" equipment. A compact camera should be fine in most cases. However there is also the restriction that you can only bring cameras that can't take movies. But actually I have never witnessed that rule to be executed by local security.
If you have a photo pass the usual rules are "no flash" and only the first three songs in front of the stage. After the first three songs most bands allow you to take pictures from outside the barriers in front of the stage, but still without flash. Make sure to have your photo pass with you all the time since security might check you when they see you in the crowd with a DSLR and a big zoom lens. But please make sure that you don't bother other people who paid hard earned money on their concert ticket. There may be bands that want you to lock your camera after the first three songs in a locker provided backstage. Just make sure you know the rules of a specific band and venue and that you respect them without further discussions.

In case you don't have a photo pass the only rule to follow is: don't hold up your cam all the time. People behind you will hate you for that ;-)

Suffocation live
Frank Mullen of Suffocation (105mm 1/40 sec 2.8f ISO 800)

How do I get a photo pass?

This question is a tough one. I personally started my own online music magazine 11 years ago, giving us good connections to many promoters, managements, record labels and bands. Basically starting an own magazine online right now is a tough task. The market is quite packed and record labels mostly work with the established magazines. In case you are all alone and want to get photo passes there are several options:

Get in connection with a good fanzine and offer your services 

Most fanzines are happy for everybody that helps. If you come up with a bunch of pics from underground shows (where no photo pass is required) and offer them to that fanzine chances are good that they want to work with you. However you will not get paid by them. I have personally never earned a cent taking pictures but it has also never been my intention to do so.

Talk to local promoters

What I usually do when I don't have direct contact to a band or label is to contact the local promoter of a specific show. Usually they hesitate to provide you with free entrance and a photo pass but most of the time I succeeded with offering them to pay for my own ticket and they give me a photo pass. This mostly works for mid-sized shows (up to 1000-2000 people in attendance).

Get connections to labels and bands

This is the most promising but also toughest way. Usually you only get this exposure when working with an existing magazine or fanzine.

#3 of Slipknot (50mm 1/80 sec 2.8f ISO 800)
The equipment
So what equipment should you get for taking decent photos? Again it is a question of having a photo pass or not. Basically the most important things to watch out for are "light" (aperture, Mega-pixels) and "high ISOs".

No photo pass = no DSLR

If you don't have a photo pass you are stuck with a compact camera. If you look for a good compact camera for this specific use case I would watch for lower Mega-pixels (10 for instance), a good lens (2,8f) and a decent performance at ISO > 200 / 400. The Panasonic LX3 looks absolutely promising for our case. DP Review has good reviews on all kinds of cameras. So check them and look out for a good low light performance of a specific camera.

Photo pass = DSLR (and nothing else)

If you have a photo pass there is no excusion for not bringing a DSLR. Everything else would be totally ridiculous. But you can leave your tripod and your flash at home, you won't be allowed to use these anyways. In terms of DSLRs a good performance at high ISOs (800 / 1600) is key to great pictures. I am personally working with Minolta / Sony bodies (A-100 and A-700) but I am sure that you will also get great (and event better) pictures with Canons and Nikons. And as always in this kind of hobby / profession: the more money you spend the more you get ;-) Of course will a D-700 or an A-900 produce better looking pictures than a D90 or an A-700. In case you start getting into DSLRs it is absolutely fair to stick with the entrance models, just make sure you can use your lenses if you upgrade your body.
In terms of lenses an aperture of 2.8f or wider is key to success. My standard equipment for shows consists of a 50mm 1.4f, a 16-50mm 2.8f and a 105mm 2.8f. However the purchase of a 70-200 2.8f is pretty close to happen. This lens is actually the best choice for big stages. For bigger shows with lot's of light I also bring the Sony 70-300mm kit lens but I'm not too happy with it's sharpness. Another general rule is: the bigger the stage, the more zoom you will need. At small Hardcore Show I usually only work with my 16-50mm 2.8f lens.
If you happen to have two camera bodies, bring them. One mounted with  a wide angel lens (50mm 1.4f or a wide angel zoom like a 16-50mm or 28-70mm) and the other one mounted with a zoom lens (70-200mm). I would mount the zoom lens on the better of both bodies because you will need shorter shutter times to avoid blur resulting due to your shaking hands.

As always you must make sure that you have enough storage available, there is nothing more embarrassing that running out of storage after the second song. At festivals I usually have my MacBook Pro and 5 4GB CF Cards with me. At a usual show I only take the 3-5 CF Cards with me. And of course you should check your batteries the night before the show. An extra battery should be with you as well.

I mentioned earlier that using flash is usually not allowed. However small club shows don't have any photo rules at all, so you could use a flash but please don't use the camera's flash as it will fire directly into the musicians eyes. I recommend an extra flash that fires into the venues upper wall and reflects from there. This has several advantages: you get better looking pictures because you don't ruin the life show and you don't flash peoples eyes. However I recommend you to use the flash only very rarely. You can also get great movement effects using rear sync flash.

Know your equipment

When shooting at concerts with the usual "3 songs no flash" rule you usually have around 10 - 13 minutes to make your photos. That means that there is not time left for figuring out where which button is and what setting is best. So in the end you must know your equipment inside out. If you get a new body or a new lens you should practice before taking pictures at rules intensive shows. For instance at a small local club where smaller bands play that are happy to be photographed.


Sabine Weininger of Deadlock (50mm 1/100 sec 1.7f ISO 400)

Camera settings

At concerts I mostly use the following settings:
  • Aperture priority with an aperture of 2.8f
  • Spot metering
  • Spot autofocus
  • ISO 800 or ISO 1600
  • Drive shooting
  • RAW File Format

Aperture priority

Of course you need to optimize shutter speed and the widest possible Aperture enables just that for you. Manual mode is due to changing light very cumbersome. In addition to that most pictures of musicians are portraits which means that a wide aperture is step one to good looking image

Spot metering and Spot autofocus

Most of the time I work with my camera's focus and metering mode set to spot. This makes sure that on the one side your camera will focus faster and on the other side you make sure that background lights don't distract from the main subject, the artist.

High ISOs

The higher the ISO the better for concert photography. This also means that you need to know how far you can go with your camera in terms of noise. For instance my Alpha 100 is quite noisy at ISO > 400. ISO 800 is only usable for web pictures after some post processing. On the other hand my Alpha 700 looks absolutely fine at ISO 1600 (with High ISO noise reduction turned OFF).
Nevertheless you should invest a few Euros / Dollars in noise reduction software.  The image below shows an example of a picture (Rob Flynn of Machine Head) taken with the Alpha 100 at ISO 800 and 50mm 2.8f before (right side) and after (left side) noise reduction with Noise Ninja Home Standalone (click to enlarge).

Rob Flynn of Machine Head (1/160sec ISO 800 50mm 2.8f).
Right side: original picture
Left side: noise reduction

Drive shooting

I usually set my camera to drive mode, so I can choose from a whole wealth of pictures of a specific scene and choose the most emotional one. Music photography is all about capturing the emotion of a certain moment of the performance.

RAW Images

The reason I only shoot in RAW is the flexibility I have in post-processing. You can still get a lot out of slightly under exposed pictures in the post-processing steps.

Terror (18mm 1,0 sec 3.5f ISO 400)

After the show: sorting out, organizing, post-processing

The obvious choices are a combination of Photoshop(tm), Lightroom(tm) or Aperture(tm) and noise removal software like Noise Ninja(tm) or  Neat Image(tm). Regarding Photoshop I would not alter the image too much, slight improvements are ok but we don't want our pictures to look cheesy, don't we?
I'm personally not using Photoshop at all because the license is too expensive for my use case. A free alternative is GIMP. Actually I have never missed Photoshop since you already have a lot of options for editing your pictures in Lightroom. But no doubt: Photoshop is king.

Another thing I usually do is to send a link or a copy of the published pictures to the girl / guy that provided me with a photo-pass so they see that I promoted their artist, festival or show.

Further reading & links

My flickr photostream

My music magazine - Allschools Network


Concert Photography Masterclass Part 1 by Daniel Boud

Concert Photography Masterclass Part 2 by Daniel Boud

Photographing Great Concert Photos






Montag, 15. September 2008

Berlin.jar Konferenz

Das vergangene Wochenende verbrachte ich in Berlin um dort einen Vortrag auf der Berlin.jar Konferenz zu halten.

Die Konferenz selbst fand zum ersten Mal statt und war, dank einer guten Promotion und eines sehr günstigen Eintrittspreises gut besucht und ebenfalls gut organisiert. Am Samstag habe ich mir zuerst den Vortrag meines Senacor Kollegen Ralph Winzinger angehört, der interessante Einblicke zum Entwurf "SOA-kompatibler" Java Anwendungen vorstellte. Leider hab ich mich im Anschluss total verquatscht und wollte dann noch mal über meinen Vortrag gehen, wodurch ich leider nicht dazu kam, mir den OSGi Talk von Stefan Zörner anzuhören.

Mit meinem Vortrag war ich im großen und ganzen zufrieden. Das Slidedeck war ein kleines Experiment, welches aufgegangen ist. Ich habe bewusst auf Textwüsten und Bulletpoint-Sammlungen verzichtet und bin mit dem Resultat nicht ganz unzufrieden.... den Stil werde ich wohl beibehalten und erweitern. Grund für den Stilwechsel war die Lektüre des Buches "Presentation Zen" von Garr Reynolds, welches ich jedem ans Herzen legen möchte.

Und was macht ein Metal Fan, der an diesem Wochenende in Berlin war? Richtig: Freitag Metallica in der O2 World... war grandios. Bilder gibts auf Allschools und Flickr

Montag, 28. Juli 2008

Conference Roundup & Wicket

I'll be giving a bunch of talks at conferences in the near future. Here are the dates:

Berlin.jar in Berlin (http://berlin.jar.jug-bb.de):
Performance Tuning of Hibernate / JPA applications

JAX-Conf San Jose (http://www.jax-conf.com):
Hibernate Search (This talk could actually change in topic)

W-JAX in Munich (http://www.w-jax.com):
Performance Tuning of Hibernate / JPA applications
Introduction to Domain Driven Design

On another note I started to completely revamp the codebase of the music magazine I started back in 1997 or something. The magazine is called Allschools Network and I'm no longer responsible for it but in the background I'm still working for it in terms of IT-related stuff. Currently I'm nearly done with a refactoring form horrible table based layout PHP Code towards a kick-ass Java based software. The ingredients of the new version are:
  • YAML based layout
  • Wicket as web framework
  • Spring for wiring, AOP, transactions
  • Hibernate + Annotations for persistence
  • Lucene + Hibernate Search for fulltext search
  • EHCache for caching
Let me just loose some words on Wicket: I'm totally sold on it. I'm not a web developer so I see a lot of the GUI related stuff from a different perspective and Wicket felt totally natural to me. This is (for me) _the best_ Web Framework out there. Expect more news on Allschools in the near future.

Cheers,
Mike

Donnerstag, 14. Februar 2008

JBoss World Orlando: Hibernate Search

Ich habe gerade eine sehr interessante und toll vorgetragene Session von Emmanuel Bernard aus dem Hibernate Team zum Thema Hibernate Search gehört.

Hibernate Search bietet Volltext Suchen für Anwendungen an, die mit Hibernate (core oder Entity Manager) arbeiten. Dabei setzt Hibernate Search primär auf folgende Technologien:
  • Das Event System von Hibernate Core
  • Apache Lucene
Die Integration von Search ist relativ einfach: ein wenig Konfiguration (eine Zeile in der hibernate.cfg.xml) und hier und da ein paar Annotationen kombiniert mit einem extra Query Interface. Den Rest macht Hibernate Search transparent für den User über das Hibernate interne Event System (welches man übrigens auch als Nutzer von Hibernate verwenden kann).

Die Präsentation war sehr gut und ich denke, dass Hibernate Search definitiv ein interssanter Ansatzpunkt für Volltext Suchen bei Hibernate basierten Anwendungen ist.