Live Google Earth
Es gibt nun eine Anwendung für Google Earth, mit der man Bilder von Webcams in die Google Earth Landschaft einbauen kann.
Mit der Anwendung kann man Bilder von Webcams auf die Objekte in Google Earth mappen.
Der Golemartikel mit Video findet sich hier. Die Seite von Live3D ist aber im Moment leider nicht zu erreichen.
Wenn ich mir überlege wo es bereits überall Kameras gibt, könnte dass Google Earth revolutionieren. Dumm nur das man an die Daten von Sicherheitskamera’s etc wohl nicht rankommen wird.
Ein paar schnell gegoogelte Kameras:
- Leipzig Panorama (Screenshots)
- Leipziger Messe (Live, steuerbar!)
- Altenburger Marktplatz (Screenshots)
- Time Square (Live!)
PS: Sowas ähnliches gab es bereits 2007
!
Leckere Wiesenhof Hühnchen
Über die Zustände in einem der Wiesenhof Mastanlagen ließ hier.
QcMylyn 0.2.7 is out!
The QC Mylyn Team proudly presents the 0.2.7 Release …
We need Feedback!
No Angel – Nadja Benaissa droht Haftstrafe
JSF Tip – execution order for ActionListener and PropertyActionListener
Until now I don’t notice this:
According to the book ‘Core JSF Programming’, the method that is binded to ‘actionListener’ attribute in component tag will always been invoked earlier than the method of <f:actionListener>. In my opinion, <f:setPropertyActionListener> is a kind of <f:actionListener>. Therefore, its method will not be invoked until ‘actionListener’ attribute method finished. I have made a test and it proved my guess.
Found here.
Zuviel Uran im deutschen Trinkwasser
Ließ bei Foodwatch nach …
Concept to handle minimal and maximal tests in a maven project
In real world applications we have all too often external dependencies in test cases. Sometimes theses third party are not always available (i.e. remote webservices).
For continuous integration I want check a minimal set of tests but for my local development i want check a maximal set of tests. I want run my tests on command line (via maven) and in eclipse (via testng-plugin).
Here is my idea to do that …
My project super pom defines 2 profiles:
- test-min
- active by default
- exclude testng groups (online-tests, thirdparty-tests,…)
- test-max
- run a defined testng suite
- the suite defines a maximal set of test (all testng groups)
<profiles>
<profile>
<id>test-min</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<inherited>true</inherited>
<configuration>
<excludedGroups>${excludedTestGroups}</excludedGroups>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>test-max</id>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<inherited>true</inherited>
<configuration>
<suiteXmlFiles>
${basedir}/src/test/resources/Testsuite.xml
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<properties>
<excludedTestGroups>online,integration,thirdparty</excludedTestGroups>
</properties>
Each subproject must define a testng src/test/resources/Testsuite.xml:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite for Foobar">
<test name="Online Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<include name="online" />
</run>
</groups>
</test>
<test name="Integration Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<include name="integration" />
</run>
</groups>
</test>
<test name="Thirdparty Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<include name="thirdparty" />
</run>
</groups>
</test>
<!-- Each project can define MORE groups: i.e. "interactive" -->
<test name="Other Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<exclude name="online" />
<exclude name="integration" />
<exclude name="thirdparty" />
<!-- Each project can define MORE groups: i.e. "interactive" -->
</run>
</groups>
</test>
</suite>
If the sub project defines more exclude groups (i.e. a additional “interactive” group) then the pom must overwrite the excludedTestGroups property:
<properties> <excludedTestGroups>online,integration,thirdparty,interactive</excludedTestGroups> </properties>
To check the correct configuration of the two profiles we can use help:effective-pom:
mvn -Ptest-min help:effective-pom | less
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>online,integration,thirdparty,interactive</excludedGroups>
</configuration>
</plugin>
mvn -Ptest-max help:effective-pom | less
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>d:\foobar\src/test/resources/Testsuite.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
Now I can run min/max tests for each project which depend on the above super-pom. The test-min is the default profile and would be used on the continuous integration system (i.e. TeamCity).
Try it
Maven https repository with self-signed ssl certificate
For a private project I try to use nexus behind apache and ssl. I used a self-signed certificate.
But each nexus repository request ends with a security exception:
[WARNING] repository metadata for: 'artifact org.apache.maven.plugins:maven-enforcer-plugin' could not be retrieved from repository: nexus-plugin-releases due to an error: Error transferring file: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
I found many site for that problem and they describe always the same solution
import the self signed cert in your local truststore!
… here are the steps:
- download the certificate
- create a local truststore and import the certificat
- call maven with the correct security properties
The import is simple (java keytool):
keytool.exe -importcert
-alias nexus-xxx
-keystore xxx.jks
-storepass secret
-file xxx.crt
For maven I’m using a cygwin bash alias:
alias mvn_xxx='/cygdrive/d/maven-2.2.1/bin/mvn -gs "d:/maven-2.2.1/conf/settings-xxx.xml" -s "d:/maven-2.2.1/conf/settings-xxx.xml" -Djavax.net.ssl.trustStore=d:/maven-2.2.1/conf/xxx.jks -Djavax.net.ssl.trustStorePassword=secret'
I point the global config (-gs) and the personal config (-s) to the same file to ignore other configuration from my default maven config file (i.e. common mirros settings / repositories etc.).
And at least here is my complete maven setting-nexus settings:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/settings/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>D:\maven-repository-xxx</localRepository>
<mirrors>
<mirror>
<id>xxx-nexus-snapshots</id>
<mirrorOf>nexus-snapshots</mirrorOf>
<url>https://nexus.xxx.com/content/groups/public-snapshots/</url>
</mirror>
<mirror>
<id>xxx-nexus-snapshots</id>
<mirrorOf>nexus-plugin-snapshots</mirrorOf>
<url>https://nexus.xxx.com/content/groups/public-snapshots/</url>
</mirror>
<mirror>
<id>xxx-nexus-releases</id>
<mirrorOf>nexus-releases</mirrorOf>
<url>https://nexus.xxx.com/content/groups/public/</url>
</mirror>
<mirror>
<id>xxx-nexus-releases</id>
<mirrorOf>nexus-plugin-releases</mirrorOf>
<url>https://nexus.xxx.com/content/groups/public/</url>
</mirror>
<mirror>
<id>xxx-nexus-releases</id>
<mirrorOf>*</mirrorOf>
<url>https://nexus.xxx.com/content/groups/public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>xxx-nexus-mirror</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>nexus-releases</id>
<url>http://foobar</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>nexus-snapshots</id>
<url>http://foobar</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-plugin-releases</id>
<url>http://foobar</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>nexus-plugin-snapshots</id>
<url>http://foobar</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<servers>
<server>
<id>xxx-nexus-releases</id>
<username>foo</username>
<password>bar</password>
</server>
<server>
<id>xxx-nexus-snapshots</id>
<username>foo</username>
<password>bar</password>
</server>
</servers>
</settings>
You can replace xxx with your personal domain-alias.
Richfaces modal panel default formular action
Each input dialog should have a default action for good useability.
If the user hit ‘Enter’ then the default action should execute.
Here is my example of a richfaces modal edit dialog for such a requirement …
The dialog have input fields and 3 actions:
- save – is the default action if the user hit ‘Enter‘ anywhere in the formular
- cancel – is the default action if the user hit ‘Esc‘ anywhere in the formular
- reset
<rich:modalPanel id="edit_dialog">
<a4j:form id="edit_form" ajaxSubmit="true">
<h:outputLabel value="What's your title:" for="title"/>
<h:inputText id="title" value="#{bean.title}"/>
<h:outputLabel value="What's your name:" for="name"/>
<h:inputText id="name" value="#{bean.name}"/>
...
<a4j:commandButton id="save"
value="Save"
action="#{save}"
type="submit"
oncomplete="if(#{facesContext.maximumSeverity==null})Richfaces.hideModalPanel('edit_dialog')"/>
<a4j:commandButton id="reset"
value="Reset"
action="#{bean.reset}"
limitToList="true"
reRender="edit_form"
ajaxSingle="true"
type="reset"/>
<a4j:commandButton id="cancel"
value="Cancel"
action="#{bean.cancel}"
ajaxSingle="true"
oncomplete="Richfaces.hideModalPanel('edit_dialog')"/>
<rich:hotKey key="return"
selector="#edit_form"
handler="${rich:element('edit_form:save')}.click();event.stopPropagation();event.preventDefault(); return false;"
disableInInput="false"/>
<rich:hotKey key="esc"
selector="#edit_form"
handler="${rich:element('edit_form:cancel')}.click();event.stopPropagation();event.preventDefault(); return false;"
disableInInput="false"/>
</a4j:form>
</rich:modalPanel>
It’s important to define ajaxSubmit=”true” for the form! This avoid “none ajax submit of html formulars”. I will explain this in a later blog
With rich:hotKey I bind 2 key events to the edit formular:
- on ‘enter’ – the handler click the save button
- on ‘esc’ – the handler click the cancel button
Try it
Richfaces modal panel autofocus first input element
With jQuery it’s easy to focus the first visible input element (textfield, textarea or selectbox) for a rich:modalPanel:
<rich:modalPanel onshow="autofocus('dialog_content')">
<h:panelGrid id="dialog_content" columns="1" width="100%" cellpadding="0" cellspacing="0">
<a4j:form ajaxSubmit="true">
<h:outputLabel value="What's your name:" for="name"/>
<h:inputText id="name" value="#{bean.name}"/>
...
<a4j:commandButton id="save" value="Save my name" action="save"/>
</a4j:form>
</h:panelGrid>
</rich:modalPanel>
function autofocus(containerId) {
var element = jQuery(":input:not(:button):visible:enabled:first", '#'+containerId);
if (element != null) {
element.focus().select();
}
}
