<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4466305307772589754</id><updated>2012-03-04T16:34:46.045+01:00</updated><category term='solr'/><category term='DWH'/><category term='Usability'/><category term='User Interface'/><category term='JPA'/><category term='ETL'/><category term='Lucene'/><category term='Hibernate'/><category term='ActionScript'/><category term='socbiz'/><category term='Glosse'/><category term='socialmedia'/><category term='exensio'/><category term='Offshoring'/><category term='Open-Source'/><category term='Konferenz'/><category term='Build Prozess'/><category term='Compass Search'/><category term='GORM'/><category term='Flash'/><category term='WebLogic Server'/><category term='Apps'/><category term='SAP EP'/><category term='Grails'/><category term='Flex'/><category term='Spring'/><category term='WebLogic Portal'/><category term='Informationsportal'/><category term='Apache Wink'/><category term='e20'/><category term='HTML5'/><category term='web20'/><category term='LocalConnection'/><category term='Kettle'/><category term='Content'/><category term='MySQL'/><category term='REST'/><category term='Portal'/><category term='Propagation'/><category term='AS3'/><category term='Virtualisierung'/><category term='BlackBerry'/><category term='ADF'/><category term='EJB 3.0'/><category term='Tomcat'/><category term='Apache Webserver'/><category term='EclipseLink'/><category term='CMS'/><category term='JRockit'/><category term='Automatisierter Build'/><category term='Liferay'/><category term='Excel'/><title type='text'>exensio it blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.exensio.de/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-8020649391383682030</id><published>2012-03-04T16:31:00.000+01:00</published><updated>2012-03-04T16:33:37.657+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache Webserver'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Teil 2 - Grails in Produktion – mit Apache, Tomcat und MySQL</title><content type='html'>Im zweiten Teil meiner Blog-Serie (&lt;a href="http://blog.exensio.de/2012/02/teil-1-grails-in-produktion-mit-apache.html"&gt;hier geht es zum ersten Teil&lt;/a&gt;) möchte ich auf die Konfiguration des Apache Moduls mod_jk innerhalb des Apache Web-Servers eingehen. Hierzu muss die Datei httpd.conf angepasst und eine Datei worker.properties erstellt (die Konfiguration der Ports beschreibe ich dann im Tomcat-Teil meiner Blog-Serie) werden. Des Weiteren werden ich noch kurz die JKStatus Konsole vorstellen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Einstellungen in der Datei httpd.conf:&lt;/b&gt;&lt;br /&gt;Im Listing unten sieht man die Standard-Einstellungen, diese können und sollten dann in jedem Projekt modifiziert bzw. erweitert werden. Folgendes ist anzumerken :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Bis Zeile 9 - stehen die globalen Einstellungen, wie Lokation des Logfiles, der worker.properties, etc.&lt;/li&gt;&lt;li&gt;Ab Zeile 43 - stehen dann die Einstellungen innerhalb des Virtual-Host Abschnitts. In einer Produktions-Umgebung sollte man dann noch entscheiden, ob die JKStatus-Konsole benutzt werden soll (Zeile 50).&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;pre class="xml" name="code" style="display: none;"&gt;LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so&lt;br /&gt;LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so&lt;br /&gt;JkWorkersFile /etc/apache2/worker.properties &lt;br /&gt;# Where to put jk logs &lt;br /&gt;JkLogFile /var/log/apache2/mod_jk.log &lt;br /&gt;# Set the jk log level [debug/error/info] &lt;br /&gt;JkLogLevel info &lt;br /&gt;# Select the log format &lt;br /&gt;JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " &lt;br /&gt;&lt;br /&gt;&lt;virtualhost *:80=""&gt;&lt;br /&gt;&lt;br /&gt; ServerAdmin webmaster@localhost&lt;br /&gt;&lt;br /&gt; DocumentRoot /var/www&lt;br /&gt; &lt;directory&gt;&lt;br /&gt;  Options FollowSymLinks&lt;br /&gt;  AllowOverride None&lt;br /&gt; &lt;/directory&gt;&lt;br /&gt; &lt;directory var="" www=""&gt;&lt;br /&gt;  Options Indexes FollowSymLinks MultiViews&lt;br /&gt;  AllowOverride None&lt;br /&gt;  Order allow,deny&lt;br /&gt;  allow from all&lt;br /&gt; &lt;/directory&gt;&lt;br /&gt;&lt;br /&gt; ErrorLog /var/log/apache2/error.log&lt;br /&gt;&lt;br /&gt; # Possible values include: debug, info, notice, warn, error, crit,&lt;br /&gt; # alert, emerg.&lt;br /&gt; LogLevel warn&lt;br /&gt;&lt;br /&gt; CustomLog /var/log/apache2/access.log combined&lt;br /&gt;&lt;br /&gt;    Alias /doc/ "/usr/share/doc/"&lt;br /&gt;    &lt;directory "="" doc="" share="" usr=""&gt;&lt;br /&gt;        Options Indexes MultiViews FollowSymLinks&lt;br /&gt;        AllowOverride None&lt;br /&gt;        Order deny,allow&lt;br /&gt;        Deny from all&lt;br /&gt;        Allow from 127.0.0.0/255.0.0.0 ::1/128&lt;br /&gt;    &lt;/directory&gt;&lt;br /&gt; # JkOptions indicate to send SSL KEY SIZE, &lt;br /&gt; JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories &lt;br /&gt; # JkRequestLogFormat set the request format &lt;br /&gt; JkRequestLogFormat "%w %V %T" &lt;br /&gt; # Send all MyWebApp requests to Tomcat&lt;br /&gt; JkMount /MyWebApp/* loadbalancer&lt;br /&gt; # Send JKStatus Console&lt;br /&gt; JkMount /jkstatus/ status&lt;br /&gt;&lt;br /&gt; RewriteEngine On&lt;br /&gt; RewriteRule ^/$ /MyWebApp/ [PT,L]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/virtualhost&gt;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Einstellungen in der Datei worker.properties (/etc/apache2):&lt;/b&gt;&lt;br /&gt;Diese finden sich im Listing unten. Diese worker.properties führt ein Load-Balancing der Http-Requests auf 4 Tomcat-Server durch (mit einem Apache-WS davor). Sollen die 4 Tomcats die Requests von 2 Apache-WS-Servern erhalten, so bräuchte man 2 worker.properties. Ich würde dann jedoch weiterhin die Namen der Server global durchnummerieren, sprich svr1..svr4 und nicht svr1/svr2 für den ersten Apache-WS und erneut svr1/svr2 für den zweiten Apache-WS, da der Servername an die JSESSIONID angehängt wird und man somit einfacher herausfinden kann, an welchen Server der HttpRequest ging, um dann beispielsweise schneller das zugehörige Logfile zu finden. Zeile 29 ist noch erwähnenswert: Das Modul mod_jk geht standardmäßig von max. 3 Servern aus, auf die die Last verteilt werden soll. Aus diesem Grund ist hier der Wert auf 4 angepasst worden.&lt;br /&gt;&lt;pre class="xml" name="code" style="display: none;"&gt;worker.list=svr1,svr2,svr3,svr4,loadbalancer,status&lt;br /&gt;worker.svr1.type=ajp13&lt;br /&gt;worker.svr1.host=xx.xx.xx.xx&lt;br /&gt;worker.svr1.port=9008&lt;br /&gt;worker.svr1.lbfactor=1&lt;br /&gt;worker.svr1.socket_keepalive=1&lt;br /&gt;worker.svr1.socket_timeout=300&lt;br /&gt;worker.svr2.type=ajp13&lt;br /&gt;worker.svr2.host=xx.xx.xx.xx&lt;br /&gt;worker.svr2.port=9009&lt;br /&gt;worker.svr2.lbfactor=1&lt;br /&gt;worker.svr2.socket_keepalive=1&lt;br /&gt;worker.svr2.socket_timeout=300&lt;br /&gt;worker.svr3.type=ajp13&lt;br /&gt;worker.svr3.host=xx.xx.xx.xx&lt;br /&gt;worker.svr3.port=9008&lt;br /&gt;worker.svr3.lbfactor=1&lt;br /&gt;worker.svr3.socket_keepalive=1&lt;br /&gt;worker.svr3.socket_timeout=300&lt;br /&gt;worker.svr4.type=ajp13&lt;br /&gt;worker.svr4.host=xx.xx.xx.xx&lt;br /&gt;worker.svr4.port=9009&lt;br /&gt;worker.svr4.lbfactor=1&lt;br /&gt;worker.svr4.socket_keepalive=1&lt;br /&gt;worker.svr4.socket_timeout=300&lt;br /&gt;worker.loadbalancer.type=lb&lt;br /&gt;worker.loadbalancer.sticky_session=1&lt;br /&gt;# Adjust to the number of workers (4 in our case)&lt;br /&gt;worker.retries=4&lt;br /&gt;worker.loadbalancer.balance_workers=svr1,svr2,svr3,svr4&lt;br /&gt;worker.status.type=status&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;JKStatus-Konsole:&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-nFuHCine4Vg/T1OHiCFaeeI/AAAAAAAAAXg/3-It2DBM2C0/s1600/exensio_blog_grails_apache_tomcat_mod_jk.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="167" src="http://4.bp.blogspot.com/-nFuHCine4Vg/T1OHiCFaeeI/AAAAAAAAAXg/3-It2DBM2C0/s320/exensio_blog_grails_apache_tomcat_mod_jk.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Diese ist im Bild rechts zu sehen. Meines Erachtens ist diese Konsole während der Lasttests ein sehr nützliches Hilfsmittel. In Produktion sollte dann jedoch eher Nagios benutzt werden. Man sieht in der Konsole beispielsweise sehr schön, ob sich die Last gleichmäßig auf alle Tomcat-Server verteilt. Auch bekommt man sehr schnell mit, wenn ein Tomcat Probleme hat. Hierbei sind folgende Angaben (rote Umrandung im Bild rechts)&amp;nbsp;von besonderem Interesse:&lt;ul&gt;&lt;li&gt;Busy (Current number of busy connections)&lt;/li&gt;&lt;li&gt;Max (Maximum number of busy connections).&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Bei hohen Werten hat der Tomcat Probleme, meistens hängen dann Tomcat-Threads, beispielsweise verursacht durch eine überlastete Datenbank.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-8020649391383682030?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/8020649391383682030/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2012/03/teil-2-grails-in-produktion-mit-apache.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8020649391383682030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8020649391383682030'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2012/03/teil-2-grails-in-produktion-mit-apache.html' title='Teil 2 - Grails in Produktion – mit Apache, Tomcat und MySQL'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-nFuHCine4Vg/T1OHiCFaeeI/AAAAAAAAAXg/3-It2DBM2C0/s72-c/exensio_blog_grails_apache_tomcat_mod_jk.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-4490374344548906153</id><published>2012-02-13T09:19:00.000+01:00</published><updated>2012-03-04T16:34:46.066+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache Webserver'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Teil 1 - Grails in Produktion – mit Apache, Tomcat und MySQL</title><content type='html'>Mit diesem Blog-Post möchte ich die Schritte, die nötig sind, um eine &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt; Applikation produktiv zu stellen, beschreiben. Dieses Thema werde ich in aufeinanderfolgende Blog-Posts aufteilen. Die Aufteilung sieht folgendermaßen aus:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Teil 1 – Allgemeines zur Systemarchitektur und Ergänzungen in Grails&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.exensio.de/2012/03/teil-2-grails-in-produktion-mit-apache.html"&gt;Teil 2 – Apache Web Server&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Teil 3 – Tomcat&lt;/li&gt;&lt;li&gt;Teil 4 – MySQL&lt;/li&gt;&lt;li&gt;Teil 5 – Load Tests&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Systemarchitektur&lt;/b&gt;&lt;br /&gt;Das Bild rechts beschreibt die gewählte Systemarchitektur. Diese besteht aus folgenden Komponenten:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-N3nFgIBVcV0/Tzf4J-lJoyI/AAAAAAAAAXQ/U54sYdR0V8I/s1600/exensio_blog_grails_apache_tomcat_mysql_system_architektur.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="189" src="http://2.bp.blogspot.com/-N3nFgIBVcV0/Tzf4J-lJoyI/AAAAAAAAAXQ/U54sYdR0V8I/s320/exensio_blog_grails_apache_tomcat_mysql_system_architektur.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Load-Balancer – dieser kann sowohl auf Soft-, wie auch auf Hardware basieren. Meistens wird hier Hardware favorisiert. Wichtig ist, dass der Load-Balancer „Sticky Sessions“ unterstützt, sprich einen User-Request immer wieder an den ursprünglichen Apache WS weiterleitet.&lt;/li&gt;&lt;li&gt;Apache Web Server – hier benutzen wir mod_jk zur Kommunikation zwischen Apache WS und Tomcat. Gründe hierfür sind: sehr ausgereift und wir benutzen meistens keine SSL Verschlüsselung zwischen Apache WS und Tomcat. Falls SSL notwendig ist, sollte eher mod_proxy_http benutzt werden [1].&amp;nbsp;&lt;/li&gt;&lt;li&gt;Tomcat – hier ist wichtig zu erwähnen, dass wir nur ein Load-Balancing für die Requests durchführen, also kein Cluster mit Session Replication. Dies reicht in den meisten Fällen vollkommen aus. Nachteilig hierbei ist, dass ein User sich erneut anmelden muss, falls eine Tomcat-Instanz abstürzt. Als Nachteile für ein Cluster können folgende Punkte aufgeführt werden:&lt;ul&gt;&lt;li&gt;Performanz – jede Session wird auf einen Backup-Server (in-memory) über das Netzwerk repliziert. Bei sehr vielen Sessions (und vielen Tomcat-Instanzen im Cluster) kann dies eine sehr hohe Netzwerklast verursachen. &amp;nbsp;Die Sessions können auch in einer Datenbank persistiert werden. Dies ist jedoch nicht performanter.&lt;/li&gt;&lt;li&gt;Bei der Entwicklung muss beispielsweise beachtet werden, dass alle Objekte in der HTTP-Session serialisierbar sind. Auch darf die http-Session nicht zu groß sein (max. 50 – 70 KByte). Des Weiteren darf beispielsweise keine Hibernate-Session in einem HTTP-Objekt gespeichert werden. Obwohl wir wissen, dass dies Anfängerfehler sind, treten diese Fälle trotzdem sehr oft auf. Insbesondere in hektischen Projektphasen. Dies bedeutet schließlich, dass ein Cluster höhere Aufwände verursacht.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;MySQL – wir verwenden auch sehr gerne PostgreSQL. Jedoch ist MySQL bei den Hosting Providern unserer Kunden öfters vertreten. Deshalb wird hier auf MySQL eingegangen. Wichtig ist hier, sich über einen Fail-Over-Szenario im klaren zu sein. Es gibt mehrere Möglichkeiten, beispielsweise Linux-Cluster, VM-Ware-Cluster, Sequoia, etc. Die Hosting-Provider unserer Kunden setzen hier meistens ein Linux-Cluster ein.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Ergänzungen in Grails&lt;/b&gt;&lt;br /&gt;Folgende Ergänzungen sollten meines Erachtens in Grails hinzugefügt werden:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GSP-Seite mit folgenden Informationen:&lt;ul&gt;&lt;li&gt;Information über die für den Build des WAR-Files benutzte Revision-Nummer des Sourcecode-Systems (Subversion in meinem Fall).&amp;nbsp;&lt;/li&gt;&lt;li&gt;Ausgabe von allen Cookies. Hier ist insbesondere die JSESSIONID von Interesse, da mod_jk den in der workers.properties gewählten Servernamen an die JSESSIONID anhängt.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Konfiguration des Connection-Pools im Tomcat. Dieser wird dann als JNDI Connection-Pool in der Grails-Applikation benutzt. Dies hat den Vorteil, dass eine neue Datenbank mit anderen Settings, ohne ein erneutes Kompilieren der Grails-Applikation, benutzt werden kann.&lt;/li&gt;&lt;li&gt;Ausgabe der Logfiles in ${CATALINA_HOME}/logs. Nun könnte jemand auf die Idee kommen, dies über einen JNDI Eintrag steuern zu wollen, wie in meinem Blog [3] beschrieben. Hierbei ist jedoch das Problem, dass die Config.groovy vor der resources.groovy (die den Zugriff auf JNDI durchführt) aufgerufen wird.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Revision aus Subversion während Grails War-File Build ermitteln&lt;/b&gt;&lt;br /&gt;Der Code unten basiert auf einem Code-Snippet von StackOverflow [2]. Ich habe diesen modifiziert (Zeile 32), so dass die Revision-Nummer angezeigt wird. Dieser Code muss der Datei _Events.groovy hinzugefügt werden.&lt;br /&gt;&lt;pre class="xml" name="code"&gt;import org.tmatesoft.svn.core.SVNException&lt;br /&gt;import org.tmatesoft.svn.core.wc.SVNRevision&lt;br /&gt;import org.tmatesoft.svn.core.wc.SVNInfo&lt;br /&gt;import org.tmatesoft.svn.core.wc.SVNWCClient&lt;br /&gt;import org.tmatesoft.svn.core.wc.SVNClientManager&lt;br /&gt;import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory&lt;br /&gt;import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl&lt;br /&gt;import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory&lt;br /&gt;&lt;br /&gt;// Create revision info in case of a WAR build&lt;br /&gt;eventWarStart = { type -&amp;gt;&lt;br /&gt;&lt;br /&gt;    println "******************* eventWarStart *****************"&lt;br /&gt;    try {&lt;br /&gt;        // initialise SVNKit&lt;br /&gt;        DAVRepositoryFactory.setup();&lt;br /&gt;        SVNRepositoryFactoryImpl.setup();&lt;br /&gt;        FSRepositoryFactory.setup();&lt;br /&gt;&lt;br /&gt;        SVNClientManager clientManager = SVNClientManager.newInstance();&lt;br /&gt;        println "clientManager = " + clientManager.toString();&lt;br /&gt;        SVNWCClient wcClient = clientManager.getWCClient();&lt;br /&gt;        println "wcClient = " + wcClient.toString();&lt;br /&gt;&lt;br /&gt;        // the svnkit equivalent of "svn info"&lt;br /&gt;        File baseFile = new File(basedir);&lt;br /&gt;&lt;br /&gt;        println "baseFile = " + baseFile.toString();&lt;br /&gt;        SVNInfo svninfo = wcClient.doInfo(baseFile, SVNRevision.WORKING);&lt;br /&gt;        println "svninfo = " + svninfo.toString();&lt;br /&gt;&lt;br /&gt;        def version = svninfo.revision.number as String&lt;br /&gt;        println "Setting Version to: ${version}"&lt;br /&gt;        metadata.'app.version' = "${version}".toString()&lt;br /&gt;        metadata.persist()&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    catch (SVNException ex) {&lt;br /&gt;        //something went wrong&lt;br /&gt;        println "**************** SVN exception **************"&lt;br /&gt;        println ex.getMessage();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;} // End eventWarStart()  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Während des Builds wird die Revisions-Nummer in der Datei application.properties (siehe unten Zeile 6) geändert.&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;br /&gt;#Grails Metadata file&lt;br /&gt;#Sat Jan 21 16:17:44 CET 2012&lt;br /&gt;app.grails.version=1.3.7&lt;br /&gt;app.name=MyGrailsProject&lt;br /&gt;app.servlet.version=2.4&lt;br /&gt;app.version=455&lt;br /&gt;plugins.aop-reloading-fix=0.1&lt;br /&gt;plugins.batch-launcher=0.5.6&lt;br /&gt;plugins.csv=0.3.1&lt;br /&gt;plugins.fixtures=1.1&lt;br /&gt;plugins.hibernate=1.3.7&lt;br /&gt;plugins.jquery=1.7.1&lt;br /&gt;plugins.jquery-ui=1.8.15&lt;br /&gt;plugins.mail=1.0-SNAPSHOT&lt;br /&gt;plugins.resources=1.0.2&lt;br /&gt;plugins.spring-security-core=1.2.4&lt;br /&gt;plugins.tomcat=1.3.7&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In der BuildConfig.groovy muss dann noch überprüft werden, ob das War-File nicht die Revisionsnummer angehängt bekommen hat. Sonst hätte der Name des War-Files folgenden Aufbau : MyProject-455.war, mit dem Nachteil, dass sich jedes Mal die Url der Grails-Applikation ändern würde.&lt;br /&gt;&lt;pre class="xml" name="code"&gt;grails.project.class.dir = "target/classes"&lt;br /&gt;grails.project.test.class.dir = "target/test-classes"&lt;br /&gt;grails.project.test.reports.dir = "target/test-reports"&lt;br /&gt;grails.project.war.file = "target/${appName}.war"&lt;br /&gt;grails.project.dependency.resolution = {&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Das Ganze kann in einer GSP-Seite (inkl. Ausgabe der Cookies) folgendermaßen dargestellt werden:&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&amp;lt;%--&lt;br /&gt;  Created by IntelliJ IDEA.&lt;br /&gt;  User: Peter Soth&lt;br /&gt;  Date: 11.01.12&lt;br /&gt;  Time: 11:49&lt;br /&gt;  To change this template use File | Settings | File Templates.&lt;br /&gt;--%&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&amp;gt;&lt;br /&gt;    &amp;lt;meta name="layout" content="main"/&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Info:&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The following revision has been used for the build of this WAR.&lt;/h3&gt;&lt;br /&gt;REV: ${grailsApplication.metadata.'app.version'}&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Show all cookies&lt;/h3&gt;&lt;br /&gt;&lt;g:each in="${request.cookies}" var="cookie"&gt;&lt;br /&gt;    NAME: ${cookie.name} VALUE: ${cookie.value}&lt;br /&gt;&lt;/g:each&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Tomcat JDBC Connection-Pool mittels JNDI einbinden&lt;/b&gt;&lt;br /&gt;Hierzu wird in DataSource.groovy folgendes eingetragen:&lt;br /&gt;&lt;pre class="xml" name="code"&gt;// environment specific settings&lt;br /&gt;environments {&lt;br /&gt;    production {&lt;br /&gt;        dataSource {&lt;br /&gt;            jndiName        = "java:comp/env/jdbc/production"&lt;br /&gt;            dialect         = org.hibernate.dialect.MySQL5InnoDBDialect&lt;br /&gt;            dbCreate        = 'update'&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;Im Blog-Post zum Tomcat zeige ich dann, wie dies im Tomcat konfiguriert wird.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Logging in CATALINA_HOME festlegen&lt;/b&gt;&lt;br /&gt;Mit folgendem Code-Snippet werden die Logs-Files der Grails-Applikation in das Log-Verzeichnis des Tomcat-Servers geschrieben.Hierzu muss die Variable logDirectory in der log4j-Konfiguration in Config.groovy benutzt werden.&lt;br /&gt;&lt;pre class="xml" name="code"&gt;// request parameters to mask when logging exceptions&lt;br /&gt;grails.exceptionresolver.params.exclude = ['password']&lt;br /&gt;&lt;br /&gt;// set per-environment serverURL stem for creating absolute links&lt;br /&gt;environments {&lt;br /&gt; ...&lt;br /&gt;    production {&lt;br /&gt;        grails.serverURL = "http://www.changeme.com"&lt;br /&gt;        //tomcat based logging&lt;br /&gt;        def catalinaHome = System.getenv('CATALINA_HOME')&lt;br /&gt;        if (!catalinaHome) catalinaHome = '.'   // falls nicht gesetzt&lt;br /&gt;        def String grailsLogDir = "${catalinaHome}/logs/"&lt;br /&gt;        ...&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;[1] &lt;a href="http://www.tomcatexpert.com/blog/2010/06/16/deciding-between-modjk-modproxyhttp-and-modproxyajp"&gt;Tomcat Expert Blog&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://stackoverflow.com/questions/5263995/grails-add-svn-revision-to-app-version"&gt;StackOverflow: SVN Revisionsnummer in Grails einbinden&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://blog.exensio.de/2012/01/grails-jndi-werte-im-embedded-tomcat.html"&gt;Grails : JNDI Werte im Embedded Tomcat setzen&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-4490374344548906153?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/4490374344548906153/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2012/02/teil-1-grails-in-produktion-mit-apache.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4490374344548906153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4490374344548906153'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2012/02/teil-1-grails-in-produktion-mit-apache.html' title='Teil 1 - Grails in Produktion – mit Apache, Tomcat und MySQL'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-N3nFgIBVcV0/Tzf4J-lJoyI/AAAAAAAAAXQ/U54sYdR0V8I/s72-c/exensio_blog_grails_apache_tomcat_mysql_system_architektur.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-3707911597787693899</id><published>2012-02-06T09:54:00.001+01:00</published><updated>2012-02-06T09:54:45.267+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails 2.0 Upgrade Guide</title><content type='html'>&lt;br /&gt;Auf Google+ [1] hat das &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;-Team die Grails Community über Ihre Erfahrungen bei der Migration auf Grails 2.0 befragt. Um es kurz zu machen: Bei kleinen Applikationen ist eine Migration sehr einfach, bei großen Applikationen gibt es jedoch Probleme. Vor allem bei der Migration von Tests gibt es Probleme. Laut Grails Team soll man auf Grails 2.0.1 [2] warten, sofern man die Tests auch migrieren möchte. Dies dürfte bei den meisten Projekten – wie auch bei uns - der Fall sein. Und hier geht es zum Upgrade Guide von Peter Ledbrook [3].&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="https://plus.google.com/117411438136918964913/posts/axyCZk1P5L5"&gt;https://plus.google.com/117411438136918964913/posts/axyCZk1P5L5&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="https://plus.google.com/117411438136918964913/posts/TFw4YvNfQXX"&gt;https://plus.google.com/117411438136918964913/posts/TFw4YvNfQXX&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://pledbrook.github.com/grails-howtos/en/upgradeToGrails2.html"&gt;http://pledbrook.github.com/grails-howtos/en/upgradeToGrails2.html&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-3707911597787693899?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/3707911597787693899/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2012/02/grails-20-upgrade-guide.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/3707911597787693899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/3707911597787693899'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2012/02/grails-20-upgrade-guide.html' title='Grails 2.0 Upgrade Guide'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-8707846592899013297</id><published>2012-02-05T18:05:00.001+01:00</published><updated>2012-02-05T18:05:42.187+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web20'/><category scheme='http://www.blogger.com/atom/ns#' term='socialmedia'/><category scheme='http://www.blogger.com/atom/ns#' term='exensio'/><category scheme='http://www.blogger.com/atom/ns#' term='socbiz'/><title type='text'>Recruiting 2.0 – exensio auf Youtube - IT Berater (w/m) mit hohem *PZU-Faktor gesucht</title><content type='html'>&lt;iframe allowfullscreen="" frameborder="0" height="240" src="http://www.youtube.com/embed/HmO27ZszfXE?rel=0" width="320"&gt;&lt;/iframe&gt;&lt;br /&gt;Unter Recruiting 2.0 versteht &amp;nbsp;man die Benutzung von Web 2.0 Diensten, wie Xing, Facebook, Twitter, Google+ und Youtube zur Mitarbeitergewinnung. Bisher sind wir bei exensio auch den klassischen Weg mit Anzeigen in Jobbörsen gegangen. Vor allem für kleinere Unternehmen hat dies jedoch den Nachteil, dass Stellen- ausschreibungen leider in der Masse untergehen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Warum neue Kollegen über einen Youtube Kanal suchen?&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Uns wurde schnell klar, dass wir einen anderen Weg versuchen mussten und als Software-Ingenieure auch professionelle Unterstützung hierfür benötigen würden. Mit dem Kommunikationsdesigner Michael Starzmann von gadget Strategie + Design [1][2] hatten wir endlich den Richtigen gefunden, der sich voll und ganz auf unserer Wellenlänge befindet. gadget zeichnet meiner Meinung nach vor allem durch tragfähige sowie angemessene Lösungen aus, denn wir hatten kein Budget für ein ganzes Filmteam etc. Weitere Infos finden sich auf dem gadget Blog [3]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;Um es gleich vorweg zu nehmen: Mit dem Hochladen eines Videos auf Youtube steigen nicht über Nacht die Zahl der Bewerbungen an. Unsere Intension war hierbei eine andere: Wir sehen das Youtube Video mehr als Möglichkeit, uns unseren potentiellen neuen Mitarbeitern in 30 Sekunden vorzustellen und vielleicht etwas mehr von der exensio „Idee“ rüberzubringen, als dies mit einer statischen Web-Seite oder einer PDF-Datei möglich ist. Das sehr positive Feedback, das wir bisher erhalten haben, zeigt uns, dass es der richtige Weg ist - wir würden es auf jeden Fall wieder machen. Des Weiteren ist zu erwähnen, dass das Video länger für uns arbeitet, als eine Anzeige auf einem Jobportal.&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://www.gadget.de/"&gt;http://www.gadget.de&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://blog.gadget.de/"&gt;http://blog.gadget.de&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://blog.gadget.de/?p=163"&gt;http://blog.gadget.de/?p=163&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-8707846592899013297?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/8707846592899013297/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2012/02/recruiting-20-exensio-auf-youtube-it.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8707846592899013297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8707846592899013297'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2012/02/recruiting-20-exensio-auf-youtube-it.html' title='Recruiting 2.0 – exensio auf Youtube - IT Berater (w/m) mit hohem *PZU-Faktor gesucht'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/HmO27ZszfXE/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-2265726432079675890</id><published>2012-02-02T18:48:00.000+01:00</published><updated>2012-02-02T18:58:59.243+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Vermeiden von ClassCastExceptions beim Reloading  in Grails-Applikationen</title><content type='html'>&lt;h2&gt;Problem&lt;/h2&gt;Einer der Hauptvorteile von &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt; gegenüber anderen Frameworks bzw. Sprachen ist die schnelle Entwicklung. Bei laufendem Server können Änderungen vorgenommen und diese sind ohne einen lang dauernden Publizierungsvorgang verfügbar.&lt;br /&gt;Unter bestimmten Umständen funktioniert allerdings der Reload von Änderungen in Controllern oder Services nicht bei laufendem Server. Nimmt man eine Änderung vor und lädt anschließend über den Browser die Seite neu, dann resultiert dies in eine ClassCast-Exception, die nur durch einen Server-Neustart zu beheben ist. Das Problem tritt unseren Beobachtungen zufolge insbesondere im Zusammenhang mit dem Spring-Cache-Plugin auf, das Annotation verwendet. Auch bei anderen Annotationstypen ist das Problem schon aufgetaucht und  bekannt [1]&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Lösung&lt;/h2&gt;Ab der Grails-Version 2.0 ist dieses Problem behoben. Für andere Grails-Versionen lässt sich das Problem durch Installation des „AOP Reloading Fix“ Plugins [2] beheben. Dies funktioniert standardmäßig allerdings nur für die Umgebung (Environment) &lt;i&gt;Development&lt;/i&gt;. &lt;br /&gt;Wird eine eigene Umgebung für die Entwicklung eingerichtet, z.B. zum Umsetzen von Batches, dann werden die Erweiterungen des Plugins nicht angezogen. Durch Setzen der Variable &lt;i&gt;grails.reload.enabled&lt;/i&gt; beim Starten der Anwendung kann dies umgangen werden und das Plugin wird angezogen.Die folgende Abbildung zeigt in IntelliJ den Befehl zum Starten der Umgebung &lt;i&gt;devbatch&lt;/i&gt;. Zusätzlich werden die beiden Variablen &lt;i&gt;grails.reload.enabled=true&lt;/i&gt; und &lt;i&gt;grails.reload.location=.&lt;/i&gt; übergeben. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-4N3xqkgD1O4/TyrJfOKs1II/AAAAAAAAARo/avDSM9QwFSA/s1600/aop_reload.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="156" src="http://1.bp.blogspot.com/-4N3xqkgD1O4/TyrJfOKs1II/AAAAAAAAARo/avDSM9QwFSA/s320/aop_reload.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Links&lt;/h2&gt;[1] &lt;a href="http://jira.grails.org/browse/GRAILS-6370"&gt;http://jira.grails.org/browse/GRAILS-6370&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://grails.org/plugin/aop-reloading-fix"&gt;AOP Reloading Fix Plugin&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-2265726432079675890?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/2265726432079675890/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2012/02/vermeiden-von-classcastexceptions-beim.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/2265726432079675890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/2265726432079675890'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2012/02/vermeiden-von-classcastexceptions-beim.html' title='Vermeiden von ClassCastExceptions beim Reloading  in Grails-Applikationen'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-4N3xqkgD1O4/TyrJfOKs1II/AAAAAAAAARo/avDSM9QwFSA/s72-c/aop_reload.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-1298703952107985903</id><published>2012-01-30T19:39:00.000+01:00</published><updated>2012-01-31T08:14:02.084+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails : JNDI Werte im Embedded Tomcat setzen</title><content type='html'>JNDI eignet sich sehr gut, um einer Web-Applikation von außen (über den Tomcat) Parameter zur Verfügung zu stellen.  Die JNDI Einstellungen werden in Tomcat in der context.xml vorgenommen. Entwickelt man in &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt; (beispielsweise mit IntelliJ), so läuft der Tomcat jedoch im Embedded Mode. Dies bedeutet, dass keine context.xml vorhanden ist, die editierbar wäre.In den folgenden Code-Beispielen möchte ich zeigen, wie ein JNDI Wert ausgelesen und im Embedded Tomcat gesetzt werden kann. Dies ist beispielsweise zum Testen sehr nützlich.&lt;br /&gt;&lt;br /&gt;So würde das Setzen eines JNDI Parameters in der Context.xml (auf dem Produktionsserver) aussehen:&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;context&gt;&lt;br /&gt;  ...&lt;br /&gt;  &lt;environment name="jnditest'" override="true" type="java.lang.String" value="Grails JNDI Test String"&gt;&lt;br /&gt;  ...&lt;br /&gt;  &lt;/environment&gt;&lt;br /&gt;&lt;/context&gt;&lt;br /&gt;&lt;/pre&gt;In der Grails Test-Umgebung werden dann in der Datei _Events.groovy die JNDI Werte gesetzt. Hier muss beachtet werden, dass MyWebAppName durch den richtigen Namen der Web Applikation ersetzt wird. In dem Beispiel unten ist es nicht nötig, das Grails Tomcat Plugin zu modifizieren, wie es in den Grails Mailing-Listen diskutiert wurde:&lt;br /&gt;&lt;pre class="xml" name="code"&gt;eventConfigureTomcat = {tomcat -&amp;gt;&lt;br /&gt;    println "### Start Tomcat configuration"&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;        def environment = tomcat.class.classLoader.loadClass('org.apache.catalina.deploy.ContextEnvironment').newInstance()&lt;br /&gt;    &lt;br /&gt;        environment.name = 'jnditest'&lt;br /&gt;        environment.type = 'java.lang.String'&lt;br /&gt;        environment.value = 'Grails JNDI Test String'&lt;br /&gt;        environment.override = Boolean.TRUE&lt;br /&gt;    &lt;br /&gt;        def context = tomcat.host.findChild('/MyWebAppName')&lt;br /&gt;        context.namingResources.addEnvironment environment&lt;br /&gt;    }&lt;br /&gt;    catch (Exception e)&lt;br /&gt;    {&lt;br /&gt;        e.printStackTrace()&lt;br /&gt;    }&lt;br /&gt;    println "### End Tomcat configuration"&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Auslesen in der resources.groovy. So funktioniert es sowohl in der Test- als auch in der Produktions-Umgebung. In dem Beispiel unten wird jedoch überprüft, ob Grails im Entwicklungsmodus läuft: &lt;br /&gt;&lt;pre class="xml" name="code"&gt;import org.springframework.web.servlet.i18n.SessionLocaleResolver&lt;br /&gt;&lt;br /&gt;// Place your Spring DSL code here&lt;br /&gt;beans = {&lt;br /&gt;    localeResolver(SessionLocaleResolver) {       &lt;br /&gt;        Locale.setDefault(Locale.GERMAN)&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    if (grails.util.GrailsUtil.environment.equals('development')) {&lt;br /&gt;        jnditest(org.springframework.jndi.JndiObjectFactoryBean) {&lt;br /&gt;            jndiName = 'java:/comp/env/jnditest'&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Links:&lt;br /&gt;[1]&amp;nbsp;&lt;a href="http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Environment Entries"&gt;http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Environment Entries&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-1298703952107985903?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/1298703952107985903/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2012/01/grails-jndi-werte-im-embedded-tomcat.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1298703952107985903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1298703952107985903'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2012/01/grails-jndi-werte-im-embedded-tomcat.html' title='Grails : JNDI Werte im Embedded Tomcat setzen'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-8498042511834283189</id><published>2012-01-12T15:56:00.007+01:00</published><updated>2012-01-12T16:30:35.292+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Webserver'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Langsame Netzwerk-Geschwindigkeit mittels Apache-Webserver simulieren</title><content type='html'>&lt;h2&gt;Einleitung&lt;/h2&gt;Im Bereich der Web-Entwicklung gibt es viele unterschiedliche Szenarien, die zu testen sind, bevor eine Änderung "live" gehen kann. Neben den typischen Kompatibilität-Tests auf Betriebssystem, Browser und Bildschirmauflösung ist auch die Netzwerk-Geschwindigkeit eine Komponente, der Beachtung geschenkt werden sollte.&lt;br /&gt;Insbesondere wenn Ressourcen nachgeladen werden müssen, ist es wichtig zu testen, wie die Web-Applikation bei verschiedenen Übertragungsgeschwindigkeiten reagiert.&lt;br /&gt;&lt;br /&gt;In einem aktuellen Projekt haben wir eine Flash/AS3-Applikation getestet, die JSON-Daten per asynchronem Request vom Server erhält und daraufhin externe Bilddateien in die Applikation nachlädt. In erster Linie musste also sichergestellt werden, dass die Applikation auch bei langsamer Übertragungsrate und gleichzeitig hoher Anzahl nachzuladender Bilder intuitiv zu bedienen bleibt (sprich: Einführung von Ladebalken, Deaktivierung von bestimmten Elementen, etc.).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Das Tool "Throttle"&lt;/h2&gt;Während es für den Apache Webserver mittlerweile auch Module gibt, die das "throttling" übernehmen können sollen, gibt es damit relativ schnell Kompatibilitätsprobleme zwischen den unterschiedlichen Webserver Versionen.&lt;br /&gt;Als zuverlässig hat sich das kleine auf Pipe-Basis [1] operierende Tool &lt;a href="http://klicman.org/throttle/"&gt;Throttle&lt;/a&gt; [2] herausgestellt. Unter Linux erfolgt die Installation einfach mit dem gewohnten Dreisatz "./configure &amp;&amp; make &amp;&amp; make install".&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Apache Webserver und Throttle&lt;/h2&gt;Pipe-Tools lassen sich auf einfache Weise in den Apache Webserver einbinden (Stichwort SetOutputFilter [3]). Im Folgenden ist die Beispiel-Konfiguration für ein Bandbreiten-Limit von 56K angegeben:&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;br /&gt;# 56KB/s filter definition&lt;br /&gt;ExtFilterDefine ksec56 mode=output cmd="/usr/local/bin/throttle 57344" preservescontentlength &lt;br /&gt;# Use filter (e.g. in Location or VirtualHost directive)&lt;br /&gt;SetOutputFilter ksec56&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Der Filter kann beispielsweise innerhalb einer belieben Location- or VirtualHost-Anweisung verwendet werden.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Fazit&lt;/h2&gt;Mittels Throttle und dem Apache Webserver können auch verschiedene Übertragungsgeschwindigkeiten einfach in die Tests bei der Web-Entwicklung einbezogen werden. Mithilfe der Location- oder VirtualHost-Anweisung kann die Beschränkung nur für einzelne Verzeichnisse aktiviert werden - perfekt um langsame externe Server zu simulieren.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Links&lt;/h2&gt;[1] &lt;a href="http://de.wikipedia.org/wiki/Pipe_(Informatik)" target="_blank"&gt;Pipe auf Wikipedia&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://klicman.org/throttle/" target="_blank"&gt;Website zu Throttle&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://httpd.apache.org/docs/2.1/mod/core.html#setoutputfilter" target="_blank"&gt;Dokumentation zu SetOutputFilter&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-8498042511834283189?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/8498042511834283189/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2012/01/langsame-netzwerk-geschwindigkeit.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8498042511834283189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8498042511834283189'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2012/01/langsame-netzwerk-geschwindigkeit.html' title='Langsame Netzwerk-Geschwindigkeit mittels Apache-Webserver simulieren'/><author><name>Manuel Breitfeld</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-9102526117200317412</id><published>2011-12-22T17:50:00.000+01:00</published><updated>2011-12-22T17:50:27.312+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exensio'/><title type='text'>exensio wünscht ein frohes Fest und ein erfolgreiches neues Jahr</title><content type='html'>&lt;br /&gt;&lt;div style="text-align: center;"&gt;Unsere besten Wünsche&lt;/div&gt;&lt;div style="text-align: center;"&gt;für ein frohes Weihnachtsfest&lt;/div&gt;&lt;div style="text-align: center;"&gt;und ein glückliches, erfolgreiches neues Jahr.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JXiBoEnFy8A/TvNc0lvdXzI/AAAAAAAAARM/U5MFnI6Y7DU/s1600/weihnachtskarte_sos_kinderdorf.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="227" src="http://1.bp.blogspot.com/-JXiBoEnFy8A/TvNc0lvdXzI/AAAAAAAAARM/U5MFnI6Y7DU/s320/weihnachtskarte_sos_kinderdorf.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Auch in diesem Jahr verwenden wir den von&lt;/div&gt;&lt;div style="text-align: center;"&gt;uns für Weihnachtsgeschenke vorgesehenen Betrag zu Gunsten einer Spende an die&lt;/div&gt;&lt;div style="text-align: center;"&gt;Marc Soth Stiftung in der Trägerschaft der SOS Kinderdorf Stiftung.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-u959FQDfOuE/TvNe6jcXHEI/AAAAAAAAARY/wS9xrarHBZ0/s1600/sos_kinderdorf.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://1.bp.blogspot.com/-u959FQDfOuE/TvNe6jcXHEI/AAAAAAAAARY/wS9xrarHBZ0/s200/sos_kinderdorf.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-9102526117200317412?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/9102526117200317412/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/12/exensio-wunscht-ein-frohes-fest-und-ein.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/9102526117200317412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/9102526117200317412'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/12/exensio-wunscht-ein-frohes-fest-und-ein.html' title='exensio wünscht ein frohes Fest und ein erfolgreiches neues Jahr'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-JXiBoEnFy8A/TvNc0lvdXzI/AAAAAAAAARM/U5MFnI6Y7DU/s72-c/weihnachtskarte_sos_kinderdorf.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-821054521627970407</id><published>2011-12-22T14:52:00.011+01:00</published><updated>2011-12-22T15:57:12.719+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GORM'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Criteria List Queries bei Many-To-Many Beziehungen in Grails</title><content type='html'>&lt;h2&gt;Einleitung&lt;/h2&gt;In diesem Beitrag wird gezeigt, wie n:m Beziehungen in &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;&amp;nbsp;(Stichwort 'hasMany') innerhalb einer Query abgefragt werden können.&lt;br /&gt;Als Beispiel betrachten wir die Beziehung zwischen einer Person und eines Projekts. Eine Person kann in mehreren Projekten involviert sein. In einem Projekt arbeiten wiederum mehrere Personen. Die Modellierung in Domain-Klassen könnte wie folgt (vereinfacht) aussehen&lt;br /&gt;&lt;pre class="java" name="code"&gt;class Person {&lt;br /&gt;String firstname&lt;br /&gt;String lastname&lt;br /&gt;static hasMany = [projects:Project]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Project {&lt;br /&gt;String name&lt;br /&gt;static hasMany = [persons:Person]&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Datenbank-Abfragen&lt;/h2&gt;Im Folgenden sollen zwei Abfragen betrachtet werden:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Liefere alle Personen, deren Vorname "Max" oder "Moritz" ist.&lt;/li&gt;&lt;li&gt;Liefere alle Projekte, bei welchen Personen mit Vorname "Max" oder "Moritz" beteiligt sind.&lt;/li&gt;&lt;/ol&gt;Die erste Abfrage kann einfach mit dem dynamischen Finder findAllBy*InList [1] in Grails realisiert werden.&lt;br /&gt;&lt;pre class="java" name="code"&gt;def firstnames = ["Max", "Moritz"]&lt;br /&gt;def result = Person.findAllByFirstnameInList(firstnames)&lt;/pre&gt;&lt;br /&gt;Die zweite Abfrage kann nicht mehr über einen dynamischen Finder abgehandelt werden. Hierfür verwenden wir ein Criteria [2]. Criteria-Abfragen sind eine geschickte Möglichkeit, um komplexe Queries in Grails-Syntax relativ übersichtlich zu schreiben. Die zweite Abfrage lässt sich wie folgt realisieren:&lt;br /&gt;&lt;pre class="java" name="code"&gt;def firstnames = ["Max", "Moritz"]&lt;br /&gt;def c = Project.createCriteria()&lt;br /&gt;def result = c.list() {&lt;br /&gt;persons {&lt;br /&gt;    inList("firstname", firstnames)&lt;br /&gt;}&lt;br /&gt;resultTransformer Criteria.DISTINCT_ROOT_ENTITY&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Innerhalb der list-Closure des Criterias kann auf die einzelnen Attribute der Domain-Klasse zugegriffen werden - im Beispiel greifen wir auf die Assoziation "persons" zu. Mit der nächsten Closure wird sichergestellt, dass nur jene Personen zurückgeliefert werden, deren Vorname in der angegebenen Liste enthalten ist.&lt;br /&gt;&lt;br /&gt;Sowohl der findAllBy-Finder als auch das list-Criteria akzeptieren die typischen Parameter wie &lt;span style="font-style: italic;"&gt;max&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;offset&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;sort &lt;/span&gt;oder &lt;span style="font-style: italic;"&gt;order&lt;/span&gt;, die vor allem bei Web-Applikationen für tabellarische Darstellungen unumgänglich sind.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Links&lt;/h2&gt;[1] &lt;a href="http://www.grails.org/doc/1.4.x/ref/Domain%20Classes/findAllBy.html" target="_blank"&gt;findAllBy in der Grails-Dokumentation&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://www.grails.org/doc/1.4.x/ref/Domain%20Classes/createCriteria.html" target="_blank"&gt;createCriteria in der Grails-Dokumentation&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-821054521627970407?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/821054521627970407/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/12/criteria-list-queries-bei-many-to-many.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/821054521627970407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/821054521627970407'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/12/criteria-list-queries-bei-many-to-many.html' title='Criteria List Queries bei Many-To-Many Beziehungen in Grails'/><author><name>Manuel Breitfeld</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-1654020689043310689</id><published>2011-11-22T22:32:00.000+01:00</published><updated>2011-11-22T10:01:00.608+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Datenbank-Migrationen mit Grails</title><content type='html'>&lt;b&gt;Problemstellung&lt;/b&gt;&lt;br /&gt;Wird für eine Applikation, die darunterliegende Datenbank ausgetauscht, dann sind im Idealfall keine Änderungen im Anwendungscode notwendig.Dies sollte zumindest gelten wenn die Applikation Standard-SQL einsetzt.Unabhängig davon müssen aber die Daten von der ursprünglichen Datenbank in die Zieldatenbank überspielt werden.Für eine &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;-Applikation standen wir genau vor dieser Herausforderung, wobei von einer MySQL-Datenbank auf eine PostgreSQL-Datenbank migriert wurde. &lt;br /&gt;&lt;br /&gt;Hierfür gibt es nun mehrere Möglichkeiten. Relativ einfach erscheint das Durchführen eines Datenbank-Exports, anschließendes modifizieren der Daten und abschließendes Importieren in PostgreSQL. Leider hat bei keinem der verfügbaren Tools zur Modifizierung (siehe [1]) der Import funktioniert, d.h. die Daten konnten nicht korrekt für PostgreSQL modifiziert werden. Des Weiteren gibt es kommerzielle Tools wie bspw. easyfrom, die über eine entsprechende Oberfläche die Migration von der Quell- zur Zieldatenbank ermöglichen. Eine weitere Möglichkeit ist die Verwendung eines Grails-Plugins wie beispielsweise DB Stuff [2]. Mit dem Plugin können Daten aus einer DB in XML abgespeichert werden und von XML wiederum in eine Datenbank eingelesen werden.&lt;br /&gt;&lt;br /&gt;In unserem Fall traten Probleme bezüglich der unterschiedlichen Datentypen zwischen MySql und PostgreSQL auf. Außerdem ist das Handling von DB-Relationen mit dieser Art von Plugins eher schwierig bzw. nicht möglich. Aufgrund der Historie hatten wir auch einige Spalten im Originalschema, für die es kein Mapping mehr in den Grails-Domain-Klassen gab. Sie waren also unbenutzt und sollten möglichst automatisiert entfernt werden. &lt;br /&gt;Der Entschluss fiel schließlich zur Erstellung einer eigenen kleinen Migrationssuite. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Migrationsidee&lt;/b&gt;&lt;br /&gt;Die Idee zur Durchführung ist relativ einfach. Über Grails Domain-Klassen werden die Daten aus der alten DB ausgelesen und anschließend werden die Inhalte der Domain-Objekte direkt in die neue Datenbank gespeichert. &lt;br /&gt;Folgende Punkte sind hierbei zu beachten und müssen gelöst werden:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Zugriff auf zwei Datenbanken in einer Grails-Applikation&lt;/li&gt;&lt;li&gt;Transaktionen: Abhängig von der Datenmenge ist ein entsprechendes Transaktionshandling notwendig&lt;/li&gt;&lt;li&gt;Definition von fachlichen Schlüsseln, um Relationen in der Ziel-Datenbank wieder zu erstellen&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Migrationsdurchführung&lt;/b&gt;&lt;br /&gt;Für den Zugriff auf zwei Datenbanken wurde das Datasources Plugin [3] eingesetzt. Die Standard-Konfiguration für Datenbanken in der Datei DataSource.groovy zeigte auf die alte DB und war wie bisher mit allen bestehenden Domain-Klassen verknüpft. &lt;br /&gt;Die bestehenden Domain-Klassen wurden alle in ein neues Package kopiert und über das Datasources Plugin mit der neuen DB verknüpft. Hierfür können, wie nachfolgend dargestellt, in der Konfigurations-Datei des Plugins die zu verknüpfenden Domain-Klassen angegeben werden. Des Weiteren kann auch angegeben werden welche Services per Default auf die konfigurierte Data-Quelle zugreifen. &lt;br /&gt;&lt;pre class="java" name="code"&gt;datasources = {&lt;br /&gt; datasource(name: 'dsPostgresMigration') {&lt;br /&gt;  domainClasses([com.exensio.timesheet.migrate.RenderReportLevel,...])&lt;br /&gt;  readOnly(false)&lt;br /&gt;  pooled(true)&lt;br /&gt;  dialect(org.hibernate.dialect.PostgreSQLDialect)&lt;br /&gt;  driverClassName('org.postgresql.Driver')&lt;br /&gt;  url('jdbc:postgresql://192.168.11.211:5432/extime')&lt;br /&gt;  username('...')&lt;br /&gt;  password('...')&lt;br /&gt;  dbCreate('update') &lt;br /&gt;  pooled(true)&lt;br /&gt;  services(['migration'])&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Für die eigentliche Migration ist der MigrationService zuständig. Der Service enthält für jedes zu migrierende Domain-Klassen-Geflecht eine Methode. Im einfachsten Fall führt eine Methode die Migration für genau eine Domain-Klasse und damit Datenbanktabelle durch. Das nachfolgende Code-Fragmentzeigt wie im ersten Schritt alle zu migrierenden Domain-Objekte ausgelesen werden. Anschließend wird über diese iteriert und bei jedem Schleifendurchlauf alle Attribute bis auf die technische ID vom alten Domain-Objekt in ein neu erstelltes Domain-Objekt kopiert und gespeichert.&lt;br /&gt;&lt;pre class="java" name="code"&gt;def migrateRenderReportLevel() {&lt;br /&gt; def renderReportLevels = com.exensio.timesheet.RenderReportLevel.list()&lt;br /&gt; def domainClass = new DefaultGrailsDomainClass(RenderReportLevel.class)&lt;br /&gt;&lt;br /&gt; renderReportLevels.each {oldDomainObject -&amp;gt;&lt;br /&gt;  def newDomainMap = [:]&lt;br /&gt;  domainClass.persistentProperties.each { property -&amp;gt;&lt;br /&gt;   newDomainMap[property.name] = oldDomainObject[property.name]&lt;br /&gt;  }&lt;br /&gt;  RenderReportLevel newDomainObject = new RenderReportLevel(newDomainMap)&lt;br /&gt;  newDomainObject.save(flush: true)&lt;br /&gt;  if (newDomainObject.hasErrors()) {&lt;br /&gt;   handleErrors(newDomainObject)&lt;br /&gt;  }&lt;br /&gt;  else {&lt;br /&gt;   log.info "${newDomainObject.class.simpleName} ${oldDomainObject.id} migrated"&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Durch die Nutzung eines Service und die Aufspaltung in mehrere Methoden kann der Ablauf der Migration einfach in mehrere Transaktionen eingeteilt werden. Die Hauptschwierigkeit bei der Migration ist die Auflösung der Beziehungen. In vielen Fällen kann die Migration über mehrere Objekte in einer Methode direkt erfolgen.Allerdings gibt es auch Domain-Klassen, die von mehreren anderen referenziert werden. Hier ist darauf zu achten, dass die Migration nur einmal erfolgt und die Beziehungen anschließend über fachliche Schlüssel erstellt werden. &lt;br /&gt;In unserem Fall gibt es die beiden Domain-Klassen User und Role, die in einer Methode migriert wurden. Die Klasse User wird auch von der Klasse Project referenziert, die wiederum in einer separaten Methode migriert wurde. Diese Migration-Methode sucht sich über den eindeutigen Login-Namen den entsprechenden User aus der Tabelle und setzt die Beziehung. &lt;br /&gt;&lt;pre class="java" name="code"&gt;Employee existing = Employee.findByUsername(oldDomainObject.projectManager.username)&lt;br /&gt;if (existing) {&lt;br /&gt; newDomainObject.projectManager = existing&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Zusammenfassung&lt;/b&gt;&lt;br /&gt;Das vorgestellte Verfahren für eine Datenbankmigration erfordert zwar etwas Programmierarbeit, ist aber dank Grails in kurzer Zeit umzusetzen. Es bietet sich insbesondere an wenn bei der Migration Sonderfälle zu beachten sind, wie bspw. das Entfernen nicht mehr benötigter Spalten. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br /&gt;[1] &lt;a href="http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL" target="_blank"&gt;Converting from other Databases to PostgreSQL&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://grails.org/plugin/db-stuff" target="_blank"&gt;DB Stuff Plugin&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://grails.org/plugin/datasources" target="_blank"&gt;Datasources Plugin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-1654020689043310689?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/1654020689043310689/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/11/datenbank-migrationen-mit-grails.html#comment-form' title='3 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1654020689043310689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1654020689043310689'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/11/datenbank-migrationen-mit-grails.html' title='Datenbank-Migrationen mit Grails'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total><georss:featurename>Spessart, 76275 Ettlingen, Deutschland</georss:featurename><georss:point>48.913343 8.433569</georss:point><georss:box>48.9081255 8.4236985 48.9185605 8.4434395</georss:box></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-6224734467127204107</id><published>2011-11-20T17:16:00.001+01:00</published><updated>2011-11-20T18:05:01.337+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Usability'/><title type='text'>Verbesserung der Usability mittels Faceted Search</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-dEPy8LFtCTw/Tsko-Z5CD7I/AAAAAAAAAMw/7Ye8W1JKJos/s1600/search.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://2.bp.blogspot.com/-dEPy8LFtCTw/Tsko-Z5CD7I/AAAAAAAAAMw/7Ye8W1JKJos/s200/search.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Die Idee der Faceted Search basiert auf der Facettenklassifikation [1][2]. Diese wurde 1933 von dem indischen Mathematiker und Bibliothekar S. R. Ranganathan [3] entwickelt, um die Bestände der Universitätsbibliothek von Madras zu katalogisieren. Bei der Facettenklassifikation werden Objekte des Wissensbereichs nicht in eine starre Baumstruktur eingegliedert, sondern durch mehrere voneinander unabhängige Gesichtspunkte definiert. In folgendem Blogeintrag möchte ich kurz beschreiben, wie User mittels Faceted Search schneller und präziser Informationen finden können und somit die Usability von (Web-) Applikationen gesteigert werden kann.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Anwendungsbeispiele&lt;/b&gt;&lt;br /&gt;Die Faceted Search ist heute vor allem bei Online Shops anzutreffen. Als prominentestes Beispiel kann hier Amazon genannt werden. Die Faceted Search setzt sich jedoch auch immer mehr bei der Verwaltung und späteren Suche von Informationen, wie Dokumenten oder Emails durch. Als Beispiel kann hier Google Mail betrachtet werden. Im Vergleich zu Outlook werden Mails nicht hierarchisch abgelegt, sondern mit Label versehen. Label sind auch unter dem Begriff Tag bekannt. Eine Hierarchie lässt sich beispielsweise unter Benutzung von Pfadnamen realisieren, wie es auch bei Google Mail gemacht wird.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Vorteile&lt;/b&gt;&lt;br /&gt;Beim Ablegen von Dokumenten trifft man oft auf die Problematik, dass ein Dokument eigentlich in &amp;nbsp;mehreren Knoten einer Baumstruktur abgelegt werden soll. Dies ist bei einer starren Baumstruktur nicht möglich (Google Mail versus Outlook). Bei der Faceted Search werden die Dokumente mit Tags versehen (verschlagwortet) und können später in verschiedenen Knoten angezeigt (gefiltert)werden. Ein Nebeneffekt der Verschlagwortung ist, dass die Dokumente eindeutig klassifiziert werden. Dies hat den großen Vorteil – im Vergleich zu einer Volltextsuche, dass Informationen präziser und schneller gefunden werden können. Bei einer Volltextsuche wird für die Dokumente beim Indizieren ein Wortvektor ermittelt. In der Suchergebnismenge wird dann die Relevanz eines Suchbegriffs über den Wortvektor ermittelt. Das Problem hierbei ist, dass die Relevanz nur eine Annäherung darstellt. Der semantische Bezug zum eigentlichen Suchwort ist meist nicht gegeben. So erreicht beispielsweise Google erst unter Einbeziehung von Wikipedia bessere Suchergebnisse.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Voraussetzung für den Einsatz einer Faceted Search&lt;/b&gt;&lt;br /&gt;Die wichtigste Voraussetzung für die Benutzung von Faceted Search ist die Erstellung einer Tag Taxonomie. &amp;nbsp;Diese kann beispielweise aus der Menüstruktur abgeleitet werden. Wichtiger Tipp hier ist, nicht mehr als 4 Hierarchieebenen aus der Menüstruktur zu übernehmen. &amp;nbsp;Die Tags werden dann später zur Verschlagwortung durch den Editor herangezogen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beispiel&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xTKMGbGiTjw/TskoKzX01tI/AAAAAAAAAMo/29C8cxm5gUE/s1600/Dokumente.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-xTKMGbGiTjw/TskoKzX01tI/AAAAAAAAAMo/29C8cxm5gUE/s320/Dokumente.png" width="282" /&gt;&lt;/a&gt;&lt;/div&gt;Als Beispiel (siehe Wireframe rechts) möchte ich das Dokumenten-Center unserer &lt;a href="http://exensio.blogspot.com/2011/05/unsere-enterprise-20-plattform.html"&gt;Enterprise 2.0 Applikation&lt;/a&gt; heranziehen. Auf der linken Seite wird die Faceted Search angezeigt. In unserem Fall ist sie hierarchisch. Eine flache Struktur wäre auch denkbar. &amp;nbsp;Durch das Markieren der Check-Boxen wird die Suchergebnismenge in der Mitte eingeschränkt, sprich die Dokumente werden gefiltert. Auf der rechten Seite sind technische Filter (oder Navigatoren) platziert, mit denen die Suchergebnismenge nochmals um Aspekte, wie Dokumententyp oder Zeitraum eingeschränkt werden können.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;In unseren Kundenprojekten haben wir die&amp;nbsp;Erfahrung gemacht, dass Benutzer schneller und präziser die gewünschten Informationen mittels Facted Search - im Vergleich zur Volltextsuche - finden. Hierdurch kann die Usability von (Web-)Applikationen enorm gesteigert werden. Nicht verschweigen sollte man jedoch, dass es eine gewisse Zeit für den Benutzer bedarf, bis er sich von einer hierarchischen Menüstruktur gelöst hat.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br /&gt;[1] &lt;a href="http://de.wikipedia.org/wiki/Facettenklassifikation"&gt;http://de.wikipedia.org/wiki/Facettenklassifikation&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://de.wikipedia.org/wiki/Colon-Klassifikation"&gt;http://de.wikipedia.org/wiki/Colon-Klassifikation&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://de.wikipedia.org/wiki/S._R._Ranganathan"&gt;http://de.wikipedia.org/wiki/S._R._Ranganathan&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-6224734467127204107?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/6224734467127204107/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/11/verbesserung-der-usability-mittels.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6224734467127204107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6224734467127204107'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/11/verbesserung-der-usability-mittels.html' title='Verbesserung der Usability mittels Faceted Search'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-dEPy8LFtCTw/Tsko-Z5CD7I/AAAAAAAAAMw/7Ye8W1JKJos/s72-c/search.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-13369217851198519</id><published>2011-10-30T16:36:00.000+01:00</published><updated>2011-11-24T11:44:12.546+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Excel Prozesse und warum es sinnvoll ist, diese durch Grails Web Applikationen zu ersetzen</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-WwyiVSpMDJg/Tq1uK0BOVZI/AAAAAAAAAKY/gL7viKdDkJ4/s1600/processSmall.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-WwyiVSpMDJg/Tq1uK0BOVZI/AAAAAAAAAKY/gL7viKdDkJ4/s200/processSmall.jpg" width="150" /&gt;&lt;/a&gt;&lt;/div&gt;Excel gilt in Fachabteilungen als das Schweizer Taschenmesser um verschiedenste Prozesse abzubilden. So ist ein Prozess auf den ersten Blick schnell aufgesetzt und das ohne die Involvierung der IT-Abteilung, die den Fachabteilungen bekanntlich meistens zu langsam ist.&lt;br /&gt;&lt;br /&gt;Als fiktiven Prozess können wir hier beispielsweise den Export eines Excel-Sheets aus dem SAP System heranziehen. Dieses Excel-Sheet wird dann per Mail oder Fileshare zwischen den unterschiedlichen Abteilungen (oder auch mit externen Dienstleistern)  verteilt, die jeweils einen oder mehrere Prozessschritte in diesem Excel-Sheet abarbeiten. Zum Schluss soll dieses Excel Sheet wieder in das SAP System  importiert werden.&lt;br /&gt;&lt;br /&gt;Einige Leser werden sich nun fragen, wo hier das Problem liegt, da ja genauso in ihrem Unternehmen gearbeitet wird. Zunächst einmal funktioniert das Ganze natürlich auch per Excel-Sheet. Es wird jedoch leicht übersehen, dass diese Excel-Prozesse auf Dauer teurer sind, als wenn sie über eine Software-Lösung abgebildet werden.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was ist an einem Excel-Prozess suboptimal?&lt;/b&gt;&lt;br /&gt;Folgende Punkte können anhand unseres fiktiven Prozesses als nachteilig aufgeführt werden:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Alle im Prozess beteiligten Personen wissen nie, ob sie wirklich die aktuelle Version haben.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Mit MS Sharepoint ist es zwar möglich, ein Excel Sheet in einer Gruppe  zu bearbeiten. Dies hat jedoch den Nachteil, dass keine Drittsysteme eingebunden werden können, mit der Folge, dass sich Falscheingaben – wie beispielsweise eine falsche Email-Adresse – einschleichen können. Diese Informationen sollten jedoch direkt aus den Drittsystemen, wie in diesem Fall aus dem Verzeichnisdienst (beispielsweise Active Directory) gezogen werden.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Sollen externe Dienstleister integriert werden, müsste Sharepoint über ein Extranet geöffnet werden. Viele Firmen scheuen sich jedoch momentan noch, aus Gründen der Sicherheit, Sharepoint nach außen zu öffnen.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Der abschließende Import in das SAP System ist sehr fehleranfällig, da es schon reicht, dass jemand im Excel-Sheet versehentlich eine Falschangabe (beispielweise Formatänderung der Zelle, etc.) gemacht hat.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Alle Prozessbeteiligten müssen über die gleiche Excel-Version verfügen. Dies ist dann vor allem problematisch, wenn externe Dienstleister integriert werden sollen.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Die Unterstützung von mobilen Endgeräten (iPad, iPhone oder Android) ist nicht möglich.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Was sind die Alternativen?&lt;/b&gt;&lt;br /&gt;Der Königsweg wäre ganz klar, die Prozesse mittels einer unternehmensübergreifen BPM bzw. SOA Strategie abzudecken. Als größtes Problem ist hierbei jedoch aufzuführen, dass solch ein Projekt sehr langwierig ist und die Vorurteile des Fachbereichs gegenüber der IT (zu langsam) sicherlich bekräftigt.&lt;br /&gt;&lt;br /&gt;Ein Mittelweg wäre den Excel Prozess mit einer Web Applikation abzubilden. Wir benutzen hier sehr gerne das Open-Source-Framework &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;, mit diesem Framework ist eine schnelle Entwicklung möglich.&lt;br /&gt;&lt;br /&gt;Was wären die Vorteile - am Beispiel - unseres fiktiven Prozesses:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In der ersten Phase könnte der Export und Import des Excel-Sheets aus dem SAP System bestehen bleiben. Es ist natürlich auch möglich, auf das SAP System direkt mittels SAPJco oder Web-Services zuzugreifen. Dies hängt ganz von den Wünschen des Kunden ab.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Alle Prozessbeteiligten erhalten eine aktuelle Sicht auf Ihre Daten. Und nur auf ihre Daten. Wir haben in diesem Kontext schon Excel-Sheets mit 5000 und mehr Zeilen gesehen. Ich denke jeder kann sich vorstellen, dass es hier leicht zu Fehleingaben kommen kann.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Externe Dienstleister können über ein Extranet (z.B. XML-Schnittstelle) bedient werden. Da das &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; Framework auf der Java JVM aufbaut, kann hier der gesamte Java Security Stack benutzt werden.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Der abschließende Import in das SAP System könnte direkt über SAPJco oder einen Web-Service erfolgen. Falls der Import über Excel gewählt wird, kann auf jeden Fall sichergestellt werden, dass das zu importierend Excel-Sheet sauber ist.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Fazit&amp;nbsp;&lt;/b&gt;&lt;br /&gt;Auf vielen Veranstaltungen bekommen wir positives Feedback, wenn wir unseren Mittelweg der Excel-Prozess-Optimierung vorstellen. So ist vielen Unternehmen schnell ersichtlich, dass ein Excel-Prozess auf lange Sicht viel teurer kommt, als eine saubere Software-Lösung. Der Mittelweg über eine &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; Web Applikation ist somit – aus unserer Sicht – eine sehr gute Lösung für Firmen, die noch nicht bereit sind für den unternehmensübergreifenden BPM/SOA Ansatz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-13369217851198519?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/13369217851198519/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/10/excel-prozesse-und-warum-es-sinnvoll.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/13369217851198519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/13369217851198519'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/10/excel-prozesse-und-warum-es-sinnvoll.html' title='Excel Prozesse und warum es sinnvoll ist, diese durch Grails Web Applikationen zu ersetzen'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-WwyiVSpMDJg/Tq1uK0BOVZI/AAAAAAAAAKY/gL7viKdDkJ4/s72-c/processSmall.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-114726002024437669</id><published>2011-10-01T18:31:00.000+02:00</published><updated>2011-10-03T17:30:15.360+02:00</updated><title type='text'>Wir benutzen nun das CRM System Highrise von 37signals.com</title><content type='html'>&lt;br /&gt;Mit diesem Blogeintrag möchte ich kurz über die von uns gesammelten Erfahrungen, bei der Evaluierung unseres neuen CRM Systems, berichten. Bisher haben wir hierzu eine Kombination aus Outlook und Excel benutzt, mit den bei dieser Kombination typischen Problemen. Ein Anlass diesen Prozess zu optimieren bot sich letzte Woche, als wir von einer Veranstaltung zurück kamen. Wir hatten uns vorgenommen, eine kleine Evaluierung durchzuführen und falls wir nicht fündig werden, ein kleines CRM System - basierend auf dem Grails Framework - selbst zu schreiben. Unsere Projekt-Zeiterfassung haben wir bereits - nach einer erfolglosen Suche - mit dem Grails Framework implementiert [1]. Für uns waren folgende Kriterien besonders wichtig:&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wqLGftW071M/Toc_CLgfR1I/AAAAAAAAAJY/XWV2JhNDZQM/s1600/37signals.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="292" src="http://1.bp.blogspot.com/-wqLGftW071M/Toc_CLgfR1I/AAAAAAAAAJY/XWV2JhNDZQM/s320/37signals.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Source: 37signals.com&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul&gt;&lt;li&gt;Die Anwendung sollte sehr einfach zu bedienen sein&lt;/li&gt;&lt;li&gt;Die Anwendung sollte keine lange Einarbeitungszeit erfordern&lt;/li&gt;&lt;li&gt;Die Anwendung sollte als Software as a Service (SaaS) verfügbar sein.&lt;/li&gt;&lt;li&gt;Einfacher Import von Kontakten, ohne ein Browser-Plugin installieren zu müssen&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Welche Anbieter haben wir uns angeschaut?&lt;/b&gt;&lt;br /&gt;Folgende Lösungen sind von uns evaluiert worden:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CAS PIA [2]&lt;/li&gt;&lt;li&gt;SageCRM.com [3]&lt;/li&gt;&lt;li&gt;Salesforce [4]&lt;/li&gt;&lt;/ul&gt;Schnell mussten wir feststellen, dass unsere Kriterien, wie beispielsweise Einfachheit, von keinem der Systeme erfüllt wurde. Zufällig erinnerten wir uns, dass auf der Homepage der Firma 37signals.com auch ein CRM System angeboten wird. Die Firma 37signals.com ist wohl den meisten als Anbieter der Projektmanagement-Lösung Basecamp bekannt. Aus Basecamp wurde später Ruby on Rails [5] extrahiert und Ruby on Rails ist wiederum der Initiator des Opensource-Projekts Grails[6]. Nun wussten wir, dass wir richtig waren :-).&lt;br /&gt;&lt;br/&gt;&lt;b&gt;Was gefällt uns an Highrise von 37signals.com besonders?&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Das System sehr einfach und selbsterklärend aufgebaut&lt;/li&gt;&lt;li&gt;Die Lösung ist als SaaS verfügbar&lt;/li&gt;&lt;li&gt;Kontakte können einfach mittels Excel, CSV oder vCard importiert werden&lt;/li&gt;&lt;li&gt;Es können verschiedene Drittsystem (z.B. für den Mailversand) als Add-Ons angebunden werden&lt;/li&gt;&lt;li&gt;Wir können Kontakte mit Schlagworten („Tags“) versehen werden. Diese Vorgehensweise ist viel besser, als ein Kommentarfeld.&lt;/li&gt;&lt;li&gt;Emails können mit Outlook versendet werden. In der BCC Zeile gibt man eine Dropbox-Email-Adresse an. Die Mail wird dann automatisch zu dem Activity Stream des Kontakts hinzugefügt. Dies ist einfach nur genial!&lt;/li&gt;&lt;/ul&gt;Weitere Infos zu Highrise finden sich hier [7]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;Wir sind wirklich sehr begeistert von dieser Lösung. Die anderen Anbieter verfügen selbstredend über einen viel größeren Funktionsumfang. Diesen brauchen wir jedoch nicht. Highrise sollte man bei einer CRM-Evaluierung auf jeden Fall in Betracht ziehen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br /&gt;[1] &lt;a href="http://exensio.blogspot.com/2010/10/erfahrungsbericht-ablosung-von-excel.html"&gt;Erfahrungsbericht: Ablösung einer Excel-basierten Zeiterfassung durch eine Grails Web-Applikation&lt;/a&gt; &lt;br /&gt;[2] &lt;a href="http://www.cas-pia.de/"&gt;CAS PIA&amp;nbsp;&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://de.sagecrm.com/"&gt;SageCRM.com&lt;/a&gt;&lt;br /&gt;[4]&amp;nbsp;&lt;a href="http://www.salesforce.com/"&gt;Salesforce&lt;/a&gt;&lt;br /&gt;[5] &lt;a href="http://rubyonrails.org/"&gt;Homepage Ruby on Rails&lt;/a&gt;&lt;br /&gt;[6] &lt;a href="http://www.grails.org/"&gt;Homepage Grails Framework&lt;/a&gt;&lt;br /&gt;[7]&amp;nbsp;&lt;a href="http://highrisehq.com/tour/"&gt;Highrise Tour&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-114726002024437669?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/114726002024437669/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/10/wir-benutzen-nun-das-crm-system.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/114726002024437669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/114726002024437669'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/10/wir-benutzen-nun-das-crm-system.html' title='Wir benutzen nun das CRM System Highrise von 37signals.com'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-wqLGftW071M/Toc_CLgfR1I/AAAAAAAAAJY/XWV2JhNDZQM/s72-c/37signals.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-5473167057609698220</id><published>2011-09-30T18:46:00.000+02:00</published><updated>2011-10-03T18:32:17.547+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='socialmedia'/><category scheme='http://www.blogger.com/atom/ns#' term='socbiz'/><title type='text'>Social Media und das Thema Sicherheit</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-KRav5QbLxh8/TongtZVvVII/AAAAAAAAAJg/zEtmvyn-0Y8/s1600/SocMediaSecurity_small.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="199" src="http://2.bp.blogspot.com/-KRav5QbLxh8/TongtZVvVII/AAAAAAAAAJg/zEtmvyn-0Y8/s200/SocMediaSecurity_small.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;In den letzten Wochen habe ich wieder sehr viele Blog-Posts gelesen, in denen immer wieder mantraartig auf die mangelnde Bereitschaft deutscher Unternehmen, sich mit dem Thema Social Media zu beschäftigen, hingewiesen wird. Laut zahlreicher Studien (z.B. [1]) lehnen demzufolge knapp 86% aller deutschen Unternehmen Social Media aus Sicherheitsgründen ab.&lt;br /&gt;Auf Veranstaltungen zum Thema Social Media wird von Agenturen meist nur aufgezeigt, wie wichtig es ist, dabei zu sein. Sicherheitsthemen werden gerne ausgeblendet, da dies dem neuen Geschäftsfeld nicht zuträglich ist.&lt;br /&gt;Ich möchte hier nicht gegen Social Media wettern, aber ich finde es immer besser, wenn man sich der Gefahr bewusst ist. Nur dann kann adäquat reagiert werden. Des Weiteren ist es meines Erachtens sehr wichtig, die IT-Abteilung von Anfang an, bei den sicherheitsrelevanten Themen, zu involvieren. Ein Alleingang der Marketing- bzw. Personalabteilung ist nicht anzuraten. Aber wo lauern jetzt genau die Gefahren?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ein kleiner Exkurs in die Welt der Virenscanner&lt;/b&gt;&lt;br /&gt;Durch einen Virenscanner wird verhindert, dass sich Schädlinge (Malware) - wie Computerviren, Computerwürmer oder Trojanische Pferde - auf einem PC einnisten können. Hierzu arbeiten die Hersteller vor allem mit 2 Verfahren, den Virensignaturen und Heuristiken (Suche nach Merkmalen eines Computervirus). Leider sind Virenscanner nicht 100% zuverlässig. So können Virensignaturen erst vom Hersteller zum Download angeboten werden, wenn diesem der neue Virustyp bekannt ist (Problem der Zero-Day-Attacke [2]).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was macht Facebook und Co nun so gefährlich?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;Ein Angriff ohne Social Media benutzt beispielsweise  Massenemails. Bei dieser Angriffsform wird darauf vertraut, dass ein gewisser Prozentsatz unwissentlich auf einen Link klickt. Mit Social Media Netzwerken, wie Facebook, Xing oder Google+ können Angreifer mit einer viel kleineren Anzahl von Mails auskommen und somit (theoretisch) fast punktgenau Malware auf den PC eines Mitarbeiters einschleusen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wie könnte so ein Angriffsszenario aussehen?&lt;/b&gt;&lt;br /&gt;So kann beispielsweise über Xing der Vor- und Nachname von Mitarbeitern einer bestimmten Firma (und vielfach sogar die Abteilung) ermittelt werden. Dann ist es ein leichtes sich die Emailadressen zusammenzusetzen. Ohne Xing müssten die Emailadressen durchprobiert werden. Die Vornamen würden einer Vornamenliste (die es im Internet gibt) entnommen, die Nachnahmen würden permutiert werden. So wäre beispielsweise meine Email-Adresse sehr schnell ermittelt, da mein Nachname nur aus 4 Buchstaben besteht. Bei dieser Vorgehensweise müssen jedoch sehr viele Mails – auch viele mit falschen Mailadressen – an den Mailserver  der anzugreifenden Firma versendet werden, deshalb wird solch ein Angriff mit einer hohen Wahrscheinlichkeit auffallen. Bei der Social Media Variante erreichen alle Mails ohne Verdacht die Empfänger. Virenscanner, die im Mailserver installiert sind, können keine Muster erkennen, da es Emails sind, die individuell für einen kleinen Kreis von Adressaten erstellt wurden. Klickt dann ein Mitarbeiter auf einen Link innerhalb der Mail, so wird der Schädling (Malware) heruntergeladen. Diese wird vom Virenscanner wahrscheinlich nicht erkannt, da es sich um einen ganz neuen und individuell für diesen Angriff entwickelten Virus handelt.&lt;br /&gt;Facebook ist aufgrund seiner sehr hohen Anzahl von Mitgliedern besonders interessant für Angreifer, vergleichbar mit Windows in Bezug auf Linux. Aus diesem Grund ist es wohl wahrscheinlicher, sich über Facebook Malware   einzuschleppen, als über Xing. Ein weiteres Sicherheitsproblem ergibt sich bei Facebook und Co. dadurch, dass ich von meinen Kontakten (Freunde und Bekannten) Nachrichten erhalte - und nicht von einer unbekannten Phishing-Mail-Adresse -, die ich für vertrauenswürdig halte. Die Wahrscheinlichkeit, dass ich auf einen Link, der mir von einem Freund über Facebook geschickt wurde,  klicke, ist somit weitaus größer. Durch Social Media erhalten Angreifer somit erstmalig die Möglichkeit sehr gezielte Angriffe durchzuführen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;Durch Social Media wird eine neue Qualität von Angriffen stattfinden. Jedes Unternehmen muss für sich den Nutzen und die Gefahren von Social Media abwägen. Folgende Punkte sind meines Erachtens beim Einstieg in diese Thematik zu beachten:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mitarbeiter müssen für das Thema Sicherheit im Kontext von Social Media sensibilisiert werden. Wichtig wäre es auch, eine IT-Security-Strategie in den Social Media Guide mit aufzunehmen. Hier könnte dann auch verankert werden, dass es beispielsweise wichtig ist, ein sicheres Passwort bei Facebook und Co. zu verwenden.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Brauchen alle Mitarbeiter Zugriff auf Social Media? Dies ist eine wichtige Frage. Meistens benötigt nur die Marketing oder Corporate Communications Abteilung einen direkten Zugang. Die restlichen Mitarbeiter könnten sich auch über Ihr Smart-Phone - während der Mittagspause - bei Facebook oder Xing einwählen. Den Zugriff der Marketingabteilung könnte man beispielsweise über eine Bitbox [3] absichern.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Des Weiteren wäre die Benennung eines zentralen Ansprechpartners wichtig. Zum einen können sich Mitarbeiter mit Fragen an diese Person wenden und zum anderen kann diese Person dann das Krisenmanagement koordinieren. Social Media wird zukünftig ein weiteres Aufgabengebiet für den Chief Security Officer darstellen.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br /&gt;[1] &lt;a href="http://www.itespresso.de/2011/09/12/studie-deutsche-unternehmen-blocken-social-media-am-haufigsten/"&gt;http://www.itespresso.de/2011/09/12/studie-deutsche-unternehmen-blocken-social-media-am-haufigsten/&lt;/a&gt;&lt;br /&gt;[2]&lt;a href="http://de.wikipedia.org/wiki/Zero-Day-Exploit#Zero-Day-Exploit"&gt; http://de.wikipedia.org/wiki/Zero-Day-Exploit#Zero-Day-Exploit&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://www.sirrix.de/content/pages/BitBox"&gt;http://www.sirrix.de/content/pages/BitBox&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Weitere Infos zu diesem Thema&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.heise.de/newsticker/meldung/Klick-Diebstahl-auf-Facebook-breitet-sich-aus-1207165.html"&gt;http://www.heise.de/newsticker/meldung/Klick-Diebstahl-auf-Facebook-breitet-sich-aus-1207165.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://exensio.blogspot.com/2011/07/facebook-und-die-problematik-mit-der.html"&gt; http://exensio.blogspot.com/2011/07/facebook-und-die-problematik-mit-der.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-5473167057609698220?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/5473167057609698220/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/09/social-media-und-das-thema-sicherheit.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5473167057609698220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5473167057609698220'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/09/social-media-und-das-thema-sicherheit.html' title='Social Media und das Thema Sicherheit'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-KRav5QbLxh8/TongtZVvVII/AAAAAAAAAJg/zEtmvyn-0Y8/s72-c/SocMediaSecurity_small.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-5533212688736736404</id><published>2011-08-25T15:32:00.014+02:00</published><updated>2011-08-25T17:26:12.471+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solr'/><category scheme='http://www.blogger.com/atom/ns#' term='e20'/><category scheme='http://www.blogger.com/atom/ns#' term='User Interface'/><title type='text'>Das Such-Interface in der exensio Enterprise 2.0 Plattform</title><content type='html'>Im Artikel &lt;a href="http://exensio.blogspot.com/2011/07/fuzzy-search-und-meinten-sie-in-solr.html"&gt;Fuzzy Search und "Meinten Sie?" in Apache Solr&lt;/a&gt; habe ich bereits erwähnt, dass wir in unserer &lt;a href="http://exensio.blogspot.com/2011/05/unsere-enterprise-20-plattform.html"&gt;Enterprise 2.0 Plattform&lt;/a&gt; auf Apache Solr als Suchmaschine setzen. In diesem Artikel gehe ich auf das User Interface unserer Suche innerhalb unseres Portals ein.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Prinzipien eines User Interfaces einer Suche&lt;/h2&gt;In jeder besseren Suche kann man nicht nur nach Begriffen suchen - man kann auch im Anschluss die zurückgelieferte Ergebnismenge mithilfe nützlicher Filter weiter einschränken. Bekannte Filteroptionen sind unter anderem das Datum oder der Dateityp.&lt;br /&gt;&lt;br /&gt;Hilfreich sind solche Filter insbesondere dadurch, dass man die gesamte Ergebnismenge schrittweise (per Klick) verfeinern kann, um letztendlich aus einem großen "Topf" an Daten die relevanten Informationen zu erhalten.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Einsatz innerhalb des Enterprise 2.0 Portals&lt;/h2&gt;In unserem Portal ist die Suche eine zentrale Komponente, die in verschiedenen Portlets zur Filterung der Inhalte verwendet wird. Im Folgenden gehe ich auf das User Interface der "eigenständigen" Suche ein.&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Eingabe von Suchbegriffen:&lt;/b&gt; Eingegeben werden kann alles, was Apache Solr unterstützt. Eine Übersicht über die Syntax und die boolschen Operatoren findet sich unter [1].&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Auto-complete:&lt;/b&gt; Dabei werden die Auto-complete Vorschläge zur Laufzeit anhand der aktuell im Index vorhandenen Daten über Apache Solr ermittelt.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Administrations-Tools:&lt;/b&gt; Nützliche Funktionen rundum die Indizierung können von berechtigten Benutzern direkt über die Suchseite aufgerufen werden.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Sortierung:&lt;/b&gt; Die Sortierung nach Relevanz ist Standard und erfolgt über den von Apache Solr ermittelten Score. Alternativ wird eine Sortierung nach Datum angeboten.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Filter (Navigatoren/Facets):&lt;/b&gt; Die Filter lassen sich in unterschiedliche Kategorien einteilen. Sie können benutzt werden, um Dokumente nach Datum, Typ, Autor, Kategorie o.ä. zu filtern. In &lt;b&gt;Screenshot 2&lt;/b&gt; ist dargestellt, wie sich solche Filter sukzessive anwenden lassen um von einer großen Ergebnismenge auf ein paar gezielt herausgesuchte Ergebnisse zu kommen.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Meta-Informationen:&lt;/b&gt; Jeder Treffer enthält nützliche Meta-Informationen wie das Datum der letzten Aktualisierung oder - im Fall von Dokumenten - die Dateigröße.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Teaser und Highlighting:&lt;/b&gt; Zu jedem Treffer wird ein Teaser angezeigt, bei dem die gesuchten Begriffe hervorgehoben werden.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Blätterung:&lt;/b&gt; Die Blätterung erlaubt das schnelle Durchsuchen der Ergebnismenge.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Tag-Cloud:&lt;/b&gt; Die Tag-Cloud kann über beliebige Informationen gebildet werden. In diesem Fall werden die am häufigsten Begriffe, die im Kontext des aktuellen Suchbegriffs auftauchen, angezeigt (groß = häufig, klein = weniger häufig). Gleiches lässt sich auch problemlos auf strukturierte Daten wie Tags anwenden.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h2&gt;Screenshots der Suche&lt;/h2&gt;&lt;table class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;" align="center" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-hI65bqSJwPA/TlZbP9oCkcI/AAAAAAAAACw/K9P0jXlLQYM/s1600/exensio-enterprise20-search-tooltips.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 324px; height: 400px;" src="http://2.bp.blogspot.com/-hI65bqSJwPA/TlZbP9oCkcI/AAAAAAAAACw/K9P0jXlLQYM/s400/exensio-enterprise20-search-tooltips.png" alt="" id="BLOGGER_PHOTO_ID_5644799512754164162" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Suche nach exensio GmbH&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-L__aK0IVm4w/TlZcYzHD4SI/AAAAAAAAAC4/zYW1qQAbd7I/s1600/exensio-enterprise20-search-active-filter.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://3.bp.blogspot.com/-L__aK0IVm4w/TlZcYzHD4SI/AAAAAAAAAC4/zYW1qQAbd7I/s400/exensio-enterprise20-search-active-filter.png" alt="" id="BLOGGER_PHOTO_ID_5644800764061933858" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Suche nach exensio GmbH mit anschließender Filterung auf Blog-Beiträge mit Tag "exensio" im Zeitraum ab 1. August 2011&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://lucene.apache.org/java/3_3_0/queryparsersyntax.html"&gt;http://lucene.apache.org/java/3_3_0/queryparsersyntax.html&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://wiki.apache.org/solr/SolrRelevancyCookbook"&gt;http://wiki.apache.org/solr/SolrRelevancyCookbook&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-5533212688736736404?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/5533212688736736404/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/08/das-such-interface-in-der-exensio.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5533212688736736404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5533212688736736404'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/08/das-such-interface-in-der-exensio.html' title='Das Such-Interface in der exensio Enterprise 2.0 Plattform'/><author><name>Manuel Breitfeld</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-hI65bqSJwPA/TlZbP9oCkcI/AAAAAAAAACw/K9P0jXlLQYM/s72-c/exensio-enterprise20-search-tooltips.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-7562316286708896806</id><published>2011-08-20T16:14:00.000+02:00</published><updated>2011-08-20T16:14:58.430+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open-Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Kettle'/><category scheme='http://www.blogger.com/atom/ns#' term='ETL'/><category scheme='http://www.blogger.com/atom/ns#' term='DWH'/><title type='text'>ETL-Prozesse mit Pentaho Kettle umsetzen</title><content type='html'>&lt;div&gt;Ein wichtiger Aspekt beim Aufbau eines Data Warehouses ist der Befüllungs-Prozess, der über den sogenannten ETL-Vorgang [1] erfolgt. Hierbei werden Daten von verschiedenen Quell-Systemen extrahiert, anschließend ggfs. transformiert und im abschließenden Schritt in das Data Warehouse geladen. &lt;br /&gt;Zur Unterstützung des  ETL-Vorgangs stehen zahlreiche Tools aus dem kommerziellen und Open-Source Umfeld zur Verfügung. Generell bringen Data Warehouse Lösungen selbst schon ein entsprechendes Tool bzw. Toolunterstützung mit. &lt;br /&gt;Alternativ kann man natürlich den gesamten ETL-Prozess auch „von Hand“ umsetzen. Dies ist aufgrund der Komplexität mit einem entsprechenden Aufwand verbunden. Deshalb wird i.d.R. auf ETL-Tools zurückgegriffen, die vor allen Dingen die folgenden Anforderungen erfüllen: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Integration von verschiedenen Quell-Systemen&lt;/li&gt;&lt;li&gt;Skalierbarkeit&lt;/li&gt;&lt;li&gt;Erweiterbarkeit für die Integration von weiteren Systemen&lt;/li&gt;&lt;li&gt;Unterstützung für Daten-Transformationen (z.B. Aggregation, Filterung, …)&lt;/li&gt;&lt;li&gt;ausführliche Test-, Debug- und Logging-Möglichkeiten&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Ein ausgereiftes ETL-Tool, das unter anderem diese Anforderungen erfüllt ist Kettle. Kettle ist ein Open-Source Produkt und stammt von der Firma Pentaho [2], die auch die gleichnamige DWH- bzw. BI-Lösung anbietet. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Kettle in der Entwicklung&lt;/b&gt; &lt;br /&gt;Dreh- und Angelpunkt ist in Kettle das Designer-Tool Spoon. Mit dessen Unterstützung werden die sogenannten Jobs und Transformationen definiert. Die Transformationen sind für das eigentliche ETL-Handling zuständig. Jobs sind dagegen für die Einhaltung der Reihenfolge sowie die Verwaltung (z.B. auch Fehlerhandling)  verantwortlich und können mehrere Transformationen enthalten. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-epvnQRVy2_M/TkDQMoKzWYI/AAAAAAAAAME/nCgt7trsF_o/s1600/kettle_sample_tranf.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 298px;" src="http://4.bp.blogspot.com/-epvnQRVy2_M/TkDQMoKzWYI/AAAAAAAAAME/nCgt7trsF_o/s320/kettle_sample_tranf.png" alt="" id="BLOGGER_PHOTO_ID_5638735648827595138" border="0" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Die vorherige Abbildung zeigt eine Transformation in der Designer-Sicht von Spoon. Im ersten Schritt werden aus einem Verzeichnis CSV-Dateien eingelesen. Beim Einlesen kann über einen Regex-Ausdruck  definiert werden welche Dateien eingelesen werden. Aus den CSV-Dateien werden die benötigten Werte extrahiert und bei Bedarf auch formatiert. Da die Daten in ein relationales Datenbankschema geladen werden sollen müssen zunächst entsprechende Fremdschlüssel über Lookups ermittelt werden. Nach der Ermittlung des nächsten freien Primärschlüssels für die Zieltabelle kann abschließend die Einfüge-Operation vorgenommen werden. &lt;br /&gt;&lt;br /&gt;Der Aufbau der Transformation sowie die Definition der einzelnen Schritte wurden allesamt mit Spoon vorgenommen. Das vorgestellte Beispiel zeigt nur eine kleine Auswahl an möglichen Schritten, die durchgeführt werden können. Spoon bietet ein sehr große Palette an vordefinierten Elementen, die für Transformationen eingesetzt werden können (z.B. Ausführung von Pragrammcode zur Konvertierung oder FTP-Transfer zum Abholen von Dateien). &lt;br /&gt;&lt;br /&gt;Das Testen und Debuggen der Transformation wird direkt in Spoon durchgeführt und ermöglicht so eine schnelle Verifikation. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit&lt;/b&gt; &lt;br /&gt;Würde  man die vorgestellte Transformation komplett in Eigenarbeit umsetzen wäre ein wesentlich höherer Zeitaufwand notwendig und auch Erweiterungen bzw. Änderungen würden  höher zu Buche schlagen. Kettle eignet sich, aufgrund seiner zahlreichen Funktionen, neben der Nutzung als ETL Tool auch zur Durchführung von Migrations-Projekten oder als Import-Werkzeug für Daten in OLTP-Datenbanken. &lt;br /&gt;&lt;br /&gt;Kettle ist ein ausgereiftes und verbreitetes Werkzeug, was sich in der Statistik mit ca. 15.000 Downloads pro Monat bei Sourceforge [3] widerspiegelt. &lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://en.wikipedia.org/wiki/Extract,_transform,_load"&gt;http://en.wikipedia.org/wiki/Extract,_transform,_load&lt;/a&gt; &lt;br /&gt;[2] &lt;a href="http://www.pentaho.com/"&gt;http://www.pentaho.com/&lt;/a&gt; &lt;br /&gt;[3] &lt;a href="http://sourceforge.net/projects/pentaho/files/Data%20Integration/stats/timeline"&gt;http://sourceforge.net/projects/pentaho/files/Data%20Integration/stats/timeline&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-7562316286708896806?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/7562316286708896806/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/08/etl-prozesse-mit-pentaho-kettle.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7562316286708896806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7562316286708896806'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/08/etl-prozesse-mit-pentaho-kettle.html' title='ETL-Prozesse mit Pentaho Kettle umsetzen'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-epvnQRVy2_M/TkDQMoKzWYI/AAAAAAAAAME/nCgt7trsF_o/s72-c/kettle_sample_tranf.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-6830608629766824954</id><published>2011-08-19T18:12:00.002+02:00</published><updated>2011-10-03T17:33:33.528+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Building a Portal with Grails-Framework</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;In this blog post I will describe how we have implemented a web portal by using only the Grails Framework [1]. Our approach differs from the Grails Portlets Plugin in the fact, that in our case the portlets are running directly in a Grails application and not as a JSR 168 portlet in a Liferay portal.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why do we need a Grails Portal?&lt;/b&gt;&lt;br /&gt;exensio has a long experience in the development of portal solutions. So far we have used portal solutions from the major manufacturers like Oracle. On the other hand, we use the Grails framework for developing Web applications more and more. Thus the idea &amp;nbsp;to combine both was close. Our solution offers the possibility to embed a Grails controller as a portlet within a Grails application. Below I've included screenshots showing this feature.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Building Blocks of the Grails Portal&lt;/b&gt;&lt;br /&gt;A portal consists mainly of the following building blocks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Portal&lt;/li&gt;&lt;li&gt;Page contains one or more portlets. A Portal can contain one or more pages.&lt;/li&gt;&lt;li&gt;Portlet-Instance of a Portlet. Each Portlet can reside on the same or another page.&lt;/li&gt;&lt;li&gt;Portlet Preferences. Each portlet can have specific preferences. For instance, &amp;nbsp;a path to the root node of content.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The wireframe below depicts these building blocks:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-fTm5UTQTeXw/Tk6EpExAXEI/AAAAAAAAAFE/XLSvleqVU_k/s1600/mockup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://4.bp.blogspot.com/-fTm5UTQTeXw/Tk6EpExAXEI/AAAAAAAAAFE/XLSvleqVU_k/s320/mockup.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;The Link Issue of the Grails Portal&lt;/b&gt;&lt;br /&gt;The generation of links must be implemented in a portal different than in a Grails application. The problem in a portal is that a click on a link must be redirected to the portlet on which the click has been executed.&lt;br /&gt;There are different ways to solve this problem. The easiest way is to use Ajax or Flash to implement the portlets. This was not our preferred solution. Our solution should be based on standard GSP pages. We solved the link problem by implementing a portal controller which gets the requests first. A link in our Grails Portal looks the following:&lt;br /&gt;&lt;br /&gt;http://server:port/enterprise20/default/MicroBlog?po_67_portlet_action=save#po_67&lt;br /&gt;&lt;br /&gt;The link contains all the necessary information like portal (since the portal can contain one or more portals), page, portlet instance and the action which should be executed in the instance of that portlet. The portal controller loops over all the portlets which reside on the executed page, renders each portlet and returns the whole portal page back to the browser.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Some Screenshots showing the Functionality&lt;/b&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-m6CyHMIQ9ug/Tk6Ht_zzyFI/AAAAAAAAAFI/npW2XtHr6cI/s1600/e20_01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-m6CyHMIQ9ug/Tk6Ht_zzyFI/AAAAAAAAAFI/npW2XtHr6cI/s400/e20_01.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Grails Portal displaying two portlets&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-tSh6ROA17ZM/Tk6IzIUwOCI/AAAAAAAAAFQ/92UsMbTULts/s1600/e20_02.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-tSh6ROA17ZM/Tk6IzIUwOCI/AAAAAAAAAFQ/92UsMbTULts/s400/e20_02.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Adding new values to portlet on right hand side.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-yeErm_8j-Fk/Tk6JMIa3FkI/AAAAAAAAAFU/uKgeCUzGL_s/s1600/e20_03.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-yeErm_8j-Fk/Tk6JMIa3FkI/AAAAAAAAAFU/uKgeCUzGL_s/s400/e20_03.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Error is shown at portlet level.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-fEac5o3Cf0o/Tk6JqGfYjpI/AAAAAAAAAFY/eWGWsDYTKHI/s1600/e20_04.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-fEac5o3Cf0o/Tk6JqGfYjpI/AAAAAAAAAFY/eWGWsDYTKHI/s400/e20_04.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Page is shown after entering correct value.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;As you can see it is possible to implement a portal based on the Grails framework. This portal acts like a portal from the major vendors but is much easier and faster to implement.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Links&lt;/b&gt;&lt;/br&gt;[1] &lt;a href="http://www.grails.org/"&gt;Homepage Grails Framework&lt;/a&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-6830608629766824954?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/6830608629766824954/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/08/building-portal-with-grails-framework.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6830608629766824954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6830608629766824954'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/08/building-portal-with-grails-framework.html' title='Building a Portal with Grails-Framework'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-fTm5UTQTeXw/Tk6EpExAXEI/AAAAAAAAAFE/XLSvleqVU_k/s72-c/mockup.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-3889531953038227766</id><published>2011-08-09T09:33:00.000+02:00</published><updated>2011-12-22T17:34:23.940+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exensio'/><title type='text'>exensio bekommt Nachwuchs ...</title><content type='html'>natürlich nicht exensio, sondern unser Kollege Xuetao ist Vater geworden. Hierzu wollen wir auf diesem Weg noch einmal recht herzlich gratulieren. Aufgrund des Fachkräftemangels in Deutschland wollen wir sogleich den Nachwuchs unseres Kollegen an die Firma binden. Hierzu kamen wir auf die geniale Idee, einen Strampler mit dem exensio Firmenlogo zu verschenken :-)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-JitBoogVXzg/Tj-ZA0y8icI/AAAAAAAAAB8/RT11GBJGpVQ/s1600/xuetao_baby.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-JitBoogVXzg/Tj-ZA0y8icI/AAAAAAAAAB8/RT11GBJGpVQ/s320/xuetao_baby.png" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-3889531953038227766?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/3889531953038227766/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/08/exensio-bekommt-nachwuchs.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/3889531953038227766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/3889531953038227766'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/08/exensio-bekommt-nachwuchs.html' title='exensio bekommt Nachwuchs ...'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-JitBoogVXzg/Tj-ZA0y8icI/AAAAAAAAAB8/RT11GBJGpVQ/s72-c/xuetao_baby.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-3671407778930282876</id><published>2011-08-08T11:30:00.006+02:00</published><updated>2011-10-03T17:35:38.189+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails Entwicklung mit IntelliJ</title><content type='html'>&lt;div&gt;Ein guter Editor reicht dem Puristen für die Entwicklung von Grails Applikationen aus. Werden die Projekte größer stellt sich jedoch die Frage, welche Entwicklungsumgebung (IDE) benutzt werden soll. Aktuell gibt es zwei IDEs, die in der Grails-Entwicklergemeinde benutzt werden:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SpringSource Tool Suite (STS) [1]&lt;br /&gt;STS basiert auf Eclipse, dies hat den Vorteil, dass das reichhaltige Angebot von Eclipse-Plugins benutzt werden kann. Dies hat jedoch auch den Nachteil, dass ein schlecht implementiertes Plugin das ganze Eclipse runterreißen kann.&lt;/li&gt;&lt;li&gt;IntelliJ IDEA [2]&lt;br /&gt;Basiert nicht auf Eclipse. Im Settings-Dialog kann die Eclipse-Keymap eingestellt werden, um die tief verinnerlichten Eclipse-Short-Cuts weiterbenutzen zu können. Als Nachteil könnte bei IntelliJ vielleicht aufgeführt werden, dass Spring Insight (Profiling Aufsatz für den Tomcat) nicht "out of the box" integriert ist. Zudem ist die Ulimate Edition (nur diese unterstützt die Entwicklung von Grails Applikationen) kostenpflichtig.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Wir haben bei exensio bisher STS benutzt, haben in letzter Zeit jedoch vermehrt gehört, dass die Entwicklung mit IntelliJ schneller vonstattengeht. Um es kurz zu machen, IntelliJ scheint unserer Meinung nach wirklich eine gelungene IDE zu sein. Vor allem viele Kleinigkeiten finden wir sehr beachtenswert. Eine Liste mit allen Groovy und Grails Funktionalitäten finden sich hier [3][4]. Folgende Punkte haben uns bei IntelliJ beeindruckt:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Stabilität:&lt;br /&gt;Bei STS war oft das deployte WAR irgendwie inkonsistent und es erschienen irgendwelche komischen Fehlermeldungen. Durch ein “grails clean” war die Applikation wieder deploybar, aber dieser Prozess war auf Dauer zu nervig.&lt;/li&gt;&lt;li&gt;Einfacherer Setup:&lt;br /&gt;Bei Eclipse gibt es so viele Settings, sodass leicht etwas übersehen wird. Bei IntelliJ ist alles, was ein Grails-Entwickler benötigt, vorab konfiguriert.&lt;/li&gt;&lt;li&gt;Debugging:&lt;br /&gt;Das Debugging von Closures ist bei IntelliJ "out of the box" möglich. Bei STS muss dies erst konfiguriert werden [5]. War bei uns in der STS 2.7.1 Version vorab gesetzt, das Debugging von Closures haben wir jedoch nicht hinbekommen. Des Weiteren ist es sehr mühsam, (wenn überhaupt möglich) die Variablen zu inspizieren.&lt;/li&gt;&lt;li&gt;Übersichtlichkeit:&lt;br /&gt;Wir finden IntelliJ übersichtlicher. So hat man immer die Gruppe (Domain-Klasse, Controller, Views und Test) im Blick:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qJZiy-iWFCo/Tj-p6QjYmYI/AAAAAAAAACA/6oOO3b508Y8/s1600/intellij1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://2.bp.blogspot.com/-qJZiy-iWFCo/Tj-p6QjYmYI/AAAAAAAAACA/6oOO3b508Y8/s320/intellij1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Oder es ist einfach möglich, per Klick von einer Action in einem Controller in die GSP-Seite zu springen:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-N8te1AHEHyY/Tj-q1KCJWpI/AAAAAAAAACE/DpkX7u1SWvc/s1600/intellij2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://1.bp.blogspot.com/-N8te1AHEHyY/Tj-q1KCJWpI/AAAAAAAAACE/DpkX7u1SWvc/s320/intellij2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Des Weiteren ist kann ein ER-Diagramm einer Domain-Klasse in Beziehung zu den anderen angezeigt werden. Hier ein Beispiel eines Star Schemas, das wir mit Grails GORM modelliert haben. Diese Funktionalität ist sehr nützlich, wenn das Datenmodell anfängt zu wachsen.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-HGpIIpuiVPk/Tj-rMiB9f0I/AAAAAAAAACI/s7Ti9Lr1t9s/s1600/intellij3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://2.bp.blogspot.com/-HGpIIpuiVPk/Tj-rMiB9f0I/AAAAAAAAACI/s7Ti9Lr1t9s/s320/intellij3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Wir wollen hier keine Empfehlung geben, welche Groovy/Grails IDE nun die bessere ist, da die Wahl einer IDE für einen Entwickler einer Glaubensfrage gleicht ;-) . Jedoch fällt auf, dass IntelliJ sehr viele Kleinigkeiten anbietet, die in Summe die Grails-Entwicklung wirklich vereinfacht und beschleunigt. Es fällt auch auf, dass bei IntelliJ die Entwickler ermuntert werden, Verbesserungsvorschläge und Wünsche einzubringen, dies merkt man unweigerlich bei der täglichen Arbeit. Wer sich selber überzeugen möchte, kann sich eine Testlizenz herunterladen, die 30 Tage gültig ist.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br /&gt;[1] &lt;a href="http://www.springsource.com/developer/sts"&gt;http://www.springsource.com/developer/sts&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://www.jetbrains.com/idea"&gt;http://www.jetbrains.com/idea&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://www.jetbrains.com/idea/features/groovy_grails.html"&gt;http://www.jetbrains.com/idea/features/groovy_grails.html&lt;/a&gt;&lt;br /&gt;[4] &lt;a href="http://blogs.jetbrains.com/idea/tag/grails/"&gt;http://blogs.jetbrains.com/idea/tag/grails/&lt;/a&gt;&lt;br /&gt;[5] &lt;a href="http://blog.springsource.com/2010/11/30/new-groovy-debug-support-in-sts-2-5-1/"&gt;http://blog.springsource.com/2010/11/30/new-groovy-debug-support-in-sts-2-5-1/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Weitere nützliche Links zum Thema IntelliJ und Grails&lt;/b&gt;&lt;br /&gt;[1]&amp;nbsp;&lt;a href="http://wiki.jetbrains.net/intellij/Creating_a_simple_Grails_application_with_IntelliJ_IDEA"&gt;http://wiki.jetbrains.net/intellij/Creating_a_simple_Grails_application_with_IntelliJ_IDEA&lt;/a&gt;&lt;br /&gt;[2]&amp;nbsp;&lt;a href="http://wiki.jetbrains.net/intellij/Managing_Grails_plugins"&gt;http://wiki.jetbrains.net/intellij/Managing_Grails_plugins&lt;/a&gt;&lt;br /&gt;[3]&amp;nbsp;&lt;a href="http://www.grails.org/IDEA+Integration"&gt;http://www.grails.org/IDEA+Integration&lt;/a&gt;&lt;br /&gt;[4]&amp;nbsp;&lt;a href="http://www.grails.org"&gt;http://www.grails.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-3671407778930282876?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/3671407778930282876/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/08/grails-entwicklung-mit-intellij.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/3671407778930282876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/3671407778930282876'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/08/grails-entwicklung-mit-intellij.html' title='Grails Entwicklung mit IntelliJ'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-qJZiy-iWFCo/Tj-p6QjYmYI/AAAAAAAAACA/6oOO3b508Y8/s72-c/intellij1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-6299393212628813792</id><published>2011-07-29T10:31:00.006+02:00</published><updated>2011-07-29T11:23:14.693+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solr'/><category scheme='http://www.blogger.com/atom/ns#' term='e20'/><title type='text'>Fuzzy Search und "Meinten Sie?" in Apache Solr</title><content type='html'>In unserer &lt;a href="http://exensio.blogspot.com/2011/05/unsere-enterprise-20-plattform.html"&gt;Enterprise 2.0 Plattform&lt;/a&gt; setzen wir die Volltextsuchmaschine Apache Solr, die auf Basis der Such-Bibliothek Lucene arbeitet, mit Begeisterung ein. Dieser Beitrag soll beschreiben, wie dem Benutzer mit einfachen Mitteln bei Tippfehlern geholfen werden kann.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Spellchecker Komponente&lt;/b&gt;&lt;br /&gt;Mit der &lt;i&gt;SpellCheckComponent&lt;/i&gt; [1] teilt Solr Vorschläge zu den vom Benutzer abgesandten Suchtermen mit. Als Grundlage dieser Vorschläge kann ein Feld aus dem Such-Index herangezogen werden.&lt;br /&gt;&lt;br /&gt;Die Konfiguration der Komponente ist bereits in der standardmäßigen schema.xml enthalten. So gilt es nur noch das Vorschläge-Verzeichnis aufzubauen. Solr erledigt dies automatisch, wenn der Parameter &lt;span style="font-size:95%;font-family: courier new;"&gt;spellcheck.build=true&lt;/span&gt; an die Anfrage angehängt wird. Ein Beispiel wäre:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:95%;font-family: courier new;"&gt;http://localhost:8983/solr/spell?q=test%20cotent&amp;amp;spellcheck=true&amp;amp;spellcheck.collate=true&amp;amp;spellcheck.build=true&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das muss selbstverständlich nicht bei jeder Abfrage gemacht werden.&lt;br /&gt;&lt;br /&gt;Die eigentliche Suchabfrage sieht genau gleich - nur ohne den Parameter - aus. Bemerkenswert ist der Parameter &lt;span style="font-size:95%;font-family: courier new;"&gt;spellcheck.collate=true&lt;/span&gt;, der nicht nur das falsch geschriebene Wort, sondern auch gleich die komplett korrigierte Suchabfrage zurück liefert. So liefert die SpellCheck-Abfrage nach "test cotent" als Vorschlag "test content" zurück.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fuzzy Search&lt;/b&gt;&lt;br /&gt;Ein weiteres Mittel, das Apache Solr (genauer gesagt: Apache Lucene) bietet, ist die "Fuzzy Search". "Fuzzy Search" steht für Suche mit einer gewissen Unschärfe.&lt;br /&gt;Durch Anhängen einer Tilde an den eigentlichen Suchterm wird angegeben, dass der Suchterm mit Unschärfe betrachtet werden soll. Dies korrigiert zum Beispiel automatisch Tippfehler, liefert aber auch ähnliche Suchtreffer, die möglicherweise passen könnten, als Ergebnis zurück.&lt;br /&gt;Während bei uns die Suche nach "exnsio" keinerlei Treffer hat, findet die Fuzzy Search nach "exnsio~" alle Dokumente, in denen "exensio" auftaucht.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Verwendung in unserer Enterprise 2.0 Plattform&lt;/b&gt;&lt;br /&gt;Sowohl die SpellCheck-Komponente als auch die "Fuzzy Search" bieten eine einfache Möglichkeit, um den Benutzer bei der Suche zu unterstützen und eventuelle Tippfehler (sogar automatisch) zu korrigieren.&lt;br /&gt;In unserer Enterprise 2.0 Plattform verwenden wir beide Möglichkeiten: Wir bieten dem Benutzer Vorschläge wie "Meinten Sie? ..." à la Google und führen gleichzeitig bei wenig Treffern eine Fuzzy Search zum eingegeben Suchterm aus, um dem Benutzer sofort passende Ergebnisse anzeigen zu können.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] Ausführliche Beschreibung zur SpellCheck-Komponente: &lt;a href="http://wiki.apache.org/solr/SpellCheckComponent"&gt;http://wiki.apache.org/solr/SpellCheckComponent&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-6299393212628813792?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/6299393212628813792/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/07/fuzzy-search-und-meinten-sie-in-solr.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6299393212628813792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6299393212628813792'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/07/fuzzy-search-und-meinten-sie-in-solr.html' title='Fuzzy Search und &quot;Meinten Sie?&quot; in Apache Solr'/><author><name>Manuel Breitfeld</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-70808979536314321</id><published>2011-07-08T11:51:00.000+02:00</published><updated>2011-10-03T17:38:17.405+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails Quick-Start</title><content type='html'>Ich bekomme des öfteren die Frage gestellt, wie man sich am besten in das Thema Grails einarbeitet. Aus diesem Grund möchte ich hier kurz zwei Empfehlungen geben, die sich sehr gut für einen Einstieg in das Grails-Framework [1] eignen.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://www.infoq.com/resource/minibooks/grails-getting-started/en/cover/LandingPageCover.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://www.infoq.com/resource/minibooks/grails-getting-started/en/cover/LandingPageCover.png" width="143" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Getting started with Grails" - der Klassiker von Jason Rudolph liegt in der zweiten Version vor. Dieses Buch gibt es als PDF (Login bei InfoQ ist nötig) und kann von folgendem &lt;a href="http://www.infoq.com/minibooks/grails-getting-started"&gt;Link&lt;/a&gt; heruntergeladen werden.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Folgende YouTube Videos können ebenfalls empfohlen werden:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Getting Started with Grails - Teil 1&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://2.gvt0.com/vi/PXHxo43hn34/0.jpg" height="390" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PXHxo43hn34&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="640" height="390"  src="http://www.youtube.com/v/PXHxo43hn34&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Getting Started with Grails - Teil 2&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/qNFksvLxZNU/0.jpg" height="390" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/qNFksvLxZNU&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="640" height="390"  src="http://www.youtube.com/v/qNFksvLxZNU&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Getting Started with Grails - Teil 3&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/oL4yVtNU31E/0.jpg" height="390" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/oL4yVtNU31E&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="640" height="390"  src="http://www.youtube.com/v/oL4yVtNU31E&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;[1] &lt;a href="http://www.grails.org"&gt;Homepage Grails Framework&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-70808979536314321?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/70808979536314321/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/07/grails-quick-start.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/70808979536314321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/70808979536314321'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/07/grails-quick-start.html' title='Grails Quick-Start'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-7285413773542210380</id><published>2011-07-05T09:17:00.000+02:00</published><updated>2011-07-05T09:17:13.122+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='socialmedia'/><category scheme='http://www.blogger.com/atom/ns#' term='socbiz'/><title type='text'>Facebook und die Problematik mit der Sicherheit für Unternehmen</title><content type='html'>&lt;a href="http://www.exensio.de/exensio_mail_campaigns/ep20_small.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://www.exensio.de/exensio_mail_campaigns/ep20_small.png" width="320" /&gt;&lt;/a&gt;Im Oktober letzten Jahres meldete die Wirtschaftswoche, dass Porsche den Zugang zu Facebook gesperrt hat. Als Grund wurde Angst vor Wirtschaftsspionage angegeben. Auf Veranstaltungen zum Thema Social Media wird dieses Vorgehen immer als Negativbeispiel angeführt. Und meistens höre ich Sätze, wie „Porsche hat Social Media nicht verstanden“ oder „Dann greifen halt die Mitarbeiter mit Ihrem Smartphone auf Facebook zu“. Mit diesem Blog möchte ich die Informationen zusammenfassen, die ich bei meiner Internetrecherche zu diesem Thema gefunden habe.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was macht Soziale Netzwerke in Bezug auf Cyberattacken so gefährlich?&lt;/b&gt;&lt;br /&gt;Symantec [2] warnt im Internet Security Thread Report aus dem Jahre 2010 vor Problemen, die für Unternehmen dadurch entstehen, dass Mitarbeiter gerne ihren Arbeitgeber oder ihre Rolle innerhalb des Unternehmens in sozialen Netzwerken preisgeben. Neben Symantec warnt auch das BSI [3] (Bundesamt für Sicherheit in der&amp;nbsp;Informationstechnik) davor Angaben über den Arbeitgeber in sozialen Netzwerken zu veröffentlichen. Aber warum ist dies so gefährlich? In diesem Artikel der VDI Nachrichten [4] ist dies - meiner Meinung nach - sehr schön dargestellt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was macht Facebook besonders riskant?&lt;/b&gt;&lt;br /&gt;Zunächst einmal ist es die Größe von Facebook. Wie bei Windows ist es auch hier viel wahrscheinlicher, einem Angriff ausgesetzt zu sein. So sehen die Security-Experten von Sophos [5] vor allem folgende Verbesserungsmöglichkeiten bei Facebook:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Kein Informations-Sharing ohne Zustimmung.&lt;/li&gt;&lt;li&gt;Prüfung von App-Entwicklern. Durch die vielen Apps [6] unterscheidet sich Facebook von den anderen sozialen Netzwerken. Aber leider sind sie auch ein Sicherheitsrisiko.&lt;/li&gt;&lt;li&gt;Verschlüsselung als Regelfall. Die vor kurzen eingeführte HTTPS Option sollte der Regelfall sein.&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;Ich möchte hier nicht gegen soziale Netzwerke wettern. Ich selbst benutze sehr gerne Xing. Aber auf der anderen Seite sollte man auch nicht die Gefahren unterschätzen. So kann ich Porsche durchaus verstehen, wenn dort Facebook gesperrt wurde. Benutzt ein Mitarbeiter sein Smart-Phone für den Zugriff auf Facebook können zumindest keine Schadprogramme in das Firmennetzwerk gelangen. Für Firmen, die nicht so restriktiv sein möchten, gäbe es noch die Möglichkeit die BitBox [7] zu benutzen. In diesem Fall läuft der FireFox-Browser in einer virtuellen Maschine, die auf einem abgespeckten Linux-Kernel basiert. Die BitBox wurde von der Sirrix AG in Zusammenarbeit mit dem BSI (Bundesamt für Sicherheit in der Informationstechnik) entwickelt, um ein sicheres Surfen zu ermöglichen.&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://www.wiwo.de/unternehmen-maerkte/porsche-sperrt-facebook-443688/"&gt;http://www.wiwo.de/unternehmen-maerkte/porsche-sperrt-facebook-443688/&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://www.zdnet.de/news/41551384/symantec-soziale-netzwerke-heizen-cyberattacken-an.htm"&gt;http://www.zdnet.de/news/41551384/symantec-soziale-netzwerke-heizen-cyberattacken-an.htm&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="https://www.bsi-fuer-buerger.de/BSIFB/DE/SicherheitImNetz/KommunikationUeberInternet/SozialeNetzwerke/Schutzmassnahmen/schutzmassnahmen_node.html"&gt;https://www.bsi-fuer-buerger.de/BSIFB/DE/SicherheitImNetz/KommunikationUeberInternet/SozialeNetzwerke/Schutzmassnahmen/schutzmassnahmen_node.html&lt;/a&gt;&lt;br /&gt;[4] &lt;a href="http://www.vdi-nachrichten.com/artikel/Unfreiwillige-Spione-im-eigenen-Haus/52543/4"&gt;http://www.vdi-nachrichten.com/artikel/Unfreiwillige-Spione-im-eigenen-Haus/52543/4&lt;/a&gt;&lt;br /&gt;[5] &lt;a href="http://business.chip.de/news/Facebook-Security-Experten-fordern-mehr-Schutz_48514422.html"&gt;http://business.chip.de/news/Facebook-Security-Experten-fordern-mehr-Schutz_48514422.html&lt;/a&gt;&lt;br /&gt;[6]&amp;nbsp;&lt;a href="http://www.zdnet.de/news/41541354/neuer-facebook-wurm-verbreitet-sich-ueber-schaedliche-apps.htm"&gt;http://www.zdnet.de/news/41541354/neuer-facebook-wurm-verbreitet-sich-ueber-schaedliche-apps.htm&lt;/a&gt;&lt;br /&gt;[7] &lt;a href="http://www.sirrix.de/content/pages/BitBox"&gt;http://www.sirrix.de/content/pages/BitBox&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-7285413773542210380?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/7285413773542210380/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/07/facebook-und-die-problematik-mit-der.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7285413773542210380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7285413773542210380'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/07/facebook-und-die-problematik-mit-der.html' title='Facebook und die Problematik mit der Sicherheit für Unternehmen'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-4046185867041358203</id><published>2011-05-30T09:49:00.001+02:00</published><updated>2011-10-03T17:42:29.098+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='e20'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Unsere Enterprise 2.0 Plattform - basierend auf dem Grails-Framework</title><content type='html'>Mit diesem Blogeintrag will ich über die Entwicklung unserer Enterprise 2.0 Plattform berichten. Es werden weitere Beiträge, die Teilaspekte der Plattform beleuchten, folgen.  Die Entwicklung unserer Enterprise 2.0 Plattform basiert auf dem Framework Grails [1], das wir seit dessen Veröffentlichung sehr erfolgreich in diversen Web-Projekten einsetzen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Warum eine weitere Enterprise 2.0 Plattform?&lt;/b&gt;&lt;br /&gt;Schaut man sich den Markt für Enterprise 2.0 Lösungen an, so kann der Markt folgendermaßen klassifiziert werden:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Spezialisierte Anbieter – hierzu zählen beispielsweise ThoughtFarmer, SocialText, Confluence oder XWiki (Open-Source). Diese Lösungen waren meistens ursprünglich Wikis und wurden im Laufe der Zeit um weitere Funktionalitäten erweitern. Ein guter Überblick findet sich hier [2].&lt;/li&gt;&lt;li&gt;Content Management Systeme – wurden in den letzten Jahren um Enterprise 2.0 Funktionalitäten erweitert. Zu den kommerziellen Anbietern zählen beispielsweise OpenText oder Day CQ. Im Open-Source-Bereich finden sich hier beispielsweise  TYPO3 oder Drupal.&lt;/li&gt;&lt;li&gt;Portal Anbieter – hierzu zählen alle großen, wie IBM (WebSphere / Lotus Connections / Lotus Quickr), Microsoft (Sharepoint) oder Oracle (WebCenter) aber auch Liferay aus dem Bereich Open-Source.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;Unsere Enterprise 2.0 Plattform wird sich von der Idee auch im Portal-Segment wiederfinden. Im Vergleich zu den „großen“ Systemen soll unsere Lösung vor allem durch einen modularen Aufbau bestechen. Des Weiteren wird eine einfache Anpass- und Erweiterbarkeit durch das Grails-Framework erreicht. Es müssen nur die Teile benutzt werden, die vom Kunden in unterschiedlichen Projekten gefordert werden. So kann dies bei einem Wiki beginnen und bei einer komplexen Portal-Lösung enden.&lt;br /&gt;&lt;br /&gt;Ein Portal hat hier (meine persönliche Meinung) den großen Vorteil, dass es einen ganzheitlichen Ansatz verfolgt. Das Portal ist hier mit einem Cockpit vergleichbar. Der Benutzer muss nicht zwischen verschiedenen Applikationen (bestehendes Portal und neu eingeführte Enterprise 2.0 Lösung) umschalten.&lt;br /&gt;&lt;br /&gt;Als Beispiel möchte ich ein Außendienst-Portal heranziehen. Mit diesem erhalten die Außendienst-Mitarbeiter aktuelle Informationen in Form von Dokumenten oder die aktuellen Verkaufszahlen aus SAP. Dieses kann mit einem Microblog angereichert werden. Mit diesem können die Außendienst-Mitarbeiter - in Echtzeit - Informationen (beispielsweise über das Verhalten des Wettbewerbers) austauschen. Der Innendienst kann sich auch auf diesen Informationskanal („Flurfunk“) aufschalten und erhält tagesaktuelle Informationen über das Marktgeschehen.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Funktionalitäten unserer Enterprise 2.0 Plattform&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;In diesem Abschnitt möchte ich die Funktionalitäten beschreiben, die aktuell geplant sind. Weitere Funktionalitäten, wie Activity Stream oder Unterstützung von mobilen Endgeräten werden in Zukunft noch aufgenommen werden.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;a href="http://1.bp.blogspot.com/-yRPjd2UMlhI/TeEWHmKZJKI/AAAAAAAAAB4/Kragf-mCzuY/s1600/e20_home_page_commented.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-yRPjd2UMlhI/TeEWHmKZJKI/AAAAAAAAAB4/Kragf-mCzuY/s400/e20_home_page_commented.png" width="323" /&gt;&lt;/a&gt;&lt;li&gt;Content Management – hier haben wir uns entschieden, ein kleines CMS System selbst zu entwickeln. Weceem, ein CMS basierend auf dem Grails-Framework, war nicht mit unserem Portal-Gedanken zu verbinden. Wir sehen hier vor allem die Anforderung, dass Content in Form von Portlets dargestellt wird. Hier werden auch Informationen, wie Bilder oder Filme gespeichert.&lt;/li&gt;&lt;li&gt;Wiki – dieses Modul wird es einem Team ermöglichen Informationen zu dokumentieren. Im Unterschied zum CMS gibt es hier beispielsweise keinen Workflow.&lt;/li&gt;&lt;li&gt;(Micro)Blog – dieses Modul ermöglicht das Erstellen von Blogs. Mit Microblogs können Kollegen in Echtzeit Kurzinformationen austauschen (Twitter unternehmensintern).&lt;/li&gt;&lt;li&gt;Dokumenten Management – hier sind wir noch auf der Suche nach einem geeigneten Open-Source-System, das sich einfach integrieren lässt.&lt;/li&gt;&lt;li&gt;Tag-Management – ist die zentrale Komponente. Alle Informationen sollen mit Tags versehen werden können. Mit diesen Tags ist es dann auch möglich, eine Faceted-Search zur Navigation aufzubauen. Die integrierte Suche kann mit Hilfe der Tags bessere Ergebnisse liefern.&lt;/li&gt;&lt;li&gt;Kommentieren und Bewerten – dies ist auch eine zentrale Komponente. Es soll möglich sein, Content, Dokumente, Wiki- und Blog-Einträge kommentieren und bewerten zu können.&lt;/li&gt;&lt;li&gt;Suche – hier benutzen wir Apache Lucene bzw. Apache Solr.&lt;/li&gt;&lt;li&gt;Portlets – alle Module können in Form von Portlets integriert werden. Des Weiteren können Portlets auch Informationen aus Back-End-Systemen - wie SAP - darstellen.&lt;/li&gt;&lt;li&gt;Kollektive Intelligenz – dieses Modul soll Empfehlungen geben. Zum Beispiel, könnte ein Benutzer Informationen erhalten, dass sein Kollege Dokumente gelesen hat, die mit denselben Tags verknüpft sind, die auch für sie oder ihn von Interesse sein könnten.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Aktueller Stand&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Die Implementierung der CMS-Funktionalitäten, des Blogs und die Applikations-Integration mittels Portlets ist abgeschlossen. Gegenwärtig arbeiten wir am Wiki, dem Tag Modul und der Suche. Die Abbildung rechts oben liefert einen ersten Eindruck über den aktuellen Stand der Implementierung.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Aufruf zur Mitarbeit&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Wir suchen Mitstreiter,  die an diesem Projekt mitarbeiten wollen. Voraussetzung wären Kenntnisse des Grails-Frameworks und eine Affinität für das Thema Enterprise 2.0.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Links&lt;/b&gt;&lt;/div&gt;&lt;div&gt;[1] &lt;a href="http://www.grails.org/"&gt;Homepage Grails Framework&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://www.wikimatrix.org/"&gt;Wikimatrix&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-4046185867041358203?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/4046185867041358203/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/05/unsere-enterprise-20-plattform.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4046185867041358203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4046185867041358203'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/05/unsere-enterprise-20-plattform.html' title='Unsere Enterprise 2.0 Plattform - basierend auf dem Grails-Framework'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-yRPjd2UMlhI/TeEWHmKZJKI/AAAAAAAAAB4/Kragf-mCzuY/s72-c/e20_home_page_commented.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-1118177164566679271</id><published>2011-04-18T14:42:00.000+02:00</published><updated>2011-04-18T14:42:17.064+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='socialmedia'/><category scheme='http://www.blogger.com/atom/ns#' term='e20'/><category scheme='http://www.blogger.com/atom/ns#' term='socbiz'/><title type='text'>Enterprise 2.0 – Rating und die wichtige Involvierung des Betriebsrates</title><content type='html'>Das bewerten und kommentieren von Content ist ein wesentlicher Baustein im Enterprise 2.0. In einem Enterprise 2.0 Projekt wollten wir ein 1-5 Star Rating einführen. Dies wurde jedoch durch den Betriebsrat untersagt, da vermieden werden sollte, dass Mitarbeiter eine schlechte Bewertung für den von Ihnen eingestellten Content erhalten können. Es wurde vielmehr ein 1-3 Star Rating (von „Good“ bis „Excellent“ - siehe links im Bild unten) entwickelt und vom Betriebsrat abgesegnet. Wir haben mit diesem Rating Verfahren sehr positive Erfahrungen gemacht.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-eIizREfs9q4/TasVrQkdmUI/AAAAAAAAABw/z-PEWcUPoLM/s1600/rating.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="103" src="http://4.bp.blogspot.com/-eIizREfs9q4/TasVrQkdmUI/AAAAAAAAABw/z-PEWcUPoLM/s320/rating.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Rating 1-3 Stars versus 1-5 Stars (Amazon)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;In meiner Social Media Arbeitsgruppe haben wir letzten Freitag hierüber gesprochen. Als Nachteil eines nur positiven Ratings wurde aufgeführt, dass es nicht möglich ist, zu unterscheiden welcher Content wirklich gut und welcher schlecht ist. Der Arbeitskollege erwähnte jedoch auch, dass in seiner Firma ein Rating wieder abgeschafft wurde, da sich ein Spezialist darüber echauffiert hatte, dass sein Content nur mit 2 Sternen bewertet wurde.&lt;br /&gt;&lt;br /&gt;Ich habe hierzu im Internet recherchiert und bin auf folgenden interessanten YouTube-Blog-Eintrag [1] gestoßen. In diesem wird die Auswertung von allen auf YouTube getätigten Bewertungen beschrieben und in der Grafik unten visualisiert. Das interessante hierbei ist, dass es eigentlich nur 1-Star und 5-Star-Ratings gibt. In diesem Blog gibt es noch jede Menge interessante Kommentare, wie ein Rating verbessert werden kann. Das Ergebnis der Auswertung hat dazu geführt, dass es bei YouTube nur noch eine binäre Bewertung („Mag ich“ bzw. „Mag ich nicht“ analog zu Facebook mit „Gefällt mir“) gibt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ucWiwZXyDLY/TasWGtK62TI/AAAAAAAAAB0/DA76cA5Qhwo/s1600/youtube_rating.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="111" src="http://1.bp.blogspot.com/-ucWiwZXyDLY/TasWGtK62TI/AAAAAAAAAB0/DA76cA5Qhwo/s320/youtube_rating.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Ergebnis der Analyse aller Ratings bei YouTube (1-5 Stars)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;Wie eingangs beschrieben ist das bewerten und kommentieren von Content sehr wichtig im Enterprise 2.0 Kontext. Der Betriebsrat sollte von Projektbeginn an involviert werden, da dieser hier &amp;nbsp;ein gewichtiges Wort mitzusprechen hat. Wir haben sehr gute Erfahrungen mit dem 1-3 Star-Rating gemacht und dieses ist auf jeden Fall keinem Rating vorzuziehen. Den von YouTube gewählten Ansatz finde ich auch sehr interessant und besser als ein 1-3 Star-Rating. Mich würde interessieren, ob diese Art der Bewertung auch von einem Betriebsrat abgelehnt würde. &amp;nbsp;Meiner Meinung nach eher nicht, da es keine harte „Notenskala“ gibt, sondern eine weichere Bewertung. Des Weiteren sollte die Bewertung auch kommentiert werden, um Rückschlüsse auf die Bewertung zu ermöglichen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br /&gt;[1]&amp;nbsp;&lt;a href="http://youtube-global.blogspot.com/2009/09/five-stars-dominate-ratings.html"&gt;YouTube Blog - Five Stars Dominate Ratings&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-1118177164566679271?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/1118177164566679271/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/04/enterprise-20-rating-und-die-wichtige.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1118177164566679271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1118177164566679271'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/04/enterprise-20-rating-und-die-wichtige.html' title='Enterprise 2.0 – Rating und die wichtige Involvierung des Betriebsrates'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-eIizREfs9q4/TasVrQkdmUI/AAAAAAAAABw/z-PEWcUPoLM/s72-c/rating.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-8218801774036635810</id><published>2011-04-10T18:20:00.002+02:00</published><updated>2011-04-10T18:22:41.094+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='e20'/><title type='text'>Enterprise 2.0 und das Problem mit der Partizipation</title><content type='html'>Eine Enterprise 2.0 Lösung ist meist schnell innerhalb eines Unternehmens eingeführt. Jedoch fehlt es meistens an einer Strategie, die Nachhaltigkeit von Enterprise 2.0 innerhalb eines Unternehmens zu verankern. Die Nachhaltigkeit kann sich jedoch nur einstellen, wenn die Enterprise 2.0 Community durch interessante Beiträge lebt.&lt;br /&gt;Jakob Nielsen (Nielsen Norman Group) hat &amp;nbsp;in seinem Blog-Beitrag (&lt;a href="http://www.useit.com/alertbox/participation_inequality.html"&gt;90-9-1 Rule for Social Design&lt;/a&gt;) im Jahre 2006 auf das ungleichmäßige Verhältnis von Content-Lesern und Content-Editoren im Internet hingewiesen. Seine in diesem Blog erwähnte 90-9-1-Regel besagt folgendes:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;90% - lesen und suchen, liefern jedoch keinen Content&lt;/li&gt;&lt;li&gt;9% - steuern gelegentlich Content bei&lt;/li&gt;&lt;li&gt;1% - steuern regelmäßig Content bei&lt;/li&gt;&lt;/ul&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://www.useit.com/alertbox/community-participation-pyramid.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="165" src="http://www.useit.com/alertbox/community-participation-pyramid.gif" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Quelle:&amp;nbsp;&lt;a href="http://www.useit.com/alertbox/participation_inequality.html"&gt;Jakob Nielsen&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Jakob Nielsen weist in seinem Blog-Beitrag (&lt;a href="http://www.useit.com/alertbox/social-intranet-features.html"&gt;Social Networking on Intranets&lt;/a&gt;) aus dem Jahre 2009 darauf hin, dass es auch im Intranet ein Ungleichgewicht zwischen Mitarbeitern gibt, die viel beisteuern und solchen, die nur lesen. Es kommt seiner Meinung nach darauf an, dass das Verhältnis von Editoren und Lesern innerhalb der Community stimmt. Auch sind die reinen Leser nicht unterzubewerten, da auch sie von der Community profitieren. Das Verhältnis von Lesern und Editoren kann von Unternehmen zu Unternehmen variieren. Andrew McAfee beschreibt in seinem Blog-Beitrag (&lt;a href="http://andrewmcafee.org/2011/04/enterprise-2-0-the-indian-way/"&gt;Enterprise 2.0 the Indian Way&lt;/a&gt; – 7. April 2011) einen Besuch beim indischen IT Dienstleister Tata Consultancy Services. Hier war der Anteil der Editoren sehr viel höher, bedingt durch einen sehr hohen Anteil von jungen Mitarbeitern (Digital Natives), die schon mit Social Media aufgewachsen sind.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Wie kann die Partizipation erhöht werden?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Jakob Nielsen hat in seinem Blog folgende Punkte hierzu aufgeführt:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Die Veröffentlichung von Content muss sehr einfach sein, damit nicht nur technisch Versierte mitmachen können.&lt;/li&gt;&lt;li&gt;Partizipation als Nebeneffekt. Vergleichbar mit Amazon‘s Empfehlungen oder Most Viewed Topics (Tag Cloud).&lt;/li&gt;&lt;li&gt;Teilnehmer sollen belohnt werden. Dies kann monetär (Incentives) oder auch mittels Anerkennung („Gold Stars“ auf Profil) realisiert werden. Andrew McAfee beschreibt in seinem Blog-Beitrag, dass bei TCS die Editoren vor allem durch Ihre Reputation innerhalb der Community motiviert wurden Inhalte beizusteuern. &amp;nbsp;In Deutschland ist es ratsam sehr früh den Betriebsrat einzubinden.&lt;/li&gt;&lt;li&gt;Editoren mit qualitativ hochwertigen Informationen müssen promotet werden, damit Ihre Beiträge nicht in der Masse der 1% Überaktiven untergehen.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Folgende Vorschläge wurden innerhalb eines &lt;a href="http://www.doubleyuu.com/leistungen/openspace/"&gt;OpenSpace Workshops&lt;/a&gt; (moderiert durch &lt;a href="https://www.xing.com/profile/Willms_Buhse"&gt;Dr. Willms Buhse&lt;/a&gt;) auf der Social CRM Veranstaltung der Computerwoche in Karlsruhe erarbeitet:&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Geduld - ein Klima (Unternehmenskultur), in dem die Mitarbeiter im doppelten Sinne Zeit bekommen&lt;br /&gt;- in dem die Umstellung nicht bis gestern erwartet wird&lt;br /&gt;- in dem der Zeitaufwand für die Einarbeitung in die neuen Strukturen und Werkzeuge berücksichtigt und/oder honoriert wird&lt;/li&gt;&lt;li&gt;Benutzerfreundlichkeit&lt;/li&gt;&lt;li&gt;Konkrete Ziele vereinbaren und dabei das mittlere Management einbeziehen&lt;/li&gt;&lt;li&gt;Menschen, die den Umgang mit den neuen Technologien und ihren Möglichkeiten begleiten (Moderatoren)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Partizipation ist ein wichtiger Aspekt bei der Einführung von Enterprise 2.0 innerhalb eines Unternehmens. &amp;nbsp;Meines Erachtens ist die kontinuierliche Moderation nach dem Go-Live sehr wichtig, damit die Begeisterung nach einer anfänglichen Euphorie nicht verloren geht. Ich höre des Öfteren auch noch eine weitere Möglichkeit, um die Partizipation zu steigern. Hierbei wird erwähnt, die Teilnahme innerhalb der Enterprise 2.0 Community in die Ziele des Mitarbeiters aufzunehmen. Dies würde ich jedoch nur als letzte Maßnahme in Betracht ziehen (falls obige Punkte nicht greifen), da eine freiwillige Teilnahme besser ist, als eine erzwungene.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-8218801774036635810?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/8218801774036635810/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/04/enterprise-20-und-das-problem-mit-der.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8218801774036635810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8218801774036635810'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/04/enterprise-20-und-das-problem-mit-der.html' title='Enterprise 2.0 und das Problem mit der Partizipation'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-1225124291646380661</id><published>2011-03-07T10:36:00.002+01:00</published><updated>2011-03-07T10:54:38.661+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='e20'/><category scheme='http://www.blogger.com/atom/ns#' term='socbiz'/><title type='text'>Ist der ROI von Enterprise 2.0 berechenbar?</title><content type='html'>Die Berechnung eines ROI für Enterprise 2.0 gilt gemeinhin als nicht trivial. Auf dem Blog des Harvard Professors Andrew McAfee [1] (Schöpfer des Begriffs Enterprise 2.0) bin ich auf einen interessanten Eintrag gestoßen. Dieser basiert auf einem Report [2] [3] der Unternehmensberatung Deloitte mit dem Titel “Social Software for Business Performance”. Hierin werden bei zwei Firmen messbare Verbesserungen durch den Einsatz von Wikis – im Kontext von Enterprise 2.0 – aufgezeigt.&lt;br /&gt;&lt;br /&gt;Die Abbildung unten zeigt, wie durch den Aufbau eines Wikis bei der der Firma Alcoa (Hersteller von Befestigungssystemen) die monatlichen Compliance Stunden reduziert werden konnten.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-ABJIXsRvxs8/TXSkR-D8omI/AAAAAAAAABo/-UAwkoPIfuk/s1600/alcoa.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="165" src="https://lh4.googleusercontent.com/-ABJIXsRvxs8/TXSkR-D8omI/AAAAAAAAABo/-UAwkoPIfuk/s320/alcoa.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Quelle: Deloitte&lt;/div&gt;&lt;div&gt;&lt;div class="MsoNormal"&gt;Die Abbildung unten zeigt wie ein Wiki bei der Firma OSIsoft die Problemlösung im Customer Support um 22% verbesserte.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-DkfbaE4n1Pk/TXSkkpFc2MI/AAAAAAAAABs/zqBFtLBv-LM/s1600/osisoft.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="207" src="https://lh3.googleusercontent.com/-DkfbaE4n1Pk/TXSkkpFc2MI/AAAAAAAAABs/zqBFtLBv-LM/s320/osisoft.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Quelle: Deloitte&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Der kritische Leser wird nun anmerken, dass es in diesem Fall einfach ist, einen Mehrwert auszurechnen. Ich gehe hier d’accord – nicht für jeden Fall kann so einfach ein ROI für den Einsatz von Enterprise 2.0 berechnet werden. Jedoch fand ich es sehr interessant einmal harte Zahlen zu sehen und vielleicht gibt der Report von Deloitte dem einen oder anderen eine Idee, wie sich in seinem speziellen Fall ein ROI berechnen lässt.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;[1]&amp;nbsp;&lt;a href="http://andrewmcafee.org/2011/02/deloitte-report-enterprise20-data/"&gt;Blog von Andrew McAfee&lt;/a&gt;&lt;br /&gt;[2]&amp;nbsp;&lt;a href="http://www.deloitte.com/us/socialsoftware"&gt;Social Software Seite von Deloitte&lt;/a&gt;&lt;br /&gt;[3]&amp;nbsp;&lt;a href="http://www.deloitte.com/assets/Dcom-UnitedStates/Local%20Assets/Documents/TMT_us_tmt/us_tmt_ce_socialsoftware_fullreport_0209111.pdf"&gt;Report über Social Software (Deloitte)&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-1225124291646380661?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/1225124291646380661/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/03/ist-der-roi-von-enterprise-20.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1225124291646380661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1225124291646380661'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/03/ist-der-roi-von-enterprise-20.html' title='Ist der ROI von Enterprise 2.0 berechenbar?'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-ABJIXsRvxs8/TXSkR-D8omI/AAAAAAAAABo/-UAwkoPIfuk/s72-c/alcoa.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-7244095088904051453</id><published>2011-02-27T20:04:00.011+01:00</published><updated>2011-03-01T09:08:13.376+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Virtualisierung'/><title type='text'>Effiziente Entwicklung mit Virtualisierung (Teil 2)</title><content type='html'>Der erste Teil des zum Thema &lt;a href="http://exensio.blogspot.com/2011/02/effiziente-entwicklung-mit.html"&gt;„Effiziente Entwicklung mit Virtualisierung“&lt;/a&gt; hat die Vorteile der Virtualisierung für die Entwicklung aufgezeigt und ESXi als eine mögliche Lösung vorgestellt. In diesem Teil wird auf die Einrichtung und Konfiguration der Virtualisierungs-Images eingegangen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Konfiguration eines Virtualisierungs-Images&lt;/b&gt;&lt;br /&gt;Jeder Entwickler besitzt ein eigenes, vorkonfiguriertes VMWare-Image. Die Entwicklungstätigkeiten von exensio sind überwiegend im Bereich von Java angesiedelt und deshalb wird aus Performance-Gründen auf Linux als Betriebssystem für die Entwicklung und damit auch für die Virtualisierung gesetzt.&lt;br /&gt;&lt;br /&gt;Es gibt ein Master-Image, das mit entsprechender Software, wie Entwicklungsumgebungen, Datenbank-Zugriff-Tools oder Versionsverwaltungssoftware, vorkonfiguriert ist. Die relevanten, über SVN versionierten, Software-Projekte werden entsprechend auf dem Master-Image ausgecheckt. Des Weiteren werden auf dem Master-Image auch zeitaufwendige Konfigurationen, wie die Einrichtung einer Domäne für einen Applikationsserver, vorgenommen.&lt;br /&gt;&lt;br /&gt;Jeder PC-Benutzer hat natürlich auch seine Vorlieben und Einstellungen auf einem PC, die er nicht missen möchte. Durch Anlage eines Accounts auf dem Master-Image für jeden Entwickler können individuelle Konfiguration vorgenommen werden.&lt;br /&gt;&lt;br /&gt;Neben den Entwicklungs-Images gibt es einen zentralen DB-Server auf dem alle Datenbanken für die Entwicklung verfügbar sind. Der DB-Server ist wiederum selbst eine virtuelle Maschine. Die nachfolgende Abbildung zeigt beispielhaft die virtuellen Maschinen für die Entwicklung und die Datenbank. Hierbei ist auf der rechten Seite der Abbildung auch zu sehen, dass virtuelle Netzwerke für die einzelnen Maschinen eingerichtet wurden. Damit werden die virtuellen Maschinen Netzwerk-Ports zugeordnet, um zu verhindern, dass alle über den gleichen Netzwerk-Port des ESXi-Servers gehen.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-UjemdINyw10/TWqhX-hhUsI/AAAAAAAAAK0/6ubwVmPvN8w/s1600/esxi_network.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 234px;" src="http://1.bp.blogspot.com/-UjemdINyw10/TWqhX-hhUsI/AAAAAAAAAK0/6ubwVmPvN8w/s320/esxi_network.png" alt="" id="BLOGGER_PHOTO_ID_5578448521744437954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ausrollen der Virtualisierungs-Images für ein neues Projekt&lt;/b&gt;&lt;br /&gt;Wie erfolgt nun das Ausrollen der Virtualisierungs-Images, wenn exensio mit einem neuen Projekt beginnt?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Ggfs. noch nicht installierte Software wird auf dem Master-Image eingerichtet&lt;/li&gt;&lt;li&gt;Basisstruktur wird in der Entwicklungsumgebung angelegt (z.B. Workspace konfigurieren, Eclipse-Projekte erstellen, Domaine für den App-Server erstellen und konfigurieren)&lt;/li&gt;&lt;li&gt;Datenbank und SVN-Repository für das neue Projekt einrichten und auf Master-Image auschecken bzw. konfigurieren&lt;/li&gt;&lt;li&gt;Einfaches clonen des Master-Images für jeden Entwickler, der am Projekt teilnimmt&lt;/li&gt;&lt;li&gt;Der Entwickler muss nach dem Starten seines Images noch ein Script ausführen, in dem individuelle Anpassungen vorgenommen werden, wie das Setzen des Hostnamen oder Berechtigungen für seinen Login-Benutzer&lt;/li&gt;&lt;/ol&gt;Die vorangegangene Auflistung zeigt noch einmal deutlich die Zeitersparnis, dass nur eine Person die eher lästigen Schritte 1. bis 4. durchführen muss und die anderen Entwickler anschließend direkt loslegen können.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-7244095088904051453?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/7244095088904051453/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/02/effiziente-entwicklung-mit_27.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7244095088904051453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7244095088904051453'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/02/effiziente-entwicklung-mit_27.html' title='Effiziente Entwicklung mit Virtualisierung (Teil 2)'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-UjemdINyw10/TWqhX-hhUsI/AAAAAAAAAK0/6ubwVmPvN8w/s72-c/esxi_network.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-5426016561052080241</id><published>2011-02-27T15:31:00.001+01:00</published><updated>2011-02-27T15:35:37.173+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='socialmedia'/><category scheme='http://www.blogger.com/atom/ns#' term='e20'/><title type='text'>Infografik über Kollaboration im Enterprise 2.0</title><content type='html'>Folgende Infografik von Socialcast zeigt meines Erachtens kurz und knapp, wofür Enterprise 2.0 steht. Besonders schön zeigt die Teilgrafik die historische Entwicklung von Collaboration Tools - von Emails hin zu Twitter. Der ganze Blog findet sich &lt;a href="http://blog.socialcast.com/e2sday-dare-to-share-a-new-culture-of-collaboration-in-the-enterprise/"&gt;hier&lt;/a&gt;&amp;nbsp;(inklusive größerer Grafik).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://blog.socialcast.com/wp-content/uploads/2011/02/dare_to_share_final-500x1259.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://blog.socialcast.com/wp-content/uploads/2011/02/dare_to_share_final-500x1259.png" width="127" /&gt;&lt;/a&gt;&lt;br /&gt;(Source: socialcast.com)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-5426016561052080241?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/5426016561052080241/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/02/infografik-uber-kollaboration-im.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5426016561052080241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5426016561052080241'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/02/infografik-uber-kollaboration-im.html' title='Infografik über Kollaboration im Enterprise 2.0'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-413398241612205357</id><published>2011-02-26T19:33:00.001+01:00</published><updated>2011-02-28T09:39:20.956+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><category scheme='http://www.blogger.com/atom/ns#' term='Informationsportal'/><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic Portal'/><title type='text'>Content-Präsentation in Web-Portalen</title><content type='html'>Wird in einem Projekt Content aus einem CMS in ein Portal integriert, gilt es die Unterschiede beider Systeme zu verstehen, um eine gute Portal-Architektur entwickeln zu können. Hier wird oft der Fehler gemacht, dass jede Content-Seite 1:1 als Portal-Seite abgebildet wird. Die hieraus entstehenden Probleme sollen mit diesem Blogeintrag beschrieben werden.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Unterschiede beider Systeme:&lt;/b&gt;&lt;br /&gt;Seiten werden in einem CMS meistens statisch in Form von HTML-Seiten vorgehalten. In einem Portal sind alle Seiten jedoch Objekte, die im Speicher gehalten werden. Basiert das Portal auf Java-Technologien, so sind dies meistens JSPs. Werden nun alle Content-Seiten als JSPs abgelegt, führt dies unweigerlich zu Performance- und  Memory-Problemen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Schlechte Architektur:&lt;/b&gt;&lt;br /&gt;In diesem Fall werden die Content-Seiten (inklusive der Content-Navigation) 1:1 innerhalb der Portal-Seiten abgebildet (siehe Abbildung unten). Dies hat den großen Nachteil, dass jede Content-Seite (repräsentiert durch eine Portal-Seite) als Objekt Memory verbraucht. Neben dem Memory-Problem tritt auch noch ein Performance-Problem auf, falls zu viele Berechtigungen (Personalisierung) auf die einzelnen Content-Seiten vergeben werden.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_k5YJcR83wtQ/TTm-ET6lp3I/AAAAAAAAABY/iiPfRKpz-B8/s1600/blog01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://3.bp.blogspot.com/_k5YJcR83wtQ/TTm-ET6lp3I/AAAAAAAAABY/iiPfRKpz-B8/s320/blog01.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Die Abbildung unten zeigt des Weiteren, dass für jeden Menü-Eintrag der Content-Navigation eine weitere Portal-Seite aufgebaut wird.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_k5YJcR83wtQ/TTm-UuEUGDI/AAAAAAAAABc/f3pVpiYV6Tk/s1600/blog02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://1.bp.blogspot.com/_k5YJcR83wtQ/TTm-UuEUGDI/AAAAAAAAABc/f3pVpiYV6Tk/s320/blog02.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Gute Architektur:&lt;/b&gt;&lt;br /&gt;Hierbei wird darauf Wert gelegt, dass es nur ein (oder mehrere wenige) Content-Portlets gibt. Der Content wird basierend auf Abfragen integriert und nicht 1:1 abgebildet. Es ist auch vorstellbar, dass das Menü des Content-Portlets innerhalb der Hauptnavigation angezeigt wird.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_k5YJcR83wtQ/TTm_H0jdLxI/AAAAAAAAABg/14vuluFxDJQ/s1600/Clipboard07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="215" src="http://1.bp.blogspot.com/_k5YJcR83wtQ/TTm_H0jdLxI/AAAAAAAAABg/14vuluFxDJQ/s320/Clipboard07.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Fazit:&lt;/b&gt;&lt;br /&gt;Bei der Integration von Content aus einem CMS sind die Unterschiede beider Systeme zu beachten. Ein Portal ist ein dynamisches, ein CMS hingegen ein statisches System. Wichtig hierbei ist darauf zu achten, dass die Anzahl von Content-Portlets möglichst gering gehalten wird. Innerhalb des Content-Portlets kann dann über den gesamten Content navigiert werden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-413398241612205357?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/413398241612205357/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/02/content-prasentation-in-web-portalen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/413398241612205357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/413398241612205357'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/02/content-prasentation-in-web-portalen.html' title='Content-Präsentation in Web-Portalen'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_k5YJcR83wtQ/TTm-ET6lp3I/AAAAAAAAABY/iiPfRKpz-B8/s72-c/blog01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-6613055652567526924</id><published>2011-02-26T11:11:00.004+01:00</published><updated>2011-02-28T09:36:43.060+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='socialmedia'/><category scheme='http://www.blogger.com/atom/ns#' term='e20'/><title type='text'>In unserem Unternehmen brauchen wir Twitter nicht!</title><content type='html'>&lt;div style="margin-bottom: 0cm;"&gt;Diese Aussage höre ich des Öfteren. Auch in unserem Unternehmen wird der Einsatz von Twitter kontrovers diskutiert. So sind viele der Meinung, dass über Twitter nur sinnlose Informationen verteilt werden, beispielsweise, dass der Zug von Kollege X 5 Minuten Verspätung hat. Dies kann natürlich geschehen, da es neben introvertierte auch extrovertierte Kollegen gibt. Aber nun möchte ich kurz schildern, wie wir diese Woche mittels Twitter einen Spezialisten für ein dediziertes Thema gefunden haben.&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;b&gt;Wie uns Twitter half einen Spezialisten zu finden:&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;Wir hatten diese Woche ein Problem, zu dessen Lösung wir gerne den Rat eines Spezialisten eingeholt hätten. Nun gibt es die Möglichkeit, solch eine Frage in einer offenen Mailingliste oder in einem Internet-Forum zu stellen. Das Problem ist nur, es gibt sehr viele Mailinglisten und auch Foren, die teilweise die selben Themen adressieren. Deshalb dachten wir, ob sich das Problem nicht mit einem Tweet lösen lassen würde. Auf unseren Tweet haben wir innerhalb von 1 Minute eine Antwort erhalten. Wir waren alle sehr beeindruckt. Wichtig hierbei ist, dass man ein für das Thema relevantes Tag benutzt. Diesen Tag-Kanal können dann Interessierte abonnieren.&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;b&gt;Was könnte Twitter für Unternehmen bringen?&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;In großen Unternehmen stellt die Suche nach einem Spezialisten immer eine große Herausforderung dar. Jeder kennt den Spruch: „Wenn Siemens wüsste, was Siemens weiß“. Gerade für das Finden von Spezialisten würde sich Twitter meines Erachtens sehr gut eignen. Man könnte Twitter vielleicht auch mit dem unternehmensinternen „Flurfunk“ vergleichen. Über den „Flurfunk“ werden Informationen verteilt. Bei Interesse kann man sich auf solch einen Informationskanal aufschalten. Diese Informationen können per Tag oder Volltext durchsucht werden. Dies würde auch dramatisch zu einer Reduktion von Informationsemails führen, die nur versendet werden, um beispielsweise auf einen nützlichen Link hinzuweisen.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-6613055652567526924?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/6613055652567526924/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/02/in-unserem-unternehmen-brauchen-wir.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6613055652567526924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6613055652567526924'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/02/in-unserem-unternehmen-brauchen-wir.html' title='In unserem Unternehmen brauchen wir Twitter nicht!'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-8198996332213296317</id><published>2011-02-25T11:40:00.002+01:00</published><updated>2011-10-03T17:50:22.799+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='e20'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Twitter in Grails einbinden mit Twitter4J</title><content type='html'>Twitter kann auf sehr einfache Weise in Grails[1]-Applikationen eingebunden werden. Aufgrund der vorhandenen Grails-Plugins und Java APIs wird das Twittern in der eigenen Applikation damit zum Kinderspiel.&lt;br /&gt;&lt;br/&gt;&lt;b&gt;Eigene Applikation bei Twitter registrieren&lt;/b&gt;&lt;br /&gt;Um mit einer fremden Applikation auf den eigenen Twitter-Account zugreifen zu können, muss die Applikation bei Twitter registriert werden. Das geschieht auf der Twitter-Seiter unter Einstellungen -&amp;gt; Verbindungen. Die entsprechenden Tokens, die Twitter für die Applikation generiert, werden für die Authentifzierung benötigt. &lt;br /&gt;&lt;br/&gt;&lt;b&gt;Installation und Konfiguration des Grails-Plugins Twitter4J&lt;/b&gt;&lt;br /&gt;Unter anderem wegen der guten OAuth-Unterstützung [2] haben wir uns für das Grails-Plugin Twitter4J [3] entschieden.&lt;br /&gt;Die Installation läuft Grails-typisch über "grails install-plugin twitter4j" ab. Die Konfiguration, in welcher der eigenen Applikation Zugang zum Twitter-Account gestattet wird, erreicht man über http://localhost:8080/enterprise20/twitter4j (enterprise20 steht für den eigenen Applikationsnamen). Innerhalb dieser Konfiguration werden die zuvor erzeugten Tokens benötigt.&lt;br /&gt;&lt;br/&gt;&lt;b&gt;Der erste Tweet über die eigene Applikation&lt;/b&gt;&lt;br /&gt;Der Twitter4J Service lässt sich intuitiv in einem Grails-Controller ansprechen und so ist alles, was für den ersten Tweet benötigt wird, der folgende kleine Controller.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;&lt;br /&gt;package com.exensio.enterprise20.controller&lt;br /&gt;&lt;br /&gt;import org.twitter4j.grails.plugin.Twitter4jService;&lt;br /&gt;import twitter4j.TwitterException&lt;br /&gt;&lt;br /&gt;class TwitterController {&lt;br /&gt;&lt;br /&gt; Twitter4jService twitter4jService&lt;br /&gt; def maxMessageLength = 140&lt;br /&gt; &lt;br /&gt; def postStatus = {&lt;br /&gt;  def message = params.twitterMessage&lt;br /&gt;  if (message?.size() &amp;lt;= maxMessageLength) {&lt;br /&gt;   twitter4jService.connect()&lt;br /&gt;   try {&lt;br /&gt;    twitter4jService.updateStatus(message);&lt;br /&gt;   } catch (TwitterException te) {&lt;br /&gt;    flash.error = te.message&lt;br /&gt;   }&lt;br /&gt;  } else {&lt;br /&gt;   flash.message = "Please limit yourself to 140 characters"&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Fazit &amp;amp; weitere Möglichkeiten&lt;/b&gt;&lt;br /&gt;Der Zugriff auf Twitter gestaltet sich mit Grails und dem richtigen Plugin also sehr einfach. Über die Möglichkeit, mehrere Twitter-Accounts in der Applikation zu verwalten, kann beispielsweise durch eine intuitive Oberfläche das Twittern unter verschiedenen Accounts deutlich vereinfacht werden. Durch Implementierung von Addons wie der automatischen Einbindung eines URL-Shorteners [4] kann dem Benutzer hilfreiche Funktionalität rund um das "normale" Twittern angeboten werden.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Links&lt;/b&gt;&lt;br /&gt;[1] &lt;a href="http://www.grails.org/"&gt;Homepage Grails Framework&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://oauth.net/"&gt;Das OAuth-Protokoll&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://www.grails.org/plugin/twitter4j"&gt;Das Twitter4J Grails-Plugin&lt;/a&gt;&lt;br /&gt;[4] Zum Beispiel der &lt;a href="http://goo.gl/"&gt;Google URL Shortener&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-8198996332213296317?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/8198996332213296317/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/02/twitter-in-grails-einbinden-mit.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8198996332213296317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8198996332213296317'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/02/twitter-in-grails-einbinden-mit.html' title='Twitter in Grails einbinden mit Twitter4J'/><author><name>Manuel Breitfeld</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-5223150825343674923</id><published>2011-02-21T11:17:00.012+01:00</published><updated>2011-02-21T12:01:50.838+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Usability'/><title type='text'>In Usability investieren - Warum es sich lohnt...</title><content type='html'>&lt;div&gt;Die Usability einer Software entscheidet oftmals über den Erfolg eines Projekts, speziell im Bereich der Web Applikationen und Portale. Usability betrifft u.a.  die Gestaltung (Design und Layout)  und Aspekte wie Lesbarkeit, Navigation und intuitive Bedienbarkeit.  Wie gut die Usability einer Software ist, wird in sogenannten Usability Tests geprüft. Hierzu gibt es jede Menge Methoden beginnend bei einfachen Usability Fragebögen bis hin zu allen möglichen Formen von Ton-, Video- und Bildschirmaufzeichnungen. Ein spezieller Test ist das Eyetracking (Blickbewegungsregistrierung), bei der die Blickbewegungen der Tester aufgenommen werden, um herauszufinden, welche Bereiche einer Seite besonders oder gar keine Beachtung finden.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Bei einer meiner Recherchen im Internet bin ich auf ein interessantes Video von Dr. Susan Weinschenk gestoßen, welches sehr anschaulich (und mit toller Animation) in 5 Minuten aufzeigt, wie sich Investitionen in Aktivitäten zur Optimierung der Usability lohnen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;object style="height: 390px; width: 640px" width="640" height="390"&gt;&lt;param name="movie" value="http://www.youtube.com/v/O94kYyzqvTc?version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/O94kYyzqvTc?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="390"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hier der Link auf das erwähnte &lt;a href="http://www.humanfactors.com/ROIposter.asp"&gt;ROI Poster&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-5223150825343674923?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/5223150825343674923/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/02/in-usability-investieren-warum-es-sich.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5223150825343674923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5223150825343674923'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/02/in-usability-investieren-warum-es-sich.html' title='In Usability investieren - Warum es sich lohnt...'/><author><name>Irving Tschepke</name><uri>http://www.blogger.com/profile/03918738619345383870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-7697523113438469895</id><published>2011-02-20T19:29:00.003+01:00</published><updated>2011-10-03T17:58:50.724+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='e20'/><title type='text'>Ist unternehmensinternes twittern sinnvoll?</title><content type='html'>Immer mehr Unternehmen beschäftigen sich mit dem Thema Enterprise 2.0. So befinden Wikis bei den meisten Unternehmen bereits im Einsatz, um Wissen unter Kollegen zu teilen. Doch kann Micro-Blogging die Wissensvermittlung unter Kollegen fördern?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was ist ein Micro-Blog?&lt;/b&gt;&lt;br /&gt;Die Kurznachrichten, die über Twitter versendet werden, heißen Micro-Blogs. Die Länge einer Nachricht ist auf 140 Zeichen begrenzt. Die interessanteste Neuerung  bei Twitter war meines Erachtens die Einführung von Hash-Tags im August 2007,  mit denen es möglich ist, Nachrichten zu filtern. Ich möchte nicht verschweigen, dass es zu dem Thema ‚Tags‘ kontoverse Diskussionen gibt, da Twitter auch über eine Suchfunktion verfügt. Suchergebnisse, die auf Tags basieren, sind meistens jedoch sinniger.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wozu könnten Micro-Blogs innerhalb von Unternehmen eingesetzt werden?&lt;/b&gt;&lt;br /&gt;Die Email – das heute beliebteste Kommunikationsmittel – stößt langsam an seine Grenzen. Bei großen verteilt arbeitenden Teams können Micro-Blogs dem Austausch von Informationen und Ideen dienen und viele Emails ersetzen. Eine Email erwartet von der Idee her eine Antwort. Es gibt jedoch viele Informationen, die per Email verteilt werden, jedoch keine Antwort erwarten. Diese enthalten meistens das Akronym  „FYI“ und einen oder mehrere Links. Ein weiterer Unterschied zur Email ist, dass meine Informationen gefunden werden, ohne, dass ich diese verteile (Push vs. Pull). Micro-Blogs können auch mit einer virtuellen Kaffee-Pause vergleichen werden, bei der  Informationen in Kurzform ausgetauscht werden. Ich möchte mit dieser Aussage jedoch keine Vier-Augen-Kaffee-Pausen durch virtuelle ersetzen ;-). Kollegen, die auf Reisen sind, können auch an diesen Informationen partizipieren.  Ein weiterer Vorteil ist die Möglichkeit, nach diesen Informationen (und deren Verfassern, die potentielle Experten sein könnten)  zu suchen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lösungen für unternehmensinternes twittern:&lt;/b&gt;&lt;br /&gt;Die folgenden Lösungen können unternehmensintern eingesetzt werden. Hierbei gibt es die Möglichkeit, diesen Service zu mieten (SaaS) oder sich die Software intern zu installieren. Bei Saas gilt es auch, Fragestellungen bezüglich des Datenschutzes zu bedenken. Hier eine kurze Auflistung von verfügbaren Lösungen (die Liste erhebt keinen Anspruch auf Vollständigkeit):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Yammer – ist wohl die bekannteste Plattform. Ist als SaaS verfügbar. Weitere Informationen finden sich &lt;a href="http://www.yammer.com/"&gt;hier&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;CO-OP – verfügbar als SaaS. Weitere Informationen finden sich &lt;a href="http://coopapp.com/"&gt;hier&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Status.net – Open-Source-Lösung. Kann als SaaS gemietet oder hausintern installiert werden. Weitere Infos finden sich &lt;a href="http://status.net/"&gt;hier&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Communote – SaaS Lösung aus Deutschland. Weitere Infos finden sich &lt;a href="http://www.communote.com/"&gt;hier&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Es wäre auch denkbar, solch eine Lösung basierend auf dem &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;-Framework ganz individuell - auf Kundenwünsche angepasst - zu realisieren.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Fazit:&lt;/b&gt;&lt;br /&gt;Ich bin der Meinung, dass Micro-Blogs eine interessante Möglichkeit zur Wissensverarbeitung bieten können. Für einen erfolgreichen Einsatz reicht es jedoch nicht aus, sich ein Tool auszusuchen. Es ist vielmehr wichtiger, eine sinnvolle Tag-Taxonomie aufzubauen, damit das Wissen später wieder gefunden werden kann.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-7697523113438469895?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/7697523113438469895/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/02/ist-unternehmensinternes-twittern.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7697523113438469895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7697523113438469895'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/02/ist-unternehmensinternes-twittern.html' title='Ist unternehmensinternes twittern sinnvoll?'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-2589671502513443972</id><published>2011-02-13T16:21:00.006+01:00</published><updated>2011-03-01T09:07:13.916+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Virtualisierung'/><title type='text'>Effiziente Entwicklung mit Virtualisierung (Teil 1)</title><content type='html'>Insbesondere bei größeren Projekten haben wir schon öfters in der Praxis erlebt, dass einiges an Zeit für die Einrichtung und das Warten der Entwicklungsinfrastruktur benötigt wird. Woran liegt das?&lt;br /&gt;Die Entwicklungsumgebungen bieten heutzutage eine große Unterstützung und sind in der Regel einfach zu installieren. Allerdings sind in vielen Fällen zusätzliche Konfigurationen und Installationen notwendig z.B. für das Anbinden von Drittsystemen. Dies kann sehr zeitintensiv sein, wenn jeder Projektmitarbeiter dies an seinem Entwicklungsrechner selbst durchführt.&lt;br /&gt;Kosten und auch Nerven kann der Einsatz von Virtualisierung in der Entwicklung sparen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Virtualisierung mit ESXi&lt;/b&gt;&lt;br /&gt;exensio setzt hierfür ESXi [1] ein. ESXi kommt von der Firma VMWare und ist ein sogenannter Bare-Metal-Hypervisor, der direkt auf der Server-Hardware installiert wird. Es handelt sich dabei um ein abgespecktes Linux-System, das im Vergleich zu anderen Virtualisierungslösungen einen sehr niedrigen Overhead hat. Des Weiteren ist ESXi kostenfrei verfügbar.&lt;br /&gt;&lt;br /&gt;Für die Entwicklung greifen Entwickler auf ein VMWare-Image zu, das auf dem zentralen ESXi-Server läuft. Der Zugriff erfolgt bei Windows über den Remote Desktop und bei Linux über den NXClient. Auf dem VMWare-Image ist alle notwendig Software installiert und konfiguriert, so dass direkt mit der Arbeit losgelegt werden kann.&lt;br /&gt;Die Hardwareausstattung des ESXi-Servers sollte angepasst sein an die Anzahl der parallel arbeitenden Entwickler. Bei komplexeren JEE-Projekten sollte man pro Virtuelle Maschine mit 3,5 GB RAM kalkulieren.&lt;br /&gt;&lt;br /&gt;In einem der nächsten Blogeinträge wird detaillierter auf die Konfiguration, Individualisierung und Verteilung der VMWare-Images eingegangen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Vorteile der Virtualisierung&lt;/b&gt;&lt;br /&gt;Welche Vorteile können sich also durch die Nutzung von Virtualisierung für die Entwicklung ergeben?&lt;br /&gt;&lt;br /&gt;Zeitersparnis, da die Basisumgebung nur einmal eingerichtet wird und anschließend für alle Entwickler dupliziert wird. Bei größeren Projekten ist diese Arbeit nicht zu unterschätzen:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Anlegen oder Konfiguration einer Server-Domaine (z.B. JDBC-Einstellungen)&lt;/li&gt;&lt;li&gt;Installation der Entwicklungsumgebung&lt;/li&gt;&lt;li&gt;Ggfs. Konfiguration der Versionsverwaltung&lt;/li&gt;&lt;li&gt;Basisstruktur für das Projekt wird einmal zentral aufgesetzt&lt;/li&gt;&lt;li&gt;Installationen und Konfiguration für den Zugriff auf Backendsysteme (z.B. DLL für SAP-Zugriff)&lt;/li&gt;&lt;/ul&gt;Es kann einfach auf eine funktionierende Entwicklungsinfrastruktur zurückgegriffen werden, falls etwas "zerstört" wurde (z.B. defekte Serverdomäne), sei es durch den Entwickler selbst oder das System.&lt;br /&gt;&lt;br /&gt;Wird eine Applikation kompiliert oder deployed, dann fällt in der Regel eine hohe Belastung für die CPUs an. Durch die Virtualisierung steht über den ESXi-Server wesentlich mehr Leistungspotential (CPU, Festplattendurchsatz, ...) zur Verfügung, das von den jeweiligen VMs zeitweise abgerufen werden kann.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was sollte man beachten?&lt;/b&gt;&lt;br /&gt;Für einen reibungslosen Ablauf und Verbesserungen ist die Mitarbeit aller Entwickler erforderlich. Änderungen die zukünftig für alle verfügbar sein sollten müssen in das Masterimage zurückgespielt werden. Dies können beispielsweise Helper-Skript sein oder Plugins für  die Entwicklungsumgebung.&lt;br /&gt;&lt;br /&gt;Des Weiteren sollte für die Verwaltung der zentralen Entwicklungsserver eine dedizierte Personengruppe zuständig sein, da sonst sehr schnell der Überblick verloren geht.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://www.vmware.com/products/vsphere-hypervisor/index.html"&gt;ESXi&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-2589671502513443972?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/2589671502513443972/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/02/effiziente-entwicklung-mit.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/2589671502513443972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/2589671502513443972'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/02/effiziente-entwicklung-mit.html' title='Effiziente Entwicklung mit Virtualisierung (Teil 1)'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-313781968549975270</id><published>2011-01-23T19:30:00.007+01:00</published><updated>2011-01-24T09:32:56.210+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Eignet sich Grails auch für „große“ Projekte?</title><content type='html'>In dem Blog mit dem Titel „Why use Grails“ [1] sind sehr gut die Gründe aufgeführt, die meines Erachtens für Grails sprechen. Wir setzen seit mehreren &amp;nbsp;Jahren Grails erfolgreich ein und &amp;nbsp;sind vor allem von der Schnelligkeit begeistert, mit der es möglich ist – im Vergleich zur herkömmlichen JEE Implementierung – Applikationen zu entwickeln. Dennoch entdecke ich immer wieder Artikel, die die Aussage treffen, dass sich Grails nur für „kleine“ &amp;nbsp;Projekte eignet. Hier meine Meinung zu Punkten, die ich öfters lese:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Skalierbarkeit:&lt;br /&gt;Die Skalierbarkeit von Grails-Applikationen wird des Öfteren bemängelt. Natürlich gibt es sehr viele Beispiele von Vorzeigeprojekten [2] bei denen es offensichtlich keine Probleme gab. Grails ist wie jedes andere Web Framework für eine gute Skalierbarkeit entworfen worden. In Grails selbst können natürlich – wie bei jeder anderen Software – auch Bugs enthalten sein. So ist im Zusammenhang mit Performanz ein Tag-Lib-Problem bei Grails bekannt geworden, &amp;nbsp;dies wurde inzwischen gefixt.&lt;br /&gt;Es kann nur empfohlen werden, schon während der Entwicklung Lasttests durchzuführen, um die Architektur auf Skalierbarkeitsaspekte hin zu überprüfen. Dies machen wir auch bei herkömmlichen JEE-Applikationen, die wir neben Grails auch noch mit JEE (JPA, EJBs, Servlets, JSPs, JSF etc.) entwickeln. &amp;nbsp;Auch bei klassischen JEE-Applikationen mussten wir &amp;nbsp;schon des Öfteren unseren Sourcecode umbauen, da die anfängliche Implementierung nicht performant genug war. Da Grails auf Spring und Hibernate basiert, sollte sich immer ein Weg finden, um die Performanz zu optimieren. Notfalls direkt mit Java beziehungsweise Hibernate.&lt;/li&gt;&lt;li&gt;Testbarkeit:&lt;br /&gt;Hier wird oft bemängelt, dass eine Grails Applikation nicht so einfach zu testen sei, da Groovy benutzt wird. Groovy ist eine dynamische Sprache und somit können Fehler erst zur Laufzeit auffallen, da hier – nicht wie bei Java – schon während &amp;nbsp;der Compilierung etwaige Probleme gefunden werden können. Grails bringt schon von Haus aus die Möglichkeit mit, JUnit-Tests zu entwickeln. Eine weitere Möglichkeit stellt das Tool Cobertura dar, mit dem es möglich ist, die Test-Coverage des Source-Codes zu bestimmen. Hier sei vielleicht folgender Blog [3] zu empfehlen. Benötigen Teile des Systems eine 100% Test-Coverage so können diese auch in Java entwickelt werden. Ein weiterer Punkt sollte nicht vergessen werden – mit Groovy wird ein kompakterer Code geschrieben, demzufolge sollte dieser auch weniger Fehler enthalten.&lt;/li&gt;&lt;li&gt;Teamgröße:&lt;br /&gt;Ich habe neulich in einem Blog gelesen, dass Grails nicht für Teams &amp;gt; 5 Programmierer geeignet ist. Diese Aussage ist mir vollkommen schleierhaft. Geht man bei Grails von einer Produktivitätssteigerung vom 3-4 fachen – im Vergleich zu einem JEE Team – aus, so würde ein 5 Mann starkes Grails-Team ein 15-20 Mann starkes JEE Team ersetzten. Dies ist schon eine Teamgröße, mit der sich etwas bewerkstelligen lässt. Soll von noch größeren Teams ausgegangen werden, so ist es wohl immer auch eine Frage des Projektmanagers und des Architekten, wie so ein Projekt in Module aufgeteilt wird, die dann von den einzelnen Teams implementiert werden können. Bei Grails könnte man sich auch vorstellen, solche Module in Form von Plugins abzubilden. &amp;nbsp;Des Weiteren ist meiner Meinung nach die von Grails vorgegebene Projektstruktur ein klarer Pluspunkt, insbesondere wenn bedacht wird, dass es einfacher wird neue Entwickler in das Team zu integrieren, da einem Grails-Entwickler diese Struktur bekannt ist und er sich nicht in eine neue Struktur einarbeiten muss.&lt;/li&gt;&lt;li&gt;Komplexität:&lt;br /&gt;Ein großer Vorteil von Grails ist das Paradigma „Convention over Configuration“. &amp;nbsp;Dies kann jedoch auch den Eindruck erwecken, dass nicht hochkomplexe Applikationen erstellbar sind, da man nicht alle Freiheitsgrade wie bei JEE vorfindet. Generell gilt auch hier, dass alles, was mit Spring/Hibernate funktioniert auch mit Grails funktioniert. Wird seitens des Projekts jedoch die Unterstützung von EJBs gefordert so muss der JEE Weg beschritten werden.&lt;/li&gt;&lt;li&gt;JEE &amp;nbsp;6:&lt;br /&gt;Durch die Einführung von JEE 6 wird auch häufig diskutiert, ob es noch Frameworks wie Grails bedarf. JEE 6 stellt gegenüber seinem Vorgänger klare Verbesserungen – beispielsweise durch die Einführung des Paradigma „Convention over Configuration“ – dar, jedoch muss man JEE 6 mit dem Gesamtpaket von Grails [1] vergleichen. Meine Meinung &amp;nbsp;hier ist, dass Grails hier immer noch einige interessante Vorteile bietet. Hierbei zählt für mich auch die Sprache Groovy.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;Ich hoffe, es ist mir gelungen, ein paar Vorurteile gegenüber dem Einsatz von Grails bei „großen“ Projekten aus dem Weg zu räumen. Dennoch möchte ich mich hier auch nicht festlegen, was der Königsweg ist. Dies muss für jedes Projekt erneut entschieden werden. Aber gerade für Projekte, die sehr budgetsensitiv sind, führt meines Erachtens kein Weg an Grails vorbei. Früher hätte man JEE (oder genauer J2EE) auch nicht zugetraut, dass auf dieser Plattform einmal geschäftskritische Applikationen laufen.&lt;br /&gt;&lt;br /&gt;[1]&amp;nbsp;&lt;a href="http://www.intelligrape.com/blog/2011/01/16/why-use-grails"&gt;Why use Grails?&lt;/a&gt;&lt;br /&gt;[2]&amp;nbsp;&lt;a href="http://www.grails.org/Testimonials"&gt;Grails Testimonials&lt;/a&gt;&lt;br /&gt;[3]&amp;nbsp;&lt;a href="http://www.oio.de/public/opensource/tutorial-grails-test-coverage.htm"&gt;Grails Test-Coverage&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-313781968549975270?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/313781968549975270/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/01/eignet-sich-grails-auch-fur-groe.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/313781968549975270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/313781968549975270'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/01/eignet-sich-grails-auch-fur-groe.html' title='Eignet sich Grails auch für „große“ Projekte?'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-6833211831924208958</id><published>2011-01-17T12:17:00.209+01:00</published><updated>2011-10-03T17:48:37.430+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GORM'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Domain-Modellierung in GORM, Tipps/ BestPractices</title><content type='html'>&lt;a href="http://www.grails.org/"&gt;Grails &lt;/a&gt;Domain Klassen sind Grundbausteine und enthalten die Datenstrukturen und Zuständen einer Geschäftsanwendung.&lt;br /&gt;Die Domain-Modellierung ist ein wichtiger Bestandteil des Grails Object Relational Mappings (GORM).&lt;br /&gt;&lt;br /&gt;In den vergangenen Grails Projekten, die in der Produktionsumgebung eine Oracle-Datenbank benutzen, finden einige Arbeitschritten zur Domain-Modellierung in derselben Art regelmäßig wiederkehrend statt.&lt;br /&gt;&lt;br /&gt;Diese routinemäßigen Schritte möchte ich nun anhand eines Beispiels beschreiben:&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;package com.exensio.myapp.helper;&lt;br /&gt;public class Constants {&lt;br /&gt;    public static final String DB_PREFIX = "MYAPP_"; // 1&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="javascript" name="code"&gt;abstract class AbstractEntity implements Serializable { // 2&lt;br /&gt;    Date    dateCreated // 3&lt;br /&gt;    Date    lastUpdated // 4&lt;br /&gt;    Integer    version // 5&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre class="javascript" name="code"&gt;class Project extends AbstractEntity { // 6&lt;br /&gt;    String title&lt;br /&gt;&lt;br /&gt;    static mapping = {&lt;br /&gt;        table   Constants.DB_PREFIX + "project" // 7&lt;br /&gt;        id      generator: "native", params:[ sequence: Constants.DB_PREFIX + "project_id_seq" ] // 8&lt;br /&gt;        sort "title" // 9&lt;br /&gt;    }&lt;br /&gt;    String toString() { title } // 10&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Tabellen-/Sequenzen- Namen bei dem DB-Mapping&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Aus folgenden Gründen wird in dem obigen Beispiel (Punkten-1,7,8) ein DB-Präfix verwendet:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Wie die meisten Datenbank-Systeme hat Oracle vordefinierte Schlüsselwörter, die nicht als Tabellen-/Sequenz- Namen verwendet werden dürfen. Mit einem Präfix kann dies Problem vermieden werden.&lt;/li&gt;&lt;li&gt;Das Präfix ermöglicht die Verwendung eines gemeinsamen DB-Schemas mit weiteren Applikationen.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Automatisches Timestamping&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Die Idee ist, automatisch einen Zeitstempel bei einer schreibenden DB-Operation zu setzen. Technisch wird dies mittels zwei GORM-Events: "beforeInsert" und "beforeUpdate" realisiert.&lt;br /&gt;Als Grails-Entwickler hat man hier Glück, da mann den Konventionen folgen kann und zwei Attributen (wie Punkte-3,4 im Beispiel) definiert.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;b&gt;Erläuterung der einzelnen Punkten:&amp;nbsp; &lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;DB-Präfix der Applikation, siehe auch Punkt-7&lt;/li&gt;&lt;li&gt;Eine abstrakte Basisklasse, die das Interface Serializalbe implementiert&lt;/li&gt;&lt;li&gt;Automatisches Timestamping, per Namenskonvention aktualisiert GORM die zwei Attribute("dateCreated" und "lastUpdated") bei entsprechenden Ereignissen&lt;/li&gt;&lt;li&gt;Automatisches Timestamping, siehe auch Punkt-3 &lt;/li&gt;&lt;li&gt;Das "Version" Attribut( ähnlich wie bei der JPA Annotation: @Version), das von GORM zum "Optimistischen Locking" verwendet wird&lt;/li&gt;&lt;li&gt;Eine Grails Domain Klasse, durch die Vererbung verfügt es über alle Eigenschaften seiner Basisklasse&lt;/li&gt;&lt;li&gt;Name der DB-Tabelle "MYAPP_PROJECT". Dieses Verfahren ermöglicht zum einen die Verwendung eines gemeinsamen DB-Schemas mit weiteren Applikationen, zum anderen wird hierdurch vermieden, dass ein von der Datenbank reserviertes Schlüsselwort als Tabellenname &amp;nbsp;verwendet wird.&lt;/li&gt;&lt;li&gt;Name der DB-Sequenz "MYAPP_PROJECT_ID_SEQ". Diese hat die gleiche Funktion wie der Tabellename von Punkt-7&lt;/li&gt;&lt;li&gt;Defaultmäßige Sortierung  nach "Title" in einer List von Projekten&lt;/li&gt;&lt;li&gt;Defaultmäßige String-Repräsentation für ein Objekt der Domain Klasse.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-6833211831924208958?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/6833211831924208958/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2011/01/gorm-tipps-bestpractices.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6833211831924208958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6833211831924208958'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2011/01/gorm-tipps-bestpractices.html' title='Domain-Modellierung in GORM, Tipps/ BestPractices'/><author><name>Xuetao Li</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-5877558524033088856</id><published>2010-11-20T18:15:00.012+01:00</published><updated>2011-10-03T17:55:11.989+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Konferenz'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Impressionen von der DOAG 2010</title><content type='html'>Am 17. und 18. November nahm ich an der DOAG 2010 [1] teil und möchte in diesem Blogbeitrag meine Eindrücke schildern. Ingesamt wurden auf der DOAG über 400 Sessions abgehalten. Da meistens 20 Sessions parallel liefen, fiel einem die Auswahl nicht immer leicht. Ich legte den Schwerpunkt für meine Vorträge auf die Bereiche Java und Middleware-Technologien.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_ZJp1Ux93_aQ/TOgEt35xecI/AAAAAAAAAJg/TETs-VhkkeM/s1600/rolltreppen.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5541684527626287554" src="http://3.bp.blogspot.com/_ZJp1Ux93_aQ/TOgEt35xecI/AAAAAAAAAJg/TETs-VhkkeM/s320/rolltreppen.jpg" style="cursor: pointer; display: block; height: 240px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Die besuchten Sessions zu Middleware verfestigten nochmal die Ankündigung von Oracle, dass &lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/overview/index.html"&gt;ADF&lt;/a&gt; (Application Development Framework) [2] als Jave EE Framework strategisch im gesamten Bereich WebCenter gesetzt ist. Es werden damit auch die internen Applikationen wie bspw. die Administrationsoberfläche umgesetzt. Inwiefern sich &lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/overview/index.html"&gt;ADF&lt;/a&gt; am freien Markt behaupten kann wird sich noch zeigen müssen. Hierzu gab es auch einen spannenden Vortrag der &lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/overview/index.html"&gt;ADF&lt;/a&gt;, &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt; und &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt; miteinander verglichen hat. Die dort aufgeführten Ergebnisse decken sich auch großteils mit unseren Erfahrungen. Spring ist sehr flexibel und umfasst ein großes Spektrum, ist aber bzgl. der Entwicklung aufwendiger. Mit Grails lassen sich, wie auch schon von meinem Kollegen aufgeführt [3], sehr schnell Applikationen entwickeln. Allerdings hat man nicht die komplette Freiheit und stößt ggfs. an Grenzen.  ADF ist zwischen den beiden Frameworks anzusiedeln.&lt;br /&gt;&lt;br /&gt;Sehr interessant fand ich ebenfalls aus technischer Sicht den Vortrag von Ed Burns und Oliver Szymanski zu JSF2. Einige neue Features kennt man ja schon durch diverse Artikel und die Spezifikation, allerdings ist es viel interessanter, wenn man die Dinge life "vorprogrammiert" bekommt.&lt;br /&gt;&lt;br /&gt;Die Keynote von Professor Hermann Maurer "Es stehen uns noch viele Entwicklungen und Überschungen ins Haus ..." war für mich der faszinierenste und auch abwechslungsreichste Vortrag. Prof. Maurer belegte anhand mehrerer Punkte warum die technologische Entwicklung in vielen Bereichen rascher und schneller ist wie wir meist annehmen. Insbesondere zeigte er auch auf warum es so schwierig bzw. fast unmöglich ist längerfristige Vorhersagen über Entwicklungen zu machen.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_ZJp1Ux93_aQ/TOgEVcsAnFI/AAAAAAAAAJY/SZFpSxy0xzo/s1600/billard.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5541684108003941458" src="http://4.bp.blogspot.com/_ZJp1Ux93_aQ/TOgEVcsAnFI/AAAAAAAAAJY/SZFpSxy0xzo/s320/billard.png" style="cursor: pointer; display: block; height: 185px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Für das leibliche Wohl war mit allerlei Köstlichkeiten ebenso wie für das Rahmenprogramm bestens gesorgt. Großer Beliebheit erfreuten sich die drei Billardtische und das am Mittwoch-Abend ausgespielte Turnier unter der Leitung von Bundestrainer Andreas Huber sowie der Billardprofis Manuel Ederer und Dominic Jentsch.&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://doag.org/konferenz/doag/2010/"&gt;http://doag.org/konferenz/doag/2010/&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/index.html"&gt;http://www.oracle.com/technetwork/developer-tools/adf/index.html&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://exensio.blogspot.com/2010/10/erfahrungsbericht-ablosung-von-excel.html"&gt;http://exensio.blogspot.com/2010/10/erfahrungsbericht-ablosung-von-excel.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-5877558524033088856?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/5877558524033088856/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/11/impressionen-von-der-doag-2010.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5877558524033088856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5877558524033088856'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/11/impressionen-von-der-doag-2010.html' title='Impressionen von der DOAG 2010'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZJp1Ux93_aQ/TOgEt35xecI/AAAAAAAAAJg/TETs-VhkkeM/s72-c/rolltreppen.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-4031508441321018846</id><published>2010-11-03T08:41:00.005+01:00</published><updated>2010-11-03T09:19:24.672+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails-spezifische Settings für den Weblogic Server</title><content type='html'>In diesem Blog-Eintrag möchte ich zwei Weblogic-spezifische Themen für die Entwicklung von Grails Applikationen erläutern.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. JDK Version des Zielsystems verwenden:&lt;/span&gt;&lt;br /&gt;Jede Weblogic Server Version wird mit einem eigenen JDK ausgeliefert. Beim Weblogic Server 8.1.4 ist es beispielsweise die Version 1.4.2_05, beim WLS 9.1 ist es die Version 1.5.0_04 und beim WLS 10.3.2 ist es die Version 1.6.0_14.&lt;br /&gt;Um böse Überraschungen bezüglich JDK Versionen beim späteren Test und Deployment in der Produktionsumgebung zu vermeiden,  sollte die Gails Applikation gleich nach dem Anlegen des Projekts so konfiguriert werden, dass die Applikation mit dem JDK des Zielsystems kompiliert wird.&lt;br /&gt;&lt;br /&gt;Zum Kompilieren bzw. zur WAR-Generierung eines Grails Projekts können folgende Skripte verwendet werden:&lt;br /&gt;- ${PROJECT_HOME}/war.cmd:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;set JAVA_HOME=${WL_HOME}\bea103\jdk160_05&lt;br /&gt;set PATH=%JAVA_HOME%\bin;%PATH%&lt;br /&gt;call grails war&lt;br /&gt;pause&lt;br /&gt;&lt;/pre&gt;- ${PROJECT_HOME}/run-app.cmd:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;set JAVA_HOME=${WL_HOME}\bea103\jdk160_05&lt;br /&gt;set PATH=%JAVA_HOME%\bin;%PATH%&lt;br /&gt;call grails run-app&lt;br /&gt;pause&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Der Weblogic Deployment Descriptor (weblogic.xml)&lt;/span&gt;&lt;br /&gt;Wenn folgende Exception beim Publizieren einer Grails Applikation auf dem Weblogic Server auftritt, hilft eine entsprechende weblogic.xml Konfiguration im WEB-INF Verzeichnis (siehe unten).&lt;br /&gt;Weitere Infos finden sich unter: &lt;a href="http://www.grails.org/Deployment"&gt;http://www.grails.org/Deployment&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Exception:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed;&lt;br /&gt;nested exception is java.lang.NoSuchMethodError: org.apache.tools.ant.helper.AntXMLContext.setCurrentTargets(Ljava/utilMap;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- ${PROJECT_HOME}/web-app/WEB-INF/weblogic.xml:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;weblogic-web-app      xmlns="http://www.bea.com/ns/weblogic/90"&lt;br /&gt;                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;                    xsi:schemaLocation="http://www.bea.com/ns/weblogic/90&lt;br /&gt;                    http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd"&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;lt;container-descriptor&amp;gt;&lt;br /&gt;      &amp;lt;prefer-web-inf-classes&amp;gt;true&amp;lt;/prefer-web-inf-classes&amp;gt;&lt;br /&gt;&amp;lt;/container-descriptor&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/weblogic-web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-4031508441321018846?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/4031508441321018846/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/11/grails-spezifische-settings-fur-den.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4031508441321018846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4031508441321018846'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/11/grails-spezifische-settings-fur-den.html' title='Grails-spezifische Settings für den Weblogic Server'/><author><name>Xuetao Li</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-5069117245653972573</id><published>2010-10-29T07:44:00.003+02:00</published><updated>2010-10-29T08:51:40.359+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apps'/><category scheme='http://www.blogger.com/atom/ns#' term='BlackBerry'/><category scheme='http://www.blogger.com/atom/ns#' term='User Interface'/><title type='text'>Slide-Effekt bei BlackBerry-Apps</title><content type='html'>Beim Gebrauch von Apps, sei es für BlackBerrys, Androids oder iPhones, fällt stets auf, dass bei der Interaktion mit dem Benutzer auf ähnliche Effekte gesetzt wird. So fährt beispielsweise bei einem Klick auf Menüpunkte oder Links meist der neue Inhalt von rechts in den Bildschirm ein.&lt;br /&gt;&lt;br /&gt;Bei der Entwicklung von BlackBerry-Apps ist ein solcher Effekt einfach zu implementieren. Die entsprechenden Begriffe in der BlackBerry-App-Welt lauten hierbei:&lt;br /&gt;- &lt;span style="font-style:italic;"&gt;Screen&lt;/span&gt;: Ein Screen enthält den Inhalt, der auf dem Bildschirm angezeigt wird. So kann es etwa einen Login-Screen und einen Home-Screen geben.&lt;br /&gt;- &lt;span style="font-style:italic;"&gt;TransitionContext&lt;/span&gt;: Der TransitionContext beschreibt, wie von einem Screen zum nächsten gewechselt wird. Screens können beispielsweise von einer Richtung außerhalb des Bildschirms in den Bildschirm fahren (&lt;span style="font-style:italic;"&gt;slide&lt;/span&gt;) oder der neue Screen kann über dem alten eingeblendet werden (&lt;span style="font-style:italic;"&gt;fade&lt;/span&gt;). Weitere Effekte heißen &lt;span style="font-style:italic;"&gt;wipe&lt;/span&gt; und &lt;span style="font-style:italic;"&gt;zoom&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Die folgende Methode beschreibt, wie beim Klick auf den Login-Button der neue Home-Screen eingeblendet wird. Die Dauer ist mit 500 ms angegeben.&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;public void fieldChanged(Field field, int context) {&lt;br /&gt; if (field instanceof LoginButton) {&lt;br /&gt;  // Get UI engine for transition effetcs&lt;br /&gt;  UiEngineInstance engine = Ui.getUiEngineInstance();&lt;br /&gt;  &lt;br /&gt;  // Init new home screen&lt;br /&gt;  homeScreen = new HomeScreen();&lt;br /&gt;                         &lt;br /&gt;  // Specify and set transition context for sliding in&lt;br /&gt;  TransitionContext transitionContextIn = new TransitionContext(TransitionContext.TRANSITION_SLIDE);&lt;br /&gt;  transitionContextIn.setIntAttribute(TransitionContext.ATTR_DURATION, 500);&lt;br /&gt;  transitionContextIn.setIntAttribute(TransitionContext.ATTR_DIRECTION, TransitionContext.DIRECTION_LEFT);&lt;br /&gt;  engine.setTransition(null, homeScreen, UiEngineInstance.TRIGGER_PUSH, transitionContextIn);&lt;br /&gt;  &lt;br /&gt;  // Specify and set transition context for sliding out&lt;br /&gt;  TransitionContext transitionContextOut = new TransitionContext(TransitionContext.TRANSITION_SLIDE);&lt;br /&gt;  transitionContextOut.setIntAttribute(TransitionContext.ATTR_DURATION, 500);&lt;br /&gt;  transitionContextOut.setIntAttribute(TransitionContext.ATTR_DIRECTION, TransitionContext.DIRECTION_RIGHT);                                                            &lt;br /&gt;  transitionContextOut.setIntAttribute(TransitionContext.ATTR_KIND, TransitionContext.KIND_OUT);&lt;br /&gt;  engine.setTransition(homeScreen, null, UiEngineInstance.TRIGGER_POP, transitionContextOut);&lt;br /&gt;  &lt;br /&gt;  // Push home screen on stack&lt;br /&gt;  synchronized(UiApplication.getEventLock())&lt;br /&gt;  {&lt;br /&gt;   UiApplication.getUiApplication().pushScreen(homeScreen);                       &lt;br /&gt;  }          &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Da diese Effekte häufiger benutzt werden und dabei immer einheitlich aussehen sollten, bietet es sich an, die Erstellung des "Transition Contexts" in eine kleine Helper-Klasse auszugliedern.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-5069117245653972573?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/5069117245653972573/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/10/slide-effekt-bei-blackberry-apps.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5069117245653972573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5069117245653972573'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/10/slide-effekt-bei-blackberry-apps.html' title='Slide-Effekt bei BlackBerry-Apps'/><author><name>Manuel Breitfeld</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-4699831255757610353</id><published>2010-10-23T17:54:00.001+02:00</published><updated>2010-10-23T17:55:40.670+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><category scheme='http://www.blogger.com/atom/ns#' term='CMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Informationsportal'/><title type='text'>Personalisierungsformen bei Portalen</title><content type='html'>Eine wichtige Funktion von Portalen stellt die Personalisierung dar. Erst hiermit ist es möglich, Informationen zielgerichtet verschiedenen Benutzergruppen zur Verfügung zu stellen. Zuerst boten Framework-Portale [1], wie das Oracle WebLogic Portal, Oracle WebCenter, IBM WebSphere Portal aber auch das Liferay Portal diese Funktionalität an. Beim Liferay Portal sei hier angemerkt, dass erst mit der Version 6 eine regelbasierte (Rules-Engine) Personalisierung möglich ist. Neuerdings bieten jedoch auch die Hersteller von Content-Management-Systemen (CMS) wie OpenText oder Day diese Funktionalität an.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Im Folgenden werden die verschiedenen Formen der Personalisierung erläutert:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Explizite Personalisierung –&lt;/b&gt; bei der expliziten Personalisierung wird basierend auf dem Benutzerprofil die Personalisierung durchgeführt. Das Benutzerprofil sollte die Möglichkeit bieten, Informationen aus verschiedensten Systemen – wie LDAP, Active Directory aber beispielsweise auch SAP – aggregieren zu können. Mit der expliziten Personalisierung ist es beispielsweise möglich Mitarbeitern aus verschiedenen Abteilungen unterschiedliche Informationen bereitzustellen. Oder bei einem Kundenportal könnte der Kunde einen Teaser mit einem Geburtstagsgruß eingeblendet bekommen.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Implizite Personalisierung –&lt;/b&gt; bei der impliziten Personalisierung wird das Interaktionsverhalten des &amp;nbsp;Benutzers für die Personalisierung benutzt. Klickt ein User beispielsweise des Öfteren auf eine risikoreiche Anlageform, so erhält er im Weiteren mehr Informationen zu risikoreichen Anlagen. Diese Form der Personalisierung ist technisch und fachlich am schwierigsten zu realisieren. Die meisten Portale unterstützten nur die Verarbeitung der Klick-Events. Im Hintergrund müssen dann jedoch noch teilweise sehr aufwändige Prozesse laufen. Des Weiteren ist es hier sehr wichtig einen sehr guten Web-Miner an der Hand zu haben, der in dem großen – durch Web-Tracking – angehäuften Daten solche Muster erkennen kann. Diese Form der Personalisierung ist die komplexeste, wobei davon auszugehen ist, dass diese Form der Personalisierung in den nächsten Jahren immer mehr Anhänger finden wird, da sie gerade bei Kundenportalen interessante Möglichkeiten bietet.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Individualisierung –&lt;/b&gt; hierbei kann ein Users sich das Portal eigenen Anforderungen anpassen. So ist es beispielsweise für den Benutzer möglich Portlets auf einer Seite nach eigenen Kriterien anzuordnen und zu parametrisieren (zum Beispiel die Url bei einem RSS Feed).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;Fazit&lt;/div&gt;&lt;div&gt;Bei einem Portalprojekt ist zunächst zu klären, welche Form der Personalisierung relevant ist. Die explizite Form unterstützen die meisten Hersteller. Jedoch ist darauf zu achten, dass die Personalisierung auf einer Rules-Engine basiert. Bei der impliziten Form ist davon auszugehen, dass bei den meisten Produkten noch Drittsysteme – beispielsweise eine Real Time Decision Engine, die basierend auf einem Model in Echtzeit Entscheidungen trifft, was für welchen Benutzer angezeigt werden soll - &amp;nbsp;angeschafft werden müssen.&amp;nbsp;&lt;/div&gt;&lt;div&gt;[1] &lt;a href="http://exensio.blogspot.com/2010/05/klassifikation-von-portal-losungen.html"&gt;Mein Blog-Eintrag mit dem Thema „Klassifikation von Portal-Lösungen“&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-4699831255757610353?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/4699831255757610353/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/10/personalisierungsformen-bei-portalen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4699831255757610353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4699831255757610353'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/10/personalisierungsformen-bei-portalen.html' title='Personalisierungsformen bei Portalen'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-6470069949093562236</id><published>2010-10-08T17:55:00.004+02:00</published><updated>2011-10-30T16:44:39.124+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Erfahrungsbericht: Ablösung einer Excel-basierten Zeiterfassung durch eine Grails Web-Applikation</title><content type='html'>In diesem Blog-Eintrag möchte ich über ein internes Projekt der exensio GmbH berichten.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ausgangssituation:&lt;/b&gt;&lt;br /&gt;Für die Zeiterfassung unserer Beratertätigkeit hatten wir früher – wie viele andere Beratungshäuser auch – Excel eingesetzt. Richtig zufrieden waren wir mit dieser Lösung nicht wirklich. Die Eingabe der Stunden gestaltet sich noch recht einfach, die Konsolidierung am Monatsende war jedoch immer recht mühsam. Eine kleine Unaufmerksamkeit führte dann zu inkonsistenten Stundenzetteln. Alles in allem war ein Kollege ein Tag hiermit beschäftigt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wir dachten – das muss doch auch anders gehen:&lt;/b&gt;&lt;br /&gt;Da wir ein IT-Beratungshaus sind, lag die Idee nahe, Excel durch ein web-basiertes Informationssystem zu ersetzten. Wir machten uns auf die Suche nach einer passenden Software. Wir fanden viele, jedoch hat keine so richtig auf unsere Prozesse gepasst. Und die Bedienung war generell bei allen Systemen zu komplex. Wir wollten natürlich auch nicht Funktionalität bezahlen, die wir überhaupt nicht benutzt hätten. Selbst ein kleines Unternehmen wie wir, wünscht sich, dass sich die Software an die eigenen Prozesse anpasst und nicht umgekehrt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Machen wir es doch selbst:&lt;/b&gt;&lt;br /&gt;Natürlich kam schon bald die Idee auf, eine eigene Zeiterfassung zu entwickeln. Leider ist dies mit den herkömmlichen Frameworks sehr zeitaufwendig und wir hatten nur ein kleines Budget. Unsere Anforderungen waren natürlich hoch. Es sollte eine elegante und einfach zu bedienende Rich Internet Application (RIA) - mit AJAX und alles was heute dazugehört - werden. In Kundenprojekten setzen wir schon seit geraumer Zeit sehr erfolgreich das Grails Framework [1] ein. Also lag nichts näher, als auch dieses Framework für unsere interne Zeiterfassungssoftware einzusetzen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Und hat es geklappt?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;Wir hatten unser Budget auf 25 Tage fixiert. Innerhalb dieser Zeit war es möglich eine Applikation für uns zu erstellen, die genau auf unsere Prozesse abgestimmt funktioniert. Man muss hierbei jedoch immer wieder darauf hinweisen, dass dies nur mit einem Framework wie Grails möglich ist. Wir waren bei der Entwicklung 3-4 mal produktiver verglichen mit herkömmlichen Tools.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_k5YJcR83wtQ/TK8-otvxJFI/AAAAAAAAABA/SZ7qeqLHBiQ/s1600/stundenzettel.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://2.bp.blogspot.com/_k5YJcR83wtQ/TK8-otvxJFI/AAAAAAAAABA/SZ7qeqLHBiQ/s320/stundenzettel.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_k5YJcR83wtQ/TK8-poo-a1I/AAAAAAAAABE/iJmnQYjRU74/s1600/wochenansicht.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://3.bp.blogspot.com/_k5YJcR83wtQ/TK8-poo-a1I/AAAAAAAAABE/iJmnQYjRU74/s320/wochenansicht.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_k5YJcR83wtQ/TK8-qOlgpDI/AAAAAAAAABI/PbVD6AjbNkE/s1600/Aufgabenansicht.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://3.bp.blogspot.com/_k5YJcR83wtQ/TK8-qOlgpDI/AAAAAAAAABI/PbVD6AjbNkE/s320/Aufgabenansicht.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;War es für uns ökonomisch sinnvoll eine solche Applikation zu bauen?&lt;/b&gt;&lt;br /&gt;Die Berechnung der Amortisierung stellt sich in diesem Fall denkbar einfach dar. Wir hatten früher 1 Tag für die Erstellung der Stundenzettel, die die Grundlage für die Rechnungsstellung bilden, gebraucht. Nun passiert dies auf Knopfdruck. Dies bedeutet, dass sich die Applikation für uns in 25 Monaten amortisiert hat. Ich denke dies ist kein schlechter Wert, wenn man davon ausgeht, dass laut Lehrbuch sich eine Anschaffung erst nach 3 Jahren amortisieren muss.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit:&lt;/b&gt;&lt;br /&gt;Es ist durchaus möglich, Applikationen in kurzer Zeit bei kleinem Budget zu entwickeln. Dies könnte besonders für den Mittelstand von Interesse sein, der in diesem Fall eine Software erhält, die genau seinen Prozessen folgt. Dies spart natürlich auch Einarbeitungszeit, da man keine überflüssigen Funktionalitäten erlernen muss. Als nächstes steht bei uns die Anschaffung eines CRM Systems (z.B. SugarCRM) an. Falls wir kein geeignetes System am Markt finden, werden wir auch hier wieder unser eigenes auf unsere Anforderungen und Prozesse optimiertes System bauen.&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://www.grails.org/"&gt;Grails Framework&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Weitere Informationen:&lt;br /&gt;&lt;a href="http://www.exensio.de/media/Web-Appl-Grails-Flyer.pdf"&gt;exensio Grails Flyer&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.exensio.de/media/DOAG-News_Grails_Weblogic.pdf"&gt;Artikel in DOAG News 02/2010 zu WebLogic und Grails&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-6470069949093562236?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/6470069949093562236/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/10/erfahrungsbericht-ablosung-von-excel.html#comment-form' title='3 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6470069949093562236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/6470069949093562236'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/10/erfahrungsbericht-ablosung-von-excel.html' title='Erfahrungsbericht: Ablösung einer Excel-basierten Zeiterfassung durch eine Grails Web-Applikation'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_k5YJcR83wtQ/TK8-otvxJFI/AAAAAAAAABA/SZ7qeqLHBiQ/s72-c/stundenzettel.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-1470570096212215012</id><published>2010-10-07T21:46:00.005+02:00</published><updated>2010-10-08T08:48:47.578+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LocalConnection'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Kommunikation zwischen mehreren Flash-Objekten über LocalConnection</title><content type='html'>Flash und Flex sind mit der Programmiersprache Actionscript, welche auf dem ECMAScript-Standard basiert, weit mehr als nur ein Spielzeug um Videos oder blinkende Werbefilme abzuspielen. Durch die Unterstützung des objektorientierten Programmierparadigmas, guter Möglichkeiten der Serveranbindung und nicht zuletzt der Browser-Unabhängigkeit, die das Adobe Flash Plugin out of the Box bereitstellt, ist Flash ein Werkzeug, welches Beachtung verdient.&lt;br /&gt;&lt;br /&gt;In diesem Beitrag soll anhand der Kommunikation zwischen verschiedenen Flash-Dateien, die in einer Seite eingebunden sind, gezeigt werden, wie robuste "Inter-Flash"-Kommunikation mit der LocalConnection-Klasse [1] in Flash funktioniert.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Sender&lt;/span&gt;&lt;br /&gt;Zuerst wird eine Verbindung mit einem LocalConnection-Objekt aufgebaut. Im Anschluss können über einen frei wählbaren "Kanal" Daten gesendet werden. Das folgende Beispiel soll dies veranschaulichen:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;var conn:LocalConnection = new LocalConnection();&lt;br /&gt;conn.addEventListener(StatusEvent.STATUS, onStatusConn);&lt;br /&gt;conn.send("exensioConnectionChannel", "connectionHandler", "exensio GmbH", "Other payload");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Es wird also über den Kanal "exensioConnectionChannel" bei jedem Client die Methode "connectionHandler" aufgerufen, die zwei String-Parameter erwartet. In diesem Fall werden "exensio GmbH" und "Other payload" als Daten gesendet. Dabei ist die Anzahl der zu übermittelnden Parameter beliebig.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Empfänger&lt;/span&gt;&lt;br /&gt;Auf Empfänger-Seite muss ebenso eine Verbindung über ein LocalConnection-Objekt bestehen. Dabwei muss auf dem gleichen Kanal auf Nachrichten gewartet werden, über welchen auch der Sender Daten sendet. Im Beispiel sieht das wie folgt aus:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;var recConn:LocalConenction = new LocalConnection();&lt;br /&gt;recConn.connect("exensioConnectionChannel");&lt;br /&gt;recConn.client = new ReceiverHandler();&lt;br /&gt;recConn.addEventListener(StatusEvent.STATUS, onStatusRecConn);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Die Unterschiede zum Code des Senders bestehen hier also in der Angabe des Verbindungsaufbaus über "connect" und der Angabe eines "Clients". Diese Angabe gibt die Klasse an, in welcher die vom Sender bestimmte Methode enthalten ist. Ein Auszug aus unserer Klasse "RecieverHandler" sieht wie folgt aus:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public function connectionHandler(companyName:String, payload:String):void {&lt;br /&gt;    //...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Die Angabe eines EventListeners, der auf das Status-Event "Status" reagiert, ist optional. Es empfiehlt sich jedoch, einen solchen anzugeben und zu implementieren, da darin die Fehlerbehandlung vorgenommen werden kann.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Fazit&lt;/span&gt;&lt;br /&gt;Mit der LocalConnection-Klasse ist es in Flash und Flex auf einfache Weise möglich, Daten zwischen mehreren Flash-Dateien auszutauschen, ohne dabei den Umweg über einen weiterleitenden Server gehen zu müssen. Benötigen also mehrere Flash-Dateien auf einer Seite die gleichen Daten eines entfernten Servers, müssen diese nur einmal abgerufen werden um so etwa Serverressourcen zu sparen.&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://livedocs.adobe.com/flash/9.0_de/ActionScriptLangRefV3/flash/net/LocalConnection.html"&gt;http://livedocs.adobe.com/flash/9.0_de/ActionScriptLangRefV3/flash/net/LocalConnection.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-1470570096212215012?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/1470570096212215012/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/10/kommunikation-zwischen-mehreren-flash.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1470570096212215012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1470570096212215012'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/10/kommunikation-zwischen-mehreren-flash.html' title='Kommunikation zwischen mehreren Flash-Objekten über LocalConnection'/><author><name>Manuel Breitfeld</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-976576753523242358</id><published>2010-09-26T13:58:00.004+02:00</published><updated>2010-09-26T14:10:31.773+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Build Prozess'/><category scheme='http://www.blogger.com/atom/ns#' term='Automatisierter Build'/><title type='text'>Automatisiertes "Builden" einfach gemacht</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Einführung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Für die Produktivsetzung, Tests oder auch beim Einsatz von Continuous Integration [1] werden bei Java-Applikationen WAR-, EAR- bzw. JAR-Archive benötigt. In der Regel bieten Entwicklungsumgebungen entsprechende Funktionalitäten zur manuellen Erzeugung der Archive an. Diese Archive werden auf den Zielsystemen wie bspw. einem Applikation-Server eingespielt.&lt;br /&gt;&lt;br /&gt;Insbesondere bei größeren Software-Projekten sollte es aber auch die Bestrebung geben einen automatisierten Build-Prozess aufzusetzen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Umsetzung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In der Java-Welt stehen hierfür unter anderem Buildwerkzeuge wie ANT [2] oder Maven [3] zur Verfügung. Wenn es allerdings an komplexere Sachen wie EJB 2.1 Generierungen oder spezifische Erweiterungen für Produkte geht, ist die Erstellung dieser Skripte aufwändig. Im konkreten Projekt stand solch ein Fall im Bereich Weblogic Portal an. Oracle bietet für die Erstellung der Build-Skripte entsprechenden Support [4][5]. Doch die Vergangenheit hat gezeigt, dass die generierten Build-Dateien zumindest im Portal-Umfeld nicht funktionieren und mit einem relativ hohen Aufwand nachbearbeitet werden mussten.&lt;br /&gt;&lt;br /&gt;Mit der Entdeckung des Projektes headlesseclipse [6] lösten sich die Befürchtungen auf, einen hohen Aufwand für die Erstellung eines automatisierten Build-Prozesses investieren zu müssen. headlesseclipse ist ein Eclipse-Plugin, das per Kommandozeile den Build von Archiven analog zum manuellen Oberflächenmodus startet. Durch die Mitgabe von Parametern ist eine entsprechende Steuerung möglich. Die Installation ist denkbar einfach und es muss lediglich die heruntergeladene JAR-Datei im Eclipse-Plugin Verzeichnis platziert werden.&lt;br /&gt;&lt;br /&gt;Der Aufruf zur Erzeugung der in der Entwicklungs-Umgebung befindlichen EAR-Projekte sieht folgendermaßen aus:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;eclipse -nosplash -data d:\projects\TimesheetApp -application com.ind.eclipse.headlessworkspace.Application exportears&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ergebnis sind im konkreten Fall drei EAR-Archive für das Portal, das Backend sowie für den automatisierten Test. Zur Überraschung aller ließen sich die drei Archive fehlerfrei installieren und selbst die Meta-Informationen für die SVN-Versionsverwaltung wurden dank des Subclipse-Plugins bei der Erstellung exkludiert.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fazit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;headlesseclipse bietet eine erfreulich einfache Möglichkeit, um mit der Entwicklungsumgebung Eclipse sehr schnell und automatisiert Java-Archive erzeugen können. Schön wäre lediglich noch die Erweiterung um eine Log-Datei, die entsprechende Informationen über die Fortschritte bzw. Fehlerfälle protokolliert.&lt;br /&gt;&lt;br /&gt;Müssen im Build-Prozess noch individuelle Anpassungen vorgenommen werden, wie bspw. das Setzen von Properties in Abhängigkeit von der Zielumgebung, bieten natürlich Werkzeuge wie ANT und MAVEN einen entsprechenden Vorteil.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration"&gt;http://en.wikipedia.org/wiki/Continuous_integration&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://ant.apache.org/"&gt;http://ant.apache.org/&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://maven.apache.org/"&gt;http://maven.apache.org/&lt;/a&gt;&lt;br /&gt;[4] &lt;a href="http://download.oracle.com/docs/cd/E12840_01/wlw/docs103/guide/ideuserguide/build/conUseCustomAntBuild.html"&gt;http://download.oracle.com/docs/cd/E12840_01/wlw/docs103/guide/ideuserguide/build/conUseCustomAntBuild.html&lt;/a&gt;&lt;br /&gt;[5] &lt;a href="http://weblogic-wonders.com/weblogic/2010/02/12/how-to-auto-generate-build-xml-file/"&gt;http://weblogic-wonders.com/weblogic/2010/02/12/how-to-auto-generate-build-xml-file/&lt;/a&gt;&lt;br /&gt;[6] &lt;a href="http://code.google.com/p/headlesseclipse/"&gt;http://code.google.com/p/headlesseclipse/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-976576753523242358?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/976576753523242358/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/09/automatisiertes-builden-einfach-gemacht.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/976576753523242358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/976576753523242358'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/09/automatisiertes-builden-einfach-gemacht.html' title='Automatisiertes &quot;Builden&quot; einfach gemacht'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-7393684236460378194</id><published>2010-09-19T19:03:00.001+02:00</published><updated>2011-10-03T17:59:59.200+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Offshoring'/><title type='text'>Ist Offshoring von IT-Projekten nach Indien sinnvoll?</title><content type='html'>Mit großem Interesse habe ich die Artikel in der Computerwoche (beispielsweise Ausgabe Nr. 36 vom 06.09.2010) zum Thema Offshoring verfolgt. Meine Meinung hierzu ist, dass dieses Thema aufgrund des demographischen Wandels in den nächsten Jahren immer bedeutsamer werden wird, es sei denn die Softwarehersteller schaffen (endlich) intelligentere Systeme bzw. Frameworks, mit denen die Entwickler sich mehr um die Fachlichkeit kümmern können, als sich mit technischen Problemen herumschlagen zu müssen. Wir von exensio setzten hier beispielsweise gerne bei der Entwicklung von Web Applikationen das &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;-Framework ein, wenn wir auf JEE - sofern es keine zwingende Kundenanforderung hierfür gibt - verzichten können.&lt;br /&gt;&lt;br /&gt;Aber nun zurück. Das Offshoring-Thema wird gerne vom Einkauf verfolgt, da man sich eine dramatische Kostenreduzierung erhofft. Hierbei wird jedoch oft vergessen, dass für einen Projekterfolg mit einem Offshoring-Dienstleister einiges zu beachten ist. Da man jedoch davon ausgeht, dass alles vergleichbar mit einem deutschen Dienstleister abläuft, scheitern sehr viele Projekte dieser Art. Und wer will schon gerne über gescheiterte Projekte berichten.&lt;br /&gt;&lt;br /&gt;Folgende Punkte sind meines Erachtens zu beachten:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Erhöhter Kommunikations- und Spezifikationsaufwand&lt;br /&gt;Es wird meistens vergessen, dass bei Offshoring-Projekten ein erheblicher Mehraufwand für die Kommunikation und Spezifikation betrieben werden muss. Es wird leider nicht über den Tellerrand geschaut: Was in der Spezifikation steht, wird umgesetzt, auch wenn es keinen Sinn macht. Dies ist besonders kritisch bei der Entwicklung von Individual-Software, da jeder weiß, dass Papier sehr geduldig ist. Bei technischen Aufgabestellungen (beispielsweise Datenbank auf UTF-8 umstellen) ist ein Offshoring-Projekt viel leichter zu realisieren.  Auch gilt zu bedenken, dass es viel einfacher ist komplexe Zusammenhänge in der Muttersprache zu formulieren.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Team-Skalierbarkeit &lt;br /&gt;Dies wird immer gerne als positives Beispiel für einen Offshore-Dienstleiter genommen, da bei den heimischen Dienstleistern angeblich meistens Ressourcenknappheit herrscht. Scheint ein Projekt sich zu verzögern, so wird dann seitens des Offshore-Dienstleisters verkauft, dass dies kein Problem darstellt. Man könne ja das Team von anfänglich 15 Entwicklern schnell auf 50 oder auch 100 Mitarbeiter erweitern. Meiner  Erfahrung  nach ist die hieraus resultierende Software später leider nicht mehr vernünftig wartbar. Alles Weitere lässt sich bei Tom De Marco nachlesen.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Verschiedene Zeitzonen&lt;br /&gt;Dies ist meiner Erfahrung nach kein Problem. Ich konnte beispielsweise auch noch spät abends einen Entwickler in Indien erreichen.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ingenieurmäßiger Ansatz &lt;br /&gt;Dieser Punkt stellt für mich das größte Problem dar. Wir Deutschen sind für unsere Präzision bekannt.  Bei der Softwarequalität müssen auf jeden Fall Abstriche in Kauf genommen werden. Leider führt dies auch zu langfristig höheren Wartungskosten. Im schlimmsten Fall wird das gesamte Projekt langfristig viel teurer, als wenn es in Deutschland entwickelt worden wäre.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Hierarchische Arbeitsstrukturen im Vergleich zu eigenverantwortlichem Arbeiten&lt;br /&gt;Es gibt ganz eindeutig kulturelle Unterschiede. Ich werde nie folgende Szene vergessen, als ich selbst in Indien vor Ort war:  Ein Entwickler musste den Projektleiter fragen, ob er sich ein Fachbuch aus dem verschlossenen Regal (Schlüssel hatte der Projektleiter) nehmen darf.  Hieraus resultiert wieder, wie eingangs bereits erwähnt, ein höherer Spezifikationsaufwand.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Kostenersparnis&lt;br /&gt;Das erste Angebot ist natürlich viel billiger als das eines deutschen Mittbewerbers. Leider wird dann jedoch meistens für die spätere Wartung des Systems vergleichbare Preise verlangt. Entscheidet sich der Kunde, das System wieder in eigener Regie warten zu wollen, so muss er meistens feststellen, dass die Software nicht sauber entwickelt wurde und durch ihn nicht wartbar ist.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Projekt-/Architekturcontrolling&lt;br /&gt;Für einen Projekterfolg ist es sehr wichtig das Projekt aus Projekt- sowie Architektursicht genau zu steuern. Hierbei ist es wichtig früh genug Mängel in der Umsetzung der Spezifikation aufzudecken. Eigentlich wäre hier ein agiler Ansatz richtig. In 2-wöchigen Sprints wäre schnell ersichtlich, wo es hapert. Hierzu gibt es jedoch unterschiedliche Auffassungen, viele meinen, dass das Wasserfall  Modell hier besser passen würde, da die meisten Offshore-Dienstleister erst noch Erfahrungen mit Scrum und XP sammeln müssen.  Hierbei kann auch ein Dienstleister wie die exensio GmbH unterstützen.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Fazit&lt;br /&gt;Bei einem Offshoring-Projekt sind viele Aspekte zu beachten. Bedingt durch den demographischen Wandel, wird dies in den nächsten Jahren für viele Firmen eine interessante Option darstellen, die eigene IT-Abteilung zu entlasten. Diese Projekte müssen jedoch noch genauer geplant werden, um erfolgreich abgeschlossen werden zu können. Offshoring sollte somit eher als langfristige Unternehmensstrategie angesehen werden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-7393684236460378194?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/7393684236460378194/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/09/ist-offshoring-von-it-projekten-nach.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7393684236460378194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7393684236460378194'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/09/ist-offshoring-von-it-projekten-nach.html' title='Ist Offshoring von IT-Projekten nach Indien sinnvoll?'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-7356048373542338419</id><published>2010-09-18T19:03:00.008+02:00</published><updated>2010-09-18T19:52:29.313+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Einsatz von Spring mit EJB 3.0</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Einführung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Spring ist eines der am weitesten verbreiteten Java-Frameworks und wird insbesondere bei vielen Java-Projekten im Enterprise-Bereich verwendet.&lt;br /&gt;Obwohl das Framework mittlerweile ein sehr breites Spektrum an Funktionalitäten abdeckt, ist der IoC Container (Inversion of Control) nach wie vor die am meisten eingesetzte Kern-Funktionalität von Spring.&lt;br /&gt;&lt;br /&gt;Auch exensio nutzt die IoC-Funktionalitäten zur Erreichung einer losen Koppelung und insbesondere um Backend-Implementierungen über&lt;br /&gt;Konfigurationen austauschbar zu machen.&lt;br /&gt;&lt;br /&gt;Bei Web-Applikationen wird hierbei die Konfigurationsdatei für Spring in den meisten Fällen mit Hilfe eines Listener-Eintrags in der Datei &lt;span style="font-family:courier new;"&gt;web.xml&lt;/span&gt; geladen.&lt;br /&gt;Doch wie lädt man eigentlich Spring-Konfigurationen in EJB-Projekten?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Spring und EJB 3.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Zunächst ein einfaches Szenario: In einem EJB-Projekt existieren mehrere Session-Beans, die unter anderem auch Methoden eines Such-Service und eines CMS-Service aufrufen. Die Services sind zu Beginn eines Projektes noch nicht verfügbar und deshalb werden zunächst Mockup-Implementierungen eingesetzt. Um zu einem späteren Zeitpunkt einfach zwischen den Mockup und den richtigen Implementierungen switchen zu können erfolgt die Konfiguration über Spring.&lt;br /&gt;&lt;br /&gt;Die nachfolgende Datei (&lt;span style="font-family:courier new;"&gt;serviceProviderContext.xml&lt;/span&gt;) zeigt die Konfiguration der Spring-Beans.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;beans xmlns="http://www.springframework.org/schema/beans"&gt;&lt;br /&gt; &lt;br /&gt;  &lt;bean id="searchService" class="com.exensio.service.search.SearchService"&gt;&lt;br /&gt;    &lt;property name="servers" value="ex_fast:15100,ex_fast2:15100"&gt;&lt;/property&gt; &lt;br /&gt;  &lt;/bean&gt;&lt;br /&gt;&lt;br /&gt;  &lt;bean id="contentService" class="com.exensio.service.content.CMSService"&gt;&lt;br /&gt;  &lt;/bean&gt;&lt;br /&gt;&lt;br /&gt;&lt;/beans&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Relativ einfach funktioniert das Laden einer Spring-Konfiguration natürlich "von Hand", wie nachfolgend dargestellt:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public UserSearchService() {&lt;br /&gt; ClassPathXmlApplicationContext beanFactory = new ClassPathXmlApplicationContext("serviceProviderContext.xml");&lt;br /&gt; searchService = (SearchService)beanFactory.getBean("searchService");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Dass dies nicht besonders schön ist liegt auf der Hand. Werden der Such- und der CMS-Service von mehreren Session-Beans verwendet, dann muss des Weiteren in jeder Session-Bean der Ladevorgang und die Zuweisung erfolgen.&lt;br /&gt;&lt;br /&gt;Deshalb stellt sich die Frage, ob dies auch eleganter funktioniert?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wiring mit Interzeptoren&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mit EJB 3.0 wurden Interzeptoren eingeführt, mit deren Hilfe Spring-Konfiguration geladen werden können. Spring stellt hierfür den &lt;span style="font-family:courier new;"&gt;SpringBeanAutowiringInterceptor&lt;/span&gt; zur Verfügung, der bei Bedarf auch erweitert werden kann. Der Spring-Interzeptor muss hierfür der EJB 3.0 Annotation &lt;span style="font-family:courier new;"&gt;@Interceptors&lt;/span&gt; zugewiesen werden. Das Binding des Interzeptors kann alternativ neben der Annotation @Interceptors auch über den EJB Deployment Descriptor (&lt;span style="font-family:courier new;"&gt;ejb-jar.xml&lt;/span&gt;) vorgenommen werden.&lt;br /&gt;&lt;br /&gt;Nachfolgend wird das Binding an den Interzeptor an einer Session-Bean illustriert, die über &lt;span style="font-family:courier new;"&gt;@Autowiring&lt;/span&gt; auch den Such-Service injiziert bekommt.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;@Stateless(mappedName = "UserSearchService")&lt;br /&gt;@Interceptors(SpringBeanAutowiringInterceptor.class)&lt;br /&gt;public class UserSearchService implements UserSearchServiceLocal {&lt;br /&gt;&lt;br /&gt; @Autowired&lt;br /&gt; private SearchService searchService;&lt;br /&gt;&lt;br /&gt; public List&lt;string&gt; getSortFields() {&lt;br /&gt;  return searchService.getSortFields();&lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Der SpringBeanAutowiringInterceptor erwartet standardmäßig eine Datei mit dem Namen beanRefContext.xml im Klassenpfad. Diese nachfolgend dargestellte Datei verweist wiederum auf die eigentliche Konfigurationsdatei aus der die zu injizierdenden Service-Klassen entnommen werden.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;beans xmlns="http://www.springframework.org/schema/beans"&gt;&lt;br /&gt;  &lt;bean id="ejb-context" class="org.springframework.context.support.ClassPathXmlApplicationContext"&gt;  &lt;br /&gt;    &lt;constructor-arg value="serviceProviderContext.xml" type="java.lang.String"/&gt;   &lt;br /&gt;  &lt;/bean&gt;&lt;br /&gt;&lt;/beans&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fazit&lt;/span&gt;&lt;br /&gt;In EJB 3.0 können relativ einfach und elegant Spring-Konfiguration geladen und injiziert werden. Der Eintrag sollte dies veranschaulichen, da hierfür nur wenige Beispiele zu finden sind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-7356048373542338419?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/7356048373542338419/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/09/einsatz-von-spring-mit-ejb-30.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7356048373542338419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7356048373542338419'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/09/einsatz-von-spring-mit-ejb-30.html' title='Einsatz von Spring mit EJB 3.0'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-2866890804688057470</id><published>2010-08-21T19:30:00.006+02:00</published><updated>2010-08-22T19:52:20.549+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Open-Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Was nutzt das Grails-Framework dem Business?</title><content type='html'>In meinem DOAG-Artikel [1] mit dem Thema „Weblogic und Grails“ habe ich diese Thematik vor allem technisch beleuchtet. Natürlich hat das Grails-Framework[2] auch Vorteile für das Business, dies möchte ich kurz in diesem Blog-Eintrag festhalten.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was macht Software-Projekte so teuer? Oder lohnt sich Software-Entwicklung in Deutschland noch?&lt;/b&gt;&lt;br /&gt;Kostentreiber bei Softwareprojekten sind auf der einen Seite nicht klar definierte Anforderungen seitens des Auftraggebers an die Software-Lösung. Auf der anderen Seite sind es technisch verliebte Dienstleister, die gerne komplexe eigene Frameworks beim Kunden einführen wollen. Ein großer Teil des Projektbudgets wird hierbei durch technische Extravaganzen vergeudet (siehe hierzu auch die Glosse von meinem Kollegen [3]). Den Auftraggeber hingegen interessiert eigentlich  nur die Umsetzung der fachlichen Anforderungen. Von den großen Dienstleistern wird deshalb, zur Kostenminimierung, Out-Sourcing in Länder mit niedrigeren Lohnkosten als Königsweg favorisiert. Jeder, der beispielsweise schon einmal ein Projekt mit einem indischen Dienstleister durchgeführt hat, weiß, dass diese Projekte (bei der Retrospektive am Projektende) doch nicht so billig sind, wie anfangs angenommen. Ein großes Problem ist hierbei immer die Kommunikation und die unterschiedlichen Kulturen. Des Weiteren wird meistens vergessen, dass die Spezifikationen detailgenauer (im Vergleich zu einem deutschen Dienstleister) sein müssen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was könnte nun ein Framework, wie Grails verbessern?&lt;/b&gt;&lt;br /&gt;Wir haben die Erfahrung gemacht, dass wir uns beim Einsatz von Grails wieder vor allem auf die fachlichen Anforderungen konzentrieren können. So konnten wir auch feststellen, dass die Sprache Groovy (im Vergleich zu Java) den Entwickler um einiges produktiver macht. Dies bedeutet im Endeffekt, dass wir in der Lage sind, Projekte in kürzerer Zeit zu realisieren. Hieraus resultieren niedrigere Projektkosten für den Auftraggeber.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;Zuletzt möchte ich dennoch anmerken, dass  Grails nicht zwingend für jede Problemstellung Anwendung finden kann.  Eine Stärke von Grails ist zweifelsfrei der Ansatz „Convention over Configuration“. Hierbei konnten wir jedoch feststellen, dass dies wiederum hinderlich sein kann, wenn man alle Freiheitsgrade bei der Entwicklung, beispielsweise für das UI eines sehr komplexen transaktionsbasierten Dialogs, benötigt. &lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://www.exensio.de/media/DOAG-News_Grails_Weblogic.pdf"&gt;WebLogic und Grails DOAG News 02/2010&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://www.grails.org/"&gt;Grails Framework&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://exensio.blogspot.com/2010/08/glosse-spezialisierung-ist-doof-wir.html"&gt;Glosse: Spezialisierung ist unnötig – wir können auch alles.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-2866890804688057470?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/2866890804688057470/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/08/was-nutzt-das-grails-framework-dem.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/2866890804688057470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/2866890804688057470'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/08/was-nutzt-das-grails-framework-dem.html' title='Was nutzt das Grails-Framework dem Business?'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-7295965515179489750</id><published>2010-08-18T09:56:00.004+02:00</published><updated>2010-08-18T13:42:56.114+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glosse'/><title type='text'>Glosse: Spezialisierung ist unnötig – wir können auch alles.</title><content type='html'>&lt;p class="MsoNormal"&gt;Ein klassischer IT Dienstleister kann alles – grundsätzlich. Egal welche Technologie oder Methodik der Kunde nachfragt und sei es noch so exotisch, jeder kann alles. Bei den ganz Großen der Branche könnte man sogar annehmen, dass das tatsächlich stimmt. Irgendwo auf der Welt gibt es sicher einen Mitarbeiter, der sich mit diesem oder jenem beschäftigt hat. Warum also erst nach einem Spezialisten suchen, die großen Anbieter können ja sowieso alles.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Fragt sich nur, ob dieser Mitarbeiter noch in dem Unternehmen ist, und wenn ja, ob er für das anstehende Projekt zur Verfügung steht? Sicherlich mag er mit dem Produkt / der Technologie gearbeitet haben. Doch wie lange ist das her, welche Produktversion war das? Auch wenn das Produkt noch den gleichen Namen hat, aber hat es sich nicht im Laufe der Zeit völlig verändert, andere Funktionen, andere Basistechnologie, anderes Grundkonzept?&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Die großen Anbieter der Offshore / Nearshore Szene machen da keine Ausnahme. Auch da wird grundsätzlich genickt, wenn die Frage&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;nach spezifischen Know how kommt. Und wenn das Produkt etwas scheinbar nicht kann, wird einfach etwas dran- oder dazugebaut – das geht alles, kein Problem.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Das ist ein generelles Muster der großen Dienstleister. So ein Produkt hat ja schon so seine Defizite, und ganz schlimm, diese Hersteller-Abhängigkeit. Immer ein gerne genommenes Argument, um möglichst viel selber neu zu bauen, was eigentlich schon an Funktionalität vorhanden ist. Und dann noch ein paar abstrakte Schichten und Layer dazugebaut, mit einem eigenen Framework veredelt. Dann kann man nachher ganz leicht das Produkt mit einem anderen austauschen. Leider ist man dann anstatt vom Hersteller nun vom Dienstleister abhängig. Aber es ist ja immer alles gut dokumentiert, und auf Standards aufgebaut, da ist die Einarbeitung durch einen anderen Dienstleister kein Problem.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Wie, das stimmt alles nicht? Nun ja, sicher ist das alles etwas überzeichnet, aber im Grundsatz läuft das Geschäft genau so ab – das erleben wir als kleiner, spezialisierte Dienstleister immer wieder. Da kommt man oft in die Situation, dass man basierend auf dem vorhandenen Spezialwissen ein extrem gutes Angebot macht. Große Anbieter machen natürlich große Angebote – da müssen ja erheblich mehr Leute ausgelastet werden – und der Kunde reibt sich die Augen. Aber wenn die Großen so große Angebote machen, da hat der Kleine das doch sicher nicht richtig verstanden. Schade…&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Warum also das Risiko eingehen, auf einen Kleinen zu setzen? Wenn es beim Großen schiefgeht, lässt sich das ja intern viel besser verkaufen nach dem Motto „Also wenn die das nicht mal geschafft haben…“. Warum der Kleine das eventuell besser macht? Er ist spezialisiert, kennt sich exakt mit dem Produkt / der Technologie aus, über lange Zeit. Er muss nicht eine große Anzahl an Mitarbeitern auslasten und neu einarbeiten, für ihn sind auch kleine Projekte attraktiv. Er will seine Mitarbeiter nicht unbedingt lange in einem Unternehmen mit Wartungsarbeiten binden, um diese frei zu haben für neue Projekte.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Warum wir das hier schreiben? Nein, wir sind nicht frustriert und wir haben auch jede Menge zu tun. Es gibt zum Glück immer noch Kunden, die auch die Zusammenarbeit mit einem kleinen Dienstleister wagen, schätzen und damit erfolgreich sind. Aber es fällt uns immer wieder auf, dass gerade im IT Bereich jeder der Tollste, Größte und Beste ist und insbesondere einfach alles kann.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Aber das ist auf der anderen Seite auch gut, denn das differenziert uns von den anderen. Wir sind da bescheidener. Wir können nicht alles. Wir können wenige Dinge, die aber sehr gut. Wir machen uns tatsächlich viele Gedanken, wie wir das Beste für den Kunden liefern können und Lösungen schaffen, die nachhaltig sind und wirklichen Nutzen stiften. Aber das können die anderen ja alle auch :-) .&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Wingdings;mso-ascii-font-family: Calibri;mso-ascii-theme-font:minor-latin;mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin;mso-char-type:symbol;mso-symbol-font-family:Wingdings;"&gt;&lt;span style="mso-char-type:symbol;mso-symbol-font-family:Wingdings;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-7295965515179489750?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/7295965515179489750/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/08/glosse-spezialisierung-ist-doof-wir.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7295965515179489750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7295965515179489750'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/08/glosse-spezialisierung-ist-doof-wir.html' title='Glosse: Spezialisierung ist unnötig – wir können auch alles.'/><author><name>Irving Tschepke</name><uri>http://www.blogger.com/profile/03918738619345383870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-5340282856912007542</id><published>2010-07-30T09:01:00.014+02:00</published><updated>2010-07-30T11:43:21.181+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic Server'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache Wink'/><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic Portal'/><title type='text'>RESTful Web Service mit Apache Wink in WebLogic Portal</title><content type='html'>Mittlerweile sind für Java einige REST-Frameworks vorhanden zu den bekanntesten zählen sicherlich Jersey [1], Restlet [2], REST in Spring 3 [3] und Apache Wink [4]. All jene Frameworks implementieren die Java API für RESTful Web Services, kurz JAX-RS, welche unter anderem durch Annotation eine einfache Handhabung von Parametern, Pfaden und HTTP-Methoden ermöglicht.&lt;br /&gt;&lt;br /&gt;Bei der Entwicklung für WebLogic Portal 10.3.2 ergibt sich das Problem, dass die verwendete Spring-Version REST noch nicht unterstützt. Auch die Frameworks Jersey und Restlet können aufgrund von Inkompatibilitäten mit WebLogic eigenen Bibliotheken nicht ohne weiteres in einem Portal-War eingebunden werden.&lt;br /&gt;&lt;br /&gt;Apache Wink stellt als leichtgewichtiges (und darüber hinaus sehr performantes Framework [5]) eine ideale Möglichkeit dar, um innerhalb eines WebLogic Portals REST Web Services zu implementieren. Durch die einfache Integration in Spring kann auch innerhalb des eigens implementierten RESTful Wen Service auf die Vorzüge von Autowiring und ähnlichem zurückgegriffen werden.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Konfiguration&lt;/b&gt;&lt;br /&gt;Die nötigen Konfigurationen befinden sich in der web.xml, in welcher der Spring-Context und das Servlet definiert werden.&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;listener&gt;&lt;br /&gt;    &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;&lt;br /&gt;&lt;/listener&gt;&lt;br /&gt;&lt;context-param&gt;&lt;br /&gt;    &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;&lt;br /&gt;    &lt;param-value&gt;classpath:META-INF/server/wink-core-context.xml&lt;br /&gt;    /WEB-INF/application-context.xml&lt;/param-value&gt;&lt;br /&gt;&lt;/context-param&gt;&lt;br /&gt;&lt;servlet&gt;&lt;br /&gt;    &lt;servlet-name&gt;restServlet&lt;/servlet-name&gt;&lt;br /&gt;    &lt;servlet-class&gt;org.apache.wink.server.internal.servlet.RestServlet&lt;/servlet-class&gt;&lt;br /&gt;&lt;/servlet&gt;&lt;br /&gt;&lt;servlet-mapping&gt;&lt;br /&gt;    &lt;servlet-name&gt;restServlet&lt;/servlet-name&gt;&lt;br /&gt;    &lt;url-pattern&gt;/restapi/*&lt;/url-pattern&gt;&lt;br /&gt;&lt;/servlet-mapping&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In der Spring-Konfiguration (hier: application-context.xml) muss nur noch die Bean, die die Implementierung des REST Services darstellt, angegeben werden.&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;bean id="resource.exensioRestService" class="servlet.rest.ExensioRestService"&gt;&lt;/bean&gt;&lt;br /&gt;&lt;br /&gt;&lt;bean class="org.apache.wink.spring.Registrar"&gt;&lt;br /&gt;    &lt;property name="classes"&gt;&lt;br /&gt;        &lt;set value-type="java.lang.Class"&gt;&lt;/set&gt;&lt;br /&gt;    &lt;/property&gt;&lt;br /&gt;    &lt;property name="instances"&gt;&lt;br /&gt;        &lt;set&gt;&lt;br /&gt;            &lt;ref local="resource.exensioRestService" /&gt;&lt;br /&gt;        &lt;/set&gt;&lt;br /&gt;    &lt;/property&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Die Service-Klasse könnte wie folgt aussehen:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;@Path("exensioService")&lt;br /&gt;@Component&lt;br /&gt;public class ExensioRestService {&lt;br /&gt;    @Autowired&lt;br /&gt;    private exensioTestServiceBusiness exensioTestService;&lt;br /&gt; &lt;br /&gt;    @GET&lt;br /&gt;    @Produces("text/plain")&lt;br /&gt;    public String getStartingInfo() {&lt;br /&gt;        return "This is an example output if no parameter and no extra path are given. "&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @GET&lt;br /&gt;    @Produces("text/plain")&lt;br /&gt;    @Path("/name/{id}")&lt;br /&gt;    public String getName(@PathParam("id") Long id) {&lt;br /&gt;     return exensioTestService.getNameForId(id);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Die Aufrufe dieses Services lauten:&lt;br /&gt;http://host:port/exensioWar/restapi/exensioService/&lt;br /&gt;http://host:port/exensioWar/restapi/exensioService/name/12&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;Apache Wink ist ein einfach zu verwendendes REST-Framework mit JAX-RS und Spring-Unterstützung, welches sich problemlos in Projekten mit WebLogic Server und WebLogic Portal integrieren lässt.&lt;br /&gt;&lt;br /&gt;Referenzen:&lt;br /&gt;[1] &lt;a href="https://jersey.dev.java.net/"&gt;https://jersey.dev.java.net/&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://www.restlet.org/"&gt;http://www.restlet.org/&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/"&gt;http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/&lt;/a&gt;&lt;br /&gt;[4] &lt;a href="http://incubator.apache.org/wink/"&gt;http://incubator.apache.org/wink/&lt;/a&gt;&lt;br /&gt;[5] &lt;a href="http://www.ibm.com/developerworks/web/library/wa-apachewink3/"&gt;http://www.ibm.com/developerworks/web/library/wa-apachewink3/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-5340282856912007542?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/5340282856912007542/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/07/restful-web-service-mit-apache-wink-in.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5340282856912007542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5340282856912007542'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/07/restful-web-service-mit-apache-wink-in.html' title='RESTful Web Service mit Apache Wink in WebLogic Portal'/><author><name>Manuel Breitfeld</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-8564327704597565701</id><published>2010-07-30T07:33:00.003+02:00</published><updated>2010-07-30T07:45:27.785+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EclipseLink'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>Query Caching in JPA 1.0 mit  EclipseLink</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Überblick Caching&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Caching kann ein wichtiger Mechanismus zur Steigerung der Performance einer Software-Applikation sein. Abhängig von der Applikationsart bietet sich Caching insbesondere an, um die Anzahl der Datenbankzugriffe einer Applikation zu reduzieren.&lt;br /&gt;&lt;br /&gt;Mit JPA 2.0 (Java Persistence API) wurden einige Möglichkeiten für das Caching standardisiert. Allerdings findet in der Praxis in den meisten Fällen noch die Version 1.0 Verwendung, da die gängigen Applikation-Server die neue JPA-Version oftmals nur in Preview-Releases anbieten.&lt;br /&gt;Aufrund der nur rudimentären Unterstützung von JPA 1.0 für Caching, haben einige JPA-Implementierungen eigene Erweiterungen eingeführt, die über den Standard hinausgehen.&lt;br /&gt;&lt;br /&gt;Dies gilt auch für die weit verbreitete Open Source Implementierung EclipseLink [1], die auch wir in einem Projekt einsetzen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Beispiel für Cache Konfiguration&lt;/span&gt;&lt;br /&gt;Die Cache-Definitionen können in EclipseLink in den Dateien &lt;span style="font-family:courier new;"&gt;persistence.xml&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;eclipselink-orm.xml&lt;/span&gt; sowie an den Entities erfolgen.&lt;br /&gt;Da sich Caching nicht für alle Datenbankobjekte anbietet, ist es in der Regel sinnvoll Caches auf Ebene der einzelnen Entities zu definieren.&lt;br /&gt;&lt;br /&gt;In unserem Projekt kommt Caching für einige Konfigurations-Tabellen zum Einsatz auf die lesend zugegriffen wird und die bei Änderungen direkt in der Datenbank manipuliert werden.&lt;br /&gt;&lt;br /&gt;Nachfolgend ist die Beispiel-Konfiguration einer Entität aufgeführt:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;@Cache(&lt;br /&gt;type=CacheType.SOFT, // Cacheinhalte werden freigegeben, wenn Speicher ausgeht&lt;br /&gt;size=200,            // Maximal 200 Objekte&lt;br /&gt;expiry=600000,       // Gültigkeit von 10 Minuten&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;In der Datei &lt;span style="font-family:courier new;"&gt;persistence.xml&lt;/span&gt; wurden die entsprechenden Einstellungen laut Dokumentation vorgenommen. Die Tests zeigten zunächst, dass der Cache einwandfrei funktionierte und auch korrekt nach der abgelaufenen Zeitspanne invalidiert wurde.&lt;br /&gt;Allerdings stellte sich bei weiteren Tests heraus, dass nicht nur die einzelnen gewünschten Entitäten gecached wurden, sondern alle Entitäten in der Applikation.&lt;br /&gt;&lt;br /&gt;Nach einigigen Versuchen und weiteren Tests führte der nachfolgend aufgeführte Auszug der Datei &lt;span style="font-family:courier new;"&gt;persistence.xml&lt;/span&gt; zum Erfolg. Insbesondere musste die Default-Größe für Caches auf 0 gesetzt werden. Außerdem war das Deaktivieren des sogenannten Parent Session Cache für alle Entitäten, die nicht gecacht werden sollen, nötig.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;property name="eclipselink.cache.size.default" value="0"&amp;gt;&lt;br /&gt;&amp;lt;property name="eclipselink.cache.shared.default.Person" value="false"&amp;gt;&lt;br /&gt;&amp;lt;property name="eclipselink.cache.shared.default.Property" value="true"&amp;gt;&lt;br /&gt;&amp;lt;property name="eclipselink.cache.shared.default.Tasks" value="true"&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fazit&lt;/span&gt;&lt;br /&gt;Nach einigen Konfigurationsschwierigkeiten funktioniert das Caching mit EclipseLink einwandfrei. Um böse Überraschungen zu vermeiden, empfiehlt es sich wie in unserem Fall das Caching durchgehend zu Testen.&lt;br /&gt;&lt;br /&gt;Referenzen:&lt;br /&gt;[1] &lt;a href="http://www.eclipse.org/eclipselink/"&gt;EclipseLink&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-8564327704597565701?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/8564327704597565701/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/07/query-caching-in-jpa-10-mit-eclipselink.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8564327704597565701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8564327704597565701'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/07/query-caching-in-jpa-10-mit-eclipselink.html' title='Query Caching in JPA 1.0 mit  EclipseLink'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-2430480700655372828</id><published>2010-07-18T17:53:00.003+02:00</published><updated>2010-07-19T09:16:49.365+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Liferay'/><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic Portal'/><category scheme='http://www.blogger.com/atom/ns#' term='SAP EP'/><title type='text'>SAP EP Integration in das WebLogic Portal mittels WSRP</title><content type='html'>In einem aktuellen Projekt sollten SAP HR (Self-Service) IViews - aus dem SAP Enterprise Portal (SAP EP) -  mittels „Web Services for Remote Portlets“ (WSRP) [1] in das Oracle WebLogic Portal (WLP) eingebunden werden. Dieser Erfahrungsbericht beschreibt die aufgetretenen Probleme und warum schließlich nur eine Integration mittels IFrame möglich war. Des Weiteren wurde das Open-Source Portal Liferay eingesetzt, da der Oracle Support bei jedem Problem behauptete, dass SAP nicht standardkonform sei.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Probleme beim Oracle WebLogic Portal&lt;/b&gt;&lt;ol&gt;&lt;li&gt;Schemadefinitionen innerhalb von wsrp_v1_types.xsd wollte das WLP von w3.org nachladen. In unserem Fall war ein Internetzugriff nur über einen Proxy-Server mittels NTLM-Authentifizierung möglich. Wir konnten dieses Problem mit einem Workaround (lokaler Web-Server mit modifizierter Hosts-Datei) zum Testen umgehen. Das Liferay-Portal zeigte diesen Fehler nicht. &lt;/li&gt;&lt;li&gt;Das SAP Portal fordert beim WSRP Aufruf der Methode getServiceDescription User-Credentials – diese können in der WLP Admin Konsole nicht gesetzt werden, die Möglichkeit dies über die IDE zu machen war buggy. Beim Liferay-Portal war es ohne Probleme möglich, diese Werte in der Admin Konsole zu setzen. Hier die seitens SAP EP angeforderten User-Credentials:&lt;ul&gt;&lt;li&gt;persistancy_mode_password&lt;/li&gt;&lt;li&gt;producer_allocated_username&lt;/li&gt;&lt;li&gt;producer_allocated_password&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Um die Komplexität der WSRP Kommunikation zu verringern, wollten wir SAML abstellen, dies war nicht möglich. Weder die Tipps des Oracle Forums noch die des Oracle Supports haben hier geholfen. Das Liferay-Portal funktioniert out-of-the-box ohne SAML.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;Probleme beim SAP Portal&lt;/b&gt;&lt;br /&gt;Mit Hilfe des Liferay-Portals konnten wir dann das SAP EP testen. Hierbei wurde dann jedoch schnell sichtbar, dass das SAP EP nicht standardkonform ist.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Das SAP EP benutzt massiv IFrames innerhalb von IViews, um z.B. Informationen aus SAP HR darzustellen. Diese IViews waren in unserem Fall als Business Server Pages (BSP) implementiert. Das SAP Portal hat die IFrame Url  (im an den Consumer zurückgelieferten Markup) gegen die des Liferay-Portals ausgetauscht. Dies ist bei normalen Urls valide, da diese wieder auf das Consumer-Portal zeigen müssen. Bei einem IFrame ist dies jedoch falsch.&lt;/li&gt;&lt;li&gt;Der nächste Versuch mit einer einfachen Url IView scheiterte daran, dass das SAP EP einen neuen Tag &lt;redirectionurl&gt; in den an den Consumer zurückgelieferten Markup hinzugefügt hat. Dieses hat jedoch laut [2] dort nichts zu suchen.&lt;/redirectionurl&gt;&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;Die Integration mittels WSRP scheiterte. Bleibt man in der SAP oder Oracle Welt funktioniert alles reibungslos, jedoch wurde WSRP gerade wegen der Interoperabilität entwickelt. Der Support beider Hersteller beschuldigte den anderen, nicht standardkonform zu sein. Vielleicht funktioniert beim SAP EP der Weg über reine Java Portlets (und keine BSPs) besser, wie er vom SAP Support empfohlen wurde. Leider basieren alle unsere zu integrierenden IViews auf BSPs. Wir hätten alles neu schreiben müssen, deshalb war dies keine Lösung innerhalb unseres Projekts. Da die meisten IViews auf BSP basieren ist dies wahrscheinlich auch keine Option bei anderen Projekten. Letztlich blieb nur die Möglichkeit einer Integration per IFrames. Dies war nach ein paar Änderungen am SAP EP möglich, da dies selbst massiv  IFrames benutzt.&lt;br /&gt;&lt;br /&gt;Referenzen:&lt;br /&gt;[1]&amp;nbsp;&lt;a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsrp"&gt;WSRP&lt;/a&gt;&lt;br /&gt;[2]&amp;nbsp;&lt;a href="http://www.oasis-open.org/committees/wsrp/specifications/version1/wsrp_v1_types.xsd"&gt;wsrp_v1_types.xsd&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-2430480700655372828?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/2430480700655372828/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/07/sap-ep-integration-in-das-weblogic.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/2430480700655372828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/2430480700655372828'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/07/sap-ep-integration-in-das-weblogic.html' title='SAP EP Integration in das WebLogic Portal mittels WSRP'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-7821541832272464021</id><published>2010-07-04T17:06:00.000+02:00</published><updated>2010-07-04T17:06:56.245+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><category scheme='http://www.blogger.com/atom/ns#' term='Informationsportal'/><title type='text'>Die Evolution von Portal-Lösungen</title><content type='html'>In diesem Blog-Eintrag  möchte ich die Entwicklung von Portal-Lösungen aufzeigen. Laut den Analysten der Gartner-Group sieht die chronologische Entwicklung von Portal-Lösungen folgendermaßen aus:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HTML-Seiten – &lt;/b&gt;die erste Form von Portalen bestand aus HTML-Seiten, die manuell gepflegt wurden. Zu diesem Zeitpunkt gab es noch keine Content Management Systeme (CMS). Dies stellte noch kein Problem dar, da die anfänglichen Portale nur spärlich Content enthielten.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Content-Portale – &lt;/b&gt;mit dem exponentiellen Anstieg von Informationen (Content), die in einem Portal anzeigt werden sollten, stieg der Bedarf nach professionellen Lösungen zum Verwalten von großen Mengen an Content. Als Anbieter sind hier beispielsweise folgende zu nennen: OpenText, Day, RedDot&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Applikations-Portale – &lt;/b&gt;als nächster Entwicklungsschritt erschienen Applikations-Portale. Diese aggregieren Informationen aus verschiedenen Applikationen. Der Benutzer erhält  eine Sicht auf alle für ihn relevanten Informationen. Hier wird oft der Vergleich mit einem Flugzeug-Cockpit benutzt. Heute ist es auch mit Content-Portalen möglich Applikationen zu integrieren, jedoch unterstützen diese meist nur lesende Zugriffe in Portlets. Portlets zeigen hier beispielsweise das Wetter an. Mit Framework-Portalen (Oracle WebLogic Portal, IBM WebSphere Portal oder Liferay Portal) oder Applikations-Portalen (SAP Enterprise Portal, Mircosoft Sharepoint Server, Siebel Portal (nun Oracle), Cognos Portal (nun IBM), SAS Information Delivery Portal) können hier im Gegensatz komplexe Transaktionen mit Backend-Systemen realisiert werden.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Prozess-Portale – &lt;/b&gt;dies ist die Königsklasse von Portal-Lösungen. Sie können reinen Content und Applikationen enthalten. Des Weiteren bilden sie auch Unternehmensprozesse ab, beispielsweise einen Einkaufsprozess. Neben der Portal-Lösung wird hier auch eine Integrationskomponente (beispielsweise Enterprise Service Bus - ESB)  benötigt, um die Geschäftsprozesse abbilden zu können. War es eine Zeit lang etwas ruhig um Prozess-Portale geworden, so  ziehen sie heute -  bedingt durch die Hype um serviceorientierte Architekturen (SOA) – wieder vermehrt Aufmerksamkeit auf sich.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-7821541832272464021?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/7821541832272464021/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/07/die-evolution-von-portal-losungen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7821541832272464021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/7821541832272464021'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/07/die-evolution-von-portal-losungen.html' title='Die Evolution von Portal-Lösungen'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-317286529278353219</id><published>2010-06-02T15:34:00.026+02:00</published><updated>2010-06-04T22:51:06.628+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><title type='text'>HTML5 Überblick</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Was ist HTML5?&lt;/span&gt;&lt;br /&gt;HTML5 bringt uns eine neue Generation von Webseiten. Für Web-Entwickler ist die Umstellung vergleichbar wie etwa der Umstieg von HTML-Tabellen zu DIV-Tags.&lt;br /&gt;&lt;br /&gt;Die Gruppe WHATWG (Web Hypertext Application Technology Working Group) arbeitet seit 2004 an der Entwicklung dieser Sprache. WHATWG entstand aus Mitarbeitern von Apple, the Mozilla Foundation und Opera Software. Obwohl die Entwicklung an HTML5 erst 2022 abgeschlossen sein soll wird und kann es heute schon verwendet werden.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wo wird HTML5 bereits heute verwendet?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Youtube und Facebook bieten heute schon die meisten Videos alternativ zu Flash auch per HTML5 an. Sie gehen auf die Bedürfnisse von iPads und iPhones ein, die aus Sicherheits- und Performancegründen ganz auf Flash verzichten.&lt;br /&gt;Ein Beispiel für die Performance von HTML5-Videos gibt es unter &lt;a href="http://www.craftymind.com/2010/04/20/blowing-up-html5-video-and-mapping-it-into-3d-space/"&gt;http://www.craftymind.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Des Weiteren wird HTML5 gerne für Portfolio-Webseiten von Web-Entwicklern verwendet um Ihre Arbeiten darzustellen wie z. B. bei &lt;a href="http://www.time2project.com/what.php"&gt;time2project&lt;/a&gt;.&lt;br /&gt;Für weitere Beispiele zu den verschiedenen Funktionen und Möglichkeiten sind die folgenden Seiten zu empfehlen:&lt;br /&gt;&lt;br /&gt;&lt;a title="HTML 5 Gallery" href="http://html5gallery.com/" target="_blank"&gt;HTML 5 Showcase&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a title="HTML 5 forms demo" href="http://brucelawson.co.uk/tests/html5-forms-demo.html" target="_blank"&gt;HTML 5 forms Demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a title="Drag and drop functionality" href="http://molly.com/html5/html5-0709.html" target="_blank"&gt;Drag and drop Funktionalität&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a title="HTML 5 Geolocation Demo" href="http://merged.ca/iphone/html5-geolocation" target="_blank"&gt;HTML 5 Geolocation Demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a title="HTML 5 Canvas Particle" href="http://www.ferretarmy.com/files/canvas/canvasParticle/canvasParticle2.html" target="_blank"&gt;HTML 5 Canvas Particle&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bei der Frage der Browserabhängingen Unterstützung von HTML5 geht es momentan nicht darum welcher Browser HTML5 unterstützt, sondern welcher Browser welches Element unterstützt. Hierzu gibt es auf &lt;a href="http://html5readiness.com/"&gt;http://html5readiness.com/&lt;/a&gt; eine Grafik, die den Fortschritt und die Entwicklung der einzelnen Browser darstellt. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Der Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dieses Beispiel zeigt wie einfach die Einbindung eines Videos mit HTML5 funktioniert. &lt;br /&gt;&lt;br /&gt;HTML 4.01&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;   &lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/                 shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="840" height="100"&gt;&lt;br /&gt;&lt;br /&gt;   &lt;param name="movie" value="images/1.swf"&gt;&lt;br /&gt;&lt;br /&gt;   &lt;param name="quality" value="high"&gt;&lt;br /&gt;&lt;br /&gt;   &lt;embed src="videos/banner.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/                 download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="840" height="100"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   &lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;HTML5&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;&lt;video&gt;&lt;br /&gt;&lt;source src="videos/video1.mp4"&gt;&lt;br /&gt;&lt;/video&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nachfolgend sind die nicht mehr verfügbaren sowie die neu hinzugekommenen HTML-Elementen aufgeführt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Liste von HTML Tags die es nicht mehr geben wird:&lt;/span&gt;&lt;br /&gt;&lt;div style="height: 300px; overflow-x: hidden; overflow-y: scroll; margin: 15px 3px; padding: 10px; border-width: 1px medium 1px 1px; border-style: solid none solid solid; border-color: rgb(204, 204, 204) -moz-use-text-color rgb(204, 204, 204) rgb(204, 204, 204);"&gt;&lt;br /&gt;&lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;acronym&amp;gt; Tag  &lt;/p&gt;                &lt;span&gt;Der &amp;lt;acronym&amp;gt; Tag wurde verwendet, um Abkürzungen in  HTML 4 zu definieren. Ein Akronym wird wie ein Wort ausgesprochen, z. B. NATO,  NASA, ASAP, GUI waren. &lt;/span&gt;&lt;br /&gt;        &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;applet&amp;gt; Tag &lt;/p&gt;                  &lt;span&gt;Der &amp;lt;applet&amp;gt; Tag wurde verwendet, um ein eingebettetes  Applet zu definieren. Sie können nun &amp;lt;OBJECT&amp;gt; stattdessen verwenden.&lt;/span&gt;&lt;br /&gt;        &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;basefont&amp;gt; Tag &lt;/p&gt;                  &lt;span&gt;Der &amp;lt;basefont&amp;gt; Tag wurde verwendet, um eine  Standard-Schriftart, Schriftfarbe oder Schriftgröße für den gesamten Text in  einem Dokument zu definieren. Dies wird nun per CSS gesteuert.&lt;/span&gt;&lt;br /&gt;        &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;big&amp;gt; Tag &lt;/p&gt;                  &lt;span&gt;Der &amp;lt;big&amp;gt; Tag wurde verwendet, um Text zu vergrößern. &lt;/span&gt;&lt;br /&gt;        &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;center&amp;gt; Tag &lt;/p&gt;                  &lt;span&gt;Die &amp;lt;center&amp;gt; Tag wurde zur mittigen Ausrichtung von  Text und Inhalt verwendet. Wird nun auch im CSS definiert.&lt;/span&gt;&lt;br /&gt;        &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;dir&amp;gt; Tag &lt;/p&gt;                  &lt;span&gt;Die &amp;lt;dir&amp;gt; Tag wurde verwendet, um eine  Verzeichnis-Liste zu definieren. Ist aber mit &amp;lt;ol&amp;gt; und &amp;lt;ul&amp;gt; Tags  genauso möglich. &lt;/span&gt;&lt;br /&gt;        &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;font&amp;gt; Tag &lt;/p&gt;                  &lt;span&gt;Der &amp;lt;font&amp;gt; Tag wurde verwendet, um Schriftart,  Schriftgröße und die Schriftfarbe des Textes zu definieren. Er gehörte zu den  am häufigsten verwendeten Tags in HTML 4. Wird in Zukunft auch nur noch über  das CSS gesteuert.&lt;/span&gt;&lt;br /&gt;        &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;frame&amp;gt;, &amp;lt;frameset&amp;gt; und &amp;lt;noframes&amp;gt; Tags&lt;/p&gt;                  &lt;span&gt;Da in HTML5 keine Framesets mehr unterstützt, wird es diese  Tags nicht mehr geben. Mit dem Ziel, die Benutzerfreundlichkeit zu verbessern.  Framesets erschweren zugleich die Suchmaschinenoptimierung (SEO) .&lt;/span&gt;&lt;br /&gt;        &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;s&amp;gt; und &amp;lt;strike&amp;gt; &lt;/p&gt;                  &lt;span&gt;Der &amp;lt;s&amp;gt; und &amp;lt;strike&amp;gt; Tag wurde verwendet, um  durchgestrichenen Text darzustellen. Dies kann mittels &amp;lt;del&amp;gt; oder über  das CSS genauso erfolgen.&lt;/span&gt;&lt;br /&gt;       &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;tt&amp;gt; Tag&lt;/p&gt;                  &lt;span&gt;Das TT-Element bewirkte, dass der Text als Teletype oder  monospaced Text dargestellt wurde.&lt;/span&gt;&lt;br /&gt;        &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;u&amp;gt; Tag &lt;/p&gt;                  &lt;span&gt;Der &amp;lt;u&amp;gt; Tag wurde verwendet, um Text zu  unterstrichenen. Wird nun ebenfalls über das CSS ermöglicht.&lt;/span&gt;&lt;br /&gt;        &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;xmp&amp;gt; Tag&lt;/p&gt;          &lt;span&gt;&amp;lt;xmp&amp;gt; war einmal als logische Auszeichnung für  Quellcode-Beispiele gedacht.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Diese Liste zeigt die neuen HTML5 Tags.&lt;/span&gt;&lt;br /&gt;&lt;div style="height: 300px; overflow-x: hidden; overflow-y: scroll; margin: 15px 3px; padding: 10px; border-width: 1px medium 1px 1px; border-style: solid none solid solid; border-color: rgb(204, 204, 204) -moz-use-text-color rgb(204, 204, 204) rgb(204, 204, 204);"&gt;&lt;br /&gt;&lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;article&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der Tag definiert externen Inhalt. Die externen Inhalte  könnten von einem News-Artikel, Weblog (Blog), Forum oder jeglicher anderen  externen Quelle herstammen. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;aside&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Dieser Tag definiert Inhalt welcher neben solchen platziert  wird. Es wäre ein geeigneter Container um z. B. die Navigation neben den Content  Bereich einzufügen.&lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;audio&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der Tag definiert Klang wie Musik oder andere Audio-Streams. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;canvas&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;canvas&amp;gt; Tag wird verwendet, um Grafiken  anzuzeigen. Er ist nur ein Container für Grafiken. um Grafiken zu malen muss  Javascript verwendet werden.&lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;command&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;command&amp;gt; Tag definiert eine Befehlsschaltfläche,  wie einen Radiobutton, ein Kontrollkästchen oder einen Submit-Button. Der  Befehl muss in ein Menü-Element sein. Wenn er dies nicht ist, wird er nicht  angezeigt. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;datalist&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;datalist&amp;gt; Tag definiert eine Liste von Optionen  welcher in Verwendung mit dem input-Element den Value definiert. Das DataList  Element und seine Optionen werden nicht angezeigt. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;details&amp;gt; Tag&lt;br /&gt;  &lt;span&gt;Der &amp;lt;details&amp;gt; Tag dient dazu, Informationen über ein  Dokument oder Teile eines Dokuments zu beschreiben. &lt;/span&gt;&lt;br /&gt;  &lt;/p&gt;&lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;embed&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;embed&amp;gt; Tag definiert eingebetteten Inhalt wie z.  B. ein Plug-in.&lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;figcaption&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;figcaption&amp;gt; Tag enthält eine Information für das  "Figur"-Element. Das "figcaption" Element sollte als das  erste oder das letzte Kind der "Figur"-Element platziert werden. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;figure&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der Tagdient zum gruppieren von Elemente. Der Inhalt  innerhalb eines Figurenelements ist Stand-alone-Inhalt. Üblicherweise wird es  verwendet, um Teile eines Dokuments zu erklären. Kann allerdings auch außerhalb  des zu erklärenden Dokuments platziert werden.&lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;footer&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;footer&amp;gt; Tag definiert den Footer eines Abschnitts  oder eines Dokuments. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;header&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;header&amp;gt; Tag definiert eine Einführung in das  Dokument. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;hgroup&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;hgroup&amp;gt; Tag definiert die Überschrift eines  Abschnitts oder eines Dokuments. Das hgroup Element gruppiert Überschriften wie  z. B. &amp;lt;h1&amp;gt; &amp;lt;h6&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;keygen&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;keygen&amp;gt; Tag definiert einen generierten  Schlüssel. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;mark&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;mark&amp;gt; Tag definiert markierten Text. Verwenden  Sie den &amp;lt;mark&amp;gt; Tag um Teile Ihres Textes hervorzuheben. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;meter&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;meter&amp;gt; Tag definiert eine Messung. Wird nur für  Messungen mit einem bekannten minimalen und maximalen Wert benutzt. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;nav&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;nav&amp;gt; Tag definiert einen Bereich der Navigation. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;output&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;output&amp;gt; Tag definiert verschiedene Typen von  Ausgaben wie z. B. die Ausgabe von einem Skript &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;progress&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Die &amp;lt;progress&amp;gt; Tag definiert work-in-progress.  Verwenden Sie das Fortschritt Element, um den Fortschritt einer aufwendigen  JavaScript-Funktion anzuzeigen. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;rp&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;rp&amp;gt; Tag ist in Ruby Annotationen benutzt, um  festzulegen, was Browser, die keine Unterstützung des Ruby-Elementes haben  darstellen sollen. Ein Ruby Annotation sind chinesischen Schriften oder  Buchstaben, welche in Ostasien verwendet werden um die Aussprache der  ostasiatische Zeichen zu verdeutlichen. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;rt&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;rt&amp;gt; Tag definiert eine Erklärung oder die  Aussprache der Zeichen (Chinesische Schrift oder Zeichen). Gebraucht in  Ostasien, um die Aussprache der ostasiatischen Zeichen zu zeigen. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;ruby&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;ruby&amp;gt; Tag definiert eine Ruby Annotation (Chinese  Schrift oder Zeichen). Gebraucht in Ostasien, um die Aussprache der  ostasiatische Zeichen zu zeigen. Benutze ihn zusammen mit dem &amp;lt;rt&amp;gt; und /  oder die &amp;lt;rp&amp;gt; tags. Das Ruby-Element besteht aus einem oder mehreren  Zeichen (welche Information zu Bedeutung / Aussprache benötigt), und ein  rt-Element, dass diese Informationen darstellt.Gegebenenfalls noch ein  rp-Element um Browsern, die keine Unterstützung des "Ruby" Tags  besitzen Alternatives anzuzeigen.&lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;section&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;section&amp;gt; Tag definiert Abschnitte in einem  Dokument. Wie z. B. chapters, headers, footers oder jedes weiteren Abschnitts  des Dokumentes. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;source&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;source&amp;gt; Tag definiert Medien Quellen wie z. B.  &amp;lt;video&amp;gt; und &amp;lt;audio&amp;gt;. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;summary&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;summary&amp;gt; Tag ist einen Header für das "Details"-Element.  Es wird verwendet um weitere Informationen über ein Dokument oder Teile eines  Dokuments zu beschreiben. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;time&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;time&amp;gt; Tag definiert eine Zeit oder ein Datum,  oder beides. &lt;/span&gt;&lt;br /&gt;  &lt;p style="font-size: 14px; font-weight: bold; color: rgb(153, 153, 153); line-height: 1.5em; margin: 5px 0pt 0pt;"&gt;&amp;lt;video&amp;gt; Tag &lt;/p&gt;            &lt;span&gt;Der &amp;lt;video&amp;gt; Tag definiert Video, wie z. B. einen  Movieclip oder andere Video-Streams.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Fazit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Die Entwicklung und Durchsetzung von HTML5 wird sicherlich dadurch bedingt wie sich die Entwickler-Community diese Themas annimmt und wie die Benutzer es verwenden. Stärker ist es allerdings davon abhängig wie die marktführenden Firmen wie Microsoft, Google und Apple mit Ihren unterschiedlichen Plattformen darauf reagieren. Die Tendenz geht eindeutig in eine positive  Richtung. Es gibt mittlerweile auch schon Skripte, die das Ausführen von HTML5 im IE6-IE8 ermöglichen.&lt;br /&gt;Was den vielerorts diskutierte Vergleich von Flash und HTML5 anbelangt, so finde ich diesen unnötig. Flash hat sich in den letzten Jahren zusätzlich mit dem Flashdeveloper in die Entwicklung von  Desktopapplikationen entwickelt und HTML5 kann mit seinen SVG-Zeichenfunktionen noch lange nicht an komplexe Flashanimationen ersetzen. Beide Technologien werden sich Ihre Gebiete abstecken und nach Plattform und Funktionalität eingesetzt werden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-317286529278353219?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/317286529278353219/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/06/html5-uberblick.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/317286529278353219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/317286529278353219'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/06/html5-uberblick.html' title='HTML5 Überblick'/><author><name>Milan Jovanovic</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-1920693663928734577</id><published>2010-05-11T07:51:00.006+02:00</published><updated>2010-05-11T08:04:25.007+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic Server'/><title type='text'>Zurücksetzen des Administrator-Passworts für den WebLogic Server</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;&lt;br /&gt;Jeder ist wahrscheinlich schon einmal in die Situation geraten das Passwort für einen Account oder eine Applikation vergessen zu haben. Genau dieser Fall ist bei einem unserer Kunden aufgetreten. Niemand konnte sich mehr an das Administrator-Passwort für den WebLogic Server erinnern und auch das Ausprobieren der vermuteten Passwörter führte nicht zum Ziel. Was kann man hier tun?&lt;br /&gt;Alle Anwesenden waren sich einig, dass es aus Sicherheitsgründen keine Möglichkeiten für das Zurücksetzen des Passwortes gibt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lösung&lt;/span&gt;&lt;br /&gt;Da schon einige Zeit in das Anlegen und Anpassen der Domaine  investiert wurde, wollte man sich aber auch nicht kampflos geschlagen geben. Nach etwas Recherche stellte sich heraus, dass es tatsächlich eine einfache Möglichkeit zum Zurücksetzen des Passwortes im Weblogic Server gibt. Hierfür sind folgende Schritte notwendig:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sicherung der Datei &lt;span style="font-family:courier new;"&gt;DefaultAuthenticatorInit.ldift&lt;/span&gt; im Verzeichnis &lt;span style="font-family:courier new;"&gt;security&lt;/span&gt; der Domaine.&lt;/li&gt;&lt;li&gt;Öffnen einer Konsole und setzen der Umgebungs-Variablen für den Weblogic-Server durch Ausführen der Datei &lt;span style="font-family:courier new;"&gt;setDomainEnv.sh&lt;/span&gt; bzw. &lt;span style="font-family:courier new;"&gt;setDomainEnv.cmd.&lt;/span&gt; &lt;/li&gt;&lt;li&gt;Danach den folgenden abgebildeten Befehl in der Konsole ausführen:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;a onblur="try  {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZJp1Ux93_aQ/S-jxqvoHiyI/AAAAAAAAAII/8aLn5nLrotc/s1600/reset.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 66px;" src="http://4.bp.blogspot.com/_ZJp1Ux93_aQ/S-jxqvoHiyI/AAAAAAAAAII/8aLn5nLrotc/s320/reset.jpg" alt="" id="BLOGGER_PHOTO_ID_5469887464083000098" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Zu guter Letzt muss noch das Verzeichnis data unterhalb des Admin-Servers umbenannt werden. Es wird beim Serverstart wieder neu erstellt.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Das anschließende Hochfahren des Servers funktioniert problemlos. Der Reset erfolgte mit der WebLogic Server Version 11gR1. Ob dieser Trick auch für ältere Server-Versionen funktioniert ist auszuprobieren.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fazit&lt;/span&gt;&lt;br /&gt;Es existiert eine einfache Möglichkeit zum Zurücksetzen des Administrator Passworts für den WebLogic Server. Im Falle unseres Kunden ersparte dies einiges an Arbeit. Trotzdem darf die Frage gestellt werden, ob solch eine Möglichkeit auch sinnvoll ist?&lt;br /&gt;Hat beispielsweise jemand böse Absichten und kommt durch eine Sicherheitslücke auf den physikalischen Server, dann ist es für diejenige Person unter Umständen auch relativ einfach den dort installierten WebLogic Server unter seine Kontrolle zu bekommen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-1920693663928734577?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/1920693663928734577/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/05/zurucksetzen-des-administrator.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1920693663928734577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1920693663928734577'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/05/zurucksetzen-des-administrator.html' title='Zurücksetzen des Administrator-Passworts für den WebLogic Server'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZJp1Ux93_aQ/S-jxqvoHiyI/AAAAAAAAAII/8aLn5nLrotc/s72-c/reset.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-8085399762376229213</id><published>2010-05-09T19:22:00.006+02:00</published><updated>2010-05-10T09:41:41.272+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><title type='text'>Klassifikation von Portal-Lösungen</title><content type='html'>Portal-Lösungen gibt es wie Sand am Meer. Jeder Hersteller hat mindestens eine Portal-Lösung im Portfolio  und jede Web Applikation, die über ein Login verfügt, wird umgangssprachlich als Portal bezeichnet.  Aber was ist eigentlich der Unterschied zwischen einem SAP Portal und Spiegel-Online?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Die Portal-Historie&lt;/b&gt;&lt;br /&gt;Das Portal, wie wir es heute kennen, wurde ursprünglich von Yahoo entwickelt. Bedingt durch den immensen Anstieg von Informationen auf den Yahoo-Seiten, sah man sich gezwungen neue Wege zu beschreiten. Hierbei entstand eine der wichtigsten Portalfunktionalitäten, die Personalisierung. Mussten früher Yahoo-Nutzer beispielsweise ihre Wetter-Seite mühsam suchen, so konnte der Benutzer später Präferenzen setzen. Der erste Schritt, der stetig steigenden Informationsüberflutung Herr zu werden. Portale werden oft auch mit einem Flugzeug-Cockpit verglichen. So erhält ein Mitarbeiter alle wichtigen Informationen auf einen Blick und muss sich nicht erst in verschiedene Applikationen einloggen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Klassifikation&lt;/b&gt;&lt;br /&gt;Hilfreich ist hier eine Klassifikation des Portal-Markts, wie sie beispielsweise von der Gartner Group erstellt wurde. Die Gartner Group unterscheidet Portal-Lösungen folgendermaßen:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Framework-Portale, z.B. Oracle WebLogic Portal, IBM WebSphere Portal oder Liferay Portal&lt;/li&gt;&lt;li&gt;Applikations-Portale, z.B. SAP Enterprise Portal, Mircosoft Sharepoint Server, Siebel Portal (nun Oracle), Cognos Portal (nun IBM), SAS Information Delivery Portal, ….&lt;/li&gt;&lt;li&gt;Content-Portale, z.B. OpenText, Day, RedDot&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Die meisten Angebote finden sich im Bereich der Applikations-Portale, sprich jeder Hersteller bezeichnet sein User-Interface als Portal – dies macht den Markt so unübersichtlich. Wofür eigenen sich nun die Portal-Lösungen am besten?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Framework-Portale&lt;/b&gt;&lt;br /&gt;Diese verfügen über eine eigene Entwicklungsumgebung und bieten die meisten Freiheitsgrade für die Entwicklung an. Sie eignen sich besonders gut, um einen heterogenen Zoo von Backend-Systemen in ein Portal einzubinden. Nachteil ist hier, dass man alles selber entwickeln muss – was jedoch meistens durch eine sehr gute Entwicklungsumgebung stark vereinfacht wird.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Applikations-Portale&lt;/b&gt;&lt;br /&gt;Diese können besonders einfach die Applikationen desselben Herstellers integrieren. Leider ist es nicht so einfach, eine heterogene Landschaft zu integrieren. Diese dienen meist als User-Interface zu den verschiedenen Applikationen. Wird innerhalb eines Unternehmens beispielsweise nur SAP eingesetzt, so kann hier schon das SAP Enterprise Portal ausreichen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Content-Portale&lt;/b&gt;&lt;br /&gt;Diese eignen sich besonders gut, um Content redaktionell verarbeiten zu können. Die Integration von Applikationen bzw. Prozessen über verschiedene Backend-Systeme ist mit Content-Portalen jedoch nicht so einfach. Aus diesem Grund wird hier meistens eine Integrationsschicht vor das Portal gehängt, die im eigentlichen Sinn die Funktionalitäten eines Framework-Portals abdeckt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit&lt;/b&gt;&lt;br /&gt;Ich hoffe, dass mit Hilfe dieser Klassifizierung von Gartner das Einordnen der unterschiedlichen Lösungen etwas einfacher fällt. Eine pauschale Aussage, wofür man welches Portal nehmen soll, kann jedoch nicht getroffen werden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-8085399762376229213?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/8085399762376229213/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/05/klassifikation-von-portal-losungen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8085399762376229213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/8085399762376229213'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/05/klassifikation-von-portal-losungen.html' title='Klassifikation von Portal-Lösungen'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-3671642043771782791</id><published>2010-05-01T16:41:00.012+02:00</published><updated>2010-05-01T18:44:06.629+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Propagation'/><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic Portal'/><title type='text'>Übernehmen von Konfigurationen im WebLogic Portal durch Propagierung</title><content type='html'>Das Oracle WebLogic Portal bietet zahlreiche  Konfigurationsmöglichkeiten über die Administrationskonsole. Neben der  Erstellung des Streaming-Portals werden dort unter anderem auch  Portlet-Eigenschaften, der Seitenaufbau des Portals oder auch  Berechtigungen definiert. Des Weiteren wird das integrierte CMS-System  hierüber administriert.&lt;br /&gt;&lt;br /&gt;Bei Software-Projekten werden in der  Regel mehrere Umgebungen für die Durchführung benötigt (z.B.  Produktions-, Wartungs- und Test-Umgebung). Da es sehr aufwändig und  auch fehleranfällig ist die ganzen Konfigurationen des Portals in jeder  Umgebung von Neuem zu erstellen, stellt sich die Frage wie Einstellungen  und CMS-Inhalte von Umgebung zu Umgebung übertragen werden können.&lt;br /&gt;&lt;br /&gt;Die  Lösung hierfür ist die Verwendung der in der Entwicklungsumgebung  (Workshop bzw. OEPE) mitgelieferten Propagierungs-Werkzeuge. Die  Funktionsweise der Propagierung ist ausführlich auf den Seiten zur  Portal-Dokumentation beschrieben [1]. Neben der kompletten Übernahme von  Konfigurationen bei Neuanlagen sind auch Merges möglich. Die folgende  Grafik zeigt einen Ausschnitt einer Merge-Session.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZJp1Ux93_aQ/S9w-zL3tTBI/AAAAAAAAAHM/HHuY_rLRanc/s1600/merge.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 177px;" src="http://4.bp.blogspot.com/_ZJp1Ux93_aQ/S9w-zL3tTBI/AAAAAAAAAHM/HHuY_rLRanc/s320/merge.png" alt="" id="BLOGGER_PHOTO_ID_5466313096801635346" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-size:100%;"&gt;Beispiel einer Merge-Session&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Leider kann es vorkommen, dass in der Zielumgebung nicht alles aktualisiert wird, obwohl die Einträge in der Merge-Session, wie in obiger Grafik zu sehen, entsprechend für ein „Update“ markiert wurden. Da auch das mehrfache Durchführen der Propagierung nicht hilft bleibt nur der Griff in die Datenbank des Portals übrig.&lt;br /&gt;&lt;br /&gt;Konkret ist dieses Problem bei unseren Projekten schon mehrfach beim Versuch der Aktualisierung des Benutzer-Profils (UUP) aufgetreten. In der entsprechenden XML-Datei für das Benutzerprofil können Attribute, wie bspw. Abteilung definiert werden. Wenn jetzt zwischen zwei Releases ein neues Attribut hinzukommt tritt genau der Fall der notwendigen Aktualisierung auf. Mit etwas Kenntnis im Portalschema findet man heraus, dass in der Tabelle DATA_SYNC_ITEM die komplette XML-Datei als BLOB-Wert abgespeichert wird. Durch Austausch des BLOB-Wertes mit der neuen XML-Datei ist das aktualisierte Benutzer-Profil auch auf der Zielumgebung zur Verfügung.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZJp1Ux93_aQ/S9xCK9L-cAI/AAAAAAAAAHk/11x66SKuZ8w/s1600/diff.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 200px; height: 161px;" src="http://4.bp.blogspot.com/_ZJp1Ux93_aQ/S9xCK9L-cAI/AAAAAAAAAHk/11x66SKuZ8w/s200/diff.png" alt="" id="BLOGGER_PHOTO_ID_5466316803711856642" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-size:100%;"&gt;  Differenz einer UUP-Datei zwischen Quell- und Zielsystem, die nicht übernommen wird&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Referenzen:&lt;br /&gt;[1] &lt;a href="http://download.oracle.com/docs/cd/E13155_01/wlp/docs103/prodOps/propTool.html"&gt;http://download.oracle.com/docs/cd/E13155_01/wlp/docs103/prodOps/propTool.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-3671642043771782791?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/3671642043771782791/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/05/ubernehmen-von-konfigurationen-im.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/3671642043771782791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/3671642043771782791'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/05/ubernehmen-von-konfigurationen-im.html' title='Übernehmen von Konfigurationen im WebLogic Portal durch Propagierung'/><author><name>Tobias Kraft</name><uri>http://www.blogger.com/profile/07647205088544667726</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZJp1Ux93_aQ/S9w-zL3tTBI/AAAAAAAAAHM/HHuY_rLRanc/s72-c/merge.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-5359839447733318782</id><published>2010-04-26T10:36:00.028+02:00</published><updated>2010-05-04T14:17:56.103+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open-Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Compass Search'/><category scheme='http://www.blogger.com/atom/ns#' term='Lucene'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Volltextsuche mit der Open-Source-Lösung Compass Search im Cluster</title><content type='html'>&lt;p&gt;Wer sich mit Suchmaschinen für eigene Projekte  beschäftigt, stößt zweifellos früher oder später auf &lt;a href="http://lucene.apache.org/"&gt;Apache Lucene&lt;/a&gt;. Lucene ist eine  Suchmaschinen-Bibliothek, die mit einer beeindruckenden  Funktionsvielfalt ausgestattet ist. Sie ist in Java geschrieben,  mittlerweile aber auch für viele andere Programmiersprachen verfügbar.&lt;/p&gt;&lt;p&gt;In diesem Eintrag geht es um die Einbindung einer  Suche in ein WebLogic Portal Projekt, welches in einem Cluster auf  WebLogic Servern läuft. Als Datenbank-Persistenzschicht wird Hibernate  eingesetzt. Die Suche soll dabei Entitäten und deren Relationen erfassen  und Funktionen wie unter anderem unscharfe Suche und boolesche  Operatoren unterstützen und dabei einen gutes Ranking der Ergebnisse  liefern.&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:100%;"&gt;Durchsuchen und Indizieren von Entitäten mit Relationen&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In diesem Beispiel geht es um eine Applikation,  mit der Projekte verwaltet werden können. Im vereinfachten Beispiel soll  davon ausgegangen werden, dass es lediglich die Entität Project mit  einigen Attributen sowie die Entität User mit einigen Attributen gibt.  Dabei besteht zwischen Project und User folgende Relation: Ein Projekt  ist immer einem User zugeordnet, ein User kann jedoch auch mehreren  Projekten zugeordnet sein.&lt;/p&gt;&lt;p&gt;Bei der Suche soll  dabei der Titel des Projekts, die Beschreibung des Projekts und der Vor-  und Zuname des zugeordneten Autors (Entität User) durchsucht werden  können.&lt;/p&gt;&lt;p&gt;Die folgende Abbildung zeigt die  Entitäten und die vorherrschende Beziehung:&lt;/p&gt;&lt;p&gt;&lt;a aiotitle="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WwggNELS9-I/S9VGChQi1WI/AAAAAAAAAAM/bkcYH0ozqIM/s1600/projectUser_Relation.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 162px;" src="http://4.bp.blogspot.com/_WwggNELS9-I/S9VGChQi1WI/AAAAAAAAAAM/bkcYH0ozqIM/s320/projectUser_Relation.png" alt="" id="BLOGGER_PHOTO_ID_5464350731985409378" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:100%;"&gt;Das  Framework Compass&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.compass-project.org/"&gt;Compass Search&lt;/a&gt; ist ein  Framework, welches auf Lucene setzt und eine einfache (Java) API für  Suche und Indizierung anbietet. Darüber hinaus lässt sich mit Compass  Search die Suche direkt mit Hibernate und entsprechenden Annotationen in  ein Projekt einbinden. Mit Compass Search besteht außerdem die  Möglichkeit, den Suchindex über JDBC in einer relationalen Datenbank  abzuspeichern. Letzteres ist mit &lt;a href="http://www.hibernate.org/subprojects/search.html"&gt;Hibernate Search&lt;/a&gt;,  einem Projekt, das einen ähnlichen Ansatz wie Compass Search verfolgt,  nicht möglich, was den Einsatz bei Applikationen, die in einem Cluster  laufen, ausschließt.&lt;/p&gt;&lt;p&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p&gt;Damit Compass Search verwendet werden kann, muss es in  das Projekt eingebunden werden. In erster Linie geht es dabei um das  Hinzufügen der entsprechenden Jar-Dateien in den Classpath. Der Download  mit Installationsanleitung findet sich auf der &lt;a href="http://www.compass-project.org/"&gt;offiziellen Webseite von Compass  Search&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Für unser Beispiel sieht die  Konfiguration in der &lt;span style="font-style: italic;"&gt;compass.cfg.xml&lt;/span&gt;,  die im Classpath der Applikation liegt, wie folgt aus:&lt;/p&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;compass-core-config xmlns="http://www.compass-project.org/schema/core-config"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://www.compass-project.org/schema/core-config&lt;br /&gt;http://www.compass-project.org/schema/compass-core-config-2.2.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;compass name="default"&amp;gt;&lt;br /&gt;&amp;lt;connection&amp;gt;&lt;br /&gt;&amp;lt;jdbc dialect="org.apache.lucene.store.jdbc.dialect.OracleDialect" managed="true"&amp;gt;&lt;br /&gt;&amp;lt;dataSourceProvider&amp;gt;&lt;br /&gt;&amp;lt;jndi lookup="exensioExampleJndiDataSource" /&amp;gt;&lt;br /&gt;&amp;lt;/dataSourceProvider&amp;gt;&lt;br /&gt;&amp;lt;/jdbc&amp;gt;&lt;br /&gt;&amp;lt;/connection&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;transaction factory="org.compass.core.transaction.JTASyncTransactionFactory" commitBeforeCompletion="true" lockPollInterval="200" lockTimeout="30"&amp;gt;&lt;br /&gt;&amp;lt;/transaction&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;searchEngine&amp;gt;&lt;br /&gt;&amp;lt;optimizer schedule="false" /&amp;gt;&lt;br /&gt;&amp;lt;/searchEngine&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;mappings&amp;gt;&lt;br /&gt;&amp;lt;class name="com.exensio.examples.persistence.entity.Project" /&amp;gt;&lt;br /&gt;&amp;lt;class name="com.exensio.examples.persistence.entity.User" /&amp;gt;&lt;br /&gt;&amp;lt;/mappings&amp;gt;&lt;br /&gt;&amp;lt;/compass&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/compass-core-config&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Im ersten Abschnitt wird die Verbindung zur  Datenbank definiert. In diesem Beispiel greifen wir auf eine im WebLogic  Server definierte JNDI Datenquelle zurück. An dieser Stelle könnten  auch direkt JDBC-Daten mit Benutzer und Passwort angegeben werden, was  jedoch aus Performance-Gründen nicht zu empfehlen ist.&lt;/p&gt;&lt;p&gt;Eine weitere interessante Konfiguration ist das  Mapping am Ende, bei welchem die Entitäten angegeben werden müssen, die  Compass-Annotationen enthalten und bei der Suche betrachtet werden  sollen.&lt;/p&gt;&lt;p&gt;Die Annotationen in den Java-Dateien  sehen wie folgt aus und sind selbstklärend. Eine Übersicht über die  vorhandenen Annotationen findet sich in der Dokumentation unter &lt;a href="http://www.compass-project.org/docs/2.2.0/reference/html/core-osem.html"&gt;Kapitel  6 "OSEM - Object/Search Engine Mapping"&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Aus Übersichtsgründen sind nur Teile der Entitäten  angegeben.&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;Project.java&lt;/span&gt;&lt;/p&gt;&lt;pre name="code" class="javascript"&gt;@Entity&lt;br /&gt;@Searchable&lt;br /&gt;public class Project implements IProject {&lt;br /&gt;@Id&lt;br /&gt;@SearchableId&lt;br /&gt;private Long id;&lt;br /&gt;&lt;br /&gt;@ManyToOne(fetch = FetchType.LAZY)&lt;br /&gt;@SearchableComponent(prefix = "user_")&lt;br /&gt;private User user;&lt;br /&gt;&lt;br /&gt;@SearchableProperty(boost = 2.0f)&lt;br /&gt;private String title;&lt;br /&gt;&lt;br /&gt;@SearchableProperty&lt;br /&gt;private String description;&lt;br /&gt;&lt;br /&gt;// Getter and Setter will stay unmodified&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="font-style: italic;"&gt;&lt;span style="font-size:100%;"&gt;User.java&lt;/span&gt;&lt;/p&gt;&lt;pre name="code" class="javascript"&gt;@Searchable(root=false)&lt;br /&gt;public class User {&lt;br /&gt;@Id&lt;br /&gt;@SearchableId&lt;br /&gt;private Long id;&lt;br /&gt;&lt;br /&gt;@SearchableProperty&lt;br /&gt;private String firstname;&lt;br /&gt;&lt;br /&gt;@SearchableProperty&lt;br /&gt;private String lastname;&lt;br /&gt;&lt;br /&gt;// Getter and Setter will stay unmodified&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;Wichtig ist die Annotation &lt;span style="font-style: italic;"&gt;Searchable&lt;/span&gt;, bei der über die  Eigenschaft &lt;span style="font-style: italic;"&gt;root &lt;/span&gt;angegeben  wird, welche Klasse die Wurzelentität darstellt.&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:100%;"&gt;Indizieren&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;Damit&lt;/span&gt; später auch etwas  gefunden werden kann, müssen die Daten noch indiziert werden. Compass  Search bietet die Möglichkeit über Hibernate Events bei jedem  Schreibzugriff automatisch die neuen Werte zu indizieren bzw. alte Werte  zu löschen. Die entsprechenden Listener müssen in der Compass  Konfiguration angegeben werden.&lt;/p&gt;&lt;p&gt;Da in diesem  Beispiel jedoch das programmatische Indizieren gezeigt werden soll,  wird auf die automatische Indizierung nun nicht weiter eingegangen. Die  nötige Konfiguration ist in &lt;a href="http://www.compass-project.org/docs/latest/reference/html/gps-embeddedhibernate.html"&gt;dieser  Dokumentation&lt;/a&gt; gut beschrieben.&lt;/p&gt;&lt;pre name="code" class="javascript"&gt;// Load compass configuration&lt;br /&gt;CompassConfiguration conf = new CompassConfiguration();&lt;br /&gt;URL cfg = getClass().getClassLoader().getResource("compass.cfg.xml");&lt;br /&gt;conf.configure(cfg);&lt;br /&gt;compass = conf.buildCompass();&lt;br /&gt;&lt;br /&gt;// Get a compass session&lt;br /&gt;CompassSession compassSession = compass.openSession();&lt;br /&gt;&lt;br /&gt;// Start with getting all projects&lt;br /&gt;List&amp;lt;project&amp;gt; projects = exensioCompassExampleService.getAllProjects();&lt;br /&gt;&lt;br /&gt;// Begin the compass transaction block&lt;br /&gt;CompassTransaction compassTransaction = null;&lt;br /&gt;try {&lt;br /&gt;compassTransaction = compassSession.beginTransaction();&lt;br /&gt;&lt;br /&gt;// Iterate through the list of projects&lt;br /&gt;Project p = null;&lt;br /&gt;for (int i = 0; i &amp;lt; projects.size(); i++) {&lt;br /&gt;p = projects.get(i);&lt;br /&gt;&lt;br /&gt;// Save annotated project to the index&lt;br /&gt;compassSession.save(p);&lt;br /&gt;&lt;br /&gt;// Commit with the specified commit interval or if at&lt;br /&gt;// the end of the project list&lt;br /&gt;if (((i % transactionCommitInterval) == 0) || (i == (projects.size() - 1))) {&lt;br /&gt;compassTransaction.commit();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Start optimizing&lt;br /&gt;compass.getSearchEngineOptimizer().optimize();&lt;br /&gt;} catch (CompassException ex) {&lt;br /&gt;if (compassTransaction != null) {&lt;br /&gt;compassTransaction.rollback();&lt;br /&gt;logger.error("Compass Indexer: Had to rollback the Compass transaction because of a Compass exception.",ex);&lt;br /&gt;} else {&lt;br /&gt;logger.error("Compass Indexer: Compass exception (compass transaction is null)",ex);&lt;br /&gt;}&lt;br /&gt;} finally {&lt;br /&gt;compassSession.close();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:100%;"&gt;Suchen&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ähnlich einfach wie das Indizieren ist das Suchen. Der  Aufruf dazu lautet:&lt;/p&gt;&lt;pre name="code" class="javascript"&gt;CompassHits hits = session.find(searchString);&lt;/pre&gt;&lt;br /&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:100%;"&gt;Anwendungsbeispiele&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Mit Compass und Lucene können komplexe sowie gezielte  Suchanfragen abgeschickt werden. Eine Suche nach &lt;span style="font-style: italic;"&gt;description:"exensio GmbH integriert Compass  Search" &lt;/span&gt;würde all jene Projekte als Resultat liefern, die in der  Beschreibung den Text &lt;span style="font-style: italic;"&gt;"exensio GmbH integriert  Compass Search"&lt;/span&gt; haben. Nach dem Nachnamen eines Autors kann über das in der Annotation angegebene Präfix gesucht werden: &lt;span style="font-style: italic;"&gt;user_lastname:Schmidt&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Per Standardeinstellung durchsucht  Compass alle Felder, so dass eine  Suche nach &lt;span style="font-style: italic;"&gt;exensio&lt;/span&gt; auf alle  indizierten Attribute geht. In unserem  Fall würde das Vorkommen von &lt;span style="font-style: italic;"&gt;exensio&lt;/span&gt;  im Titel eines Projekts  jedoch höher bewertet werden  (&lt;span style="font-style: italic;"&gt;boost&lt;/span&gt;-Eigenschaft  in der Annotation, siehe oben) und dadurch jene Projekte zuerst in der   Ergebnismenge zurückliefern.&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Fazit&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;Mit dem Compass Search Framework kann auf einfache Weise  eine funktionsreiche und performante Suche in kleine sowie große  Applikationen integriert werden. Beim Speichern des Indexes kann entweder das Dateisystem oder eine Datenbank benutzt werden, was  somit den Betrieb im Cluster ermöglicht. Auch die Integration in  JVM-nahe Cluster-Software wie &lt;a href="http://terracotta.org/"&gt;Terracotta&lt;/a&gt;  ist möglich.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;Wenn  gewünscht kann das Indizieren im Hintergrund über Hibernate Listener  integriert werden, so dass es keine Verzögerung zwischen Suchresultaten  und den tatsächlich vorhandenen Daten in der Applikation gibt.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;Über die Einbindung von &lt;a href="http://lucene.apache.org/tika/"&gt;Apache Tika&lt;/a&gt; können nicht nur  reine Texte sondern auch viele gängige Dateiformate indiziert werden.  Dazu zählen beispielsweise diverse Office-Formate wie Microsoft Word,  Excel und Powerpoint sowie Adobe PDF.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-5359839447733318782?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/5359839447733318782/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/04/volltextsuche-mit-der-open-source.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5359839447733318782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/5359839447733318782'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/04/volltextsuche-mit-der-open-source.html' title='Volltextsuche mit der Open-Source-Lösung Compass Search im Cluster'/><author><name>Manuel Breitfeld</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_WwggNELS9-I/S9VGChQi1WI/AAAAAAAAAAM/bkcYH0ozqIM/s72-c/projectUser_Relation.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-4850023886827621587</id><published>2010-04-24T15:46:00.003+02:00</published><updated>2010-04-29T17:16:32.803+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='User Interface'/><title type='text'>User-Interface-Design mit Wireframes</title><content type='html'>In einer fachlichen Spezifikation ist das geschriebene Wort – wie auch in anderen Bereichen – dehnbar. &amp;nbsp;Aus diesem Grund wird in Spezifikationen gerne visualisiert, &amp;nbsp;beispielsweise durch den Einsatz von UML. Für die Beschreibung von User Interfaces (UI) bietet es sich hier an, die Spezifikation mit Grafiken anzureichern. Für die Erstellung dieser UI-Grafiken wird gerne Photoshop benutzt. Dies hat jedoch zum einen den Nachteil, dass dies sehr aufwändig sein kann und zum anderen wird gerne zunächst die Ästhetik diskutiert. Wir alle kennen die Aussage „die Farben gefallen mir aber noch nicht so sehr“ obwohl in diesem frühen Stadium zuerst das Fachliche geklärt werden sollte. Aus diesem Grund benutzen wir bei exensio zuerst Wireframes. Diese werden dann – wenn die fachlichen Fragen in Bezug auf das UI geklärt sind – mittels Photoshop reingezeichnet bzw. als HTML Prototyp umgesetzt.&lt;br /&gt;&lt;b&gt;Was sind Wireframes?&lt;/b&gt;&lt;br /&gt;Ein Wireframe ist die konzeptionelle Darstellung eines UI-Prototypen. Diese werden bewusst in schwarzweiß gehalten, &amp;nbsp;um ästhetische Fragen zu unterbinden. Wireframes können per Hand oder toolunterstützt gezeichnet werden. Wir bei exensio benutzen hierzu das Tool Balsamiq Mockups [1]. Es erlaubt die Gestaltung von sehr komplexen UIs mit einer einfachen und intuitiven Oberfläche. &amp;nbsp;Das Bild unten zeigt ein Beispiel.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_k5YJcR83wtQ/S9L10kMNJDI/AAAAAAAAAAM/BsCsiSRJm-Q/s1600/mockup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_k5YJcR83wtQ/S9L10kMNJDI/AAAAAAAAAAM/BsCsiSRJm-Q/s320/mockup.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Referenzen&lt;br /&gt;[1] &lt;a href="http://www.balsamiq.com/products/mockups"&gt;Balsamiq Mockups&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-4850023886827621587?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/4850023886827621587/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/04/user-interface-design-mit-wireframes.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4850023886827621587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4850023886827621587'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/04/user-interface-design-mit-wireframes.html' title='User-Interface-Design mit Wireframes'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_k5YJcR83wtQ/S9L10kMNJDI/AAAAAAAAAAM/BsCsiSRJm-Q/s72-c/mockup.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-1777134815217007129</id><published>2010-04-23T17:44:00.014+02:00</published><updated>2010-04-29T17:17:06.217+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Informationsportal'/><category scheme='http://www.blogger.com/atom/ns#' term='Content'/><title type='text'>Content Modellierung</title><content type='html'>&lt;p&gt;Eines unserer Kernthemen ist die Konzeption und Umsetzung von Informationsportalen. Wie der Name bereits sagt, stellen Informationsportale Informationen aus verschiedensten Quellen dem Anwender zur Verfügung. Das Besondere dabei ist die Personalisierung. Informationen werden anhand des individuellen Bedarfs eines Benutzers zur Verfügung gestellt. D.h. nicht mehr der Benutzer sucht nach den für ihn geeigneten Informationen sondern Informationen, die für den Benutzer wichtig sind, werden ihm einfach zugänglich zur Verfügung gestellt. Anhand des Benutzerprofils werden die relevanten Informationen aus den verschiedenen Informationsquellen zusammengestellt und dem Benutzer angeboten. Damit das ganze auch funktioniert, sind verschiedene Dinge erforderlich. Neben dem bereits genannten Benutzerprofil mit den Stammdaten und Interessengebieten des Benutzers ist es dringend erforderlich, dass die Informationen in strukturierter Form zur Verfügung stehen. Diese Strukturierung ist bereits in der Konzeptionsphase zu erarbeiten. Wir nennen die dafür notwendige Aktivität Content Modellierung.&lt;/p&gt;&lt;b&gt;Was ist Content Modellierung?&lt;/b&gt;&lt;br /&gt;Content Modellierung dient der Strukturierung und Kategorisierung der Informationen, die im Portal darzustellen sind. Ähnlich einem Datenmodell für eine Applikation werden die Informationen für das Portal modelliert. Ein solches Modell besteht aus Content Typen und deren Beziehungen. Beispielsweise kann es einen Content Typ Nachricht geben. Ein solcher Content Typ wird durch Metaattribute und Attribute beschrieben. Metaattribute enthalten Daten über Daten, d.h. sie beschreiben den Content. Beispielsweise sind der Autor, das Erstellungsdatum oder die Keywords klassische Metadaten. Attribute hingegen enthalten die eigentlichen Informationen. Im Falle des Content Typs Nachricht könnten dies die Attribute Titel, Untertitel, Text, Referenzen und Kontakt sein. Aus den Content Typen und deren Beziehungen ergibt sich dann das Content  Modell. Dinge wie Vererbung und Spezialisierung, die man aus der objektorientierten Modellierung kennt, finden auch hier ihre Anwendung - zumindest für das fachliche Modell. So könnte beispielsweise der Content Typ Nachricht noch Spezialisierungen haben wie Rundschreiben oder Pressemeldung.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wozu dient diese Modellierung?&lt;/b&gt;&lt;br /&gt;Auf Basis der Attribute (und auch Metadaten) können zum einen Informationen gezielt ermittelt und dem Benutzer zur Verfügung gestellt werden. Beispielsweise können einem Mitarbeiter, der einem bestimmten Standort zugeordnet ist, auch nur die Standort-relevanten Nachrichten angzeigt werden. Zum anderen können durch die Strukturierung auch Teile der Informationen zur Verfügung gestellt werden. So ist es eventuell erforderlich, auf der Startseite des Portals, lediglich die Titel und die Zusammenfassung der Nachricht darzustellen. Liegen diese Information nicht strukturiert in separaten Attributen vor, wäre dies nicht möglich.&lt;br /&gt;Wie auch bei der Datenmodellierung gilt es bei der Content Modellierung, Mass zu halten. Es muss nicht zwanghaft alles strukturiert abgebildet werden. Die Notwendigkeit besteht dann, wenn entweder Informationen personalisiert oder auszugsweise dargestellt werden sollen. Auch Aspekte der Content Wiederverwendung spielen eine Rolle. So kann beispielsweise strukturierte Information über Produkte an den verschiedensten Stellen wiederverwendet werden - sei es als Überblicksinformation auf den Webseiten oder mehr detaillierte Informationen auf den internen Marketingseiten oder im Bereich Vertrieb.&lt;br /&gt;&lt;p&gt;&lt;a aiotitle="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Si-mTIeCTQ0/S9WKnjAYtxI/AAAAAAAAAAU/CxtyLTQZdi0/s1600/Example_ContentModel.gif"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 164px;" src="http://2.bp.blogspot.com/_Si-mTIeCTQ0/S9WKnjAYtxI/AAAAAAAAAAU/CxtyLTQZdi0/s320/Example_ContentModel.gif" alt="" id="BLOGGER_PHOTO_ID_5464426134900356882" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;Beispiel Content Model&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Wer sich weiter für das Thema Modellierung und Strukturierung von Informationen interessiert, dem empfehle ich das Studium des Buches "Single Source Publishing" von Sissi Closs [1]. Die Zielrichtung geht zwar eher in die Richtung des Publizierens von Dokumentationen - man erhält aber einige Anregungen, die sich direkt auf das Thema Content Modellierung für Informationsportale abbilden lassen.&lt;br /&gt;&lt;br /&gt;Referenzen:&lt;br /&gt;[1] &lt;a href="http://www.amazon.de/Single-Source-Publishing-Topicorientierte-Strukturierung/dp/3935042981"&gt;Buch "Single Source Publishing" von Sissi Closs&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-1777134815217007129?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/1777134815217007129/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/04/content-modellierung.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1777134815217007129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/1777134815217007129'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/04/content-modellierung.html' title='Content Modellierung'/><author><name>Irving Tschepke</name><uri>http://www.blogger.com/profile/03918738619345383870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Si-mTIeCTQ0/S9WKnjAYtxI/AAAAAAAAAAU/CxtyLTQZdi0/s72-c/Example_ContentModel.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-4061029139791544943</id><published>2010-04-18T19:24:00.008+02:00</published><updated>2010-04-29T17:17:52.182+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JRockit'/><title type='text'>JRockit und fragmentierter Heap</title><content type='html'>Der Heap in einer JVM fragmentiert durch das Allokieren von Speicher für Objekte von unterschiedlicher Größe und Lebenszeit. Besonders problematisch ist dies beim Hochladen von großen Dateien. Sichtbar wird dies durch folgenden Logfile-Eintrag:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 262160, Num elements: 262144&lt;br /&gt;&lt;/pre&gt;In diesem Fall wurde vergeblich versucht 262160 Byte zu allokieren.&lt;br /&gt;&lt;b&gt;Was kann man tun?&lt;/b&gt;&lt;br /&gt;Unter [1] findet sich eine wertvolle Anleitung. Hier die Infos, was wir gemacht haben:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Heapsize anpassen, ich bin jedoch kein Freund eines zu großen Heaps, da dies sehr lange GC Zyklen zur Folge hat. Es ist meistens besser in einem Cluster einen weiteren WebLogic Server hinzuzufügen, als den Heap zu groß zu wählen. Wir haben folgende Settings gewählt: -Xms1356m –Xmx1356m&lt;/li&gt;&lt;li&gt;Um sicherzustellen, dass der WebLogic Server Nodemanager die JRockit automatisch bei einem OutOfMemoryError starten kann, haben wir den Schalter –XxexitOnOutOfMemory benutzt. Hierbei bendet sich die Jrockit automatisch und läuft nicht in einem halbtoten Zustand weiter.&lt;/li&gt;&lt;li&gt;Um die GC überwachen zu können haben wir diesen Schalter hinzugefügt -Xverbose:gcpause&amp;nbsp;&lt;/li&gt;&lt;li&gt;Ein weiterer wichtiger Parameter ist die Verdichtung des freien Heaps, sprich eine Defragmentierung. Hierbei sollte vorsichtig vorgegangen werden. Wir haben uns für folgenden Wert entschieden: -XXcompactratio=10&lt;/li&gt;&lt;li&gt;Des Weiteren haben wir noch die Generational GC mit -Xgc:gencon gesetzt.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Hier die gesamte Parameterliste:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;-Xms1356m –Xmx1356m -Xgc:gencon –XxexitOnOutOfMemory -Xverbose:gcpause&lt;/pre&gt;&lt;br /&gt;Noch eine Anmerkung zur Heapsize. In unserem Fall handelte es sich um einen Windows 2003 Server mit 16GByte Memory und eingeschalteter (Physical Address Extension)PAE .&lt;br /&gt;Unter [2] findet sich eine interessante Info bzgl. Speicherverfügbarkeit von JRockit unter Windows mit PAE. JRockit hat hier gegenüber der Sun JVM den Vorteil, dass der Speicher nicht zusammenhängend sein muss. Jedoch muss hier beachtet werden, dass in einem JRockit Prozess auch etwaige DLLs von nativen Java Bibliotheken (z.B. SAPJco oder Documentum) liegen. Dies war bei uns der Fall.&lt;br /&gt;&lt;br /&gt;Referenzen:&lt;br /&gt;[1]&lt;a href="http://blogs.oracle.com/jrockit/2008/09/repost_tips_and_tricks_for_dealing_with_a_fragmented_java_heap.html"&gt;Repost: Tips and tricks for dealing with a fragmented Java heap&lt;/a&gt;&lt;br /&gt;[2]&lt;a href="http://blogs.oracle.com/jrockit/2008/09/how_to_get_almost_3_gb_heap_on_windows.html"&gt;Repost: How to get (almost) 3 GB heap on Windows!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-4061029139791544943?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/4061029139791544943/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/04/jrockit-und-fragmentierter-heap.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4061029139791544943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4061029139791544943'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/04/jrockit-und-fragmentierter-heap.html' title='JRockit und fragmentierter Heap'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4466305307772589754.post-4163806677225966830</id><published>2010-04-18T15:34:00.015+02:00</published><updated>2010-04-29T17:18:33.886+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic Portal'/><title type='text'>WebLogic Portal 10.3.2 und Java Server Faces (JSF)</title><content type='html'>Es hat sich herumgesprochen, dass Oracle das Apache Beehive Framework &amp;nbsp;nicht länger unterstützen wird. Die Entwicklung von Portlets soll nun mittels JSF realisiert werden. Aktuell wird jedoch nur die SUN JSF Referenz-Implementierung von Oracle unterstützt. Siehe [1].&lt;br /&gt;&lt;div class="MsoNormal"&gt;Dies ist verständlich, da es sehr viele JSF Frameworks auf dem Markt gibt. Es sind jedoch vor allem die auf Ajax basierenden Frameworks, wie ICEfaces oder ADF Faces, die den Einsatz von JSF reizvoll erscheinen lassen. Wie sieht es mit der Integration solcher Frameworks in das&amp;nbsp;WebLogic Portal&amp;nbsp;aus?&lt;br /&gt;&lt;b&gt;Ist ICEfaces oder ADF Faces im WebLogic Portal möglich?&lt;/b&gt;&lt;br /&gt;Der Einsatz von ICEfaces oder ADF Faces für eine reine Web Applikation ohne&amp;nbsp;WebLogic Portal&amp;nbsp;ist ohne Probleme möglich. Werden diese Frameworks im&amp;nbsp;WebLogic Portal&amp;nbsp;benutzt, wird die Angelegenheit jedoch etwas komplexer. In&amp;nbsp;WebLogic Portal&amp;nbsp;10.3.2 wird&amp;nbsp; (per default) ein JSF 1.2&amp;nbsp; Portlet mittels der JSR 329 Faces Portlet Bridge in ein JSR 286 konformes Portlet gewandelt. Bei ICEfaces ist hier z.B. das Problem, dass die ICEfaces Bridge nicht durch eine andere JSF Bridge (z.B.&amp;nbsp; JSR 329 Bridge) ersetzt werden kann. Ich stand vor 2 Jahren vor dem Problem mit&amp;nbsp;WebLogic Portal&amp;nbsp;10, es scheint bei&amp;nbsp;WebLogic Portal&amp;nbsp;10.3.2 immer noch zu existieren. Siehe [2]&amp;nbsp;bzw [3].&lt;br /&gt;Bei ADF Faces geht aktuell nur der Weg über Oracle Web-Center und WSRP. Siehe [4].&lt;br /&gt;&lt;b&gt;JSF lieber doch nicht?&lt;/b&gt;&lt;br /&gt;Das exzellente Whitepaper [5]&amp;nbsp;von Peter Laird und Tim Breeden&amp;nbsp;–&amp;nbsp;auch wenn es für&amp;nbsp;WebLogic Portal&amp;nbsp;10.3 geschrieben wurde – gibt einen guten Einblick in die Entwicklung von JSF basierten Portlets. Meiner Meinung nach sollte man diesem Dokument folgen und erst einmal auf ICEfaces verzichten. Des Weiteren kann man hinterfragen, ob alle ICEFaces Controls benötigt werden. Mittels jQuery lässt sich bekannterweise &amp;nbsp;auch ein gelungenes UI erstellen.&lt;br /&gt;&lt;b&gt;Was machen Projekte in denen hauptsächlich Beehive Erfahrung existiert?&lt;/b&gt;&lt;br /&gt;In einem aktuellen Projekt haben wir dies lange mit unserem Kunden diskutiert. Wir haben uns dann dazu entschieden, momentan mit Beehive &amp;nbsp;zu starten und später auf JSF 2.0, sobald es vom&amp;nbsp;WebLogic Portal&amp;nbsp;unterstützt wird, zu migrieren. Hierbei ist eine klare Trennung von Präsentations- und Businesslogik (in diesem Projekt mittels EJB 3.0) notwendig.&lt;br /&gt;&lt;br /&gt;Referenzen:&lt;br /&gt;[1]&amp;nbsp;&lt;a href="http://download.oracle.com/docs/cd/E15919_01/wlp.1032/e14247/relnotes.htm#i1168310"&gt;Oracle WebLogic Portal 10.3.2 Supported Standards&lt;/a&gt;&lt;br /&gt;[2]&amp;nbsp;&lt;a href="http://www.icefaces.org/JForum/posts/list/16319.page"&gt;Forums for ICEfaces&lt;/a&gt;&lt;br /&gt;[3]&amp;nbsp;&lt;a href="http://www.icefaces.org/JForum/posts/list/16331.page"&gt;Forums for ICEfaces&lt;/a&gt;&lt;br /&gt;[4]&amp;nbsp;&lt;a href="http://download.oracle.com/docs/cd/E15919_01/wlp.1032/e14235/chap_webcenter_interop.htm#BABFCFFF"&gt;Configuring Portlets That Use ADF Faces Rich Client Components&lt;/a&gt;&lt;br /&gt;[5]&amp;nbsp;&lt;a href="http://blogs.oracle.com/tridib_samanta/weblogic-portal-jsf-whitepaper.pdf"&gt;Developing JSF Portlets with WebLogic Portal&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4466305307772589754-4163806677225966830?l=blog.exensio.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.exensio.de/feeds/4163806677225966830/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://blog.exensio.de/2010/04/weblogic-portal-1032-und-java-server.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4163806677225966830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4466305307772589754/posts/default/4163806677225966830'/><link rel='alternate' type='text/html' href='http://blog.exensio.de/2010/04/weblogic-portal-1032-und-java-server.html' title='WebLogic Portal 10.3.2 und Java Server Faces (JSF)'/><author><name>Peter Soth</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
