<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="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" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4466305307772589754</atom:id><lastBuildDate>Fri, 17 Feb 2012 03:12:32 +0000</lastBuildDate><category>solr</category><category>DWH</category><category>Usability</category><category>User Interface</category><category>JPA</category><category>ETL</category><category>Lucene</category><category>Hibernate</category><category>ActionScript</category><category>socbiz</category><category>Glosse</category><category>socialmedia</category><category>exensio</category><category>Offshoring</category><category>Open-Source</category><category>Konferenz</category><category>Build Prozess</category><category>Compass Search</category><category>GORM</category><category>Flash</category><category>WebLogic Server</category><category>Apps</category><category>SAP EP</category><category>Grails</category><category>Flex</category><category>Spring</category><category>WebLogic Portal</category><category>Informationsportal</category><category>Apache Wink</category><category>e20</category><category>HTML5</category><category>web20</category><category>LocalConnection</category><category>Kettle</category><category>Content</category><category>MySQL</category><category>Portal</category><category>REST</category><category>Propagation</category><category>AS3</category><category>Virtualisierung</category><category>BlackBerry</category><category>ADF</category><category>EJB 3.0</category><category>Tomcat</category><category>Apache Webserver</category><category>EclipseLink</category><category>CMS</category><category>JRockit</category><category>Automatisierter Build</category><category>Liferay</category><category>Excel</category><title>exensio it blog</title><description /><link>http://blog.exensio.de/</link><managingEditor>noreply@blogger.com (Peter Soth)</managingEditor><generator>Blogger</generator><openSearch:totalResults>59</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/blogspot/iQDgu" /><feedburner:info uri="blogspot/iqdgu" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>blogspot/iQDgu</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-4490374344548906153</guid><pubDate>Mon, 13 Feb 2012 08:19:00 +0000</pubDate><atom:updated>2012-02-13T12:12:10.580+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MySQL</category><category domain="http://www.blogger.com/atom/ns#">Apache Webserver</category><category domain="http://www.blogger.com/atom/ns#">Tomcat</category><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Teil 1 - Grails in Produktion – mit Apache, Tomcat und MySQL</title><description>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;Teil 2 – Apache Web Server&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/d1MTjsOYOZU/teil-1-grails-in-produktion-mit-apache.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2012/02/teil-1-grails-in-produktion-mit-apache.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-3707911597787693899</guid><pubDate>Mon, 06 Feb 2012 08:54:00 +0000</pubDate><atom:updated>2012-02-06T09:54:45.267+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Grails 2.0 Upgrade Guide</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/9_YhQIybg80/grails-20-upgrade-guide.html</link><author>noreply@blogger.com (Peter Soth)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.exensio.de/2012/02/grails-20-upgrade-guide.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-8707846592899013297</guid><pubDate>Sun, 05 Feb 2012 17:05:00 +0000</pubDate><atom:updated>2012-02-05T18:05:42.187+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">web20</category><category domain="http://www.blogger.com/atom/ns#">socialmedia</category><category domain="http://www.blogger.com/atom/ns#">exensio</category><category domain="http://www.blogger.com/atom/ns#">socbiz</category><title>Recruiting 2.0 – exensio auf Youtube - IT Berater (w/m) mit hohem *PZU-Faktor gesucht</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/NLQd4YIQ8Ro/recruiting-20-exensio-auf-youtube-it.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2012/02/recruiting-20-exensio-auf-youtube-it.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-2265726432079675890</guid><pubDate>Thu, 02 Feb 2012 17:48:00 +0000</pubDate><atom:updated>2012-02-02T18:58:59.243+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Vermeiden von ClassCastExceptions beim Reloading  in Grails-Applikationen</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/vJ5Aj8_Vh1U/vermeiden-von-classcastexceptions-beim.html</link><author>noreply@blogger.com (Tobias Kraft)</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><feedburner:origLink>http://blog.exensio.de/2012/02/vermeiden-von-classcastexceptions-beim.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-1298703952107985903</guid><pubDate>Mon, 30 Jan 2012 18:39:00 +0000</pubDate><atom:updated>2012-01-31T08:14:02.084+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Grails : JNDI Werte im Embedded Tomcat setzen</title><description>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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/CpIWkQ9FfVY/grails-jndi-werte-im-embedded-tomcat.html</link><author>noreply@blogger.com (Peter Soth)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.exensio.de/2012/01/grails-jndi-werte-im-embedded-tomcat.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-8498042511834283189</guid><pubDate>Thu, 12 Jan 2012 14:56:00 +0000</pubDate><atom:updated>2012-01-12T16:30:35.292+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Apache Webserver</category><category domain="http://www.blogger.com/atom/ns#">AS3</category><category domain="http://www.blogger.com/atom/ns#">Flash</category><title>Langsame Netzwerk-Geschwindigkeit mittels Apache-Webserver simulieren</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/NlkI30FTh0o/langsame-netzwerk-geschwindigkeit.html</link><author>noreply@blogger.com (Manuel Breitfeld)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.exensio.de/2012/01/langsame-netzwerk-geschwindigkeit.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-9102526117200317412</guid><pubDate>Thu, 22 Dec 2011 16:50:00 +0000</pubDate><atom:updated>2011-12-22T17:50:27.312+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">exensio</category><title>exensio wünscht ein frohes Fest und ein erfolgreiches neues Jahr</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/gLhxS5IbDIk/exensio-wunscht-ein-frohes-fest-und-ein.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/12/exensio-wunscht-ein-frohes-fest-und-ein.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-821054521627970407</guid><pubDate>Thu, 22 Dec 2011 13:52:00 +0000</pubDate><atom:updated>2011-12-22T15:57:12.719+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GORM</category><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Criteria List Queries bei Many-To-Many Beziehungen in Grails</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/kUYaXfgLXhQ/criteria-list-queries-bei-many-to-many.html</link><author>noreply@blogger.com (Manuel Breitfeld)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.exensio.de/2011/12/criteria-list-queries-bei-many-to-many.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-1654020689043310689</guid><pubDate>Tue, 22 Nov 2011 21:32:00 +0000</pubDate><atom:updated>2011-11-22T10:01:00.608+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Datenbank-Migrationen mit Grails</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/9yKV9nznsyw/datenbank-migrationen-mit-grails.html</link><author>noreply@blogger.com (Tobias Kraft)</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><feedburner:origLink>http://blog.exensio.de/2011/11/datenbank-migrationen-mit-grails.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-6224734467127204107</guid><pubDate>Sun, 20 Nov 2011 16:16:00 +0000</pubDate><atom:updated>2011-11-20T18:05:01.337+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Usability</category><title>Verbesserung der Usability mittels Faceted Search</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/D50R09AnyT4/verbesserung-der-usability-mittels.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/11/verbesserung-der-usability-mittels.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-13369217851198519</guid><pubDate>Sun, 30 Oct 2011 15:36:00 +0000</pubDate><atom:updated>2011-11-24T11:44:12.546+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Excel</category><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Excel Prozesse und warum es sinnvoll ist, diese durch Grails Web Applikationen zu ersetzen</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/4bmsCpEP5S0/excel-prozesse-und-warum-es-sinnvoll.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/10/excel-prozesse-und-warum-es-sinnvoll.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-114726002024437669</guid><pubDate>Sat, 01 Oct 2011 16:31:00 +0000</pubDate><atom:updated>2011-10-03T17:30:15.360+02:00</atom:updated><title>Wir benutzen nun das CRM System Highrise von 37signals.com</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/0lwVhmfK_WI/wir-benutzen-nun-das-crm-system.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/10/wir-benutzen-nun-das-crm-system.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-5473167057609698220</guid><pubDate>Fri, 30 Sep 2011 16:46:00 +0000</pubDate><atom:updated>2011-10-03T18:32:17.547+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">socialmedia</category><category domain="http://www.blogger.com/atom/ns#">socbiz</category><title>Social Media und das Thema Sicherheit</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/YvE-PJZ7V4o/social-media-und-das-thema-sicherheit.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/09/social-media-und-das-thema-sicherheit.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-5533212688736736404</guid><pubDate>Thu, 25 Aug 2011 13:32:00 +0000</pubDate><atom:updated>2011-08-25T17:26:12.471+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">solr</category><category domain="http://www.blogger.com/atom/ns#">e20</category><category domain="http://www.blogger.com/atom/ns#">User Interface</category><title>Das Such-Interface in der exensio Enterprise 2.0 Plattform</title><description>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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/uUZ2TmfYxgU/das-such-interface-in-der-exensio.html</link><author>noreply@blogger.com (Manuel Breitfeld)</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><feedburner:origLink>http://blog.exensio.de/2011/08/das-such-interface-in-der-exensio.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-7562316286708896806</guid><pubDate>Sat, 20 Aug 2011 14:14:00 +0000</pubDate><atom:updated>2011-08-20T16:14:58.430+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Open-Source</category><category domain="http://www.blogger.com/atom/ns#">Kettle</category><category domain="http://www.blogger.com/atom/ns#">ETL</category><category domain="http://www.blogger.com/atom/ns#">DWH</category><title>ETL-Prozesse mit Pentaho Kettle umsetzen</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/mO4firrkvFA/etl-prozesse-mit-pentaho-kettle.html</link><author>noreply@blogger.com (Tobias Kraft)</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><feedburner:origLink>http://blog.exensio.de/2011/08/etl-prozesse-mit-pentaho-kettle.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-6830608629766824954</guid><pubDate>Fri, 19 Aug 2011 16:12:00 +0000</pubDate><atom:updated>2011-10-03T17:33:33.528+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portal</category><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Building a Portal with Grails-Framework</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/t9N6QdgNhEo/building-portal-with-grails-framework.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/08/building-portal-with-grails-framework.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-3889531953038227766</guid><pubDate>Tue, 09 Aug 2011 07:33:00 +0000</pubDate><atom:updated>2011-12-22T17:34:23.940+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">exensio</category><title>exensio bekommt Nachwuchs ...</title><description>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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/fYsT_tRqLhc/exensio-bekommt-nachwuchs.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/08/exensio-bekommt-nachwuchs.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-3671407778930282876</guid><pubDate>Mon, 08 Aug 2011 09:30:00 +0000</pubDate><atom:updated>2011-10-03T17:35:38.189+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Grails Entwicklung mit IntelliJ</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/1M0n2_5sfmY/grails-entwicklung-mit-intellij.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/08/grails-entwicklung-mit-intellij.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-6299393212628813792</guid><pubDate>Fri, 29 Jul 2011 08:31:00 +0000</pubDate><atom:updated>2011-07-29T11:23:14.693+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">solr</category><category domain="http://www.blogger.com/atom/ns#">e20</category><title>Fuzzy Search und "Meinten Sie?" in Apache Solr</title><description>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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/AKFYPjphyuQ/fuzzy-search-und-meinten-sie-in-solr.html</link><author>noreply@blogger.com (Manuel Breitfeld)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.exensio.de/2011/07/fuzzy-search-und-meinten-sie-in-solr.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-70808979536314321</guid><pubDate>Fri, 08 Jul 2011 09:51:00 +0000</pubDate><atom:updated>2011-10-03T17:38:17.405+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Grails Quick-Start</title><description>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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/oNliWT5tQhU/grails-quick-start.html</link><author>noreply@blogger.com (Peter Soth)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.exensio.de/2011/07/grails-quick-start.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-7285413773542210380</guid><pubDate>Tue, 05 Jul 2011 07:17:00 +0000</pubDate><atom:updated>2011-07-05T09:17:13.122+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">socialmedia</category><category domain="http://www.blogger.com/atom/ns#">socbiz</category><title>Facebook und die Problematik mit der Sicherheit für Unternehmen</title><description>&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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/6lr480vo_Bw/facebook-und-die-problematik-mit-der.html</link><author>noreply@blogger.com (Peter Soth)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.exensio.de/2011/07/facebook-und-die-problematik-mit-der.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-4046185867041358203</guid><pubDate>Mon, 30 May 2011 07:49:00 +0000</pubDate><atom:updated>2011-10-03T17:42:29.098+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">e20</category><category domain="http://www.blogger.com/atom/ns#">Grails</category><title>Unsere Enterprise 2.0 Plattform - basierend auf dem Grails-Framework</title><description>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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/73Db5JmcGjE/unsere-enterprise-20-plattform.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/05/unsere-enterprise-20-plattform.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-1118177164566679271</guid><pubDate>Mon, 18 Apr 2011 12:42:00 +0000</pubDate><atom:updated>2011-04-18T14:42:17.064+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">socialmedia</category><category domain="http://www.blogger.com/atom/ns#">e20</category><category domain="http://www.blogger.com/atom/ns#">socbiz</category><title>Enterprise 2.0 – Rating und die wichtige Involvierung des Betriebsrates</title><description>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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/g1p69sMCyIA/enterprise-20-rating-und-die-wichtige.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/04/enterprise-20-rating-und-die-wichtige.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-8218801774036635810</guid><pubDate>Sun, 10 Apr 2011 16:20:00 +0000</pubDate><atom:updated>2011-04-10T18:22:41.094+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">e20</category><title>Enterprise 2.0 und das Problem mit der Partizipation</title><description>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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/1uu86R9EQ_0/enterprise-20-und-das-problem-mit-der.html</link><author>noreply@blogger.com (Peter Soth)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.exensio.de/2011/04/enterprise-20-und-das-problem-mit-der.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4466305307772589754.post-1225124291646380661</guid><pubDate>Mon, 07 Mar 2011 09:36:00 +0000</pubDate><atom:updated>2011-03-07T10:54:38.661+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">e20</category><category domain="http://www.blogger.com/atom/ns#">socbiz</category><title>Ist der ROI von Enterprise 2.0 berechenbar?</title><description>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;</description><link>http://feedproxy.google.com/~r/blogspot/iQDgu/~3/iVFpizNS5KE/ist-der-roi-von-enterprise-20.html</link><author>noreply@blogger.com (Peter Soth)</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><feedburner:origLink>http://blog.exensio.de/2011/03/ist-der-roi-von-enterprise-20.html</feedburner:origLink></item></channel></rss>

