Monday, December 27, 2010

How To Create An Empty Java Project With Maven

To create an empty maven-managed java project simply type:

mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart

You will be asked for the groupId and artifactId for your project, the project version and the main package for your code.

$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart
[INFO] Scanning for projects...
[INFO]                                                                        
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
Define value for property 'groupId': : cloudobjects
Define value for property 'artifactId': : demoProject
Define value for property 'version':  1.0-SNAPSHOT: :
Define value for property 'package':  cloudobjects: : de.cloudobjects
Confirm properties configuration:
groupId: cloudobjects
artifactId: demoProject
version: 1.0-SNAPSHOT
package: de.cloudobjects
 Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: cloudobjects
[INFO] Parameter: packageName, Value: de.cloudobjects
[INFO] Parameter: package, Value: de.cloudobjects
[INFO] Parameter: artifactId, Value: demoProject
[INFO] Parameter: basedir, Value: /Users/helmut
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] ********************* End of debug info from resources from generated POM ***********************
[INFO] project created from Old (1.x) Archetype in dir: /Users/helmut/demoProject
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 24.293s
[INFO] Finished at: Mon Dec 27 15:08:58 CET 2010
[INFO] Final Memory: 9M/81M
[INFO] ------------------------------------------------------------------------


Now you have a simple maven-managed java project.

If you are using eclipse you have (at least) two options:

To create an eclipse project from your maven project cd into the project-directory and type:

$ mvn eclipse:eclipse

If you are using the M2Eclipse-Plugin, you can import the maven project directly into eclipse.

To import a maven project into eclipse choose "File -> Import" and select "Maven -> Existing Maven Projects":


In the next step select the newly created project folder and the projects pom.xml:


Now you have an eclipse-project with full maven dependency management.

More information about the M2Eclipse-Plugin can be found in the sonatype M2Eclipse manual.

Tuesday, December 7, 2010

Fixing Ruby Gems On Mac OS Snow Leopard

Today I tried to install the ruby client library for cassandra. The gem install command failed with the following error message:

helmut$ sudo gem install cassandra
ERROR:  could not find gem cassandra locally or in a repository 

Running the same command with the verbose flag produced the following output:

helmut$ sudo gem install cassandra -V
HEAD 302 Found: http://gems.rubyforge.org/latest_specs.4.8
Error fetching remote data:  bad response Found 302 (http://gems.rubyforge.org/latest_specs.4.8)
Falling back to local-only install
ERROR:  could not find gem cassandra locally or in a repository


This output shows that the gem command tries to download the file http://gems.rubyforge.org/latest_specs.4.8 but cannot find it. In the next step it tried to download this file with curl. This worked. Downloading the file with the verbose flag produced the following output:

helmut$ curl -v http://rubygems.org/latest_specs.4.8
* About to connect() to rubygems.org port 80 (#0)
*   Trying 72.4.120.124... connected
* Connected to rubygems.org (72.4.120.124) port 80 (#0)
> GET /latest_specs.4.8 HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3
> Host: rubygems.org
> Accept: */*
> 
< HTTP/1.1 302 Found
< Date: Tue, 07 Dec 2010 08:18:46 GMT
< Server: Apache/2.2.3 (Red Hat) mod_ssl/2.2.3 OpenSSL/0.9.8e-fips-rhel5 Phusion_Passenger/3.0.0
< X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.0
< X-UA-Compatible: IE=Edge,chrome=1
< X-Runtime: 0.001094
< Location: http://production.s3.rubygems.org/latest_specs.4.8
< Content-Length: 0
< Status: 302
< Vary: Accept-Encoding
< Content-Type: text/html
< 
* Connection #0 to host rubygems.org left intact
* Closing connection #0
This output shows, that the request was redirected to http://production.s3.rubygems.org/latest_specs.4.8. Obviously the location of the ruby gems repository has changed. To fix the above problem, add the new repository url and remove the old one:
helmut$ sudo gem sources -a http://production.s3.rubygems.org/
helmut$ sudo gem sources -r http://gems.rubyforge.org/
After this fix the installation works without errors:
helmut$ sudo gem install cassandra
Successfully installed cassandra-0.8.2
1 gem installed
Installing ri documentation for cassandra-0.8.2...
Installing RDoc documentation for cassandra-0.8.2...

Friday, November 26, 2010

Running hadoop jobs using the eclipse hadoop plugin

The hadoop distribution contains an eclipse plugin that allows you to browse the hadoop filesystem and to run MapReduce-jobs on a hadoop cluster.

As i tried to use the plugin bundled with the current stable hadoop version 0.20.2 i found out that this version of the plugin is not compatible with eclipse 3.4 and above. It allows you to browse hdfs-shares, but you cannot start hadoop-jobs. If you try to start a job nothing happens. The error log contains the following message:

Error
Fri Nov 26 10:13:43 CET 2010
Plug-in org.apache.hadoop.eclipse was unable to load class 
org.apache.hadoop.eclipse.launch.HadoopApplicationLaunchShortcut.

java.lang.NoClassDefFoundError: 
org/eclipse/jdt/internal/debug/ui/launcher/JavaApplicationLaunchShortcut

After some google searches, i found out, that this is a known issue that has already been fixed in the jira ticket MAPREDUCE-1280.

Unfortunately there is no hadoop release that contains this bugfix. Because of this I compiled the plugin from the current hadoop 0.20 svn branch. I attached the compiled plugin to the jira ticket. You can download it from here

This version of the plugin works for me on Mac OS 10.6 with hadoop 0.20.2 and eclipse 3.5.2 as well as eclipse 3.6.1.

To install the plugin, simply delete any old version of the plugin from your eclipse installation and put the jar file into the dropins-folder of your eclipse installation.

If you had an older version of the plugin installed, you need to start eclipse with the "-clean" command line switch. Help on running eclipse with command line switches can be found here.

If you have any trouble getting this to work feel free to ask for support here.

Tuesday, October 26, 2010

Is Apple Going To Discontinue Java Support For Mac OS?

Yesterday Apple released Java for Mac OS X 10.6 Update 3. The release notes for this update state:

"As of the release of Java for Mac OS X 10.6 Update 3, the version of Java that is ported by Apple, and that ships with Mac OS X, is deprecated.

This means that the Apple-produced runtime will not be maintained at the same level, and may be removed from future versions of Mac OS X."

What does this mean for the future of Java on Mac OS? At the moment there is no official alternative to the Apple-produced JVM on Mac OS.


The link to the release notes document was found on osnews.
The release notes document can be found here.

Update:
There is an online petition of people who would like to see Apple to contribute the source code of its JDK to the OpenJDK project. The petition can be found here.

Update #2
Apple and Oracle announced the OpenJDK-Project for Mac OS. Apple will donate most of it's code to the OpenJDK-Project. Read more about this here.

Tuesday, October 19, 2010

Scala Tutorial Part 2 - Defining And Calling Functions

Scala is a hybrid language that combines features of object oriented languages with features of functional languages. In this third part of my scala tutorial series i am going to show how to define and call functions in scala. All code snippets shown here can be run using the interactive scala shell or the scala interpreter as shown in the first part of this series.

Functions Without Parameters

The following snippet defines a function that takes no parameters and does not return a value:
scala> def sayHello() { 
     | println("hello")
     | }
sayHello: ()Unit
The scala shell determines that sayHello is a parameterless function that has the return type Unit. The type Unit indicates, that a function does not return a value. For now you can think of Unit as an equivalent of Java's void.
A function definition starts with the keyword def. This is followed by the function name and empty parentheses. Function arguments would go between the parentheses. This is followed by the function body which is surrounded by square brackets.

Functions that return a value have an equals sign between the parameter list and the method body:
def giveUniversalAnswer() = {
     | 42
     | }
giveUniversalAnswer: ()Int     
A function always returns the value of the last statement in the function body. You can mark this by using the return-statement, but this is not usual in scala. As you can see the type inference system determined that this function returns a value of type int. Sometimes the type inference algorithm is unable to infer the return type of a method (e.g. the scala compiler cannot determine the return type of recursive methods). In this case you have to declare the return type explicitly. And of course in some cases it makes sense to declare the return type of a function for the sake of readability.
The return type has to be declared in front of the equals sign:
def giveUniversalAnswer(): Int = {
     | 42
     | }
giveUniversalAnswer: ()Int     
If you omit the equals sign after the parameter list, the function does not return a value. This is even true for functions that have a return-statement.


Command Query Separation

It is good practice to differentiate between functions that have side effects and functions that are free of side effects. A side effect is an operation that changes the state of a program, for instance by changing a global variable or a type field. The practice of differentiating between these function types was introduced by Bertrand Meyer in his book "Object Oriented Software Construction". He introduces the term command query separation for this differentiation.
The basic idea of command query separation is do differentiate between these two function types:
  • queries: functions that compute values but are free of side effects
  • commands: functions that change the state of the system but do not return values.

// Side note:
// A more in depth description of command query separation can be found
// in Martin Fowlers Bliki.

In scala you can use functions without return type to implement commands and functions with return type to implement queries. This way you have a syntax for declaring queries and a syntax for declaring commands.


Functions With Parameters

The following snippet defines a function that takes two arguments:
scala> def registerPerson(name: String, password: String) {                    
     | printf("User '%s' added to database with password '%s'", name, password)
     | }                                                                       
registerPerson: (name: String,password: String)Unit
The parameters of a function go between the parentheses after the function name. Unlike the return type of a function, the type of function parameters has to be declared. The function parameters are constants that cannot be modified inside the function body. The following code will not compile:
scala> def registerPerson(name: String, password: String) {                    
     | name = "not allowed"
     | }
:6: error: reassignment to val
       name = "not allowed"

Calling Functions
Functions are called by the function name followed by the parameter list. If the parameter list is empty you are allowed to omit the empty parentheses. The following code shows two legal ways to call the function sayHello defined above:
scala> sayHello()
hello

scala> sayHello 
hello


// Side note:
// As we will see later, the parentheses can also be omitted
// when calling type members that have only one parameter.

When calling a function that takes parameters, the parameters are passed to the function in parentheses. To call the function registerPerson type
scala> registerPerson("Helmut", "secret")                  
User 'Helmut' added to database with password 'secret'
To make this code easier to read, scala 2.8 introduced the notion of named parameters. These allow you to specify the name of the parameter in the function call. This makes the function call above easier to read and less error prone. Since the name of the parameters is specified you are even allowed to change the order of the parameters passed. The following code demonstrates this:
scala> registerPerson(password="secret", name="Helmut")
User 'Helmut' added to database with password 'secret'


Uniform Access

When declaring functions without parameters, the parentheses indicating the empty parameter list can be omitted. This makes it possible to make the access to a computed value look like the access to a property. When the parentheses for the empty arguments are omitted in the function definition you also have to omit them when calling the function:
scala> def universalAnswer = {     
     | 40 + 2
     | }
universalAnswer: Int

scala> var x = universalAnswer * 2
x: Int = 84
This example does not make a lot of sense. But as we will see later, this feature allows you to define type members that perform a computation but look like fields for clients.


Summary

In this post I gave a short introduction to defining functions in scala. Below is a summary of rules for the use of functions in scala:

  • omit the equals sign in front of the function body if the function does not return a value
  • use an equals sign for functions that return a value, otherwise the return-value is being ignored
  • use command query separation
  • function arguments are unmodifiable constants
  • you can omit the parentheses when calling functions with zero arguments
  • if the parentheses for an empty parameter list is omitted in the function definition, you have to omit it when accessing the function

I hope this article gave you an insight in using functions in scala. Comments, suggestions for improvement or questions are greatly appreciated.

Scala Tutorial Part 1 - Three Reasons To Learn Scala

In this second part of the scala tutorial series I am going to show you three features that make scala an extremely powerful language.
These features are presented using simple one-liners. The code shown in this post can be run using the scala shell. Running scala code snippets using the scala shell is described in the first part of this scala tutorial series.

To get started fire up a scala console:

$scala
Welcome to Scala version 2.8.0.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.

Static Typing

In the first step we simply define a variable:
scala> var i = -3
i: Int = -3 
Even in this simple statement you can see one reason why scala is such a powerful language: it has type inference and static typing.
You defined a variable named i with the value -3. The scala console shows you the result of this expression: a variable i with value -3 of type Int was created. The type inference system automatically determined that -3 is an integer. The scala compiler uses this information to ensure that only int values are assigned to the variable i. Let's try this out:
scala> i = "The static type system will not allow this" 
:6: error: type mismatch;
 found   : java.lang.String("The static type system will not allow this")
 required: Int
       i = "The static type system will not allow this"
In the above statement i tried to assign a String to our Int variable. As you can see, this results in an error.

Sometimes the code can be more readable if you include the type of a variable in the variable definition. Of course you can do this, but you don't have to. You could also have written:
scala> var i: Int = -3
i: Int = -3 
As you can see, the type of a variable can be declared after the name of the variable. The type declaration consists of a colon and the type name.


// A little side note:
// the book "Object-Oriented Type Systems" by Jens Palsberg
// and Michael Schwartzbach provides excellent background
// information on the topic type inference.


Concise Syntax

One more thing you can see in the above example is the conciseness of scala code. The scala syntax allows you to reduce the amount of boilerplate code you have to write.

You already learned that you can omit the type declaration. But there is one more thing to see in the above statements: You do not have to terminate statements by a semicolon. At least this is true for most cases - in some cases the compiler cannot infer by itself where a statement ends. In this case you have to help the compiler. But in most cases you are allowed to terminate statements by a semicolon.

As you learn more features of the scala language you will learn to appreciate the conciseness of scala. Here is a little teaser:

To define a Map with some values in scala you can use the following code:
scala> var capitals = Map("Italy" -> "Rome", "Germany" -> "Berlin")
To achieve the same in java you have to write the following code:
Map capitals = new HashMap();
capitals.put("Italy", "Rome");
capitals.put("Germany", "Berlin");
In Java you have to define the type of this map twice! Even if you use third party libraries like google collections from the guava project the java code will still be more verbose than the equivalent scala code.


Scala Is Purely Object Oriented

The third and last power-feature of scala i want to show you in this post can be seen in the following code snippet:
scala> 15.toHexString
res0: String = f
What is happing here? You invoke the method toHexString on the number 15. This is possible because everything in scala is an object. Scala is completely object oriented. It does not have simple types like int. Because of this, the literal 15 defines an object of type Int. Of course you can invoke methods on this object.

Conclusion

This post presented three extremely powerful features of the scala languages:
  • static typing and type inference
  • concise code
  • pure object-orientation

Hopefully I got you interested in scala. Stay tuned for the next article in this series!

Sunday, October 10, 2010

Installing The Scala Developer Documenation

Sometimes it is useful to have an offline version of the scala api docs installed. To install the docs you can use the sbaz tool:

sbaz install scala-devel-docs

This command installs the following documentation to $SCALA_HOME/doc/scala-devel-docs:

  • the scala api docs
  • the reference for the scala tools like scalac and sbaz
  • some code examples

Tuesday, October 5, 2010

Scala Tutorial Part 0 - Four Ways To Run Your Scala Programs

So you have downloaded the scala distribution from scala-lang.org. $SCALA_HOME points to your scala installation and $SCALA_HOME/bin is in your PATH. Now you want to write your first scala program. This tutorial is going to show you four ways to run your first scala program. 


The interactive scala shell

The interactive scala shell can be started be typing the command  scala on the console. The scala shell allows you to enter scala code that is executed immediately.

The following listing shows how to run the classical "hello world" program:
$ scala
Welcome to Scala version 2.8.0.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.

scala> println("hello, scala world!");
hello, scala world!

scala> 

To quit the shell hit CTRL-D.


Running scripts

If you want to run the same code multiple times, you can put the code into a script. Simply put the above code into a file called HelloWorld.scala. To execute the script type
scala HelloWorld.scala
If you run scala programs interactively or as scripts you don't need classes. Especially you do not need a main class. This allows you to write scala scripts without lots of boilerplate code. But if you want to compile the code, you need to put your scala code into classes.

Running compiled code with the scala interpreter

To create a compilable version of our hello world application you need to create an object. Objects are the scala way to create static methods. We will explain more about objects in a future tutorial in this series.
Put the following code into a file called HelloWorldCompilable.scala:
object HelloWorld {
    def main (args: Array[String]) : Unit = {
        println("hello, scala world")
    }
}
If you are familiar with java you can understand this code. Unlike java scala allows you to give the file containing a class a different name than the class name.

To compile the code type
scalac HelloWorldCompilable.scala

The scala compiler creates two class files: HelloWorld.class and HelloWorld$.class. To run the compiled code type
scala HelloWorld
Make sure to omit the suffix .class. Typing scala HelloWorld.class will result in an error.


Running compiled code with the java interpreter

The scalac compiler creates java bytecode. Because of this you also can use the java interpreter to execute our HelloWorld class. All you have to do is to put the scala-library.jar into the classpath. This jar is located in the lib directory of your scala installation. To run the program type
java -classpath $SCALA_HOME/lib/scala-library.jar:. HelloWorld

This last example shows you one of the great strengths of scala. The fact that scalac generates java bytecode makes it possible to access every java library in scala code!

Monday, October 4, 2010

Subversion Clients on Mac OS

For Java development always use the eclipse subversive svn plugin.

Today i evaluated other svn clients for mac os. Of course there is the command line client svn. But that is not always comfortable. So let us have a look at different gui frontends for subversion.
 
The Textmate Subversion Bundle 

Textmate is my favorite text-editor for Mac OS. Textmate is a commercial tool which costs nearly 50 euros but it has so many useful features that i think it is worth the money if you are using your mac as a development machine.

The subversion bundle can be used to check out a project from a subversion repository and to work with the files from the project. It offers basic support for the add, remove, commit, diff, info and merge commands. Even the blame command is supported.
The Textmate blame window

The Subversion context menu in Textmate


As you can see the Textmate subversion bundle allows you to work with files in a working copy. But there is no support for importing projects to a repository or to create tags using the copy command. 

Conclusion:
Given this feature set, the subversion bundle is an option if you are developing using Textmate. But you will need another tool for the administration of the repository.

Finder Integration with SCPlugin

The SCPlugin aims to offer finder integration for subversion. The current version is 0.8.2. The SCPlugin project claims to support Snow Lepopard. I followed the installation posted here, but the plugin does not work for me. I can use the svn actions but i do not get icons that show the state of the files in my working copy. Did anyone get this to work? 

Conclusion:
For me SCPlugin seems rather useless.

SvnX

SnvX is a free standalone gui tool for subversion. It offers support for most of the svn client commands. It supports both managing files in your working copy and managing your repository.

The SvnX Gui

Conclusion:
This tool is the opposite of the Textmate subversion bundle: Repository administration works pretty good with this tool, managing a working copy is partially supported but not very comfortable.



Commercial SVN Clients

Besides the tools menitoned above there exists a range of commercial SVN clients. Since i do not want to pay for an snv client i did not evaluate them. Below is a list of commercial svn clients for Mac OS:


Summary

Despite the fact that subversion is being used productively for many years now the support for svn in Mac OS is not very good if you do not want to buy a commercial client app. I will continue using a combination of the command line client, svnx, textmate and eclipse. There is no suitable all in one solution for me. 

Do you have better solution?

Sunday, September 12, 2010

Scala resources

A google search for 'scala language' returns more than two million hits.
In this post i am collecting links to scala related resources and articles i consider useful.

Link Description
Learning Scala List of resources for learning scala on scala-lang.org.
artima scalazine Online Scala magazine that features several articles by scala creator Martin Odersky
Programming Scala Free online version of the book "Programming Scala" with user comments.
Scala series at IBM developerWorks IBM developerworks features a great series with articles about programming in scala.
Code Monkeyism - the blog for developers Blog containing some interesting articles about scala.

Installing Textmate Support For Scala

To install a scala bundle for Textmate you can use the Scala Bazaar System.

The sbaz binary is located in $SCALA_HOME/bin.
> sbaz install scala-tool-support
planning to install: scala-tool-support/2.8.0.final
Installing...

This downloads several scala-tools to $SCALA_HOME/misc. In particular it creates the folder
$SCALA_HOME/misc/scala-tool-support/textmate/Bundles/.

To install the scala-bundle simply unzip Scala.tmbundle.zip:

>unzip Scala.tmbundle.zip

Then doubleclick Scala.tmbundle. Thats all!

Tuesday, August 17, 2010

Basic usage of actors in scala

Summary:
This article gives a short introduction about parallel programming using scala actors.


 
The Scala programming language makes it easy to execute tasks in parallel. The easiest way to start parallel execution is to call the actor method of the Actor companion Object. 


This method takes a code block as parameter and creates a new thread executing the code block.

actor {
  // code to be executed
}

Note for java developers: using scala style the brackets around the method arguments are omitted here. The code shown above is equivalent to

actor({
  // code to be executed
})

The following example shows a small scala script that creates two actors. Each of the actors says hello for five times. After having sayed hello each actor takes a break for a small time.

import scala.actors.Actor._ 
for (actorId <- 1 to 2) {
  actor {
    for (helloIndex <- 1 to 5) {
      printf("Actor %d says hello  %d times.\n", actorId, helloIndex)
      Thread.sleep(30)
    }
  }
}


To run this example simple start the scala interpreter in interactive mode and paste the code into the command line.
If i execute the above script i get the following output:

Actor 1 says hello  1 times.
Actor 1 says hello  2 times.
Actor 2 says hello  2 times.
Actor 2 says hello  3 times.
Actor 1 says hello  3 times.
Actor 2 says hello  4 times.
Actor 1 says hello  4 times.
Actor 2 says hello  5 times.
Actor 1 says hello  5 times.

As you can see the messages from the two actors appear intermixed because the actors are executed in parallel. 


If you want to run the example in eclipse simply create a scala object with a main method and run it as scala application.

import scala.actors.Actor._ 
object SimpleActorDemo {

  def main(args: Array[String]): Unit = {
    for (actorId <- 1 to 2) {
      actor {
        for (helloIndex <- 1 to 5) {
          printf("Actor %d says hello  %d times.\n",
             actorId, helloIndex)
        }
      }
    } 
  }
}


Did you find this article useful? Your comments are greatly appreciated.

Friday, January 1, 2010

Impressum

Angaben gemäß § 5 TMG:

Helmut Zechmann
Freiberuflicher IT-Berater
Bänschstr. 35
10247 Berlin

Kontakt:

Telefon: +49 (0) 151 27527950
Telefax: +49 (0) 321 24961977
E-Mail: info@cloudobjects.de

Umsatzsteuer-ID:

Umsatzsteuer-Identifikationsnummer gemäß §27 a Umsatzsteuergesetz:
DE 261 254 476

 

Haftungsausschluss:

Haftung für Inhalte

Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.

Haftung für Links

Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.

Urheberrecht

Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.

Datenschutz

Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder eMail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben.

Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich.

Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor.

 

Google Analytics

Diese Website benutzt Google Analytics, einen Webanalysedienst der Google Inc. („Google“). Google Analytics verwendet sog. „Cookies“, Textdateien, die auf Ihrem Computer gespeichert werden und die eine Analyse der Benutzung der Website durch Sie ermöglichen. Die durch den Cookie erzeugten Informationen über Ihre Benutzung dieser Website (einschließlich Ihrer IP-Adresse) wird an einen Server von Google in den USA übertragen und dort gespeichert. Google wird diese Informationen benutzen, um Ihre Nutzung der Website auszuwerten, um Reports über die Websiteaktivitäten für die Websitebetreiber zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen zu erbringen. Auch wird Google diese Informationen gegebenenfalls an Dritte übertragen, sofern dies gesetzlich vorgeschrieben oder soweit Dritte diese Daten im Auftrag von Google verarbeiten. Google wird in keinem Fall Ihre IP-Adresse mit anderen Daten von Google in Verbindung bringen. Sie können die Installation der Cookies durch eine entsprechende Einstellung Ihrer Browser Software verhindern; wir weisen Sie jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich nutzen können. Durch die Nutzung dieser Website erklären Sie sich mit der Bearbeitung der über Sie erhobenen Daten durch Google in der zuvor beschriebenen Art und Weise und zu dem zuvor benannten Zweck einverstanden.