[{"content":"In this post I will describe a solution to add a portal page, a common header and a dynamic panel to each of the three tools Jenkins, SonarQube, and Nexus. Those modifications lead to a better visual integration and intensifies the impression that the tools belong together.\nAs a pre-requisite you need an Apache HTTP server, configured as reverse proxy and the tools accessible via the following context path:\n/jenkins /sonarqube /nexus The folder structure which contains the portal page and the customization fragments looks like this:\nindex.html js portal-panel.js jenkins-customization.js sonarqube-customization.js nexus-customization.js require-2.1.11.js jquery-1.11.0.js Portal Page The portal page index.html is available under the context root and basically contains the following links:\nJenkins SonarQube Nexus Wiki Mail Portal Panel The portal panel is a small box at the top of the page at a fixed position. When the mouse enters the box it gets maximized and displays buttons for accessing the other tools. When the mouse exits the box, the box shrinks to its initial size. When scrolling the page down, the box remains at the top of the window so that the other the tools are accessible from everywhere in the page.\nThe panel heavily relies on jQuery to do the animations and the styling. The following block contains the script with some information removed for clarity:\nfunction poller() { // wait until jQuery becomes ready if(typeof jQuery !== \u0026#34;undefined\u0026#34;) { // settings var animMillis = 200; var collapsedWidth = 30; var height = 30; var expandedWidth = 350; var logo = \u0026#34;/img/Logo.png\u0026#34;; var email = \u0026#34;xxx@yyy.zzz\u0026#34;; var germanMailText = \u0026#34;Hallo Support Team,%0A%0AQuelle: \u0026#34; + window.location.href + \u0026#34;%0A%0A%0A%0AMit freundlichen Gruessen,%0A\u0026#34;; var englishMailText = \u0026#34;Hello Support Team,%0A%0AOrigin: \u0026#34; + window.location.href + \u0026#34;%0A%0A%0A%0AWith Kind regards,%0A\u0026#34;; // add center method to jQuery jQuery.fn.center = function () { this.css(\u0026#34;position\u0026#34;, \u0026#34;fixed\u0026#34;); this.css(\u0026#34;top\u0026#34;, \u0026#34;0px\u0026#34;); var width = jQuery(this).width(); var left = Math.max(0, ((jQuery(window).width() - width) / 2) + jQuery(window).scrollLeft()); this.css(\u0026#34;left\u0026#34;, left + \u0026#34;px\u0026#34;); return this; } // detect mail language var language = window.navigator.userLanguage || window.navigator.language; var mailText = englishMailText; if (language.indexOf(\u0026#39;de\u0026#39;) == 0) { mailText = germanMailText; } // add markup (removed for clarity) jQuery(\u0026#34;body\u0026#34;).append(\u0026#39;MARKUP\u0026#39;); // style markup (removed for clarity) jQuery(\u0026#34;#portalPanel\u0026#34;).css(\u0026#34;STYLING\u0026#34;); jQuery(\u0026#34;#portalLogo\u0026#34;).css(\u0026#34;STYLING\u0026#34;); jQuery(\u0026#34;#portalMenu\u0026#34;).css(\u0026#34;STYLING\u0026#34;); jQuery(\u0026#34;.portalButton\u0026#34;).css(\u0026#34;STYLING\u0026#34;); jQuery(\u0026#34;.portalButton a:link\u0026#34;).css(\u0026#34;STYLING\u0026#34;); jQuery(\u0026#34;.portalButtonMagenta\u0026#34;).css(\u0026#34;STYLING\u0026#34;); jQuery(\u0026#34;.portalButtonDark\u0026#34;).css(\u0026#34;STYLING\u0026#34;); jQuery(\u0026#34;.portalButtonLight\u0026#34;).css(\u0026#34;STYLING\u0026#34;); // button animation jQuery(\u0026#34;.portalButtonMagenta\u0026#34;).hover(function() { jQuery(this).css(\u0026#34;background-color\u0026#34;, \u0026#34;#f59fcd\u0026#34;); }, function() { jQuery(this).css(\u0026#34;background-color\u0026#34;, \u0026#34;#d8006f\u0026#34;); }); jQuery(\u0026#34;.portalButtonDark\u0026#34;).hover(function() { jQuery(this).css(\u0026#34;background-color\u0026#34;, \u0026#34;#b1b1b1\u0026#34;); }, function() { jQuery(this).css(\u0026#34;background-color\u0026#34;, \u0026#34;#4c4c4c\u0026#34;); }); jQuery(\u0026#34;.portalButtonLight\u0026#34;).hover(function() { jQuery(this).css(\u0026#34;background-color\u0026#34;, \u0026#34;#f2f2f2\u0026#34;); }, function() { jQuery(this).css(\u0026#34;background-color\u0026#34;, \u0026#34;#b8b8b8\u0026#34;); }); // make box relocate when browser window is resized jQuery(window).bind(\u0026#39;resize\u0026#39;, function() { jQuery(\u0026#39;#portalPanel\u0026#39;).center(); }); // initial state jQuery(\u0026#34;#portalPanel\u0026#34;).center(); jQuery(\u0026#34;#portalLogo\u0026#34;).show(); jQuery(\u0026#34;#portalMenu\u0026#34;).hide(); // animate the box var dirin = true; jQuery(\u0026#34;#portalPanel\u0026#34;).hover(function() { dirin = true; jQuery(\u0026#39;#portalMenu\u0026#39;).clearQueue().stop(true, true, true); jQuery(\u0026#39;#portalPanel\u0026#39;).clearQueue().stop(true, true, true); jQuery(\u0026#39;#portalLogo\u0026#39;).clearQueue().stop(true, true, true); if (dirin) { jQuery(\u0026#39;#portalLogo\u0026#39;).fadeOut(animMillis, function() { if (dirin) { var left = Math.max(0, ((jQuery(window).width() - expandedWidth) / 2) + jQuery(window).scrollLeft()); jQuery(\u0026#39;#portalPanel\u0026#39;).animate({\u0026#39;width\u0026#39;:expandedWidth + \u0026#39;px\u0026#39;, \u0026#39;left\u0026#39;:left + \u0026#39;px\u0026#39;}, animMillis, \u0026#39;swing\u0026#39;, function() { if (dirin) { jQuery(\u0026#39;#portalMenu\u0026#39;).fadeIn(animMillis, function() { // do nothing }); } }); } }); } }, function() { dirin = false; jQuery(\u0026#39;#portalMenu\u0026#39;).clearQueue().stop(true, true, true); jQuery(\u0026#39;#portalPanel\u0026#39;).clearQueue().stop(true, true, true); jQuery(\u0026#39;#portalLogo\u0026#39;).clearQueue().stop(true, true, true); if (!dirin) { jQuery(\u0026#39;#portalMenu\u0026#39;).fadeOut(animMillis, function() { if (!dirin) { var left = Math.max(0, ((jQuery(window).width() - collapsedWidth) / 2) + jQuery(window).scrollLeft()); jQuery(\u0026#39;#portalPanel\u0026#39;).animate({\u0026#39;width\u0026#39;:collapsedWidth + \u0026#39;px\u0026#39;, \u0026#39;left\u0026#39;:left + \u0026#39;px\u0026#39;}, animMillis, \u0026#39;swing\u0026#39;, function() { if (!dirin) { jQuery(\u0026#39;#portalLogo\u0026#39;).fadeIn(animMillis, function() { jQuery(\u0026#39;#portalLogo\u0026#39;).show(); }); } }); } }); } }); } else { setTimeout(poller, 100); } } poller(); Jenkins Customization To use jQuery in our customization fragments the Jenkins jQuery plugin must be installed via the Jenkins Update Center. The plugin adds the jQuery JavaScript library to each Jenkins page without colliding with Jenkins\u0026rsquo; JavaScript. Because Jenkins uses the jQuery shortcut \u0026ldquo;$\u0026rdquo; for one of its own functions, jQuery can only be accessed by using the full name \u0026ldquo;jQuery\u0026rdquo;.\nDownload the latest release of the page-markup plugin and copy the page-markup.hpi to the folder JENKINS_HOME/plugins. Finally the plugins need to be activated by restarting the Jenkins server.\nAdd the following snippet to the text area under Manage Jenkins -\u0026gt; Configure System -\u0026gt; Additional Page HTML Markup -\u0026gt; Header HTML to extend the Jenkins HTML page:\n\u0026lt;style type=\u0026#34;text/css\u0026#34;\u0026gt; #top-panel { display:none; background: none; } .top-sticker, #top-sticker { top: 62px; } \u0026lt;/style\u0026gt; \u0026lt;script src=\u0026#34;/js/require-2.1.11.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; require([\u0026#34;/js/jenkins-customization.js\u0026#34;], function(util) { // nothing to do }); require([\u0026#34;/js/portal-panel.js\u0026#34;], function(util) { // nothing to do }); \u0026lt;/script\u0026gt; The small CSS part hides the Jenkins logo and the blue header so that it does not flicker when the page is reloaded. Because the jQuery code takes some time to get executed, the logo is displayed shortly if no countermeasures are taken.\nSonarQube Customization Download the sonar-pagedecoration-plugin and install it manually to the $SONARQUBE_HOME/extensions/plugins folder of your SonarQube installation. You need to restart SonarQube to get the plugin activated.\nAdd the following snippet to the Settings -\u0026gt; General Settings -\u0026gt; Page Decoration -\u0026gt; Script text area and click on Save Page Decoration Settings to add the fragment to the SonarQube HTML page:\n\u0026lt;script src=\u0026#34;/js/require-2.1.11.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; require([\u0026#34;/js/sonarqube-customization.js\u0026#34;], function(util) { // nothing to do }); require([\u0026#34;/js/portal-panel.js\u0026#34;], function(util) { // nothing to do }); \u0026lt;/script\u0026gt; The SonarQube customization does not need to load jQuery explicitly as SonarQube already uses jQuery in its HTML pages.\nNexus Customization Download the nexus-pagedecoration-plugin, unzip the file nexus-pagedecoration-plugin-2.7.1-01-bundle.zip to the folder SONATYPE_WORK/nexus/plugin-repository and restart Nexus to activate the plugin. Add the following snippet to the Administration -\u0026gt; Page Decoration -\u0026gt; Pre Head text area and click on Save to add the fragment to the Nexus HTML page:\n\u0026lt;style type=\u0026#34;text/css\u0026#34;\u0026gt; load. div#branding img { display:none; } div#header { background-color: white; background-image: none; } \u0026lt;/style\u0026gt; \u0026lt;script src=\u0026#34;/js/require-2.1.11.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; require([\u0026#34;/js/jquery-1.11.0.min.js\u0026#34;], function(util) { require([\u0026#34;/js/nexus-customization.js\u0026#34;], function(util) { // nothing to do }); require([\u0026#34;/js/portal-panel.js\u0026#34;], function(util) { // nothing to do }); }); \u0026lt;/script\u0026gt; In Nexus the original logo also needs to be hidden to avoid flickering upon page reload.\nThe Nexus UI is based upon ExtJS so that jQuery needs to pulled first. When jQuery has been loaded completely, the other JavaScript files get loaded and are executed.\nThe scripts can be found in the following GitHub project:\nhttps://github.com/mrumpf/software-build-service/tree/master/portal\n","permalink":"https://rumpf.eu/michael/posts/2014-02-24-integrating-jenkins-sonarqube-and-nexus/","summary":"\u003cp\u003eIn this post I will describe a solution to add a portal page, a common header and a dynamic panel to\neach of the three tools Jenkins, SonarQube, and Nexus. Those modifications lead to a better visual\nintegration and intensifies the impression that the tools belong together.\u003c/p\u003e\n\u003cp\u003eAs a pre-requisite you need an Apache HTTP server, configured as reverse proxy and the tools accessible\nvia the following context path:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e/jenkins\u003c/li\u003e\n\u003cli\u003e/sonarqube\u003c/li\u003e\n\u003cli\u003e/nexus\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe folder structure which contains the portal page and the customization fragments looks like this:\u003c/p\u003e","title":"Integrating Jenkins, SonarQube, and Nexus"},{"content":"While trying to apply a unified visual layout to the tools Jenkins, SonarQube, and Nexus I learned that there are some plugins available, but none of them really fits the intended purpose.\nJenkins has no easy way of changing its appearance and the Simple Theme plugin comes only close to what is needed. In SonarQube there is a Branding plugin with which you can display an image at the top of each page, but that\u0026rsquo;s basically all. The Nexus plugin to change the Sonatype Nexus logo is available for the professional version only, but buying the professional version just for being able to change the logo is not really an option.\nAnalyzing the APIs of the different tools revealed that similar extension points are offered in order to inject HTML fragments into the HTML page:\nJenkins: hudson.model.PageDecorator SonarQube (since 3.3): org.sonar.api.web.PageDecoration Nexus: org.sonatype.nexus.plugins.rest.NexusIndexHtmlCustomizer For Jenkins and SonarQube I found plugins which use these extension points, although the plugins are not available via the official plugin repositories and therefore somewhat hidden from the public:\nJenkins: page-markup (GitHub)\nThe original Subversion repository has been forked to GitHub but the plugin has not made it into the Jenkins Plugin Repository yet. SonarQube: sonar-pagedecoration-plugin (GitHub)\nIt seems as if there has been no attempt at getting the plugin into the SonarQube Plugin Forge yet. Nexus: No plugin available or at least I did not find one yet. Inspired from the Blog postings \u0026ldquo;Nexus and UI contributions\u0026rdquo; and \u0026ldquo;Extending Nexus UI\u0026rdquo; I decided to write my own plugin which matches the functionality of the SonarQube\u0026rsquo;s pagedecoration and the Jenkins\u0026rsquo;s page-markup plugins.\nThe new nexus-pagedecoration-plugin adds a menu item \u0026ldquo;Page Decoration\u0026rdquo; to the Administration section of the Nexus UI:\n[] (http://2.bp.blogspot.com/-Ni1gkHRtdxA/UwoGugngvGI/AAAAAAAAcZQ/ZySSX11ac-8/s1600/2014-02-23+15_33_10-Clipboard.png)\nThe corresponding Page Decoration tab provides text areas for all the four extension points:\nPre Head Post Head Pre Body Post Body You can add HTML fragments to each of the text areas and when saving the changes and reloading the page, the fragments will be rendered into the Nexus UI HTML page.\n[] (http://1.bp.blogspot.com/-dzOV41d622g/UwoHbwRdt_I/AAAAAAAAcZY/WwVimvnJwfs/s1600/2014-02-23+15_35_57-Sonatype+Nexus.png)\nThe nexus-pagedecoration-plugin is available under the Apache 2.0 license and is hosted on Github. The initial release for Nexus 2.7.1-01 can be found under GitHub releases.\nFor the other plugins I did a fork on GitHub and made some releases on GitHub:\npage-markup release: v0.4-SNAPSHOT sonar-pagedecoration-plugin release: v1.0.1-SNAPSHOT nexus-pagedecoration-plugin release: v2.7.1-01 ","permalink":"https://rumpf.eu/michael/posts/2014-02-23-page-decoration-plugins-for-jenkins/","summary":"\u003cp\u003eWhile trying to apply a unified visual layout to the tools \u003ca href=\"http://jenkins-ci.org/\"\u003eJenkins\u003c/a\u003e, \n\u003ca href=\"http://www.sonarqube.org/\"\u003eSonarQube\u003c/a\u003e, and \u003ca href=\"http://www.sonatype.org/nexus/\"\u003eNexus\u003c/a\u003e I learned that\nthere are some plugins available, but none of them really fits the intended purpose.\u003c/p\u003e\n\u003cp\u003eJenkins has no easy way of changing its appearance and the \n\u003ca href=\"https://wiki.jenkins-ci.org/display/JENKINS/Simple+Theme+Plugin\"\u003eSimple Theme plugin\u003c/a\u003e comes only\nclose to what is needed. In SonarQube there is a\n\u003ca href=\"http://docs.codehaus.org/display/SONAR/Branding+Plugin\"\u003eBranding plugin\u003c/a\u003e with which you can display\nan image at the top of each page, but that\u0026rsquo;s basically all. The Nexus plugin to change the\n\u003ca href=\"http://blog.sonatype.com/2010/02/custom-logo-nxpro/\"\u003eSonatype Nexus logo is available for the professional version only\u003c/a\u003e,\nbut buying the professional version just for being able to change the logo is not really an option.\u003c/p\u003e","title":"Page decoration plugins for Jenkins, SonarQube, and Nexus"},{"content":"This is not yet another \u0026ldquo;how to configure MPD on the Raspberry Pi\u0026rdquo; article, because there are a lot of excellent MPD HOWTOs already available:\nhttp://hempeldesigngroup.com/embedded/stories/raspberry-pi-setup-as-mpd-sever/ http://www.t3node.com/blog/streaming-audio-with-mpd-and-icecast2-on-raspberry-pi/ http://lesbonscomptes.com/pages/raspmpd.html However, I experienced a bottleneck with the configuration described by those articles. The load was slightly over 1 but it was high enough to cause some stuttering every 30 seconds.\nThe first optimization is to avoid using a separate streaming solution like icecast\nMPD has its own, built-in streaming plugin which can be configured like this:\naudio_output { type \u0026#34;httpd\u0026#34; name \u0026#34;My HTTP Stream\u0026#34; encoder \u0026#34;flac\u0026#34; port \u0026#34;8000\u0026#34; bitrate \u0026#34;96\u0026#34; format \u0026#34;44100:16:2\u0026#34; } But before adding this you need to check your sound card default output parameters:\nsudo cat /proc/asound/card0/pcm0p/sub0/hw_params which returns something like this:\naccess: RW_INTERLEAVED format: S16_LE subformat: STD channels: **2** rate: **44100** (44100/1) period_size: 5513 buffer_size: 22050 Then note the rate and channels above and make sure they are the same as in mpd.conf:\naudio_output { type \u0026#34;alsa\u0026#34; name \u0026#34;My ALSA Device\u0026#34; device \u0026#34;hw:0,0\u0026#34; # optional format \u0026#34;44100:16:2\u0026#34; # CHECK rate and channels mixer_device \u0026#34;default\u0026#34; # optional mixer_control \u0026#34;PCM\u0026#34; # optional mixer_index \u0026#34;0\u0026#34; # optional } audio_output { type \u0026#34;httpd\u0026#34; name \u0026#34;My HTTP Stream\u0026#34; # we are using a faster encoder note that some player might not supprt Flac encoder \u0026#34;flac\u0026#34; port \u0026#34;8000\u0026#34; # quality \u0026#34;5.0\u0026#34; # do not define if bitrate is defined # leave at 128 and check cpu usage... bitrate \u0026#34;96\u0026#34; # do not define if quality is defined format \u0026#34;44100:16:2\u0026#34; } # This setting will change all decoded audio to be converted to the specified # format before being passed to the audio outputs. By default, this setting is # disabled. # audio_output_format \u0026#34;44100:16:2\u0026#34; # # If MPD has been compiled with libsamplerate support, this setting specifies # the sample rate converter to use. Possible values can be found in the # mpd.conf man page or the libsamplerate documentation. By default, this is # setting is disabled. # samplerate_converter \u0026#34;Fastest Sinc Interpolator\u0026#34; The important hints for those optimizations came from the Raspberry Pi Forum here.\n","permalink":"https://rumpf.eu/michael/posts/2013-06-10-music-player-daemon-on-raspberry-pi/","summary":"\u003cp\u003eThis is not yet another \u0026ldquo;how to configure \u003ca href=\"http://www.musicpd.org/\"\u003eMPD\u003c/a\u003e on the Raspberry Pi\u0026rdquo; article,\nbecause there are a lot of excellent \u003ca href=\"http://www.musicpd.org/\"\u003eMPD\u003c/a\u003e HOWTOs already available:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://hempeldesigngroup.com/embedded/stories/raspberry-pi-setup-as-mpd-sever/\"\u003ehttp://hempeldesigngroup.com/embedded/stories/raspberry-pi-setup-as-mpd-sever/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.t3node.com/blog/streaming-audio-with-mpd-and-icecast2-on-raspberry-pi/\"\u003ehttp://www.t3node.com/blog/streaming-audio-with-mpd-and-icecast2-on-raspberry-pi/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://lesbonscomptes.com/pages/raspmpd.html\"\u003ehttp://lesbonscomptes.com/pages/raspmpd.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eHowever, I experienced a bottleneck with the configuration described by those articles. The load\nwas slightly over 1 but it was high enough to cause some stuttering every 30 seconds.\u003c/p\u003e\n\u003cp\u003eThe first optimization is to avoid using a separate streaming solution like icecast\u003c/p\u003e\n\u003cp\u003eMPD has its own, built-in streaming plugin which can be configured like this:\u003c/p\u003e","title":"Music Player Daemon on Raspberry Pi"},{"content":"The issue I have is that my Sony LCD TV seems to be very picky regarding the UPnP/DLNA protocol when playing media from a control point to the television. The Android App BubbleUPnP does a good job here as playing music works out of the box. Initial tests with the Cling Java library to play music does not work out of the box. Therefore I wanted to debug the HTTP SOAP protocol in order to see where the differences are.\nThe UPnP inspector tools discover all UPnP devices on the network, but they cannot monitor the traffic between the devices as the communication is happening directly (service discovery is via multicast):\nUPnP-Inspector GUPnP Universal Control Point Because of a switched network the traffic does not go through my OpenWRT router either, so sniffing on the WLAN-LAN bridge br-lan does not work either. That means the only chance to get a hook into the communication channel was to use arpspoof, part of the dsniff networking tool-chain, together with tcpdump and wireshark for sniffing and visualization.\n\u0026ldquo;ARP spoofing[1] is a computer hacking technique whereby an attacker sends fake (\u0026ldquo;spoofed\u0026rdquo;) Address Resolution Protocol (ARP) messages onto a Local Area Network. Generally, the aim is to associate the attacker\u0026rsquo;s MAC address with the IP address of another host (such as the default gateway), causing any traffic meant for that IP address to be sent to the attacker instead.\u0026rdquo; (See http://en.wikipedia.org/wiki/ARP_spoofing)\nOn my Ubuntu desktop the following packages need to be installed to get started:\nsudo apt-get install dsniff wireshark tcpdump Three devices are part of the show:\nAndroid Phone - 192.168.0.107 Sony LCD TV - 192.168.0.77 Desktop PC - 192.168.0.17 Before spoofing can be set up we need to make sure that IP packages are forwarded on the desktop machine:\nsudo \u0026ldquo;echo 1 \u0026gt; /proc/sys/net/ipv4/ip_forward\u0026rdquo;\nWe need to tell the Android Phone that we are the Sony LCD TV:\nsudo arpspoof -i eth0 -t 192.168.0.107 192.168.0.77 and the Sony LCD TV that we are the Android Phone:\nsudo arpspoof -i eth0 -t 192.168.0.77 192.168.0.107 Then the sniffing can be started with the following command\nsudo \u0026#34;tcpdump not arp -s0 -w - | wireshark -k -i -\u0026#34; In Wireshark you can simply search for the String \u0026ldquo;AVTransportURI\u0026rdquo; (Edit / Find packet\u0026hellip; / Find By: String \u0026ldquo;AVTransportURI\u0026rdquo; / Search In: Packet Bytes) to find the HTTP request that informs the LCD TV which song to play.\nRight click on the selected line and choose \u0026ldquo;Decode as\u0026hellip;\u0026rdquo; from the context menu. Then swith to the \u0026ldquo;Transport\u0026rdquo; tab and select \u0026ldquo;HTTP\u0026rdquo; from the list. Finally click on \u0026ldquo;OK\u0026rdquo; to decode the packet as HTTP.\nPOST /upnp/control/AVTransport HTTP/1.1 Content-type: text/xml;charset=\u0026#34;utf-8\u0026#34; Soapaction: \u0026#34;urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI\u0026#34; Content-Length: 1493 Host: 192.168.0.77:52323 Connection: Keep-Alive User-Agent: Android/4.1.1 UPnP/1.0 BubbleUPnP/1.5.4 \u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;utf-8\u0026#34; standalone=\u0026#34;yes\u0026#34;?\u0026gt; \u0026lt;s:Envelope s:encodingStyle=\u0026#34;http://schemas.xmlsoap.org/soap/encoding/\u0026#34; xmlns:s=\u0026#34;http://schemas.xmlsoap.org/soap/envelope/\u0026#34;\u0026gt; \u0026lt;s:Body\u0026gt; \u0026lt;u:SetAVTransportURI xmlns:u=\u0026#34;urn:schemas-upnp-org:service:AVTransport:1\u0026#34;\u0026gt; \u0026lt;InstanceID\u0026gt;0\u0026lt;/InstanceID\u0026gt; \u0026lt;CurrentURI\u0026gt;http://192.168.0.107:57645/external/audio/media/10839.mp3\u0026lt;/CurrentURI\u0026gt; \u0026lt;CurrentURIMetaData\u0026gt; \u0026lt;DIDL-Lite xmlns=\u0026#34;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\u0026#34; xmlns:upnp=\u0026#34;urn:schemas-upnp-org:metadata-1-0/upnp/\u0026#34; xmlns:dc=\u0026#34;http://purl.org/dc/elements/1.1/\u0026#34; xmlns:dlna=\u0026#34;urn:schemas-dlna-org:metadata-1-0/\u0026#34;\u0026gt; \u0026lt;item id=\u0026#34;/external/audio/albums/6/10839\u0026#34; parentID=\u0026#34;/external/audio/albums/6\u0026#34; restricted=\u0026#34;1\u0026#34;\u0026gt; \u0026lt;upnp:class\u0026gt;object.item.audioItem.musicTrack\u0026lt;/upnp:class\u0026gt; \u0026lt;dc:title\u0026gt;Blind Willie\u0026lt;/dc:title\u0026gt; \u0026lt;dc:creator\u0026gt;Rob Towns\u0026lt;/dc:creator\u0026gt; \u0026lt;upnp:artist\u0026gt;Rob Towns\u0026lt;/upnp:artist\u0026gt; \u0026lt;upnp:albumArtURI\u0026gt;http://192.168.0.107:57645/external/audio/albums/6.jpg\u0026lt;/upnp:albumArtURI\u0026gt; \u0026lt;upnp:album\u0026gt;media\u0026lt;/upnp:album\u0026gt;\u0026lt;dc:date\u0026gt;2001-01-01\u0026lt;/dc:date\u0026gt; \u0026lt;res protocolInfo=\u0026#34;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0\u0026#34; size=\u0026#34;2703360\u0026#34; duration=\u0026#34;0:02:15.000\u0026#34;\u0026gt;http://192.168.0.107:57645/external/audio/media/10839.mp3\u0026lt;/res\u0026gt;\u0026lt;/item\u0026gt; \u0026lt;/DIDL-Lite\u0026gt; \u0026lt;/CurrentURIMetaData\u0026gt; \u0026lt;/u:SetAVTransportURI\u0026gt; \u0026lt;/s:Body\u0026gt; \u0026lt;/s:Envelope\u0026gt; With this method it will be easily possible to tweak a Cling Java client to speak to the Sony LCD TV.\n","permalink":"https://rumpf.eu/michael/posts/2012-10-08-debugging-upnpdlna-traffic-to-sony-lcd/","summary":"\u003cp\u003eThe issue I have is that my Sony LCD TV seems to be very picky regarding the UPnP/DLNA protocol when playing\nmedia from a control point to the television. The Android App\n\u003ca href=\"https://play.google.com/store/apps/details?id=com.bubblesoft.android.bubbleupnp\u0026amp;hl=en\"\u003eBubbleUPnP\u003c/a\u003e does a\ngood job here as playing music works out of the box. Initial tests with the \u003ca href=\"http://4thline.org/projects/cling/\"\u003eCling Java library\u003c/a\u003e\nto play music does not work out of the box. Therefore I wanted to debug the HTTP SOAP protocol in order to see where the differences are.\u003c/p\u003e","title":"Debugging UPnP/DLNA traffic to a Sony LCD TV"},{"content":"Changing source and target version to 1.7 is not sufficient to enable Java 7 on Buildhive at the moment.\nAdding the following profile to your Maven POM makes sure that your local build is not affected by the special configuration and when running on Buildhive, JDK 7 is used for both build and test-run.\n\u0026lt;profiles\u0026gt; \u0026lt;profile\u0026gt; \u0026lt;id\u0026gt;buildhive\u0026lt;/id\u0026gt; \u0026lt;build\u0026gt; \u0026lt;plugins\u0026gt; \u0026lt;plugin\u0026gt; \u0026lt;groupId\u0026gt;org.apache.maven.plugins\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;maven-compiler-plugin\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;2.5.1\u0026lt;/version\u0026gt; \u0026lt;configuration\u0026gt; \u0026lt;source\u0026gt;1.7\u0026lt;/source\u0026gt; \u0026lt;target\u0026gt;1.7\u0026lt;/target\u0026gt; \u0026lt;showDeprecation\u0026gt;true\u0026lt;/showDeprecation\u0026gt; \u0026lt;showWarnings\u0026gt;true\u0026lt;/showWarnings\u0026gt; \u0026lt;encoding\u0026gt;UTF-8\u0026lt;/encoding\u0026gt; \u0026lt;executable\u0026gt;/opt/jdk/jdk1.7.0/bin/javac\u0026lt;/executable\u0026gt; \u0026lt;fork\u0026gt;true\u0026lt;/fork\u0026gt; \u0026lt;/configuration\u0026gt; \u0026lt;/plugin\u0026gt; \u0026lt;plugin\u0026gt; \u0026lt;groupId\u0026gt;org.apache.maven.plugins\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;maven-surefire-plugin\u0026lt;/artifactId\u0026gt; \u0026lt;configuration\u0026gt; \u0026lt;jvm\u0026gt;/opt/jdk/jdk1.7.0/bin/java\u0026lt;/jvm\u0026gt; \u0026lt;forkMode\u0026gt;once\u0026lt;/forkMode\u0026gt; \u0026lt;/configuration\u0026gt; \u0026lt;/plugin\u0026gt; \u0026lt;/plugins\u0026gt; \u0026lt;/build\u0026gt; \u0026lt;/profile\u0026gt; \u0026lt;/profiles\u0026gt; The profile can be selected by adding the following line to the configuration of your Buildhive job:\nMaven Goals: -Pbuildhive clean install\n","permalink":"https://rumpf.eu/michael/posts/2012-08-14-use-java-7-on-buildhive/","summary":"\u003cp\u003eChanging source and target version to 1.7 is not sufficient to enable Java 7 on Buildhive at the moment.\u003cbr\u003e\nAdding the following profile to your Maven POM makes sure that your local build is not affected by\nthe special configuration and when running on Buildhive, JDK 7 is used for both build and test-run.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e  \u0026lt;profiles\u0026gt;  \n    \u0026lt;profile\u0026gt;  \n      \u0026lt;id\u0026gt;buildhive\u0026lt;/id\u0026gt;  \n      \u0026lt;build\u0026gt;  \n        \u0026lt;plugins\u0026gt;  \n          \u0026lt;plugin\u0026gt;  \n            \u0026lt;groupId\u0026gt;org.apache.maven.plugins\u0026lt;/groupId\u0026gt;  \n            \u0026lt;artifactId\u0026gt;maven-compiler-plugin\u0026lt;/artifactId\u0026gt;  \n            \u0026lt;version\u0026gt;2.5.1\u0026lt;/version\u0026gt;  \n            \u0026lt;configuration\u0026gt;  \n              \u0026lt;source\u0026gt;1.7\u0026lt;/source\u0026gt;  \n              \u0026lt;target\u0026gt;1.7\u0026lt;/target\u0026gt;  \n              \u0026lt;showDeprecation\u0026gt;true\u0026lt;/showDeprecation\u0026gt;  \n              \u0026lt;showWarnings\u0026gt;true\u0026lt;/showWarnings\u0026gt;  \n              \u0026lt;encoding\u0026gt;UTF-8\u0026lt;/encoding\u0026gt;  \n              \u0026lt;executable\u0026gt;/opt/jdk/jdk1.7.0/bin/javac\u0026lt;/executable\u0026gt;  \n              \u0026lt;fork\u0026gt;true\u0026lt;/fork\u0026gt;  \n            \u0026lt;/configuration\u0026gt;  \n          \u0026lt;/plugin\u0026gt;  \n          \u0026lt;plugin\u0026gt;  \n            \u0026lt;groupId\u0026gt;org.apache.maven.plugins\u0026lt;/groupId\u0026gt;  \n            \u0026lt;artifactId\u0026gt;maven-surefire-plugin\u0026lt;/artifactId\u0026gt;  \n            \u0026lt;configuration\u0026gt;  \n              \u0026lt;jvm\u0026gt;/opt/jdk/jdk1.7.0/bin/java\u0026lt;/jvm\u0026gt;  \n              \u0026lt;forkMode\u0026gt;once\u0026lt;/forkMode\u0026gt;  \n            \u0026lt;/configuration\u0026gt;  \n          \u0026lt;/plugin\u0026gt;  \n        \u0026lt;/plugins\u0026gt;  \n      \u0026lt;/build\u0026gt;  \n    \u0026lt;/profile\u0026gt;  \n  \u0026lt;/profiles\u0026gt;  \n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe profile can be selected by adding the following line to the configuration of your Buildhive job:\u003c/p\u003e","title":"Use Java 7 on Buildhive"},{"content":"My Raspberry Pi finally arrived after 4 months:\nThe stable Debian distribution \u0026ldquo;Squeeze\u0026rdquo; does not contain support for all of the Raspberry Pi features. That means there is no way around the the latest Debian \u0026ldquo;Wheezy\u0026rdquo; image: http://www.raspberrypi.org/archives/1435\nBut even with the latest image version there is still some configuration effort left\u0026hellip;\nWLAN Stick For network connectivity I have chosen the Conrad WLAN Stick N150 Nano, which is based on the following chipset: USB: 0BDA:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter.\nUnfortunately this chipset has some issues with the current drivers from both Debian Linux images as discussed in the forum thread Automatic setup for RTL8188CUS based wifi adapters. By executing the script install-rtl8188cus-latest.sh from the forum thread, the adapter started working immediately after the script was finished.\nThe general WLAN configuration is described in detail in the Debian Wiki: http://wiki.debian.org/WiFi/HowToUse#Command_Line\nAnalog Audio The following commands must be issued to activate the analog output of the Raspberry Pi:\nsudo apt-get install alsa-utils gstreamer-tools madplay gstreamer0.10-alsa sudo modprobe snd_bcm2835 sudo amixer cset numid=3 1 Now you can play a mp3 audio stream via the ALSA device like this:\ngst-launch souphttpsrc location=http://dradio_mp3_dlf_m.akacast.akamaistream.net/7/249/142684/v1/gnl.akacast.akamaistream.net/dradio_mp3_dlf_m \\\\ ! mad \\\\ ! audioconvert \\\\ ! audioresample \\\\ ! alsasink device=hw:0 The fact that the device needs to be specified explicitly \u0026ldquo;device=hw:0\u0026rdquo; indicates another issue here as this is not necessary on my desktop Linux machine.\nFor testing the output without an internet connection you can use the following commands:\ncd /opt/vs/src/hello_pi make ./hello_audio The audio output is not as clear as I expected it to be. I still hear some clicking noises when playing a stream. I hope this will be fixed in upcoming releases of the analog audio driver.\nGPIO Ports In a first test I connected a button to the GPIO port 0 and tried to read the switch state via a simple script:\nsudo -s echo \u0026#34;0\u0026#34; \u0026gt; /sys/class/gpio/export echo \u0026#34;in\u0026#34; \u0026gt; /sys/class/gpio/gpio0/direction watch cat /sys/class/gpio/gpio0/value When pressing and holding the button pressed for at least 2 seconds you will see that the value turns from 1 (not pressed) to 0 (pressed).\nBecause the polling approach consumes too much resources I started looking after an interrupt solution.\nThe Debian \u0026ldquo;Wheezy\u0026rdquo; Beta version does not support interrupts for input ports. However, patches exist and have been included into Linux kernel version 3.2.21 from here: http://www.bootc.net/archives/2012/07/01/new-revision-of-3-2-21/\nIn order to download the kernel and activate it, run the following commands (NOTE: the kernel version changes quite frequently, so the 3.2.23 might be outdated):\nwget http://apt.bootc.net/debian/pool/main/l/linux-source-3.2.23-rpi1+/linux-image-3.2.23-rpi1+_1_armel.deb sudo dpkg -i linux-image-3.2.23-rpi1+_1_armel.deb sudo cp /boot/vmlinuz-3.2.23-rpi1+ /boot/kernel.img After a reboot the kernel provides interrupts on GPIO input ports and a simple C application published on the following thread demonstrates how to handle interrupts: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=7509\u0026amp;p=92074\n","permalink":"https://rumpf.eu/michael/posts/2012-06-30-raspberry-pi/","summary":"\u003cp\u003eMy Raspberry Pi finally arrived after 4 months:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"http://lh4.ggpht.com/-d4He0twcz6g/T-7UaBINYfI/AAAAAAAAJTQ/2exhKrF50Ck/1341051972105.png\"\u003e\u003c/p\u003e\n\u003cp\u003eThe stable Debian distribution \u0026ldquo;Squeeze\u0026rdquo; does not contain support for all of the Raspberry Pi\nfeatures. That means there is no way around the the latest Debian \u0026ldquo;Wheezy\u0026rdquo; image: \n\u003ca href=\"http://www.raspberrypi.org/archives/1435\"\u003ehttp://www.raspberrypi.org/archives/1435\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBut even with the latest image version there is still some configuration effort left\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"wlan-stick\"\u003eWLAN Stick\u003c/h2\u003e\n\u003cp\u003eFor network connectivity I have chosen the Conrad WLAN Stick N150 Nano, which is based on the following chipset: USB: 0BDA:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter.\u003cbr\u003e\nUnfortunately this chipset has some issues with the current drivers from both Debian Linux images as discussed in the forum thread \u003ca href=\"http://www.raspberrypi.org/phpBB3/viewtopic.php?f=26\u0026amp;t=6256\u0026amp;sid=85adf66d944a48285a706d8cb6884190\u0026amp;start=350\"\u003eAutomatic setup for RTL8188CUS based wifi adapters\u003c/a\u003e. By executing the script install-rtl8188cus-latest.sh from the forum thread, the adapter started working immediately after the script was finished.\u003cbr\u003e\nThe general WLAN configuration is described in detail in the Debian Wiki: \u003ca href=\"http://wiki.debian.org/WiFi/HowToUse#Command_Line\"\u003ehttp://wiki.debian.org/WiFi/HowToUse#Command_Line\u003c/a\u003e\u003c/p\u003e","title":"Raspberry Pi"},{"content":"Under Ubuntu I chose the following way to activate wake on LAN on the eth0 device:\n# Install ethtool sudo apt-get install ethtool # Create init script to set the wol bit on the device sudo vi /etc/init.d/wakeonlan #!/bin/sh ethtool -s eth0 wol g exit # Make the script executable sudo chmod a+x /etc/init.d/wakeonlan # Create the init links sudo update-rc.d wakeonlan defaults Under Debian the following approach has been chosen:\n# Get root sudo su - # Edit the network interface configuration vi /etc/network/interfaces # Add the lines post-up/pre-down to your network device section iface eth0 inet dhcp post-up /usr/sbin/ethtool -s $IFACE wol g pre-down /usr/sbin/ethtool -s $IFACE wol g The `post-up/post-down´ commands execute the ethtool each time the eth0 device gets started or stopped. This happens also during boot (post-up) and shutdown (pre-down).\nBoth approaches activate WOL on the network device so that the machine can be started by sending a WOL package.\n","permalink":"https://rumpf.eu/michael/posts/2012-03-03-wake-on-lan/","summary":"\u003cp\u003eUnder Ubuntu I chose the following way to activate wake on LAN on the eth0 device:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# Install ethtool  \nsudo apt-get install ethtool  \n\n# Create init script to set the wol bit on the device  \nsudo vi /etc/init.d/wakeonlan  \n  \n  \n#!/bin/sh  \nethtool -s eth0 wol g  \nexit  \n\n# Make the script executable  \nsudo chmod a+x /etc/init.d/wakeonlan  \n\n# Create the init links  \nsudo update-rc.d wakeonlan defaults  \n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUnder Debian the following approach has been chosen:\u003c/p\u003e","title":"Wake On LAN"},{"content":"For deploying weld-osgi to the jcoderz.org repository the following modifications to the pom.xml files are necessary (after applying the wagon-ssh extensions to the your Maven installation, see previous post):\nDeploy the WELD API packages git clone -b WELD-963 http://github.com/mathieuancelin/api.git WELD-963 cd WELD-963 vi pom.xml Add the following XMl fragment to the maven-deploy-plugin\n\u0026lt;build\u0026gt; \u0026lt;plugins\u0026gt; \u0026lt;plugin\u0026gt; \u0026lt;groupId\u0026gt;org.apache.maven.plugins\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;maven-deploy-plugin\u0026lt;/artifactId\u0026gt; \u0026lt;configuration\u0026gt; \u0026lt;skip\u0026gt;true\u0026lt;/skip\u0026gt; \u0026lt;/configuration\u0026gt; \u0026lt;dependencies\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.apache.maven.wagon\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;wagon-ssh\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;2.2\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;/dependencies\u0026gt; \u0026lt;/plugin\u0026gt; \u0026lt;/plugins\u0026gt; \u0026lt;/build\u0026gt; mvn -e clean install -Dmaven.test.skip=true mvn -e deploy -DaltDeploymentRepository=jcoderz-snapshots::default::scp://jcoderz.org/var/www/repos/maven2-snapshot/ -Dmaven.test.skip=true cd .. 2. Deploy the WELD OSGi packages\ngit clone -b weld-osgi http://github.com/mathieuancelin/core.git weld-osgi cd weld-osgi vi pom.xml Add the following XML into the tag section:\n\u0026lt;plugin\u0026gt; \u0026lt;groupId\u0026gt;org.apache.maven.plugins\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;maven-deploy-plugin\u0026lt;/artifactId\u0026gt; \u0026lt;dependencies\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.apache.maven.wagon\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;wagon-ssh\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;2.2\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;/dependencies\u0026gt; \u0026lt;/plugin\u0026gt; mvn -e clean install -Dmaven.test.skip=true mvn -e deploy -DaltDeploymentRepository=jcoderz-snapshots::default::scp://jcoderz.org/var/www/repos/maven2-snapshot/ -Dmaven.test.skip=true cd environments/osgi Deploy weld-osgi-parent pom.xml to the repository (Is there a way to include the parent pom.xml in the previous run?)\nmvn -e -N deploy -DaltDeploymentRepository=jcoderz-snapshots::default::scp://jcoderz.org/var/www/repos/maven2-snapshot/ -Dmaven.test.skip=true With those deployments the repository is prepared to compile the m3server project\u0026hellip;\n","permalink":"https://rumpf.eu/michael/posts/2011-12-31-for-deploying-weld-osgi-to-jcoderz/","summary":"\u003cp\u003eFor deploying weld-osgi to the jcoderz.org repository the following modifications to the \u003ccode\u003epom.xml\u003c/code\u003e\nfiles are necessary (after applying the wagon-ssh extensions to the your Maven installation, see previous post):\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDeploy the WELD API packages\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egit clone -b WELD-963 http://github.com/mathieuancelin/api.git WELD-963\ncd WELD-963\nvi pom.xml\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAdd the following XMl fragment to the maven-deploy-plugin\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e   \u0026lt;build\u0026gt;  \n      \u0026lt;plugins\u0026gt;  \n         \u0026lt;plugin\u0026gt;  \n            \u0026lt;groupId\u0026gt;org.apache.maven.plugins\u0026lt;/groupId\u0026gt;  \n            \u0026lt;artifactId\u0026gt;maven-deploy-plugin\u0026lt;/artifactId\u0026gt;  \n            \u0026lt;configuration\u0026gt;  \n               \u0026lt;skip\u0026gt;true\u0026lt;/skip\u0026gt;  \n            \u0026lt;/configuration\u0026gt;  \n            \u0026lt;dependencies\u0026gt;  \n              \u0026lt;dependency\u0026gt;  \n                \u0026lt;groupId\u0026gt;org.apache.maven.wagon\u0026lt;/groupId\u0026gt;  \n                \u0026lt;artifactId\u0026gt;wagon-ssh\u0026lt;/artifactId\u0026gt;  \n                \u0026lt;version\u0026gt;2.2\u0026lt;/version\u0026gt;  \n              \u0026lt;/dependency\u0026gt;  \n            \u0026lt;/dependencies\u0026gt;\n         \u0026lt;/plugin\u0026gt;  \n      \u0026lt;/plugins\u0026gt;  \n   \u0026lt;/build\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emvn -e clean install -Dmaven.test.skip=true\nmvn -e deploy -DaltDeploymentRepository=jcoderz-snapshots::default::scp://jcoderz.org/var/www/repos/maven2-snapshot/ -Dmaven.test.skip=true\ncd ..  \n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e \u003cbr\u003e\n2. Deploy the WELD OSGi packages\u003c/p\u003e","title":"Deploying weld-osgi to jcoderz.org repository"},{"content":"Using the maven-deploy-plugin to deploy artifacts to a repository that is not the original target repository of a project is getting complicated with Maven 3 when the wagon SSH provider is not part of the Maven distribution. The following JAR files must be added to the Maven distribution into the lib/ext extension folder:\njsch-0.1.44-1.jar plexus-utils-3.0.jar plexus-interactivity-api-1.0-alpha-6.jar wagon-ssh-2.2.jar\\n* wagon-ssh-external-2.2.jar wagon-ssh-common-2.2.jar Then the parent pom.xml of the project must be extended by the following lines:\n\u0026lt;dependecy\u0026gt; \u0026lt;groupid\u0026gt;org.apache.maven.plugins\u0026lt;/groupid\u0026gt; \u0026lt;artifactid\u0026gt;maven-deploy-plugin\u0026lt;/artifactid\u0026gt; \u0026lt;/dependecy\u0026gt; \u0026lt;dependecy\u0026gt; \u0026lt;groupid\u0026gt;org.apache.maven.wagon\u0026lt;/groupid\u0026gt; \u0026lt;artifactid\u0026gt;wagon-ssh\u0026lt;/artifactid\u0026gt; \u0026lt;version\u0026gt;2.2\u0026lt;/version\u0026gt; \u0026lt;/dependecy\u0026gt; The settings.xml contains the user credentials and looks like this: \u0026lt;servers\u0026gt; \u0026lt;server\u0026gt;\u0026lt;id\u0026gt;myrepo-snapshots\u0026lt;/id\u0026gt; \u0026lt;username\u0026gt;username\u0026lt;/username\u0026gt; \u0026lt;privatekey\u0026gt;${user.home}/.ssh/id_rsa\u0026lt;/privatekey\u0026gt; \u0026lt;passphrase\u0026gt;key-passphrase\u0026lt;/passphrase\u0026gt; \u0026lt;filepermissions\u0026gt;666\u0026lt;/filepermissions\u0026gt; \u0026lt;directorypermissions\u0026gt;777\u0026lt;/directorypermissions\u0026gt; \u0026lt;/server\u0026gt; \u0026lt;/servers\u0026gt; Then the deploy phase can be executed like this:\nmvn deploy -DaltDeploymentRepository=myrepo-snapshots::default::scp://host:port/var/www/repos/maven2-snapshot/ ","permalink":"https://rumpf.eu/michael/posts/2011-12-31-maven-3-ssh-deploy-to-foreign/","summary":"\u003cp\u003eUsing the maven-deploy-plugin to deploy artifacts to a repository that is not the\noriginal target repository of a project is getting complicated with Maven 3 when\nthe wagon SSH provider is not part of the Maven distribution. The following JAR\nfiles must be added to the Maven distribution into the \u003ccode\u003elib/ext\u003c/code\u003e extension folder:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ejsch-0.1.44-1.jar\u003c/li\u003e\n\u003cli\u003eplexus-utils-3.0.jar\u003c/li\u003e\n\u003cli\u003eplexus-interactivity-api-1.0-alpha-6.jar\u003c/li\u003e\n\u003cli\u003ewagon-ssh-2.2.jar\\n* wagon-ssh-external-2.2.jar\u003c/li\u003e\n\u003cli\u003ewagon-ssh-common-2.2.jar\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThen the parent \u003ccode\u003epom.xml\u003c/code\u003e of the project must be extended by the  following lines:\u003c/p\u003e","title":"Maven 3: SSH deployment to foreign repository"},{"content":"In case you want to use Weld inside your OSGi application you first need to compile a few branches on your own:\nWELD-963 branch of the weld/api project weld-osgi branch from the weld/core project Those branches will soon be merged into the official Weld codebase. But in the meantime you need to follow the steps below in order to get the packages compiled.\nA prerequisite is that git and Maven 3 is available\ngit clone -b WELD-963 http://github.com/mathieuancelin/api.git WELD-963 cd WELD-963 mvn clean install cd .. git clone -b weld-osgi http://github.com/mathieuancelin/core.git weld-osgi cd weld-osgi mvn clean install -Dmaven.test.skip=true find . -name \u0026#34;weld-osgi-core*SNAPSHOT.jar\u0026#34; -exec cp {} . \\; The last command above copies the following files into your current directory:\nweld-osgi-core-api-1.1.5-SNAPSHOT.jar weld-osgi-core-extension-1.1.5-SNAPSHOT.jar weld-osgi-core-integration-1.1.5-SNAPSHOT.jar weld-osgi-core-mandatory-1.1.5-SNAPSHOT.jar weld-osgi-core-spi-1.1.5-SNAPSHOT.jar You can now deploy those packages into your local repository so that they can be used in your own project\u0026rsquo;s pom.xml.\nmvn deploy:deploy-file -DgroupId=org.jboss.weld.osgi \\ -DartifactId=weld-osgi-core-api \\ -Dversion=1.1.5-SNAPSHOT \\ -Dpackaging=jar \\ -Dfile=weld-osgi-core-api-1.1.5-SNAPSHOT.jar mvn install:install-file -DgroupId=org.jboss.weld.osgi \\ -DartifactId=weld-osgi-core-extension \\ -Dversion=1.1.5-SNAPSHOT \\ -Dpackaging=jar \\ -Dfile=weld-osgi-core-extension-1.1.5-SNAPSHOT.jar mvn install:install-file -DgroupId=org.jboss.weld.osgi \\ -DartifactId=weld-osgi-core-integration \\ -Dversion=1.1.5-SNAPSHOT \\ -Dpackaging=jar \\ -Dfile=weld-osgi-core-integration-1.1.5-SNAPSHOT.jar mvn install:install-file -DgroupId=org.jboss.weld.osgi \\ -DartifactId=weld-osgi-core-mandatory \\ -Dversion=1.1.5-SNAPSHOT \\ -Dpackaging=jar \\ -Dfile=weld-osgi-core-mandatory-1.1.5-SNAPSHOT.jar mvn install:install-file -DgroupId=org.jboss.weld.osgi \\ -DartifactId=weld-osgi-core-spi \\ -Dversion=1.1.5-SNAPSHOT \\ -Dpackaging=jar \\ -Dfile=weld-osgi-core-spi-1.1.5-SNAPSHOT.jar The pom.xml of your assembly package might look like this:\n\u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.jboss.weld.osgi\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;weld-osgi-core-api\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;1.1.5-SNAPSHOT\u0026lt;/version\u0026gt; \u0026lt;scope\u0026gt;runtime\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.jboss.weld.osgi\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;weld-osgi-core-extension\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;1.1.5-SNAPSHOT\u0026lt;/version\u0026gt; \u0026lt;scope\u0026gt;runtime\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.jboss.weld.osgi\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;weld-osgi-core-integration\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;1.1.5-SNAPSHOT\u0026lt;/version\u0026gt; \u0026lt;scope\u0026gt;runtime\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.jboss.weld.osgi\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;weld-osgi-core-mandatory\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;1.1.5-SNAPSHOT\u0026lt;/version\u0026gt; \u0026lt;scope\u0026gt;runtime\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.jboss.weld.osgi\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;weld-osgi-core-spi\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;1.1.5-SNAPSHOT\u0026lt;/version\u0026gt; \u0026lt;scope\u0026gt;runtime\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; ","permalink":"https://rumpf.eu/michael/posts/2011-12-06-building-weld-osgi/","summary":"\u003cp\u003eIn case you want to use \u003ca href=\"http://seamframework.org/Weld\"\u003eWeld\u003c/a\u003e inside your OSGi application you first need to compile a few branches on your own:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mathieuancelin/api/tree/WELD-963\"\u003eWELD-963\u003c/a\u003e branch of the weld/api project\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mathieuancelin/core/tree/weld-osgi\"\u003eweld-osgi\u003c/a\u003e branch from the weld/core project\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThose branches will soon be merged into the official Weld codebase. But in the meantime you need to follow the steps below in order to get the packages compiled.\u003cbr\u003e\nA prerequisite is that git and Maven 3 is available\u003c/p\u003e","title":"Building weld-osgi"},{"content":"m3player version 0.1.3 has the following new features:\nm3player can be run as a daemon with -d or --daemon The name of the UPnP Media Renderer can be configured by -n or --name. This is done by copying the XML files from /usr/share/m3player to /var/lib/m3player and filtering place-holders in some of the files. The version of the MediaRenderer device can be configured by -r or --root. The default is MediaRendererV2.xml The UPnP server can be bound to a network interface, specified by -i or --interface. Example: eth0 The help output shows an overview of all the parameters available:\n$ ./m3player -h Usage: m3player [OPTION...] Help Options: -h, --help Show help options Application Options: -c, --config Path to the config file (Default: /etc/m3player/m3player.ini) -p, --pid Path to the pid file (Default: /var/run/m3player.pid) -s, --xmlsource Path to the XML source folder (Default: /usr/share/m3player) -t, --xmltarget Path to the XML target folder (Default: /var/lib/m3player) -n, --name The name of the player instance (Default: HOSTNAME) -r, --root The name of the root device file (Default: MediaRendererV2.xml) -l, --log The name of the log file (Default: /var/log/m3player.log) -i, --interface The name of the interface the process is bound to (e.g. eth0) -d, --daemonise Fork the player as daemon ","permalink":"https://rumpf.eu/michael/posts/2011-08-20-m3player-version-013-released/","summary":"\u003cp\u003e\u003ca href=\"http://www.jcoderz.org/m3dditiez/wiki/m3ddity-player\"\u003em3player version 0.1.3\u003c/a\u003e has the following new features:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003em3player can be run as a daemon with \u003ccode\u003e-d\u003c/code\u003e or \u003ccode\u003e--daemon\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eThe name of the UPnP Media Renderer can be configured by \u003ccode\u003e-n\u003c/code\u003e or \u003ccode\u003e--name\u003c/code\u003e. This is done by copying\nthe XML files from \u003ccode\u003e/usr/share/m3player\u003c/code\u003e to \u003ccode\u003e/var/lib/m3player\u003c/code\u003e and filtering place-holders in some of the files.\u003c/li\u003e\n\u003cli\u003eThe version of the MediaRenderer device can be configured by \u003ccode\u003e-r\u003c/code\u003e or \u003ccode\u003e--root\u003c/code\u003e. The default is \u003ccode\u003eMediaRendererV2.xml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eThe UPnP server can be bound to a network interface, specified by \u003ccode\u003e-i\u003c/code\u003e or \u003ccode\u003e--interface\u003c/code\u003e. Example: eth0\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe help output shows an overview of all the parameters available:\u003c/p\u003e","title":"m3player version 0.1.3 released"},{"content":"As most of the public HOWTOs seem to be either incomplete or a bit outdated and because I have no copy of the book Advanced Programming in the UNIX Environment, Instead I found the following microHOWTOs:\nCause a process to become a daemon Cause a process to become a daemon in c By following the steps, described there I was able to turn m3player into a daemon. The daemon behavior can be turned on by passing the -d or --daemon switches to the command line. When the daemon switch is specified, all output (stdout and stderr) gets redirected into the log file at the default location /var/log/m3player.log or to the location, specified by the -l or --logfile switch.\n","permalink":"https://rumpf.eu/michael/posts/2011-08-11-turning-m3player-into-daemon/","summary":"\u003cp\u003eAs most of the public HOWTOs seem to be either incomplete or a bit outdated and because I\nhave no copy of the book\n\u003ca href=\"http://www.amazon.com/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0201563177\"\u003eAdvanced Programming in the UNIX Environment\u003c/a\u003e,\nInstead I found the following microHOWTOs:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.microhowto.info/howto/cause_a_process_to_become_a_daemon.html\"\u003eCause a process to become a daemon\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.microhowto.info/howto/cause_a_process_to_become_a_daemon_in_c.html\"\u003eCause a process to become a daemon in c\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBy following the steps, described there I was able to turn\n\u003ca href=\"http://www.jcoderz.org/m3dditiez/wiki/m3ddity-player\"\u003em3player\u003c/a\u003e into a daemon.\nThe daemon behavior can be turned on by passing the \u003ccode\u003e-d\u003c/code\u003e or \u003ccode\u003e--daemon\u003c/code\u003e switches to the command\nline. When the daemon switch is specified, all output (stdout and stderr) gets redirected into\nthe log file at the default location \u003ccode\u003e/var/log/m3player.log\u003c/code\u003e or to the location, specified by\nthe \u003ccode\u003e-l\u003c/code\u003e or \u003ccode\u003e--logfile\u003c/code\u003e switch.\u003c/p\u003e","title":"Turning m3player into a daemon"},{"content":"I just released version 0.1.2 of m3player. The new version includes:\nCompilation and packaging for OpenWRT Installation of the ipkg package on the TL-WR1043ND device Support for command-line parameters: config - Path to the config file (/etc/m3player/m3player.ini) pidfile - Location of the PID file (/var/run/m3player.pid) xmlfolder - Location of the descriptor XML files (/usr/share/m3player) name - Set the name of the player instance (Hostname or m3player) filename - The name of the root device file (MediaRenderedV1.xml) Support for an INI file (/etc/m3player/m3player.ini) Fixes to the GStreamer pipeline to work in the stripped down OpenWRT environment with only a few plugins When launching the m3player it starts playing the first entry from the preset list.\nThe next version will include support for preset switching via the QSS button.\n","permalink":"https://rumpf.eu/michael/posts/2011-08-01-m3player-version-012-released/","summary":"\u003cp\u003eI just released version 0.1.2 of \u003ca href=\"http://www.jcoderz.org/m3dditiez/wiki/m3ddity-player\"\u003em3player\u003c/a\u003e. The new version includes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCompilation and packaging for OpenWRT\u003c/li\u003e\n\u003cli\u003eInstallation of the ipkg package on the TL-WR1043ND device\u003c/li\u003e\n\u003cli\u003eSupport for command-line parameters:\n\u003cul\u003e\n\u003cli\u003econfig - Path to the config file (\u003cspan style=\"font-family: \u0026quot;Courier New\u0026quot;,Courier,monospace;\"\u003e/etc/m3player/m3player.ini\u003c/span\u003e)\u003c/li\u003e\n\u003cli\u003epidfile - Location of the PID file (\u003cspan style=\"font-family: \u0026quot;Courier New\u0026quot;,Courier,monospace;\"\u003e/var/run/m3player.pid\u003c/span\u003e)\u003c/li\u003e\n\u003cli\u003exmlfolder - Location of the descriptor XML files (\u003cspan style=\"font-family: \u0026quot;Courier New\u0026quot;,Courier,monospace;\"\u003e/usr/share/m3player\u003c/span\u003e)\u003c/li\u003e\n\u003cli\u003ename - Set the name of the player instance (Hostname or m3player)\u003c/li\u003e\n\u003cli\u003efilename - The name of the root device file (\u003cspan style=\"font-family: \u0026quot;Courier New\u0026quot;,Courier,monospace;\"\u003eMediaRenderedV1.xml\u003c/span\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eSupport for an INI file (\u003cspan style=\"font-family: \u0026quot;Courier New\u0026quot;,Courier,monospace;\"\u003e/etc/m3player/m3player.ini\u003c/span\u003e)\u003c/li\u003e\n\u003cli\u003eFixes to the GStreamer pipeline to work in the stripped down OpenWRT environment with only a few plugins\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhen launching the \u003ca href=\"http://www.jcoderz.org/m3dditiez/wiki/m3ddity-player\"\u003em3player\u003c/a\u003e it starts playing the first entry from the preset list.\u003c/p\u003e","title":"m3player version 0.1.2 released"},{"content":"This article gives a step-by-step description on how to get the m3ddity-player working on the TP-Link TL-WR1043ND device, using the stable version of OpenWRT 10.03 (backfire).\nFirst you need to checkout the OpenWRT 10.03 (backfire) branch:\nsvn co svn://svn.openwrt.org/openwrt/branches/backfire cd backfire Then the feed for the m3ddity-player must be added:\ncp feeds.conf.default feeds.conf echo \u0026#34;src-svn jcoderz http://www.jcoderz.org/svn/m3dditiez/branches/openwrt-10.3/packages\u0026#34; \u0026gt;\u0026gt; feeds.conf ./scripts/feeds update ./scripts/feeds install -a Now run menuconfig and select the necessary modules:\nmake menuconfig The following list shows only menuconfig entries where settings have been changed. Settings not shown here are left untouched.\nTarget System (Atheros AR71xx/AR7240/AR913x) Target Profile (TP-Link TL-WR1043ND v1) Global build settings ---\u0026gt; [*] Remove ipkg/opkg status/data files in final images [ ] Enable ipv6 support in packages [*] Build the OpenWRT based toolchain [*] Image configuration ---\u0026gt; (192.168.0.5)LAN DNS server (192.168.0.5)LAN Gateway (255.255.255.0) LAN Network Mask (192.168.0.111) LAN IP Address Base system \u0026lt;*\u0026gt; block-mount \u0026lt; \u0026gt; dnsmasq \u0026lt; \u0026gt; firewall Kernel Modules Filesystems \u0026lt;*\u0026gt; kmod-fs-ext3 (for USB drive) \u0026lt;*\u0026gt; kmod-nls-utf8 Other modules \u0026lt;*\u0026gt; kmod-ledtrig-netdev Sound Support \u0026lt;*\u0026gt; kmod-sound-core USB Support \u0026lt;*\u0026gt; kmod-usb-core \u0026lt;*\u0026gt; kmod-usb-audio \u0026lt;*\u0026gt; kmod-usb-ohci \u0026lt;*\u0026gt; kmod-usb-storage (for USB drive) Network \u0026lt; \u0026gt; ppp \u0026lt; \u0026gt; iptables Time Synchronization\u0026lt;*\u0026gt;ntpdate Multimedia \u0026lt;*\u0026gt; gst-mod-alsa \u0026lt;*\u0026gt; gst-mod-mad \u0026lt;*\u0026gt; gst-mod-souphttpsrc \u0026lt;*\u0026gt; gstreamer \u0026lt;*\u0026gt; m3ddity-player (only with [jCoderZ.org](http://www.jcoderz.org/m3dditiez/wiki/openwrt-packages) modules) Utilities \u0026lt;*\u0026gt; alsa-utils (for alsamixer/alsactl) After the configuration step is completed, the image can be compiled with the following command:\nmake\nThe next steps assume that the router is already running a stable version of OpenWRT (flashed initially via the original vendor UI). If that is the case you can now connect to the router by running:\ntelnet 192.168.0.111 # The IP configured during menuconfig Now copy the new image to a location on the router with enough space, for example a USB stick (/dev/sda1):\nmkdir /mnt/usb mount -t ext2 /dev/sda1 /mnt/usb cd /mnt/usb scp USERNAME@HOST:HOME/backfire/bin/ar71xx/openwrt-ar71xx-generic-tl-wr1043nd-v1-squashfs-sysupgrade.bin . Now drop the caches:\necho 3 \u0026gt; /proc/sys/vm/drop_caches Then reflash the image with the following command:\nmtd -r write openwrt-ar71xx-generic-tl-wr1043nd-v1-squashfs-sysupgrade.bin firmware The router will reboot and you can connect again after reboot:\ntelnet 192.168.0.111 Replace the USB stick with the USB audio device and run the m3ddity-player with the following command:\nm3player Now you should hear a sound as the m3player starts playing one of its presets from the config file /etc/m3player/m3player.ini.\n","permalink":"https://rumpf.eu/michael/posts/2011-07-31-building-tp-link-tl-wr1043nd-openwrt/","summary":"\u003cp\u003eThis article gives a step-by-step description on how to get the\n\u003ca href=\"http://www.jcoderz.org/m3dditiez/wiki/m3ddity-player\"\u003em3ddity-player\u003c/a\u003e working on the\nTP-Link TL-WR1043ND device, using the stable version of OpenWRT 10.03 (backfire).\u003c/p\u003e\n\u003cp\u003eFirst you need to checkout the OpenWRT 10.03 (backfire) branch:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esvn co svn://svn.openwrt.org/openwrt/branches/backfire\ncd backfire\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen the feed for the \u003ca href=\"http://www.jcoderz.org/m3dditiez/wiki/m3ddity-player\"\u003em3ddity-player\u003c/a\u003e must be added:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecp feeds.conf.default feeds.conf\necho \u0026#34;src-svn jcoderz http://www.jcoderz.org/svn/m3dditiez/branches/openwrt-10.3/packages\u0026#34; \u0026gt;\u0026gt; feeds.conf\n./scripts/feeds update ./scripts/feeds install -a\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNow run menuconfig and select the necessary modules:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emake menuconfig \n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe following list shows only menuconfig entries where settings have been changed. Settings not shown here are left untouched.\u003c/p\u003e","title":"Building a TP-Link TL-WR1043ND OpenWRT 10.03 image"},{"content":"The m3ddity-player and the GUPnP libraries, on which the player depends upon, can now easily be build for OpenWRT, just follow the steps below:\n1. Checkout the trunk version of OpenWRT\nsvn co svn://svn.openwrt.org/openwrt/trunk cd trunk Add the jCoderZ package repository to the list of feeds cp feeds.conf.default feeds.conf echo \u0026#34;src-svn jcoderz \u0026#34; \\ \u0026#34;http://www.jcoderz.org/svn/m3dditiez/trunk/\u0026#34; \\ \u0026#34;openwrt/packages\u0026#34; \u0026gt;\u0026gt; feeds.conf ./scripts/feeds update ./scripts/feeds install -a 3. Run menuconfig and select the packages as described here\nmake menuconfig 4. Additionally select the package Multimedia/m3ddity-player. This automatically selects the necessary GUPnP libraries.\nFinally, you can build the image make -j 5 But be warned, the trunk version of OpenWRT might be broken and flashing the image might result in a bricked device that can only be restored via the serial console. For the TL-WR1043ND, this even involves soldering!\n","permalink":"https://rumpf.eu/michael/posts/2011-07-25-music-player-fully-integrated-into/","summary":"\u003cp\u003eThe \u003ca href=\"http://www.jcoderz.org/m3dditiez/wiki/m3ddity-player\"\u003em3ddity-player\u003c/a\u003e and the GUPnP libraries,\non which the player depends upon, can now easily be build for OpenWRT, just follow the steps below:\u003c/p\u003e\n\u003cp\u003e1. Checkout the trunk version of OpenWRT\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esvn co svn://svn.openwrt.org/openwrt/trunk\ncd trunk\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eAdd the \u003ca href=\"http://www.jcoderz.org/m3dditiez/\"\u003ejCoderZ\u003c/a\u003e package repository to the list of feeds \u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecp feeds.conf.default feeds.conf  \necho \u0026#34;src-svn jcoderz \u0026#34; \\   \n     \u0026#34;http://www.jcoderz.org/svn/m3dditiez/trunk/\u0026#34; \\   \n\u0026#34;openwrt/packages\u0026#34; \u0026gt;\u0026gt; feeds.conf  \n./scripts/feeds update   \n./scripts/feeds install -a  \n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e3. Run menuconfig and select the packages as described\n\u003ca href=\"http://dev-snapshot.blogspot.com/2011/07/building-openwrt-image-optimized-for.html\"\u003ehere\u003c/a\u003e\u003c/p\u003e","title":"Music player fully integrated into the OpenWRT build process"},{"content":"The OpenWRT music player, which I have blogged about recently, has found a home at https://github.com/jCoderZ/m3player\n","permalink":"https://rumpf.eu/michael/posts/2011-07-24-jcoderzorg/","summary":"\u003cp\u003eThe OpenWRT music player, which I have blogged about recently, has found a \nhome at \u003ca href=\"https://github.com/jCoderZ/m3player\"\u003ehttps://github.com/jCoderZ/m3player\u003c/a\u003e\u003c/p\u003e","title":"jCoderZ.org"},{"content":"The new audio devices arrived but unfortunately they show the same glitches as the devices I tested before:\nUSB Soundkarte mit Virtual 3D Soundeffekt LogiLink® This device is also based on the chipset \u0026ldquo;Tenx Technology, Inc. TP6911 Audio Headset\u0026rdquo; and has the same issues as the previous device (USB Sound Audio), i.e. the output is far too loud.\nUSB Soundkarte mit Virtual 7.1 Soundeffekt LogiLink® The sound is good but as with the previous device a clicking noise is heard during reboot, power-off, power-on, plug-in/out. The chipset is \u0026ldquo;C-Media Electronics, Inc. Audio Adapter\u0026rdquo; So both adapters use the same chipsets and show the same issues. It seems as if there are not too many different cheap USB audio devices on the market, just rebranded stuff from the same manufacturer.\n\u0026hellip; to be continued!\n","permalink":"https://rumpf.eu/michael/posts/2011-07-19-quest-for-usb-audio-device-part-2/","summary":"\u003cp\u003eThe new audio devices arrived but unfortunately they show the same glitches as the devices I tested\n\u003ca href=\"http://dev-snapshot.blogspot.com/2011/07/seeking-cheap-usb-audio-device-that.html%22\"\u003ebefore\u003c/a\u003e:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"%22http://www.logilink.eu/showproduct/UA0053.htm\"\u003eUSB Soundkarte mit Virtual 3D Soundeffekt LogiLink®\u003c/a\u003e\nThis device is also based on the chipset \u0026ldquo;Tenx Technology, Inc. TP6911 Audio Headset\u0026rdquo; and has the same\nissues as the previous device (USB Sound Audio), i.e. the output is far too loud.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"%22http://www.logilink.eu/showproduct/UA0078.htm\"\u003eUSB Soundkarte mit Virtual 7.1 Soundeffekt LogiLink®\u003c/a\u003e\nThe sound is good but as with the previous device a clicking noise is heard during reboot, power-off,\npower-on, plug-in/out. The chipset is \u0026ldquo;C-Media Electronics, Inc. Audio Adapter\u0026rdquo;\nSo both adapters use the same chipsets and show the same issues. It seems as if there are not\ntoo many different cheap USB audio devices on the market, just rebranded stuff from the same\nmanufacturer.\u003c/p\u003e","title":"Quest for a USB audio device part 2..."},{"content":"I\u0026rsquo;m seeking for a USB audio device that works with the TP-Link TL-WR1043ND under OpenWRT. Until now I tried 2 different devices with unacceptable issues.\n1. USB Sound Audio (Amazon)\nThe device gets detected under Linux as Tenx Technology, Inc. TP6911 Audio Headset. The following warnings are reported by dmesg when connecting the device:\nusb_audio: Warning! Unlikely big volume range (=13568), cval-\u0026gt;res is probably wrong. usb_audio: [2] FU [PCM Playback Volume] ch = 2, val = 2560/16128/1 usb_audio: Warning! Unlikely big volume range (=6096), cval-\u0026gt;res is probably wrong. usb_audio: [5] FU [Mic Capture Volume] ch = 1, val = 0/6096/1 The issue with this device is that the volume level is so high that it cannot be controlled. Between mute and 10% the output sounds distorted. At 20% the volume level is at its maximum, with no audible change between 20% and 100%. 2. auvisio Visual Sound Technologies (pearl.de)\nThe device gets detected as C-Media Electronics, Inc. Audio Adapter.\nThe issue with the device is that a very loud clicking sound gets played when the OpenWRT router starts-up or during shutdown/power-off. The sound is quite loud and it will be very annoying when using the router as a music-player.\nNext\nBoth devices are unsuitable for using them with the router. The next try will be with the following devices\u0026hellip;\nUSB Soundkarte mit Virtual 7.1 Soundeffekt LogiLink®](http://www.logilink.eu/showproduct/UA0078.htm) USB Soundkarte mit Virtual 3D Soundeffekt LogiLink®](http://www.logilink.eu/showproduct/UA0053.htm) ","permalink":"https://rumpf.eu/michael/posts/2011-07-13-seeking-cheap-usb-audio-device-that/","summary":"\u003cp\u003eI\u0026rsquo;m seeking for a USB audio device that works with the TP-Link TL-WR1043ND under OpenWRT. Until now I tried 2 different devices with unacceptable issues.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. USB Sound Audio (Amazon)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://2.bp.blogspot.com/-qWqnVo0dbP8/Th4AOAsdarI/AAAAAAAAElw/m7Hwk4flU3U/s1600/TP6911.jpg\"\u003e\u003cimg loading=\"lazy\" src=\"http://2.bp.blogspot.com/-qWqnVo0dbP8/Th4AOAsdarI/AAAAAAAAElw/m7Hwk4flU3U/s200/TP6911.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe device gets detected under Linux as Tenx Technology, Inc. TP6911 Audio Headset. The following warnings are reported by \u003c/p\u003e\n\u003cp\u003edmesg when connecting the device:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eusb_audio: Warning! Unlikely big volume range (=13568), cval-\u0026gt;res is probably wrong.  \nusb_audio: [2] FU [PCM Playback Volume] ch = 2, val = 2560/16128/1  \nusb_audio: Warning! Unlikely big volume range (=6096), cval-\u0026gt;res is probably wrong.  \nusb_audio: [5] FU [Mic Capture Volume] ch = 1, val = 0/6096/1  \n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe issue with this device is that the volume level is so high that it cannot be controlled. Between mute and 10% the output sounds distorted. At 20% the volume level is at its maximum, with no audible change between 20% and 100%.\n\u003cstrong\u003e2. auvisio Visual Sound Technologies (pearl.de)\u003c/strong\u003e\u003c/p\u003e","title":"Seeking a cheap USB audio device for the TP-Link TL-WR1043ND"},{"content":"The command-line tool alsamixer can be used to control the volume of the USB audio output:\nUnfortunately the setting does not survive a reboot. Another tool from the alsa-utils package can be used for this purpose: alsactl\nAfter setting the volume with alsamixer, the following command persists the current setting in the file-system for device 0:\nalsactl -f /etc/alsa/alsa0.state store 0 During startup, the state must be restored again. This can be achieved by adding the following command to /etc/rc.local:\nalsactl -f /etc/alsa/alsa0.state restore 0 ","permalink":"https://rumpf.eu/michael/posts/2011-07-13-make-alsa-settings-persistent-on/","summary":"\u003cp\u003eThe command-line tool alsamixer can be used to control the volume of the USB audio output:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://2.bp.blogspot.com/-EHJmq1aKXrI/Th3tP-sqcLI/AAAAAAAAEls/SGdLN4yRHo4/s1600/alsamixer.png\"\u003e\u003cimg loading=\"lazy\" src=\"http://2.bp.blogspot.com/-EHJmq1aKXrI/Th3tP-sqcLI/AAAAAAAAEls/SGdLN4yRHo4/s320/alsamixer.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eUnfortunately the setting does not survive a reboot. Another tool from the alsa-utils package can be used for this purpose: alsactl\u003c/p\u003e\n\u003cp\u003eAfter setting the volume with alsamixer, the following command persists the current setting in the file-system for device 0:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ealsactl -f /etc/alsa/alsa0.state store 0  \n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDuring startup, the state must be restored again. This can be achieved by adding the following command to /etc/rc.local:\u003c/p\u003e","title":"Make ALSA settings persistent on OpenWRT"},{"content":"For the audio-renderer, see revious posts, I decided to switch to the trunk version of OpenWRT.\nI experienced some issues with the USB audio hardware and the trunk version should prove that there are no issues with the USB audio drivers which are already fixed.\nThe following configuration is for the bleeding-edge version, some module names have changed so it cannot be applied to the Kamikaze (10.3) version without modification (e.g. block-mount contains the overlay functionality and kmod-fs-ext4 has support for all ext file-system versions).\nNOTE: This configuration has stripped all modules which are not necessary for USB audio and Wireless LAN.\nTarget System: Atheros AR71xx/AR7240/AR913x/AR934x) Target Profile: TP-Link TL-WR1043ND v1 Global build settings ---\u0026gt; [*] Remove ipkg/opkg status/data files in final images [ ] Enable ipv6 support in packages LATER: Strip unnecessary exports from kernel image LATER: Strip unnecessary functions from libraries [*] Build the OpenWRT Image Builder [*] Build the OpenWRT SDK [*] Build the OpenWRT based toolchain [*] Image configuration ---\u0026gt; LAN Gateway: 192.168.0.5 LAN Network Mask: [255.255.255.0](tel:255.255.255.0) LAN IP Address: 192.168.0.111 Base system \u0026lt;*\u0026gt; block-mount \u0026lt; \u0026gt; dnsmasq \u0026lt; \u0026gt; firewall Kernel Modules Filesystems \u0026lt;*\u0026gt; kmod-fs-ext4 (for USB drive) Native Language Support \u0026lt;*\u0026gt; kmod-nls-utf8 Sound Support \u0026lt;*\u0026gt; kmod-sound-core \u0026lt;*\u0026gt; kmod-usb-audio USB Support \u0026lt;*\u0026gt; kmod-usb-ohci \u0026lt;*\u0026gt; kmod-usb-storage (for USB drive) Other Modules (not sure yet whether they are needed) ??? *gpio* ??? (Buttons for preset-switching ???) Network \u0026lt; \u0026gt; ppp Firewall \u0026lt; \u0026gt; iptables Time Synchronization \u0026lt;*\u0026gt; ntpclient Multimedia \u0026lt;*\u0026gt; gst-mod-alsa \u0026lt;*\u0026gt; gst-mod-mad \u0026lt;*\u0026gt; gst-mod-souphttpsrc \u0026lt;*\u0026gt; gstreamer \u0026lt;*\u0026gt; gstreamer-utils (for gst-* tools) Utilities \u0026lt;*\u0026gt; alsa-utils (for alsamixer/alsactl) After the configuration step is completed, the image can be compiled with the following command:\nmake -j 5 # on a quad-core machine With the configuration above the compiled image is 5248kB large, which means 2944kB are free for modules and configuration in the /overlay file-system.\nThen you can connect to the router with the following command (assuming that OpenWRT is already installed):\ntelnet 192.168.0.111 Copy the new image to a location on the router with enough space (I use a 32MB USB stick with ext2 file-system which I mount under /mnt/usb):\nscp USERNAME@HOST:HOME/openwrt-trunk/bin/ar71xx/openwrt-ar71xx-generic-tl-wr1043nd-v1-squashfs-sysupgrade.bin . Now drop the caches:\necho 3 \u0026gt; /proc/sys/vm/drop_caches Then reflash the image with the following command:\nmtd -r write openwrt-ar71xx-generic-tl-wr1043nd-v1-squashfs-sysupgrade.bin firmware The router will reboot and when connecting via telnet again, the setup can be tested with the following command:\ngst-launch souphttpsrc location=http://87.248.219.60/stream/swr_mp3_m_swr1bwa ! mad ! alsasink Et viola, the USB audio device will play the radio station! Hopefully\u0026hellip;.. ;)\n","permalink":"https://rumpf.eu/michael/posts/2011-07-13-building-openwrt-image-optimized-for/","summary":"\u003cp\u003eFor the audio-renderer, see revious posts, I decided to switch to the trunk version of OpenWRT.\u003cbr\u003e\nI experienced some issues with the USB audio hardware and the trunk version should prove that there\nare no issues with the USB audio drivers which are already fixed.\u003cbr\u003e\nThe following configuration is for the bleeding-edge version, some module names have changed so it\ncannot be applied to the Kamikaze (10.3) version without modification (e.g. block-mount contains the\noverlay functionality and kmod-fs-ext4 has support for all ext file-system versions).\u003cbr\u003e\n\u003cstrong\u003eNOTE: This configuration has stripped all modules which are not necessary for USB audio and Wireless LAN.\u003c/strong\u003e\u003c/p\u003e","title":"Building an OpenWRT image optimized for MP3 audio playback"},{"content":"After the Playstation Network Hack I decided to change to secure passwords for all my accounts. The drawback is that nobody can remember secure passwords anymore, so there is no way around using a password safe.\nThe only application that is available on all the different platforms I use is KeePass (V1.x on Windows, KeePassX under Linux, and KeePassDroid on Android). Under Windows the the 1.x version must be used in order to stick to the same file format as the KeePassX and the KeePassDroid applications.\nUsing one database file on many different devices has proven to be a challenge as the file must be located where it can be accessed from all the different devices.\nMy first approach was to use a WebDAV folder which is available from hosters like web.de or 1\u0026amp;1 in Germany.\nThe Linux support for WebDAV is good, dav2fs does what I was looking for and I found absolutely no issues while using it.\nUnfortunately Windows 7 64Bit support for WebDAV is severly broken. Access to the online folder was working a few days but it stopped working, being unable to connect anymore (Error 0x80070043). All the hints and workarounds I found did not work for my business notebook. I also tried the different WebDAV client tools like NetDrive for example. None of them was working reliably in a corporate environment behind a proxy and I did not want to find workarounds for the issues of the WebDAV clients.\nThere is also no free WebDAV support available on Android, making the protocol unusable on my phone and tablet. The consequence would be either to copy the file manually or to extend KeePassDroid in order to access databases via HTTPS/WebDAV.\nAfter a few weeks of pain when trying to log into an account with a secure password I decided to give DropBox a try. Clients are available for all the devices I have and adding an account is very easy and can be setup in under a minute.\nDropBox has been configured to create a new folder and not to sync the whole user\u0026rsquo;s home folder:\nWindows: C:\\Users(USERNAME)\\Dropbox Linux: /home/(USERNAME)/Dropbox Android: /mnt/sdcard/dropbox On all platforms the extension \u0026ldquo;kdb\u0026rdquo; has been associated with the KeePass application, so opening the DropBox folder and double-clicking/pressing on the kdb file opens KeePass/KeePassX/KeePassDroid which asks for the database password.\nSo far DropBox seems to be the solution to my problem. I can access the database with only 2 passwords to remember, the one for the password safe file and the other one for the DropBox account.\nHowever, one issue with concurrent access to the same KeePass file remains. The KeePass application writes a lock file to signal that the database is being used by an instance of the application. Different instances create and delete the lock file so that the file is completely useless in the scenario, described above. The message that a lock file has been found and whether the database should be opened read-only must either be ignored or followed. When followed new entries can be added on one device only.\nWhen you add an entry to the database on one platform this change is propagated to the other devices because of the DropBox sync. Unfortunately running instancs of KeePass do not recognize that a file has changed in the DropBox folder. Only when you add an account there and you try to save the database file you get a message that the file in the file-system has changed.\nThe\nThe solution to this issue would be that KeePass reloads the file on a regular basis as long as no entries have been added. In case a user has added an entry KeePass could do a merge of the two database files by comparing entries one by one and adding new ones to the loaded database before persisting it again.\nAs long as this has not been implemented the only work-around is to do some configuration on the clients so that the application/database is likely to be closed each time you switch the device.\nOne setting is not minimize the application window into the system tray. That keeps the window open and reminds you, when you, for example, cleanup the desktop of your business notebook in evening, to close the application. The next morning you need to reopen the database and load all entries that have been added last evening on your other devices.\nA small step into the merge direction would be to notify the user when the database in the file-system has changed. If such a notification pops-up the database can be closed and re-opened again.\nI have created feature requests for each of the three projects:\nKeePass: 3362189 (Closed, Rejected:http://keepass.info/help/base/multiuser.html) KeePassX: 3362184 KeePassDroid: 206 ","permalink":"https://rumpf.eu/michael/posts/2011-07-09-using-password-safe-on-multiple/","summary":"\u003cp\u003eAfter the Playstation Network Hack I decided to change to secure passwords for all my accounts.\nThe drawback is that nobody can remember secure passwords anymore, so there is no way around using a\npassword safe.\u003c/p\u003e\n\u003cp\u003eThe only application that is available on all the different platforms I use is KeePass (V1.x on Windows,\nKeePassX under Linux, and KeePassDroid on Android). Under Windows the the 1.x version must be used in\norder to stick to the same file format as the KeePassX and the KeePassDroid applications.\u003c/p\u003e","title":"Using a password safe on multiple platforms"},{"content":"One important feature for the audio renderer is the support for presets.\nI do not want to search for my mobile phone in order to select a music source when I enter the kitchen in the morning. The use-case where you turn on your analog radio and the tuning wheel is right at the position of your favorite radio station is unbeatable simple.\nTherefore the audio-renderer has a list of MP3 streaming URLs where the first one will be played upon startup of the process. The channels can be switched by sending a signal to the server process:\nkill -USR1 \u0026lt;PID of audio-renderer\u0026gt; This is a good way to hijack an unused button of your router (for example the QSS button of the TP-Link WR1043ND) and write a simple script as shown here: http://wiki.openwrt.org/doc/howto/hardware.button\nThere is currently no support for M3U files as this is not supported by Gstreamer. The MP3 streams must be extracted manually from the M3U files.\n","permalink":"https://rumpf.eu/michael/posts/2011-06-27-radio-presets/","summary":"\u003cp\u003eOne important feature for the audio renderer is the support for \u003cstrong\u003epresets\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eI do not want to search for my mobile phone in order to select a music source when I enter the kitchen in the morning. The use-case where you turn on your analog radio and the tuning wheel is right at the position of your favorite radio station is unbeatable simple.\u003c/p\u003e\n\u003cp\u003eTherefore the audio-renderer has a list of MP3 streaming URLs where the first one will be played upon startup of the process. The channels can be switched by sending a signal to the server process:\u003c/p\u003e","title":"Radio presets"},{"content":"A very early version of my UPnP audio-renderer had been released on Gitorius https://gitorious.org/gupnp-audio-renderer (Update 2011-08-01: It has been renamed to m3player and been moved to here). It implements the necessary parts of the UPnP MediaRenderer specification.\nThe implementation is based on excellent frameworks like:\nGUPnP GStreamer GLib The initial target for the renderer is the OpenWRT platform (see previous articles about a WiFi music player). I decided to use C instead of Vala (that was a decision against Rygel) as the memory constraints are very limited and I need to save memory whereever possible. Although my C language skills are a bit rusty, I did not want to learn another language. Additionally, the usage of Vala would increase the effort to port the whole vala stuff to the OpenWRT build-system. Luckily GStreamer and GLib are already available on OpenWRT.\nUpdate 2011-07-31: Porting Vala packages to OpenWRT seems to be less complex as many source tarballs already contain the C source, generated by the valac pre-compiler, so no valac must be available during the OpenWRT build process.\nThe requirements for the implementation are:\naudio-only renderer (usually routers do not have displays) with a focus on MP3 small memory footprint (my router has only 32MB available) easy porting to different platforms (not dependent to where Vala has been ported) support for presets (which can be switched by pressing a button on the router device) The renderer is being tested with the UPnP Control Point UPnPlay on my HTC Legend.\nThe next steps are:\nRounding the rough edges Packaging for Debian/Ubuntu Makefiles for OpenWRT Cleaning up the codebase Update 2011-07-31: The gupnp-audio-renderer has been renamed to m3ddity-player and it found a home here.\n","permalink":"https://rumpf.eu/michael/posts/2011-06-27-upnp-audio-renderer-released/","summary":"\u003cp\u003eA very early version of my UPnP audio-renderer had been released on Gitorius \u003ca href=\"https://gitorious.org/gupnp-audio-renderer\"\u003ehttps://gitorious.org/gupnp-audio-renderer\u003c/a\u003e\n(\u003cstrong\u003eUpdate 2011-08-01\u003c/strong\u003e: It has been renamed to m3player and been moved to \u003ca href=\"http://www.jcoderz.org/m3dditiez/wiki/m3ddity-player\"\u003ehere\u003c/a\u003e).\nIt implements the necessary parts of the UPnP MediaRenderer specification.\u003c/p\u003e\n\u003cp\u003eThe implementation is based on excellent frameworks like:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.gupnp.org/\"\u003eGUPnP\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://gstreamer.freedesktop.org/\"\u003eGStreamer\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://developer.gnome.org/glib/\"\u003eGLib\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe initial target for the renderer is the \u003ca href=\"http://www.openwrt.org/\"\u003eOpenWRT\u003c/a\u003e platform (see previous articles about a WiFi music player).\nI decided to use C instead of Vala (that was a decision against Rygel) as the memory constraints are very limited and I need to save\nmemory whereever possible. Although my C language skills are a bit rusty, I did not want to learn another language. Additionally, the\nusage of Vala would increase the effort to port the whole vala stuff to the OpenWRT build-system. Luckily GStreamer and GLib are already\navailable on OpenWRT.\u003c/p\u003e","title":"UPnP audio renderer released"},{"content":"Follow the commands below in order to setup a local environment for working with the latest development version of the GUPNP framework.\nmkdir $(pwd)/base git clone http://git.gnome.org/browse/gssdp cd gssdp ./autogen.sh --prefix=$(pwd)/../base --exec-prefix=$(pwd)/../base make \u0026amp;\u0026amp; make install cd .. git clone http://git.gnome.org/browse/gupnp cd gupnp PKG_CONFIG_PATH=$(pwd)/../base/lib/pkgconfig ./autogen.sh --prefix=$(pwd)/../base --exec-prefix=$(pwd)/../base cd .. git clone http://git.gnome.org/browse/gupnp-tools cd gupnp-tools PKG_CONFIG_PATH=$(pwd)/../base/lib/pkgconfig ./autogen.sh --prefix=$(pwd)/../base --exec-prefix=$(pwd)/../base cd .. Run the following commands for setting the environment to use the fresh compiled libraries instead of the OS provided ones (Empathy under Ubuntu 11.04 uses an older version of the GUPNP libraries. I ran into segmentation faults because the libraries did not match):\nexport PATH=$(pwd)/base/bin:$(pwd)/gupnp/examples:$PATH export LD_LIBRARY_PATH=$(pwd)/base/lib:$LD_LIBRARY_PATH export PKG_CONFIG_PATH=$(pwd)/base/lib/pkgconfig:$PKG_CONFIG_PATH Now you can execute several examples or tests to check whether everything works as expected:\nlight-server \u0026amp; gupnp-universal-cp \u0026amp; The GUI application GUPnP Universal Control Point shows an entry \u0026ldquo;Kitchen Lights\u0026rdquo;, which is provided by the light-server application started above.\n","permalink":"https://rumpf.eu/michael/posts/2011-06-13-compile-development-version-of-gupnp/","summary":"\u003cp\u003eFollow the commands below in order to setup a local environment for working with the latest development version of the GUPNP framework.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emkdir $(pwd)/base  \ngit clone http://git.gnome.org/browse/gssdp  \ncd gssdp  \n./autogen.sh --prefix=$(pwd)/../base --exec-prefix=$(pwd)/../base  \nmake \u0026amp;\u0026amp; make install  \ncd ..  \ngit clone http://git.gnome.org/browse/gupnp  \ncd gupnp\nPKG_CONFIG_PATH=$(pwd)/../base/lib/pkgconfig ./autogen.sh --prefix=$(pwd)/../base --exec-prefix=$(pwd)/../base\ncd ..  \ngit clone http://git.gnome.org/browse/gupnp-tools  \ncd gupnp-tools  \nPKG_CONFIG_PATH=$(pwd)/../base/lib/pkgconfig ./autogen.sh --prefix=$(pwd)/../base --exec-prefix=$(pwd)/../base\ncd ..\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRun the following commands for setting the environment to use the fresh compiled libraries instead of the OS provided ones (Empathy under Ubuntu 11.04 uses an older version of the GUPNP libraries. I ran into segmentation faults because the libraries did not match):\u003c/p\u003e","title":"Compile a development version of GUPnP from HEAD"},{"content":"[] []\nFor my low-budget wireless music player I had to tweak OpenWRT in order to support my setup. For initial tests I decided to use the Music Player Daemon and madplay.\nThe following steps describe how to setup OpenWRT on the TP-Link WR1043ND. It assumes that the OpenWRT 10.03.1-rc4 firmware has already been installed, that the IP address of the router has been set to 192.168.0.111, and that an USB audio, as well as that an USB stick has been connected to the device via an USB hub.\nCheckout the 10.03 branch (currently 10.03.1-rc5)\n$ svn co svn://svn.openwrt.org/openwrt/branches/backfire $ cd backfire Download and install all packages:\n$ ./scripts/feeds update -a $ ./scripts/feeds install -a Run menuconfig and select a few more items so that they are available without the need to install packages first:\n$ make menuconfig -\u0026gt; Target Profile: TP-Link TL-WR1043ND -\u0026gt; [*] Build the OpenWrt Image Builder -\u0026gt; [*] Build the OpenWrt SDK -\u0026gt; [*] Build the OpenWrt based Toolchain -\u0026gt; [*] Image Configuration () LAN Gateway:\u0026lt;gw-address\u0026gt;\u0026lt;/gw-address\u0026gt; (192.168.1.1) LAN Network Address: 192.168.0.111 Exit -\u0026gt; Base System \u0026lt;*\u0026gt; block-hotplug \u0026lt;*\u0026gt; block-extroot Exit -\u0026gt; Kernel Modules\u0026lt;span class=\u0026#34;Apple-tab-span\u0026#34; style=\u0026#34;white-space: pre;\u0026#34;\u0026gt; -\u0026gt; Filesystems \u0026lt;*\u0026gt; kmod-fs-ext2 Exit -\u0026gt; USB Support \u0026lt;*\u0026gt; kmod-usb-core \u0026lt;*\u0026gt; kmod-usb-audio \u0026lt;*\u0026gt; kmod-usb-ohci \u0026lt;*\u0026gt; kmod-usb-storage \u0026lt;*\u0026gt; kmod-usb-storage-extras \u0026lt;*\u0026gt; kmod-usb-usb2 Exit -\u0026gt; Sound \u0026lt;m\u0026gt;mpd\u0026lt;/m\u0026gt; \u0026lt;m\u0026gt;mpc\u0026lt;/m\u0026gt; \u0026lt;m\u0026gt;madplay\u0026lt;/m\u0026gt; Exit Exit On quad core machines you can run make with 5 parallel jobs:\n$ make -j 5 Install the new image by running the following commands:\n$ telnet 192.168.0.111 $ scp USER\u0026lt;user\u0026gt;@HOST\u0026lt;host\u0026gt;:HOME\u0026lt;home\u0026gt;/workspaces/openwrt/backfire/bin/ar71xx/openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin .\u0026lt;/home\u0026gt;\u0026lt;/host\u0026gt;\u0026lt;/user\u0026gt; $ cd /tmp $ mtd -r write openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin firmware Because WLAN will not be configured after flashing a new image, you need a cable connection.\nAfter the reboot is finished you can connect to the device like this:\n$ telnet 192.168.0.111 Because mpd and madplay consume more space than the router has available on its root partition, the extroot feature must be enabled. Enable extroot for the USB stick by modifiying fstab:\n$ vi /etc/config/fstab ================================ config mount option target /overlay option device \u0026lt;span class=\u0026#34;Apple-style-span\u0026#34; style=\u0026#34;color: red;\u0026#34;\u0026gt;**/dev/sda1** option fstype \u0026lt;span class=\u0026#34;Apple-style-span\u0026#34; style=\u0026#34;color: red;\u0026#34;\u0026gt;**ext2** option options rw,sync option enabled \u0026lt;span class=\u0026#34;Apple-style-span\u0026#34; style=\u0026#34;color: red;\u0026#34;\u0026gt;**1** option enabled_fsck 0 ================================ Reboot the device again so that the extroot overlay becomes available:\n$ reboot Connect to the device again:\n$ telnet 192.168.0.111 I have setup an Apache on my desktop machine in order to easily provide the packages to the device. For using the local HTTP server, opkg must be configured like this (my desktop machine has IP 192.168.0.17):\n$ vi /etc/opkg.conf ================================ src/gz packages http://192.168.0.17/packages ... ================================ When this is done you can update the package list:\n$ opkg update Now the packages mpd, mpc, and madplay can be installed:\n$ opkg install mpd mpc madplay The mpd daemon needs some special folder setup:\n$ mkdir -p ~/.mpd/playlists Make sure mpd starts when the device boots up by adding the follownig line to rc.local:\n$ vi /etc/rc.local ================================ mpd /etc/mpd.conf ================================ In oder to disconnect the wired LAN connection, you need to setup WLAN:\n$ vi /etc/config/wireless Change the following entries:\n================================ config wifi-device radio0 ... # REMOVE THIS LINE TO ENABLE WIFI: **#option disabled 1** config wifi-iface ... **option mode sta # Client mode** **option ssid mySSID # Your SSID** **option encryption psk2 # WPA-PSK2** **option key 12345678901234567890 # Your network key** ================================ Configure DHCP so that the device asks the DHCP server for an IP address:\n$ vi /etc/config/network Change the lan interface (eth0.1) like this:\n================================ config \u0026#39;interface\u0026#39; \u0026#39;lan\u0026#39; option \u0026#39;ifname\u0026#39; \u0026#39;eth0.1\u0026#39; option \u0026#39;proto\u0026#39; \u0026#39;dhcp\u0026#39; ================================ Now you can start WiFi like this:\n$ wifi up After that you can unplug the LAN cable. The router should be connected to your WLAN and it should acquire an IP address from your local network DHCP server. Make sure that you do not gave a MAC Filter enabled in case it does not work ;)\nFor an intial test you can updload a MP3 file to the device:\n$ scp USER \u0026lt;user\u0026gt;@HOST\u0026lt;host\u0026gt;:HOME\u0026lt;home\u0026gt;/test.mp3 /tmp\u0026lt;/home\u0026gt;\u0026lt;/host\u0026gt;\u0026lt;/user\u0026gt; With madplay the MP3 can be played like this:\n$ madplay /tmp/test.mp3 With the following script running on your desktop machine you can make the Music Play Daemon play a Shoutcast audio stream:\n$ export MPD_HOST=192.168.0.111 $ mpc add http://89.179.179.5:8040 $ mpc play ","permalink":"https://rumpf.eu/michael/posts/2011-06-12-building-custom-openwrt-image-for-tp/","summary":"\u003cp\u003e[\u003cimg loading=\"lazy\" src=\"http://1.bp.blogspot.com/-My4aqk4nBL4/TfSaA1akJ5I/AAAAAAAAEkg/GpWbxKqabLs/s200/IMAG0292.jpg\"\u003e]\n[\u003cimg loading=\"lazy\" src=\"http://3.bp.blogspot.com/-eqzxpdUiMJ8/TfSaC26_9QI/AAAAAAAAEkk/5lGKpLAiEvs/s200/IMAG0293.jpg\"\u003e]\u003c/p\u003e\n\u003cp\u003eFor my low-budget wireless music player I had to tweak OpenWRT in order to support my setup. For initial tests I decided to use the \u003ca href=\"http://mpd.wikia.com/\"\u003eMusic Player Daemon\u003c/a\u003e and \u003ca href=\"http://www.underbit.com/products/mad/\"\u003emadplay\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe following steps describe how to setup OpenWRT on the TP-Link WR1043ND. It assumes that the OpenWRT 10.03.1-rc4 firmware has already been installed, that the IP address of the router has been set to 192.168.0.111, and that an USB audio, as well as that an USB stick has been connected to the device via an USB hub.\u003c/p\u003e","title":"Building a custom OpenWRT image for the TP-Link TL-WR1043ND"},{"content":"After searching the net for quite a while I could not find a pure wireless music player for small money. In case you want to equip multiple rooms in your house with a music player it will cost you a lot of money. All products on the market come with a lot of features, of which most are not necessary. The following links show interesting hacks on how to build your own WiFi music player based on OpenWRT:\nhttp://www.instructables.com/id/Build-your-own-Wifi-radio/ http://robhardwick.wordpress.com/2008/07/21/3/ http://devices.natetrue.com/musicap/ http://neophob.com/2008/02/openwrt-mp3-player-screenshots/ http://www.thilloy.com/integrations/musicplayer.html http://mightyohm.com/blog/2008/10/building-a-wifi-radio-part-1-introduction/ http://blog.josefsson.org/2007/09/25/home-audio-server/ Using routers as a platform is a very good choice as they produced in high volume and thus the price for the\nhardware can be very low. Every platform evaluation board is much more expensive, especially when you\nwant to have WiFI connectivity (\u0026gt; EURO 150). Those evaluation boards or development kits are produced\nin very small volume and thus the price is not competitive.\nI decided to use a router as the base for my player. My current setup is this:\nTP-Link TL-WR1043ND: EUR 43,59 3D-Sound USB-Audio: EUR 7,48 Delock HUB USB 2.0 extern 4 Port: EUR 12,49 32MB USB Stick: EUR 3,00 (for a 1GB Stick) This makes EUR 66,56 for the music player without loud-speakers. I guess the price can be further reduced\nbecause the sound-card was more expensive than expected (additional shipping costs), and there are much\ncheaper USB Hubs available, but this one I already had around.\nThe router TP-Link TL-WR1043ND is the TP-Link flagship consumer product, choosing another (maybe a\nused one) one where you can easily solder a USB port, would also do.\nFor the second version of the music player I expect the price to drop around EUR 30.\n","permalink":"https://rumpf.eu/michael/posts/2011-06-12-low-budget-wifi-music-player/","summary":"\u003cp\u003eAfter searching the net for quite a while I could not find a pure wireless music player for small money. In case\nyou want to equip multiple rooms in your house with a music player it will cost you a lot of money. All products\non the market come with a lot of features, of which most are not necessary. The following links show interesting\nhacks on how to build your own WiFi music player based on OpenWRT:\u003c/p\u003e","title":"Low-budget WiFi Music Player"},{"content":"The following message occurs when the \u0026lt;urlbase\u0026gt;\u0026lt;/urlbase\u0026gt; tag of the root device description is empty when trying to autoconnect actions:\n** (process:25888): WARNING **: Failed to get SCPD: Cannot resolve hostname ((null)) Changing it to http://localhost fixes the issue.\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34;?\u0026gt; \u0026lt;root xmlns=\u0026#34;urn:schemas-upnp-org:device-1-0\u0026#34;\u0026gt; \u0026lt;specVersion\u0026gt; \u0026lt;major\u0026gt;1\u0026lt;/major\u0026gt; \u0026lt;minor\u0026gt;0\u0026lt;/minor\u0026gt; \u0026lt;/specVersion\u0026gt; \u0026lt;URLBase\u0026gt;http://localhost\u0026lt;/URLBase\u0026gt; \u0026lt;device\u0026gt; \u0026lt;!-- ... --\u0026gt; \u0026lt;/device\u0026gt; \u0026lt;/root\u0026gt; The message is a bit misleading. I was first trying to find an issue with my DNS configuration.\n","permalink":"https://rumpf.eu/michael/posts/2011-06-05-gupnp-failed-to-get-scpd-cannot-resolve_05/","summary":"\u003cp\u003eThe following message occurs when the \u003ccode\u003e\u0026lt;urlbase\u0026gt;\u0026lt;/urlbase\u0026gt;\u003c/code\u003e tag of the root device description is empty when trying to autoconnect actions:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e** (process:25888): WARNING **: Failed to get SCPD: Cannot resolve hostname ((null))  \n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eChanging it to \u003cstrong\u003ehttp://localhost\u003c/strong\u003e fixes the issue.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34;?\u0026gt;  \n\u0026lt;root xmlns=\u0026#34;urn:schemas-upnp-org:device-1-0\u0026#34;\u0026gt;  \n  \u0026lt;specVersion\u0026gt;  \n    \u0026lt;major\u0026gt;1\u0026lt;/major\u0026gt;  \n    \u0026lt;minor\u0026gt;0\u0026lt;/minor\u0026gt;  \n  \u0026lt;/specVersion\u0026gt;  \n \u0026lt;URLBase\u0026gt;http://localhost\u0026lt;/URLBase\u0026gt;\n  \u0026lt;device\u0026gt;  \n    \u0026lt;!-- ... --\u0026gt;  \n  \u0026lt;/device\u0026gt;  \n\u0026lt;/root\u0026gt;  \n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe message is a bit misleading. I was first trying to find an issue with my DNS configuration.\u003c/p\u003e","title":"GUPNP: Failed to get SCPD: Cannot resolve hostname ((null))"},{"content":"Because the GUPnP stack is lacking some documentation I describe my experiences with getting it complied under Ubuntu 11.04. The commands will setup an environment that does not interfere with the Ubuntu provided packages, which are older than the ones compiled here. The library files will be installed under the location: ~/workspaces/openwrt/upnp\nDownload:\nmkdir -p ~/workspaces/openwrt/upnp cd ~/workspaces/openwrt/upnp wget -O - http://gupnp.org/sites/all/files/sources/gupnp-igd-0.1.11.tar.gz | tar xvfz - wget -O - http://gupnp.org/sites/all/files/sources/gupnp-0.16.1.tar.gz | tar xvfz - wget -O - http://gupnp.org/sites/all/files/sources/gupnp-igd-0.1.10.tar.gz | tar xvfz - wget -O - http://gupnp.org/sites/all/files/sources/gupnp-tools-0.8.3.tar.gz | tar xvfz - wget -O - http://gupnp.org/sites/all/files/sources/gupnp-dlna-0.6.1.tar.gz | tar xvfz - wget -O - http://gupnp.org/sites/all/files/sources/gupnp-av-0.8.0.tar.gz | tar xvfz - wget -O - http://gupnp.org/sites/all/files/sources/gssdp-0.10.0.tar.gz | tar xvfz - wget -O - http://gupnp.org/sites/all/files/sources/gupnp-vala-0.8.0.tar.gz | tar xvfz - Prerequisites:\n$ sudo apt-get install gstreamer0.10-dev uuid-dev libsoup2.4-dev libxml2-dev libgstreamer-plugins-base0.10-dev gtk+3.0 libgtk-3-dev valac-0.12 libgee-dev libgconf2-dev Compilation:\ncd gssdp-0.10.0 ./configure --prefix ~/workspaces/openwrt/upnp --exec-prefix ~/workspaces/openwrt/upnp gssdp-0.10.0$ make \u0026amp;\u0026amp; make install cd ../gupnp-0.16.1 gupnp-0.16.1$ PKG_CONFIG_PATH=~/workspaces/openwrt/upnp/gssdp-0.10.0 ./configure --prefix ~/workspaces/openwrt/upnp --exec-prefix ~/workspaces/openwrt/upnp make \u0026amp;\u0026amp; make install cd ../gupnp-av-0.8.0 PKG_CONFIG_PATH=~/workspaces/openwrt/upnp/gupnp-0.16.1 ./configure --prefix ~/workspaces/openwrt/upnp --exec-prefix ~/workspaces/openwrt/upnp gupnp-av-0.8.0$ make \u0026amp;\u0026amp; make install cd ../gupnp-dlna-0.6.1 ./configure --prefix ~/workspaces/openwrt/upnp --exec-prefix ~/workspaces/openwrt/upnp make \u0026amp;\u0026amp; make install cd ../gupnp-igd-0.1.11 PKG_CONFIG_PATH=~/workspaces/openwrt/upnp/gupnp-0.16.1 ./configure --prefix ~/workspaces/openwrt/upnp --exec-prefix ~/workspaces/openwrt/upnp make \u0026amp;\u0026amp; make install cd ../gupnp-tools-0.8.3 PKG_CONFIG_PATH=~/workspaces/openwrt/upnp/gupnp-0.16.1 ./configure --prefix ~/workspaces/openwrt/upnp --exec-prefix ~/workspaces/openwrt/upnp make \u0026amp;\u0026amp; make install cd ../gupnp-vala-0.8.3 PKG_CONFIG_PATH=~/workspaces/openwrt/upnp/gssdp-0.10.0 ./configure --prefix ~/workspaces/openwrt/upnp --exec-prefix ~/workspaces/openwrt/upnp make \u0026amp;\u0026amp; make install The gupnp-media-renderer (version 0.1) is out of scope here as it is not maintained anymore. The code has been integrated into Rygel.\n","permalink":"https://rumpf.eu/michael/posts/2011-06-03-compiling-gupnp-on-ubuntu-1104/","summary":"\u003cp\u003eBecause the \u003ca href=\"http://gupnp.org/\"\u003eGUPnP\u003c/a\u003e stack is lacking some documentation I describe my experiences with getting it complied under Ubuntu 11.04. \u003cbr\u003e\nThe commands will setup an environment that does not interfere with the Ubuntu provided packages, which are older than the ones compiled here. The library files will be installed under the location:\n~/workspaces/openwrt/upnp\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDownload:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emkdir -p ~/workspaces/openwrt/upnp  \ncd ~/workspaces/openwrt/upnp  \nwget -O - http://gupnp.org/sites/all/files/sources/gupnp-igd-0.1.11.tar.gz | tar xvfz -  \nwget -O - http://gupnp.org/sites/all/files/sources/gupnp-0.16.1.tar.gz | tar xvfz -  \nwget -O - http://gupnp.org/sites/all/files/sources/gupnp-igd-0.1.10.tar.gz | tar xvfz -  \nwget -O - http://gupnp.org/sites/all/files/sources/gupnp-tools-0.8.3.tar.gz | tar xvfz -  \nwget -O - http://gupnp.org/sites/all/files/sources/gupnp-dlna-0.6.1.tar.gz | tar xvfz -  \nwget -O - http://gupnp.org/sites/all/files/sources/gupnp-av-0.8.0.tar.gz | tar xvfz -  \nwget -O - http://gupnp.org/sites/all/files/sources/gssdp-0.10.0.tar.gz | tar xvfz -\nwget -O - http://gupnp.org/sites/all/files/sources/gupnp-vala-0.8.0.tar.gz | tar xvfz -\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003ePrerequisites:\u003c/strong\u003e\u003c/p\u003e","title":"Compiling GUPnP on Ubuntu 11.04"},{"content":"After an update to Ubuntu 11.04 VirtualBox was not running anymore. Startup fails with a hint that the kernel modules exited in error and that I should use DKMS to reconfigure the kernel module.\nRunning the vboxdrv setup command also led to an error:\n$ sudo /etc/init.d/vboxdrv setup [sudo] password for desktop: * Stopping VirtualBox kernel modules * done. * Uninstalling old VirtualBox DKMS kernel modules * done. * Trying to register the VirtualBox kernel modules using DKMS Error! Bad return status for module build on kernel: 2.6.38-8-generic (x86_64) Consult the make.log in the build directory /var/lib/dkms/vboxhost/4.0.2/build/ for more information. * Failed, trying without DKMS * Recompiling VirtualBox kernel modules * Look at /var/log/vbox-install.log to find out what went wrong The log file indicates that a header file was missing:\nless /var/lib/dkms/vboxhost/4.0.2/build/make.log ... fatal error: linux/autoconf.h: No such file or directory ... The following link led me to the solution (workaround): http://forums.virtualbox.org/viewtopic.php?f=7\u0026amp;t=38584\n... ln -s /usr/src/linux-headers-`uname -r`/include/generated/autoconf.h /usr/src/linux-headers-`uname -r`/include/linux/autoconf.h ... After the link has been created, the vboxdrv setup command just ran fine:\nmicha@micha-desktop:~$ sudo /etc/init.d/vboxdrv setup * Stopping VirtualBox kernel modules * done. * Uninstalling old VirtualBox DKMS kernel modules * done. * Trying to register the VirtualBox kernel modules using DKMS * done. * Starting VirtualBox kernel modules * done. ","permalink":"https://rumpf.eu/michael/posts/2011-05-29-virtualbox-402-on-ubuntu-1104/","summary":"\u003cp\u003eAfter an update to Ubuntu 11.04 VirtualBox was not running anymore. Startup fails with a hint that the kernel modules exited in error and that I should use DKMS to reconfigure the kernel module.\u003c/p\u003e\n\u003cp\u003eRunning the vboxdrv setup command also led to an error:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo /etc/init.d/vboxdrv setup \n[sudo] password for desktop:  \n * Stopping VirtualBox kernel modules                                  *  done. \n * Uninstalling old VirtualBox DKMS kernel modules                     *  done. \n * Trying to register the VirtualBox kernel modules using DKMS                   \nError! Bad return status for module build on kernel: 2.6.38-8-generic (x86_64) \nConsult the make.log in the build directory \n/var/lib/dkms/vboxhost/4.0.2/build/ for more information. \n * Failed, trying without DKMS \n * Recompiling VirtualBox kernel modules                                         \n * Look at /var/log/vbox-install.log to find out what went wrong \n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe log file indicates that a header file was missing:\u003c/p\u003e","title":"VirtualBox 4.0.2 on Ubuntu 11.04"},{"content":"The original versions of smppd-web by Christopher Hofmann neither support adding and removing links on the fly nor do they support dial-on-demand ISDN interfaces. That is the reason why I extended the original codebase by these features.\nFurther more the users for which I developed the software are german speaking only so that gettext support was also an important feature. Initially I added support for german and english languages.\nAs I\u0026rsquo;m not a SuSE user in general, the new version probably does not follow the SuSE directory guidelines and it does not come packaged as a RPM. Therefore it would be great if someone with SuSE RPM packaging know-how would create a successor RPM package out of Christopher\u0026rsquo;s original version. Or even better Christopher packages a new version for OpenSuSE ;)\nPlease see the README in the tarball for more information.\nUpdate 20060113: Christopher Hofmann was so kind to create a RPM for OpenSuSE 10.0 and promised to feed it into OpenSuSE 10.1: smpppd-web.spec\nFri Jan 13 2006 cwh@suse.de version 3.00 - now supports adding and removing links on the fly - support dial-on-demand interfaces - supports multiple languages with gettext (currently included is german and english) ","permalink":"https://rumpf.eu/michael/posts/2006-01-12-new-version-of-smpppd-web/","summary":"\u003cp\u003eThe original versions of \u003ca href=\"http://www.suse.de/~cwh/\"\u003esmppd-web\u003c/a\u003e by Christopher Hofmann neither support adding and removing links on the fly nor do they support dial-on-demand ISDN interfaces. That is the reason why I extended the original codebase by these features.\u003cbr\u003e\nFurther more the users for which I developed the software are german speaking only so that gettext support was also an important feature. Initially I added  support for german and english languages.\u003c/p\u003e\n\u003cp\u003eAs I\u0026rsquo;m not a SuSE user in general, the new version probably does not follow the SuSE directory guidelines and it does not come packaged as a RPM. Therefore it would be great if someone with SuSE RPM packaging know-how would create a successor RPM package out of Christopher\u0026rsquo;s original version. Or even better Christopher packages a new version for \u003ca href=\"http://old-en.opensuse.org/User:Cwh\"\u003eOpenSuSE\u003c/a\u003e ;)\u003c/p\u003e","title":"New version of smpppd-web"},{"content":"In Germany flatrates are available for DSL only, so people, living in areas where DSL is not available, have to pay expensive time based fees for slowly connecting to the Internet. The problem is that M$ Windows and many of the installed tools are known for initiating internet connections although the user did not ask them to do so. Therefore it is crucial to reliably disconnect the ISDN line so that those unwanted connection attempts will not succeed. ISDN routers, which might be of help here, are hard to find nowadays and do not offer the comfort as new DSL routers do.\nA solution should fulfill the following additional requirements:\nprovide secure internet access provide a secure way to do remote administration provide centralized storage provide a Wiki for documentation should also be usable as a client machine After doing some investigation I found the following possible solutions:\nTools on a Windows server Linux Diskless Router based solution Scripts from a Windows client executed on the Linux Server Linux server with a web based approach The first category solutions, for example Internet Remote Control, fall short because the Windows machine is connected directly to the Internet and thus vulnerable to all kind of attacks (Who really trusts the Windows XP firewall?).\nWith software from the second class it is not possible to provide centralized storage via Samba. I know that this is by far the most secure way but it would mean booting another machine with no other purpose than Internet access.\nThe third and fourth solution can be deployed together on one Linux server machine, which can also be used as a desktop. This machine provides secure Internet access via ISDN and at the same time centralized storage to the Windows clients on the network. The script based solution has one deficiency, it does not allow continous feedback on the connection state of the ISDN interface. Therefore the last solution is by far the one with the greatest flexibility and has been chosen to build a final solution.\nThe machine has been installed with SuSE Linux 9.3 as a desktop machine. The following services have been enabled:\nApache2 Samba SSH The ddclient package is used to update dyndns.org records when the ISDN connection is established. This allows easy remote administration, as the IP address gets updated automatically.\nAs a little gimmick I added the script xsend.py from the xmpppy project which sends a message with the ippp0 configuration to my Jabber account so that I get notified when the machine is connected to the Internet.\nBoth scripts xsend.py and ddclient are executed when the connection is established. This is done by the script /etc/ppp/ip-up.local which gets called by the ISDN stack upon connection establishment.\nThe excellent tool smpppd and smpppd-web is used to manage the ISDN connections.\n","permalink":"https://rumpf.eu/michael/posts/2005-10-19-creating-isdn-gateway-with-suse-93/","summary":"\u003cp\u003eIn Germany flatrates are available for DSL only, so people, living in areas where DSL is not available, have to pay expensive time based fees for slowly connecting to the Internet. The problem is that M$ Windows and many of the installed tools are known for initiating internet connections although the user did not ask them to do so. Therefore it is crucial to reliably disconnect the ISDN line so that those unwanted connection attempts will not succeed. ISDN routers, which might be of help here, are hard to find nowadays and do not offer the comfort as new DSL routers do.\u003c/p\u003e","title":"Creating an ISDN Gateway with SuSE 9.3"},{"content":"This is a short guide on how to debug applications or dynamic link libraries created by the post free Microsoft C++ compile environment.\nThe following tools need to be installed:\nMicrosoft Debug Tools (13MB): c:\\msdev\\debug Windows XP with Service Pack 2 symbols (195MB) Then extend your environment\u0026rsquo;s LIB path by adding the Visual Studio .NET 2003 lib folder. Visual Studio .NET 2003 was installed during the former .NET SDK installation, unfortunately the path, specified for the .NET SDK is not taken as installation path for Visual Studio but the usual program folder is used instead, in my case C:\\Programme\\Microsoft Visual Studio .NET 2003. Find out the path\u0026rsquo;s short name with dir /X and add the following line with your specific path to the setenv.cmd script below the three call statements:\nset LIB=C:\\PROGRA~1\\MICROS~1.NET\\Vc7\\lib;%LIB% Add the parameters /XP32 /DEBUG to the call c:\\msdev\\platsdk\\SetEnv.bat:\ncall c:\\msdev\\platsdk\\SetEnv.bat /XP32 /DEBUG For having the debugging tools on the path the following line must be added:\nset PATH=C:\\msdev\\debug;%PATH% Then go to the traceser example of the Detours package for testing our debug environment setup by recompiling the example with debug information:\ncd detours\\samples\\traceser\nnmake clean set CFLAGS=/nologo /Zi $(CLIB) /Gi- /Gm- /W4 /WX \\ /FR \u0026#34;/I$(DTRINCD)\u0026#34; \u0026#34;/I$(INCD)\u0026#34; /Yd set CLIB=/MTd nmake /E set CFLAGS= set CLIB= The /Yd compiler switch must be specified in order to compile the example in debug mode. The CLIB variable is set by the Makefile to /MT which is the release version of the multi-threaded libc. Changing the CLIB variable to /MTd uses the debug version when compiling the example. The switch /E passed to the nmake tool overrides the Makefile variables with the environment settings.\nFor starting the DataRecorder application together with the traceser interception DLL the following commands must be executed. First start the logging service which receives the messages from the interception layer:\nstart ..\\bin\\syelogd.exe /e /s traceser.log Then start the application with the following command:\nstart ..\\bin\\withdll -d:..\\bin\\traceser.dll \\ c:\\Programme\\DataRecorder\\DataRecorder.exe Finally start the Microsoft debugger WinDbg and attach to the DataRecorder process. For source level debugging the following settings need to be done:\nSet the symbol file path (File-\u0026gt;Symbol File Path\u0026hellip;, CTRL-S) to C:\\msdev\\detours\\lib; C:\\msdev\\detours\\samples\\traceser; C:\\Programme\\Microsoft Visual Studio .NET 2003\\Vc7\\lib Set the source path (File-\u0026gt;Source File Path\u0026hellip;, CTRL-P) to C:\\msdev\\detours\\samples\\traceser; C:\\msdev\\detours\\src Set a breakpoint to the method Mine_WriteFile in the traceser library: bp traceser!Mine_WriteFile Start the application (Debug-\u0026gt;Go, F5) The debugger should stop at the specified breakpoint, showing the highlighted source code position in the source window.\nFor Just-In Time Debugging set the following registry values:\nHKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug=Windbg HKLM\\Software\\Microsoft.NETFramework\\DbgJITDebugLaunchSetting=2 HKLM\\Software\\Microsoft.NETFramework\\DbgManagedDebugger=Windbg For further information on using the WinDbg debugger, see the online help. The debugger itself is a complex beast and quite cryptic to use. Although it has a graphical user interface, a strong similarity to command line GDB debugging is obvious.\n","permalink":"https://rumpf.eu/michael/posts/2005-07-27-setting-up-free-microsoft-debugging/","summary":"\u003cp\u003eThis is a short guide on how to debug applications or dynamic link libraries created by the post \u003cem\u003efree Microsoft C++ compile environment\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eThe following tools need to be installed:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.5.3.7.exe\"\u003eMicrosoft Debug Tools\u003c/a\u003e (13MB): \u003cstrong\u003ec:\\msdev\\debug\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://msdl.microsoft.com/download/symbols/packages/windowsxp/WindowsXP-KB835935-SP2-slp-Symbols.exe\"\u003eWindows XP with Service Pack 2 symbols\u003c/a\u003e (195MB)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThen extend your environment\u0026rsquo;s LIB path by adding the \u003cem\u003eVisual Studio .NET 2003\u003c/em\u003e lib folder. \u003cem\u003eVisual Studio .NET 2003\u003c/em\u003e was installed during the former \u003cem\u003e.NET SDK\u003c/em\u003e installation, unfortunately the path, specified for the \u003cem\u003e.NET SDK\u003c/em\u003e is not taken as installation path for Visual Studio but the usual program folder is used instead, in my case \u003ccode\u003eC:\\Programme\\Microsoft Visual Studio .NET 2003\u003c/code\u003e. Find out the path\u0026rsquo;s short name with \u003ccode\u003edir /X\u003c/code\u003e and add the following line with your specific path to the \u003ccode\u003esetenv.cmd\u003c/code\u003e script below the three \u003ccode\u003ecall\u003c/code\u003e statements:\u003c/p\u003e","title":"Setting up a free Microsoft debugging environment on Windows XP"},{"content":"I did more reverse engineering on the DataRecorder Windows tool that comes with the TFA Klima-Logger hygrometer in order to find out which serial lines are used as input lines.\nThe evaluation version of IDA Pro Disassembler and Debugger did a great job here. The only thing I had to do was to load the executable DataRecorder.exe into the disassembler and find the places where the Win32 API function GetCommModemStatus gets called. A search for the function name revealed two sub-routines inside the huge pile of Assembler code. Looking at the references to data segment constants it was quite easy to determine which of the two sub-routines was the Assembler version of CI2CDriver::Sda() and which one was the Assembler version of CI2CDriver::Scl(). The first sub-routine was referencing an error message\nCall to GetCommModemStatus in CI2CDriver::Sda() failed.\nwhereas the second was referencing the error message\nCall to GetCommModemStatus in CI2CDriver::Scl() failed.\nAfter identifying the two sub-routines I looked at their Assembler code and found the following suspicious fragment for CI2CDriver::Sda()\n.text:0042CC30 ModemStat = dword ptr -18h ... .text:0042CC84 mov [ebp+ModemStat], 0 .text:0042CC8D lea edx, [ebp+ModemStat] .text:0042CC90 push edx ; lpModemStat ... .text:0042CC9B call ds:GetCommModemStatus ... .text:0042CCF3 mov eax, [ebp+ModemStat] .text:0042CCF6 and eax, 10h .text:0042CCF9 sub eax, 10h .text:0042CCFC neg eax .text:0042CCFE sbb eax, eax .text:0042CD00 inc eax ... .text:0042CD2B retn and this fragment for CI2CDriver::Scl():\n.text:0042CC30 ModemStat = dword ptr -18h ... .text:0042CC84 mov [ebp+ModemStat], 0 .text:0042CC8D lea edx, [ebp+ModemStat] .text:0042CC90 push edx ; lpModemStat ... .text:0042CC9B call ds:GetCommModemStatus ... .text:0042CCF3 mov eax, [ebp+ModemStat] .text:0042CCF6 and eax, 20h .text:0042CCF9 sub eax, 20h .text:0042CCFC neg eax .text:0042CCFE sbb eax, eax .text:0042CD00 inc eax ... .text:0042CD2B retn The function signature of GetCommModemStatus from the MSDN Library shows that the second parameter is a pointer to a long word:\nBOOL GetCommModemStatus(HANDLE hFile, LPDWORD lpModemStat);\nThe out value parameter lpModemStat contains the pointer to the memory location that is referenced by ModemStat in the fragments above.\nThat led to the assumption that the first three lines of Assembler code, before the call to GetCommMomdemStatus, are preparing the call stack and the five lines of code after the call command are dealing with what was returned by the function from the out parameter. The interesting thing is that those result handling lines contain a constant 0x10h in one fragment and 0x20h in the other fragment. When looking at the MSDN Library description of the GetCommModemStatus function again it becomes clear which of the serial flag lines are used:\nlpModemStat [out] Pointer to a variable that specifies the current state of the modem control-register values. This parameter can be one or more of the following values. Value Meaning MS_CTS_ON 0x0010 The CTS (clear-to-send) signal is on. MS_DSR_ON 0x0020 The DSR (data-set-ready) signal is on. That means that the I2C\u0026rsquo;s serial clock SCL is read via the serial port\u0026rsquo;s DSR line and the I2C\u0026rsquo;s serial data SDA is read via the serial port\u0026rsquo;s CTS line.\nThe missing piece in the puzzle is whether a low voltage signal on the serial line means a logical 0 or whether it means a logical 1 for the SCL or the SDA signals. For that to find out it would have been sufficient to analyze the result code handling lines in the Assembler fragments above. Unfortunately I wasn\u0026rsquo;t sure about what exactly was happening on the arithmetic level. Therefore I decided to write a small Assembler program that performs the operations above and run it once with the DSR/CTS bits set and once with the bits cleared.\n; tfa.s section .data section .text global main main: mov eax, 0h and eax, 10h sub eax, 10h neg eax sbb eax, eax inc eax exit: mov eax,1 xor ebx,ebx int 0x80 The Assembler file can be compiled with NASM under Linux by using the following command:\nnasm -f elf tfa.s\nAfterwards it must be linked into an executable by using\ngcc -o tfa tfa.o\nIn order to see what is happening, the GNU Debugger was used with the following command sequence:\n$\u0026gt;gdb sda (gdb) break main (gdb) run (gdb) set disassembly-flavor intel (gdb) disassemble main (gdb) stepi 16 mov eax, 0h (gdb) print/x $eax $1 = 0x0 (gdb) stepi 18 and eax, 10h (gdb) print/x $eax $2 = 0x0 (gdb) stepi 20 sub eax, 10h (gdb) print/x $eax $3 = 0x0 (gdb) stepi 22 neg eax (gdb) print/x $eax $4 = 0xfffffff0 (gdb) stepi 24 sbb eax, eax (gdb) print/x $eax $5 = 0x10 (gdb) stepi 26 inc eax (gdb) print/x $eax $6 = 0xffffffff (gdb) stepi 30 mov eax,1 ;system call number (sys_exit) (gdb) print/x $eax $7 = 0x0 The result was when the eax register is loaded with 0x10h then the final value of the eax register is 1 and when it gets loaded with value 0x00h then the final value is 0.\nThat means that the arithmetic Assembler operations return 0 when the serial line flags are cleared and 1 when the flags are set, i.e. no inversion is done here.\nWith the findings from the reverse engineering session above it is clear now which serial port lines are used for which I2C communication lines:\nSCL Input - DSR (High - High) SDA Input - CTS (High - High) SCL Output - DTR (High - Low) SDA Output - RTS (High - Low) ","permalink":"https://rumpf.eu/michael/posts/2005-07-06-more-reverse-engineering/","summary":"\u003cp\u003eI did more reverse engineering on the \u003cem\u003eDataRecorder\u003c/em\u003e Windows tool that comes with the \u003cem\u003eTFA Klima-Logger\u003c/em\u003e hygrometer in order to find out which serial lines are used as input lines.\u003c/p\u003e\n\u003cp\u003eThe evaluation version of \u003ca href=\"http://www.hex-rays.com/idapro/\"\u003eIDA Pro Disassembler and Debugger\u003c/a\u003e did a great job here. The only thing I had to do was to load the executable \u003ccode\u003eDataRecorder.exe\u003c/code\u003e into the disassembler and find the places where the Win32 API function \u003ccode\u003eGetCommModemStatus\u003c/code\u003e gets called. A search for the function name revealed two sub-routines inside the huge pile of Assembler code. Looking at the references to data segment constants it was quite easy to determine which of the two sub-routines was the Assembler version of \u003ccode\u003eCI2CDriver::Sda()\u003c/code\u003e and which one was the Assembler version of \u003ccode\u003eCI2CDriver::Scl()\u003c/code\u003e. The first sub-routine was referencing an error message\u003c/p\u003e","title":"More Reverse Engineering"},{"content":"For reverse-engineering the Windows software of the TFA Klima-Logger I tried to analyze the I2C protocol over the serial line by intercepting Win32 API system calls.\nSearching with Google about the topic intercept Win32 function I stumbled over the Microsoft Research tool Detours which was exactly what I was looking for. Version 1.5 of the tool is freely available for download and already comes with an example to intercept serial API system calls which served as a starting point for my serial communication interception library.\nHere is how it works: The Detours library provides means to copy the first few bytes from the actual library function text segment to the beginning of the interception library function. It copies as many bytes as necessary to write an unconditional jump to the beginning of the original Win32 function instead. This unconditional jump just moves the execution pointer to the interception function which executes the bytes just copied, before it executes the actual interception code. Finally it jumps to the original function entry point, skipping the bytes of the unconditional jump and performs the normal library function\u0026rsquo;s tasks. A precise description of the Detours concept can be found here.\nIn order to get the library into the address space of the application whose Win32 function calls should be intercepted, Detours delivers a small tool with which the interception library can be injected into the process to be analyzed. Once injected the interception mechanisms are installed and each Win32 function call is routed through the function provided by the Detours library.\nSee the i2canalyzer example on how to intercept serial communication functions. This is an extended version of the Detours example traceser with additional functionality of logging information to different files.\nThe i2canalyzer example might be extended when using the Linux I2C layer approach for communicating with the device does not lead to the expected results.\nOne of the biggest problems on getting the Detours examples running was the missing compile environment on Windows. If you are interested in how this can be achieved, have a look at the article on Setting up a Microsoft C++ compile environment at no charge on Windows XP.\n","permalink":"https://rumpf.eu/michael/posts/2005-07-03-intercepting-win32-api-system-calls/","summary":"\u003cp\u003eFor reverse-engineering the Windows software of the \u003cem\u003eTFA Klima-Logger\u003c/em\u003e I tried to analyze the I2C protocol over the serial line by intercepting Win32 API system calls.\u003c/p\u003e\n\u003cp\u003eSearching with Google about the topic \u003cem\u003eintercept Win32 function\u003c/em\u003e I stumbled over the Microsoft Research tool \u003ca href=\"http://research.microsoft.com/sn/detours/\"\u003eDetours\u003c/a\u003e which was exactly what I was looking for. Version 1.5 of the tool is freely available for download and already comes with an example to intercept serial API system calls which served as a starting point for my serial communication interception library.\u003c/p\u003e","title":"Intercepting Win32 API system calls"},{"content":"Update 2012-03-01:\nI just ordered 2 outdoor sensors and the plan is to connect the Klima-Logger to a Raspberry Pi Board to make the data available via browser on my home network. Here are some resources I found\nhttps://oss.inqnet.at/trac/klimalogger/ http://members.home.nl/xbasic/01c2249c770e62101/index.html http://www.atmel.com/dyn/resources/prod_documents/doc0670.pdf http://www.wetterstationsforum.de/phpBB/viewtopic.php?t=7605\u0026amp;postdays=0\u0026amp;postorder=asc\u0026amp;start=0\u0026amp;sid=472299c23b04447cc15aa92492c4a76f http://web.student.tuwien.ac.at/~e9725348/Projects/klimalogger/ Outdated:\nI recently bought a hygrometer from TFA-Dostmann, called Klima-Logger. It is the cheapest thermometer and hygrometer with PC connectivity I could find on the market. Unfortunately only a Windows software is provided to get the recorded values for temperature and humidity. I thought a Linux driver would be cool and started searching for resources on the net. Usually the Linux community is very fast in supporting new gadgets of any kind, but nothing could be found.\nThat was driving me to think about writing support on my own. The first thing I did was to install the demo version of IDA Pro 4.8, a commercial disassembler for Windows, to look at any valuable information inside the executable. Some symbols I found were very narrative, for example CI2CDriver::setScl or CI2CDriver::setSda which indicated that some kind of I2C communication was used for accessing the device. The Windows API calls to GetCommModemStatus and EscapeCommFunction gave a hint that only serial flag lines were used for the I2C communication. At least for writing, informational and error messages from the data segement were indicating exactly which serial flag lines are used:\n(newState == SdaHigh) ? CLRRTS : SETRTS\nand\n(newState == SclHigh) ? CLRDTR : SETDTR\nThat means RTS (Request To Send) is used for SDA (Serial Data) and DTR (Data Terminal Ready) is used for SCL (Serial Clock) write functionality. The EscapeCommFunction from the Win32 API is utilized to set or clear the RTS and DTR serial flag lines.\nReading is done by utilyzing the GetCommModemStatus Win32 API function. Unfortunately I haven\u0026rsquo;t found any strings from the data segment that reveal the assignment of the read flags directly. Assumptions are that DSR (Data Set Ready) and CTS (Clear To Send) lines are used for reading SCL and SDA lines. The problem is to find out whether SCL == DSR and SDA == CTS or whether SCL == CTS and SDA == DSR. The signals might additionally be inverted SCL == CLRCTS or SCL == SETCTS.\nBy looking at the board inside the hygrometer I found an Atmel 24C256 which is an EEPROM with an I2C interface and a capacity of 256KB (0x00000-0x39999).\nThe next step was trying to decipher the I2C protocol over the serial port status lines. I searched for a topic on how to install hooks for Win32 API system calls and found a solution from Microsoft Research on system call interception, called Detours (See article \u0026lsquo;Intercepting Win32 API system calls\u0026rsquo; on how to use this tool).\nMy Detour dynamic link library with trampoline functions for all serial port Win32 API calls delivered a file with the recorded serial line status changes, but I forgot associating the SCL and SDA signals on a time basis. That made the data delivered by the Detours library unusable for analyzing the protocol. Further thinking about this solution led to the conclusion that it might be an uncomparably high effort to write this extension as it would require multiple threads being synchronized by timer interrupts in order to get this synchronization on a time basis.\nFurther looking through the data segment of the Windows application revealed that on top of the EEPROM some kind of Ringbuffer has been implemented.\nThe Ringbuffer seems to store the temperature and the humidity of each transmitter that is wirelessly connected to the device. The Windows software shows a list of 5 possible sensor pairs, but only the column for one pair is filled with values coming from the built in temperature- and humidity-sensor pair on the device. The conclusion for this observation is that 4 wireless transmitters can be connected and that the ring-buffer always seems to reserve space for all possible sensor pairs. Here as well, the structure of some data items haven\u0026rsquo;t been identified so far, for example start markers and end markers of data sets.\nWithout a claim of correctness, this might be the structure of the EEPROM:\n00000 RING_BUFFER_CONFIG 00000 NrOfTransmitters 00004 Start 00008 End 0000c ByteSize 00010 DatasetSize 00014 DatasetCount 00018 RING_BUFFER_START (earliest start) Dataset #1 00018 TIMESTAMP (usually a long aka 8 Bytes) 00020 TEMPERATURE of Built In sensor (1 Byte) 00021 HUMIDITY of Built In sensor (1 Byte) 00022 TEMPERATURE of transmitter sensor #1 (1 Byte) 00023 HUMIDITY of transmitter sensor #1 (1 Byte) 00024 TEMPERATURE of transmitter sensor #2 (1 Byte) 00025 HUMIDITY of transmitter sensor #2 (1 Byte) 00026 TEMPERATURE of transmitter sensor #3 (1 Byte) 00027 HUMIDITY of transmitter sensor #3 (1 Byte) 00028 TEMPERATURE of transmitter sensor #4 (1 Byte) 00029 HUMIDITY of transmitter sensor #4 (1 Byte) Dataset #2 0002a TIMESTAMP (usually a long aka 8 Bytes) 39999 RING_BUFFER_END What I found out so far:\nSerial Port Interface (Writing: SDA High == CLRRTS, SDA Low == SETRTS, Reading: DSR, CTS) EEPROM Atmel 24C256 with Ringbuffer for data sets and means to identify not yet read data sets. Linux I2C layer might provide basis for a possible solution as it implements all the infrastructure with pluggable device support. The next steps are to get familiar with the Linux I2C layer and to learn how to write external Linux kernel modules for the Linux 2.6 kernel, especially for Ubuntu Linux which I have installed on my notebook.\n","permalink":"https://rumpf.eu/michael/posts/2005-07-02-linux-support-for-tfa-klima-logger/","summary":"\u003cp\u003e\u003cstrong\u003eUpdate 2012-03-01:\u003c/strong\u003e\u003cbr\u003e\nI just ordered 2 outdoor sensors and the plan is to connect the \u003ca href=\"http://www.tfa-dostmann.de/Bedienungsanleitungen/30.3015_e.pdf\"\u003eKlima-Logger\u003c/a\u003e to a \u003ca href=\"http://www.raspberrypi.org/\"\u003eRaspberry Pi\u003c/a\u003e Board to make the data available via browser on my home network. Here are some resources I found\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://oss.inqnet.at/trac/klimalogger/\"\u003ehttps://oss.inqnet.at/trac/klimalogger/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://members.home.nl/xbasic/01c2249c770e62101/index.html\"\u003ehttp://members.home.nl/xbasic/01c2249c770e62101/index.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.atmel.com/dyn/resources/prod_documents/doc0670.pdf\"\u003ehttp://www.atmel.com/dyn/resources/prod_documents/doc0670.pdf\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.wetterstationsforum.de/phpBB/viewtopic.php?t=7605\u0026amp;postdays=0\u0026amp;postorder=asc\u0026amp;start=0\u0026amp;sid=472299c23b04447cc15aa92492c4a76f\"\u003ehttp://www.wetterstationsforum.de/phpBB/viewtopic.php?t=7605\u0026amp;postdays=0\u0026amp;postorder=asc\u0026amp;start=0\u0026amp;sid=472299c23b04447cc15aa92492c4a76f\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://web.student.tuwien.ac.at/~e9725348/Projects/klimalogger/\"\u003ehttp://web.student.tuwien.ac.at/~e9725348/Projects/klimalogger/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOutdated:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eI recently bought a hygrometer from \u003ca href=\"http://www.tfa-dostmann.de/TFA2003_englisch/\"\u003eTFA-Dostmann\u003c/a\u003e, called \u003ca href=\"http://www.tfa-dostmann.de/Bedienungsanleitungen/30.3015_e.pdf\"\u003eKlima-Logger\u003c/a\u003e. It is the cheapest thermometer and hygrometer with PC connectivity I could find on the market. Unfortunately only a Windows software is provided to get the recorded values for temperature and humidity. I thought a Linux driver would be cool and started searching for resources on the net.  Usually the Linux community is very fast in supporting new gadgets of any kind, but  nothing could be found.\u003c/p\u003e","title":"Linux support for TFA Klima-Logger"},{"content":"I am a software engineer with over 40 years of hands-on experience, from 8-bit home computers to cloud-native microservices.\nMy fascination for computers began in 1982 with a Sinclair ZX-81. After exploring home computers like the TI-99 4/A and the VIC-20, I wrote my first BASIC program on a C64 in 1985. I learned 8-bit assembler on the C128, then moved on to M68000 assembler and C on the Commodore Amiga, before transitioning to Turbo Pascal on PC/MS-DOS. From there I worked across many Windows and UNIX platforms, using C/C++ until adopting Java as my primary language around 2000.\nMy diploma thesis in 1998 sparked a deep interest in distributed systems \u0026ndash; an expertise that proved invaluable during my time at Brokat/Encorus/First Data, where I worked at the core of the Brokat Java Enterprise Edition application server Twister, used by numerous banks for their online banking solutions.\nThroughout my career I have contributed to various open-source and free software projects, and I continue to be passionate about clean architecture, cloud-native development, and solving complex engineering challenges.\nMEMBERSHIPS Active GitLab (Since April 2018) GitHub (Since November 2011) LinkedIn Member (Since April 2008) Java User Group Stuttgart (JUGS) Member (Since June 2004) Inactive Jenkins (July 2014 until March 2018) OpenORB \u0026ndash; Committer (January 2002 until 2005) ORBit Resource \u0026ndash; Maintainer (August 2000 until 2003) Encorus Software Architecture Group (SWAG) \u0026ndash; Member (March 2003 until January 2006) PUBLICATIONS Weblog (Since June 2005) Diploma thesis (2000) Approaches for the integration of distributed computation into the WWW (1998) Article for \u0026lsquo;DOS International\u0026rsquo; (1993) TECHNOLOGIES Domains Automotive, Cloud, Connected Vehicle, IoT, Finance, Telecom Methodologies Domain-Driven Design (DDD), TDD, Agile, DevSecOps, Platform Engineering, OOA/OOD/OOP, XP, MDA/MDSD AI / GenAI Agentic AI, LLMs, MCP (Model Context Protocol), Context Engineering, Spring AI, Amazon Bedrock Coding Agents Claude Code, GitHub Copilot Languages Java, Kotlin, Rust, Python, Bash, C/C++, SQL, JavaScript, HTML/CSS, Perl, Pascal, 6502/68000 Assembler JVM Ecosystem GraalVM, WebAssembly (Wasm), Native Image, Virtual Threads Cloud Platforms Azure, AWS, IBM Cloud, Google Cloud, Open Telekom Cloud (OTC) AWS Services Lambda, ECS, EKS, CDK, MSK, IoT Core, Bedrock, Aurora, ALB Cloud Native Containers, Kubernetes, Serverless, Docker, Helm, Cloud Foundry Server Frameworks Spring Boot/Cloud, JEE, Pro Active Infrastructure (PAI, Mercedes-Benz AG internal) Spring Ecosystem Spring Framework, Spring Boot, Spring Cloud, Spring Data, Spring AI, Spring Integration Netflix OSS Eureka, Zuul, Feign, Hystrix, Ribbon Messaging / Streaming Apache Kafka, Amazon MSK, RabbitMQ (AMQP), ActiveMQ (JMS), IBM WebSphere MQ Web Frameworks Angular, JSF (MyFaces, ICEfaces), Struts, Wicket, Quasar (Mercedes-Benz AG internal) Web Technologies REST, gRPC, SOAP, JSP, Servlets, AJAX, JSTL, CSS, XHTML Security Zero Trust Architecture, GitLab Ultimate SAST/DAST CI/CD GitLab CI, Concourse CI, Jenkins/Hudson, CruiseControl Code Analysis SonarQube, jQAssistant, Checkstyle, FindBugs, PMD, JDepend Testing JUnit, JUnitPerf, JMeter, Selenium Build Tools Gradle, Maven, Ant, make, msbuild VCS Git, Subversion, CVS, Microsoft Team Foundation Server, ClearCase Monitoring Dynatrace, AppDynamics, Datadog, Grafana, Elasticsearch/Kibana, Prometheus Observability OpenTelemetry, OpAMP, Jaeger, eBPF DBMS PostgreSQL, MySQL, Oracle, H2/HSQL-DB, JavaDB/Derby, MS-SQL, Microsoft Access ORM Spring Data JDBC, Hibernate, JPA XML XML, XSL, JAXB, Castor, XPath IDE IntelliJ IDEA, Eclipse, Visual Studio, VS Code, Netbeans, IBM WSAD/RAD Modelling PlantUML, Visual Paradigm, Enterprise Architect, StarUML, Visio Diagrams UML, ER, Flow Issue Tracking GitLab, GitHub, JIRA, Bugzilla, Trac Wikis GitLab, GitHub, Confluence, MediaWiki Reporting Crystal Reports, Jasper Reports, Aspose (Slides, Words, Cells, Pdf) CORBA OpenORB, Sun ORB, VisiBroker, Orbix, Orbix COMet, ORBit, TAO Legacy Microsoft ActiveX, COM, DCOM, DDE, VBA Legacy UI Eclipse RCP, Swing, MFC, Borland OWL, Turbo-Vision, X11 Legacy Compilers gcc, MSVC, Borland C++, Sun C++, IBM C++, HP C++ ","permalink":"https://rumpf.eu/michael/about/","summary":"\u003cp\u003eI am a software engineer with over 40 years of hands-on experience, from 8-bit home computers to cloud-native microservices.\u003c/p\u003e\n\u003cp\u003eMy fascination for computers began in 1982 with a Sinclair \u003ca href=\"https://en.wikipedia.org/wiki/ZX81\"\u003eZX-81\u003c/a\u003e. After exploring home computers like the \u003ca href=\"https://en.wikipedia.org/wiki/Texas_Instruments_TI-99/4A\"\u003eTI-99 4/A\u003c/a\u003e and the \u003ca href=\"https://en.wikipedia.org/wiki/Commodore_VIC-20\"\u003eVIC-20\u003c/a\u003e, I wrote my first BASIC program on a \u003ca href=\"https://en.wikipedia.org/wiki/Commodore_64\"\u003eC64\u003c/a\u003e in 1985. I learned 8-bit assembler on the \u003ca href=\"https://en.wikipedia.org/wiki/Commodore_128\"\u003eC128\u003c/a\u003e, then moved on to M68000 assembler and C on the \u003ca href=\"https://en.wikipedia.org/wiki/Amiga\"\u003eCommodore Amiga\u003c/a\u003e, before transitioning to Turbo Pascal on PC/MS-DOS. From there I worked across many Windows and UNIX platforms, using C/C++ until adopting Java as my primary language around 2000.\u003c/p\u003e","title":"About"},{"content":"My role at Achievo Deutschland AG was best described as Technical Lead Software Development. My responsibilities included:\nDevelopment process (offshore and nearshore) Software development guidelines Definition and compliance checking of quality gates Technical architecture Coaching of new developers Build process and continuous integration strategy WebSphere Application Server configuration and deployment On customer projects I served as senior software architect.\nTACO - Transparent Analysis and Cost Optimization The TACO project is a J2EE application which supports the purchasing process of car components for an automotive manufacturer.\nDFM - Designed for Manufacturing (PPG - Produktionsgerechte ProduktGestaltung) The DFM project is a J2EE application which supports the optimization process during the production of a new car model.\nADF - Achievo Development Framework ADF is a framework which provides common functionality to the Achievo Java/J2EE projects.\nRole Senior Software Architect and Technical Lead Software Development Environment Windows, Linux, Solaris, Eclipse, IBM WebSphere 5.0/6.0/6.1, Java 1.4/1.5, J2EE1.2/1.3/1.4, Struts 1.1, JSF 1.1, CruiseControl/Hudson, Findbugs, Checkstyle, PMD, Oracle 9.x-10.x, Aspose Slides/Words/Cells/Pdf, Pro Active Infrastructure (PAI) 3.x - 4.0 ","permalink":"https://rumpf.eu/michael/projects/achievo/","summary":"\u003cp\u003eMy role at \u003ca href=\"https://web.archive.org/web/20100108110134/http://www.achievo.de/\"\u003eAchievo Deutschland AG\u003c/a\u003e was best described as \u003cem\u003eTechnical Lead Software Development\u003c/em\u003e. My responsibilities included:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDevelopment process (offshore and nearshore)\u003c/li\u003e\n\u003cli\u003eSoftware development guidelines\u003c/li\u003e\n\u003cli\u003eDefinition and compliance checking of quality gates\u003c/li\u003e\n\u003cli\u003eTechnical architecture\u003c/li\u003e\n\u003cli\u003eCoaching of new developers\u003c/li\u003e\n\u003cli\u003eBuild process and continuous integration strategy\u003c/li\u003e\n\u003cli\u003eWebSphere Application Server configuration and deployment\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOn customer projects I served as senior software architect.\u003c/p\u003e\n\u003ch1 id=\"taco---transparent-analysis-and-cost-optimization\"\u003eTACO - Transparent Analysis and Cost Optimization\u003c/h1\u003e\n\u003cp\u003eThe TACO project is a J2EE application which supports the purchasing process of car components for an automotive manufacturer.\u003c/p\u003e","title":"Achievo"},{"content":"This application replaces manual paper-based allowance calculations on construction sites with computer-based data entry and reporting.\nAt startup, the user selects a construction site before proceeding to the main menu.\nMain Menu\nThe first ten menu items provide functions for the collection of allowances. Each mask is preceded by a blueprint number and the resulting item number for the allowance.\nInformation\nInput mask for length, width, and height\nThe \u0026ldquo;daily reports\u0026rdquo; provide information about the human resource usage and the weather conditions for the specified day.\nDaily report mask 1\nDaily report mask 2\nThe administration menu provides printing, faxing, copying, or removing of allowance reports.\nFile administration\nThe difference between the versions from 1.0 to 5.2 is the number of supported allowance types, the daily report functionality, and the file administration feature.\nRole Architect, Developer Environment MS-DOS, Turbo Pascal 3.0 - 6.0 Link aufmass.tar.bz2 (110kB) ","permalink":"https://rumpf.eu/michael/projects/allowance/","summary":"\u003cp\u003eThis application replaces manual paper-based allowance calculations on construction sites with computer-based data entry and reporting.\u003c/p\u003e\n\u003cp\u003eAt startup, the user selects a construction site before proceeding to the main menu.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/aufmassmain.png\"\u003e\u003cimg alt=\"Main Menu\" loading=\"lazy\" src=\"/michael/images/aufmassmainsmall.png\"\u003e\u003c/a\u003e\n\u003cem\u003eMain Menu\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThe first ten menu items provide functions for the collection of allowances. Each mask is preceded by a blueprint number and the resulting item number for the allowance.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/aufmassinfo.png\"\u003e\u003cimg alt=\"Information\" loading=\"lazy\" src=\"/michael/images/aufmassinfosmall.png\"\u003e\u003c/a\u003e\n\u003cem\u003eInformation\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/aufmasslbh.png\"\u003e\u003cimg alt=\"Input mask for length, width, and height\" loading=\"lazy\" src=\"/michael/images/aufmasslbhsmall.png\"\u003e\u003c/a\u003e\n\u003cem\u003eInput mask for length, width, and height\u003c/em\u003e\u003c/p\u003e","title":"Allowance"},{"content":"Several fun programs written in 68000 Assembler on the Commodore Amiga. The purpose of these programs was simply to explore the Amiga\u0026rsquo;s hardware capabilities and to have fun.\nThe programs below were tested on Amiga Emulator UAE version 0.6.9 R12.\nMisc The small test application below moves five sprites and draws some lines using the processor only \u0026ndash; no Amiga custom chips are involved.\nVector The first screenshot shows my first working vector graphics algorithm.\nThe second screenshot shows a little demo application in which I combined the Copper custom chip, a three-layered star scrolling, and the previously mentioned vector graphics algorithm.\nvector.tar.bz2 (38kB)\nDemo The next screenshot shows my first fully working Amiga demo application featuring three moving bars (Copper), a star layer scrolling (processor), a scrolling text line (Blitter), and sound.\nYouTube \u0026ndash; demo.tar.bz2 (68kB)\nMegaDemo II Here you can see a part of a so-called Mega-Demo. Unfortunately, the other members of our small computer club were not quite as enthusiastic about writing a mega-demo, so my part was the only one that ever got finished ;)\nThe demo features the usual star scrolling, two rotating color lines (Copper), a scroll line (Blitter), a rotating logo (Blitter), four sprites flying around, and sound.\nYouTube \u0026ndash; megademo2.tar.bz2 (190kB)\nGame This was my first attempt at writing a game on the Amiga. The bottom stripes move to create the impression that the airplane is flying over the terrain.\ngame.tar.bz2 (35kB)\nCoder This program was intended for encrypting floppy disks so their contents would be accessible only by password.\nThe GUI is non-standard, meaning no AmigaOS GUI libraries are used. Directory loading is implemented and the GUI is fully operational, but the actual encryption algorithms were never finalized.\ncoder.tar.bz2 (60kB)\nSeek \u0026amp; Destroy (S\u0026amp;D) This is a classic fly-and-shoot game. Unfortunately, the version I found on the Amiga disks is broken, so the actual game can no longer be started \u0026ndash; only the menus shown here still work.\nSteering the helicopter over a landscape and firing rockets were already working, but the full game was never finalized.\nseekndestroy.tar.bz2 (378kB, ADF)\nRole Architect, Developer Environment AMIGA OS, SEKA 68000 Assembler 3.2, Deluxe Paint 4 ","permalink":"https://rumpf.eu/michael/projects/amiga/","summary":"\u003cp\u003eSeveral fun programs written in \u003ca href=\"https://en.wikipedia.org/wiki/Motorola_68000\"\u003e68000 Assembler\u003c/a\u003e on the \u003ca href=\"https://en.wikipedia.org/wiki/Amiga\"\u003eCommodore Amiga\u003c/a\u003e.\nThe purpose of these programs was simply to explore the Amiga\u0026rsquo;s hardware capabilities and to have fun.\u003c/p\u003e\n\u003cp\u003eThe programs below were tested on \u003ca href=\"http://www.amigaemulator.org/\"\u003eAmiga Emulator UAE\u003c/a\u003e version 0.6.9 R12.\u003c/p\u003e\n\u003ch1 id=\"misc\"\u003eMisc\u003c/h1\u003e\n\u003cp\u003eThe small test application below moves five sprites and draws some lines using the processor only \u0026ndash; no Amiga custom chips are involved.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/5imageshuepflines.png\"\u003e\u003cimg alt=\"Five hopping sprites\" loading=\"lazy\" src=\"/michael/images/5imageshuepflinessmall.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"vector\"\u003eVector\u003c/h1\u003e\n\u003cp\u003eThe first screenshot shows my first working vector graphics algorithm.\u003c/p\u003e","title":"Amiga"},{"content":"This software provides a set of scripts for automatically generating DBox2 Neutrino channel lists \u0026ndash; a workaround for the automatic transponder scan, which does not work reliably on all DBox2 boxes.\nAutomatic Zapit Satellite (AZS) is a small collection of scripts that extract the Astra digital TV and digital radio channel lists from internet sources and produce the services.xml and bouquets.xml files used by the Linux operating system on the DBox2 digital satellite receiver.\nCurrent yadi Neutrino versions ship with fairly sophisticated channel scanning software. Unfortunately, it does not work with my DBox2 \u0026ndash; most likely because the signal quality is too poor, possibly due to trees blocking the line of sight. The symptom is that an automatic channel scan picks up only a handful of channels, whereas building the channel list from internet sources works without any issues.\nThe current AZS version fetches the channel list from Lyngsat, which serves a rather broken HTML page containing all digital TV and radio channels. The script cleans up the page with HTML Tidy, then strips it down using an XSL stylesheet. The result is a relatively clean, simple HTML page that is used to generate the services.xml file, which maps channels to satellite transponders. In the next stage, this file serves as the source for the bouquet.xml file, which maps channels to bouquets. This AZS version uses a file called mybouquets.xml that tells the scripts which channels belong to which bouquets. The final step is an automatic upload of the generated files to the DBox2 via FTP using the expect tool.\nFor the current version, mybouquets.xml must be created manually. It is essentially a services.xml file with a different bouquet assignment. When running AZS for the first time, you execute the services.sh script and then copy the generated services.xml to mybouquets.xml. You then edit the bouquet assignments in that file so that the final services.xml can be generated on the fly on subsequent runs.\n./services.sh cp services.xml mybouquets.xml\nEdit the mybouquets.xml and adapt the channel to bouqets assignment When you run the azs.sh script afterwards, it uses the adapted mybouquets.xml to rearrange the services.xml and then uploads the generated files to the DBox2.\n./azs.sh Type Personal Project Environment Linux, XSL, Bash, HTML Tidy, expect Link azs-0.2.tar.bz2 (21kB) ","permalink":"https://rumpf.eu/michael/projects/azs/","summary":"\u003cp\u003eThis software provides a set of scripts for automatically generating DBox2 Neutrino channel lists \u0026ndash; a workaround for the automatic transponder scan, which does not work reliably on all DBox2 boxes.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eA\u003c/strong\u003eutomatic \u003cstrong\u003eZ\u003c/strong\u003eapit \u003cstrong\u003eS\u003c/strong\u003eatellite (AZS) is a small collection of scripts that extract the \u003ca href=\"http://www.ses-astra.com\"\u003eAstra\u003c/a\u003e digital TV and digital radio channel lists from internet sources and produce the \u003ccode\u003eservices.xml\u003c/code\u003e and \u003ccode\u003ebouquets.xml\u003c/code\u003e files used by the Linux operating system on the DBox2 digital satellite receiver.\u003c/p\u003e","title":"Automatic Zapit Satellite"},{"content":"This project involved migrating WordBasic macros to VisualBasic for Applications (VBA).\nThe company used a large set of Microsoft Word Autotext fragments to generate customer offers. Each fragment described one of their products, and an offer was simply a compilation of different fragments into a single Word document.\nThe original program consisted of WordBasic scripts that inserted all Autotexts into a document for editing the product descriptions. My task was to convert these scripts to VisualBasic for Applications (VBA).\nThe problem with storing product descriptions as Autotexts was that the approach did not scale \u0026ndash; it was unsuitable for concurrent access, and the text fragments were very hard to maintain. As a solution, I wrote a prototype in Visual Basic called Inventory Management 1.0, which was presented to the company. Unfortunately, they chose an already established application instead.\nRole Architect, Developer Environment Windows, Microsoft Word 97, VisualBasic for Applications Link autotexts.tar.bz2 (620kB) ","permalink":"https://rumpf.eu/michael/projects/autotexts/","summary":"\u003cp\u003eThis project involved migrating WordBasic macros to VisualBasic for Applications (VBA).\u003c/p\u003e\n\u003cp\u003eThe company used a large set of Microsoft Word Autotext fragments to generate customer offers. Each fragment described one of their products, and an offer was simply a compilation of different fragments into a single Word document.\u003c/p\u003e\n\u003cp\u003eThe original program consisted of WordBasic scripts that inserted all Autotexts into a document for editing the product descriptions. My task was to convert these scripts to VisualBasic for Applications (VBA).\u003c/p\u003e","title":"Autotexts"},{"content":"The Commodore 64 projects on this page were created while teaching myself the BASIC programming language and 6502 Assembler.\nThe files on this page were converted to the \u0026ldquo;Virtual Disk\u0026rdquo; format (.d64) using Trans64 and an X1541 cable to connect an original C64 floppy drive to a PC.\nBasic Arithmetics This program served as both a calculator and a training tool for basic arithmetic.\nIn training mode, you can limit the number of questions and/or the maximum numbers used. The user\u0026rsquo;s response time is measured for statistics.\nDisk \u0026ldquo;M.RUMPF (Side 1+2)\u0026rdquo;\nVocabulary Trainer This program was developed to train my English vocabulary. Relative access (REL) file databases of the six English school books used in classes five through ten were created so that the complete vocabulary from class five to ten could be practiced.\nUnfortunately, I don\u0026rsquo;t have screenshots because the C128 emulator could not run the program correctly, even though it worked fine on the original C128.\nDisks VocabularyTrainer Book 1+2, Book 3+4, Book 5+6\nC128 Assembler I took my first steps in assembler on the C128 using the EDASS assembler.\nDisk EDASS + Source\nRole Architect, Developer Environment C64 Basic, C128 EDASS Assembler ","permalink":"https://rumpf.eu/michael/projects/c64128/","summary":"\u003cp\u003eThe \u003ca href=\"https://en.wikipedia.org/wiki/Commodore_64\"\u003eCommodore 64\u003c/a\u003e projects on this page were created while teaching myself the BASIC programming language and \u003ca href=\"https://en.wikipedia.org/wiki/MOS_Technology_6502\"\u003e6502 Assembler\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe files on this page were converted to the \u0026ldquo;Virtual Disk\u0026rdquo; format (.d64) using \u003ca href=\"http://sta.c64.org/cables.html\"\u003eTrans64\u003c/a\u003e and an X1541 cable to connect an original C64 floppy drive to a PC.\u003c/p\u003e\n\u003ch1 id=\"basic-arithmetics\"\u003eBasic Arithmetics\u003c/h1\u003e\n\u003cp\u003eThis program served as both a calculator and a training tool for basic arithmetic.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/grundrechenarten1.png\"\u003e\u003cimg alt=\"Grundrechenarten 1\" loading=\"lazy\" src=\"/michael/images/grundrechenarten1small.png\"\u003e\u003c/a\u003e   \u003ca href=\"/michael/images/grundrechenarten2.png\"\u003e\u003cimg alt=\"Grundrechenarten 2\" loading=\"lazy\" src=\"/michael/images/grundrechenarten2small.png\"\u003e\u003c/a\u003e   \u003ca href=\"/michael/images/grundrechenarten3.png\"\u003e\u003cimg alt=\"Grundrechenarten 3\" loading=\"lazy\" src=\"/michael/images/grundrechenarten3small.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/grundrechenarten4.png\"\u003e\u003cimg alt=\"Grundrechenarten 4\" loading=\"lazy\" src=\"/michael/images/grundrechenarten4small.png\"\u003e\u003c/a\u003e   \u003ca href=\"/michael/images/grundrechenarten5.png\"\u003e\u003cimg alt=\"Grundrechenarten 5\" loading=\"lazy\" src=\"/michael/images/grundrechenarten5small.png\"\u003e\u003c/a\u003e   \u003ca href=\"/michael/images/grundrechenarten6.png\"\u003e\u003cimg alt=\"Grundrechenarten 6\" loading=\"lazy\" src=\"/michael/images/grundrechenarten6small.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/grundrechenarten7.png\"\u003e\u003cimg alt=\"Grundrechenarten 7\" loading=\"lazy\" src=\"/michael/images/grundrechenarten7small.png\"\u003e\u003c/a\u003e\u003c/p\u003e","title":"C64/C128"},{"content":"The clearing and settlement solution was developed between September 2004 and June 2005 to process large volumes of chargeable events and produce files for carrying out the actual settlements with a bank.\nArchitecture\nMy task in this project was to develop the Finance Calculation Service (FCS). The main design goal was to keep the interface as simple as possible and to avoid any dependencies on other components of the application. The workflow engine was responsible for orchestrating all the different services. It reads the financial base data from the database via the Finance Data Repository (FDR) and feeds those entities into the FCS API. The calculated results are then stored back into the database through the FDR. The design follows the dependency injection principle, where all data is fed into the FCS methods from the outside. This allows the service to run locally without requiring an EJB container or a database.\nI also developed the graphical user interface \u0026ndash; an online reporting view for the settled payments \u0026ndash; following the Model View Controller (MVC) pattern.\nType Senior Software Architect at First Data Mobile Solutions Environment Linux, AIX, Eclipse, BEA Weblogic 8.1, EJB, JUnit, JSP, Ant, JSTL ","permalink":"https://rumpf.eu/michael/projects/css/","summary":"\u003cp\u003eThe clearing and settlement solution was developed between September 2004 and June 2005 to process large volumes of chargeable events and produce files for carrying out the actual settlements with a bank.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/cssng.png\"\u003e\u003cimg alt=\"Architecture\" loading=\"lazy\" src=\"/michael/images/cssng_small.png\"\u003e\u003c/a\u003e\n\u003cem\u003eArchitecture\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eMy task in this project was to develop the Finance Calculation Service (FCS). The main design goal was to keep the interface as simple as possible and to avoid any dependencies on other components of the application. The workflow engine was responsible for orchestrating all the different services. It reads the financial base data from the database via the Finance Data Repository (FDR) and feeds those entities into the FCS API. The calculated results are then stored back into the database through the FDR. The design follows the dependency injection principle, where all data is fed into the FCS methods from the outside. This allows the service to run locally without requiring an EJB container or a database.\u003c/p\u003e","title":"Clearing and Settlement System"},{"content":"An evaluation prototype for testing CORBA access from VisualBasic applications.\nThe goal of this prototype was to evaluate whether a commercially available COM2CORBA bridge is suitable for accessing CORBA objects from a Microsoft COM application.\nThe prototype was developed using an evaluation version of Orbix 2.3 for Windows NT and Sun Solaris, along with the IONA Orbix COMet COM2CORBA bridge.\nCOM2CORBA prototype architecture\nThe server component runs on Solaris 5 and provides access to a Fulcrum Search Server, an SGML indexing engine. The client is a VisualBasic search application running on Windows NT.\nA search term is transparently mapped from COM into a CORBA request by the COM2CORBA bridge and sent via IIOP to the CORBA server component. The server performs a keyword search against the Fulcrum Search Server and returns the result list to the VisualBasic client, which displays the search results to the user.\nThis prototype demonstrates how smoothly CORBA objects can be accessed through COM interfaces.\nType Internship, Evaluation Project Environment Windows 9x/NT4, Sun Solaris 5, Orbix COMet, SUN C++ 4.2, Visual Basic 5.0 ","permalink":"https://rumpf.eu/michael/projects/com2corba/","summary":"\u003cp\u003eAn evaluation prototype for testing CORBA access from VisualBasic applications.\u003c/p\u003e\n\u003cp\u003eThe goal of this prototype was to evaluate whether a commercially available COM2CORBA bridge is suitable for accessing CORBA objects from a Microsoft COM application.\u003c/p\u003e\n\u003cp\u003eThe prototype was developed using an evaluation version of Orbix 2.3 for Windows NT and Sun Solaris, along with the IONA Orbix COMet COM2CORBA bridge.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/com2corba.png\"\u003e\u003cimg alt=\"COM2CORBA prototype architecture\" loading=\"lazy\" src=\"/michael/images/com2corba_small.png\"\u003e\u003c/a\u003e\n\u003cem\u003eCOM2CORBA prototype architecture\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThe server component runs on Solaris 5 and provides access to a Fulcrum Search Server, an SGML indexing engine. The client is a VisualBasic search application running on Windows NT.\u003c/p\u003e","title":"COM2CORBA"},{"content":"A perl script that runs positive and negative test-cases against arbitrary IDL compilers for specification compliance checking.\nWhile learning CORBA, I wrote a set of IDL files and a script to check the compliance of an IDL parser.\nThe files are separated into categories of valid and invalid IDL fragments. A Perl script picks up the different IDL files and feeds them to the IDL compiler. If the compiler fails on a valid file, or does not fail on an invalid file, the script terminates and reports an incompatibility in the IDL parser under test.\nThe related CORVAL project of the Open Group tries to define a framework with which CORBA products can be checked for standard compliance.\nType Personal Project Environment Linux, Perl, ORBit, GNU make Link validator.tar.bz2 (8kB) ","permalink":"https://rumpf.eu/michael/projects/validator/","summary":"\u003cp\u003eA perl script that runs positive and negative test-cases against arbitrary IDL compilers for specification compliance checking.\u003c/p\u003e\n\u003cp\u003eWhile learning CORBA, I wrote a set of IDL files and a script to check the compliance of an IDL parser.\u003c/p\u003e\n\u003cp\u003eThe files are separated into categories of valid and invalid IDL fragments. A Perl script picks up the different IDL files and feeds them to the IDL compiler. If the compiler fails on a valid file, or does not fail on an invalid file, the script terminates and reports an incompatibility in the IDL parser under test.\u003c/p\u003e","title":"CORBA 2.2 Validator"},{"content":"The CORBA/CGI bridge is an evaluation prototype for testing how a CGI application can be replaced by CORBA components.\nThe idea behind this prototype was to replace a CGI application that accessed a server-side application with a CORBA layer. The client application had to remain unchanged, as its source code was not available.\nIn the first step, the CGI application was replaced by a Java servlet deployed on Sun\u0026rsquo;s Java Web Server. At this stage, the servlet still accessed the server application by executing a command-line script.\nCORBA-CGI Architecture\nIn the second step, the server application was wrapped with a CORBA IDL interface and accessed from within the servlet via a Java CORBA client. The CORBA server was written in C++ using the VisiBroker CORBA ORB, while the servlet used Sun\u0026rsquo;s JavaIDL CORBA ORB on the client side.\nThe servlet exposes the same interface as the original CGI program. It simply parses the HTTP request parameters and forwards them to the CORBA server application\u0026rsquo;s interface. The benefit of using CORBA is that the server-side application can be moved to a different machine, with all network communication handled transparently by the CORBA IIOP protocol.\nType Internship, Evaluation Project Environment Windows 9x/NT4, C++, Java, JDK 1.2 Beta, JavaIDL 1.0, VisiBroker C++ 3.2, JavaWebServer 2.0 Beta ","permalink":"https://rumpf.eu/michael/projects/corbacgi/","summary":"\u003cp\u003eThe CORBA/CGI bridge is an evaluation prototype for testing how a CGI application can be replaced by CORBA components.\u003c/p\u003e\n\u003cp\u003eThe idea behind this prototype was to replace a CGI application that accessed a server-side application with a CORBA layer. The client application had to remain unchanged, as its source code was not available.\u003c/p\u003e\n\u003cp\u003eIn the first step, the CGI application was replaced by a Java servlet deployed on Sun\u0026rsquo;s Java Web Server. At this stage, the servlet still accessed the server application by executing a command-line script.\u003c/p\u003e","title":"CORBA/CGI Bridge"},{"content":"This article, published in a German PC magazine called \u0026lsquo;DOS International\u0026rsquo;, was written during a summer C++ course at Saarland University.\nInitially, it was intended as a submission for a contest to write a useful program in just 1024 bytes. The prize was 1024 Deutsche Mark, but unfortunately the program was considered too specialized to be generally useful. However, the contribution was later reused in the magazine\u0026rsquo;s programmer\u0026rsquo;s corner: \u0026rsquo;tips and tricks for programmers\u0026rsquo;.\nBelow is the German version of the article as published in \u0026lsquo;DOS International\u0026rsquo; in September 1993.\nVektortemplate vektor.cpp (Listing 2) kompilieren Sie mit Borland C++ ab Version 3.1.\nEin Vektortemplate nutzen alle begeisterten C++-Anhänger, die wiederverwendbare Software schreiben. Es kann als Ausgangspunkt einer benutzerdefinierten, mathematischen Bibliothek dienen und bietet dem Anwender viele Wege zur Erweiterung, wie zum Beispiel ein Matrixtemplate, das aus mehreren Vektoren dargestellt wird. Das Ziel der Vektorrepräsentation durch ein Template ist es, unter Ausnutzung der Überladungsmöglichkeiten von Operatoren und Funktionen (operator-overloading, function-overloading) eine Syntax zu gestatten, wie es in der Mathematik üblich ist. Damit erreichen Sie besser lesbaren und damit leichter verständlichen Code. Der zweite Vorteil des Templates ist, daß es dem Anwender überlassen ist, welchen Datentyp er in der Instanz seines Vektors speichern möchte. Durch die beiden Konstruktoren und das Default-Argument ergeben sich drei verschiedene Arten der Definition eines Vektorobjektes vom Typ v.\nDie erste Definition erzeugt einen dreidimensionalen Vektor v1 mit Komponenten vom Typ float.\nv\u0026lt;float\u0026gt; v2 = v1; Die zweite Definition erzeugt ein komplettes Duplikat des Vektors v1 mit eigenem Komponentenspeicher.\nv\u0026lt;float\u0026gt; v3(4); Die dritte Definition erzeugt den vierdimensionalen Vektor v3 unter expliziter Angabe der Dimension.Die Elementfunktion 4 liefert als Rückgabewert die Dimension eines Vektors:\ncout\u0026lt;\u0026lt;v1.d()\u0026lt;\u0026lt;\u0026#34;-dimensional\u0026#34;; //Ausgabe:3-dimensional Durch das Überladen des Subskriptoperators [] kann der Anwender explizit auf die einzelnen Komponenten eines Vektors zugreifen:\ncout \u0026lt;\u0026lt; v1[1]; //Ausgabe:0,weil erste Komponente hier noch // nicht initialisiert ist. Die Subskriptfunktion liefert als Rückgabe eine Referenz auf die spezifizierte Komponente. Dadurch sind Sie in der Lage, mit dem Subskriptoperator eine Initialisierung des Vektors durchzuführen.\nv1[1]=2.0; v1[2]=3.5; v1[3]=1.7; v2[1]=5.7; v2[2]=9.1; v2[3]=4.8; Mit der Nummerierung hält sich die Operatorfunktion an die mathematische Notation. Der Anwender spricht bei einem dreidimensionalen Vektor die Komponenten mit den Indizes 1 bis 3 an. Template-intern wird zwangsläufig auf die normale C++-Indizierung von 0 bis 2 umgerechnet. Das Überladen des C++-Ausgabeoperators \u0026lt;\u0026lt; erlaubt die Ausgabe beliebig-dimensionaler Vektoren innerhalb der gewohnten Ausgabesequenzen;\ncout \u0026lt;\u0026lt; \u0026#34;v1=\u0026#34; \u0026lt;\u0026lt; v1 \u0026lt;\u0026lt; \u0026#39;\\n\u0026#39;; // Ausgabe:v1=[2.0,3.5,1.7] Die arithmetischen Operatoren +, -, * und der Zuweisungsoperator = wurden überladen, um die einfachen mathematischen Vektoroperationen zu gestatten: v3=v1;. Der Zuweisungsoperator kopiert die Komponenten und die Dimension von bestehenden Objekten. Im Unterschied zum Copy-Konstruktor wird kein neues Objekt erzeugt, sondern ein bestehendes überschrieben. Die auf Vektoren definierte Skalarmultiplikation unterliegt jedoch einigen Beschränkungen. Der linke Operand muß ein lvalue sein, und es können nur Elemente gleichen Datentyps miteinander multipliziert werden oder Elemente, die sich nach den Typumwandlungsregeln von C++ in den Datentyp der Komponenten verwandeln lassen.\ncout \u0026lt;\u0026lt; v1*3; //Ausgabe:[6.0,10.5,5.1] Der Additionsoperator stellt die komponentenweise Addition zweier Vektoren zur Verfügung.\ncout \u0026lt;\u0026lt; vl+v2; //Ausgabe:[7.7,12.6,6.5] Um bei der Vektorsubtraktion nicht den identischen Code des Additionsoperators zu benutzen, nur mit dem Unterschied eines einzigen Zeichens, wurde die Subtraktion mit Hilfe der Addition und Skalarmultiplikation implementiert. Die Anweisung return *this + w * -1; führt mit jeder Komponente des Übergabeparameters w eine Multiplikation mit -1 durch und addiert danach die beiden Vektoren. Der Subtraktionsoperator kann dann beispielsweise so genutzt werden:\ncout \u0026lt;\u0026lt; vl-v2; //Ausgabe:[-3.7,-5.6,-3.1] Dieses Beispiel trägt hoffentlich dazu bei, die Stärken von C++ gegenüber prozeduralen Programmiersprachen zu verdeutlichen und herauszustellen, wie einfach es ist, wiederverwendbaren Code zu schreiben. Das Template soll dem Benutzer als Anregung dienen, sich mit den Stärken von C++ auseinanderzusetzen und nach Erweiterung der Funktionen soll es sich als nützlich im Zusammenhang mit der Entwicklung mathematischer Software erweisen.\n(Michael Rumpf/et)\n1: //Compiler: Borland C++ 3.1 2: #include \u0026lt;iostream.h\u0026gt; 3: template\u0026lt;class T\u0026gt;class v{ 4: int z; 5: T* a; 6: public: 7: v(intd=3){a=new T[z=d];} 8: v(v\u0026lt;T\u0026gt;\u0026amp;); 9: -v()\u0026lt;delete a;} 10: int d()(return z;); 11: T\u0026amp;operator()(int i); 12: v\u0026lt;T\u0026gt;operator+(v\u0026lt;T\u0026gt;); 13: v\u0026lt;T\u0026gt;operator*lT); 14: v\u0026lt;T\u0026gt;operator-(v\u0026lt;T\u0026gt;); 15: v\u0026lt;T\u0026gt;operator=(v\u0026lt;T\u0026gt;); 16: friend ostream\u0026amp;operator\u0026lt;\u0026lt; 17: (ostream\u0026amp;os,v\u0026lt;T\u0026gt;w);); 18: template\u0026lt;class T\u0026gt;ostream 19: \u0026amp;operator\u0026lt;\u0026lt; (ostream\u0026amp;os,v\u0026lt;T\u0026gt;w) 20: {os\u0026lt;\u0026lt;\u0026#34; [\u0026#34;; for (int i=1; i\u0026lt;w.z;i++) 21: os\u0026lt;\u0026lt;w[i]\u0026lt;\u0026lt;\u0026#39;,\u0026#39;; 22: return os\u0026lt;\u0026lt;w [w.z] \u0026lt;\u0026lt;\u0026#34;] \u0026#34;: } 23: template\u0026lt;class T\u0026gt;v\u0026lt;T\u0026gt;::v(v\u0026lt;T\u0026gt;\u0026amp;w) 24: {a=new T[z=w.z]; 25: for(int i=0;i\u0026lt;z;ii+) a[i]=w.a[i];} 26: template\u0026lt; 27: class T\u0026gt;T\u0026amp;v\u0026lt;T\u0026gt;::operatori[](int i) 28:{if(i\u0026gt;=1\u0026amp;\u0026amp;i\u0026lt;=z)return a[i-1];} 29: template\u0026lt; 30: class T\u0026gt;v\u0026lt;T\u0026gt;v\u0026lt;T\u0026gt;::operator+(v\u0026lt;T\u0026gt;w) 31: {v\u0026lt;T\u0026gt;s(2); 32: if(z==w.z)for(int i=0; 33: i\u0026lt;z;i++)s.a[i]*=(a+i)+w.a[i]; 34: return s;} 35: template\u0026lt; 36: class T\u0026gt;v\u0026lt;T\u0026gt;v\u0026lt;T\u0026gt;::operator*(T s) 37: {v\u0026lt;T\u0026gt;w(z); 38: for(int i=O;i\u0026lt;z; 39: i++)w.a[i]=a[i]*s;return w;} 40: template\u0026lt; 41: class T\u0026gt;v\u0026lt;T\u0026gt;v\u0026lt;T\u0026gt;::operator-(v\u0026lt;T\u0026gt;w) 42: {return *this+(w*-1),} 43: template\u0026lt; 44: class T\u0026gt;v\u0026lt;T\u0026gt;v\u0026lt;T\u0026gt;::operator=(v\u0026lt;T\u0026gt;w) 45: {delete a;a=new T[z=w.z]; 46: for(int i=0; 47: i\u0026lt;z;i++)a[i]=w.a[i];return *this;) 48: void main()(v\u0026lt;int\u0026gt; vl,v2; 49:vi[1]=4;vi[2]=6;vi[3]=8; 50: v2=vl;cout (r) vl (r) vl + v2; 51: cout (r) \u0026#39;\\n\u0026#39;(r) vi*3; } vektor.cpp\u0026lt; beweist, was C++-Programmierer besser als die Kollegen in prozeduralen Programmiersprachen können.\nType Article for a Computer Magazine Environment Sun Solaris 5, Windows 3.x, Borland C++ 3.1, GCC ","permalink":"https://rumpf.eu/michael/projects/dos/","summary":"\u003cp\u003eThis article, published in a German PC magazine called \u0026lsquo;DOS International\u0026rsquo;, was written during a summer C++ course at Saarland University.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"DOS International\" loading=\"lazy\" src=\"/michael/images/dos993.png\"\u003e\u003c/p\u003e\n\u003cp\u003eInitially, it was intended as a submission for a contest to write a useful program in just 1024 bytes. The prize was 1024 Deutsche Mark, but unfortunately the program was considered too specialized to be generally useful. However, the contribution was later reused in the magazine\u0026rsquo;s programmer\u0026rsquo;s corner: \u0026rsquo;tips and tricks for programmers\u0026rsquo;.\u003c/p\u003e","title":"DOS International"},{"content":"An application for comparing the cost of traditional power supply against a power generator.\nThe \u0026lsquo;Energy Cost Calculation\u0026rsquo; application was used by the sales department of a company selling electrical generators and standby sets. A sales representative\u0026rsquo;s typical task was to compare the efficiency and potential savings of an electrical generator against a standard power supply. This application automates most of the steps that previously had to be done by hand.\nMain Screen 1/4\nThe first screen asks for the customer\u0026rsquo;s address and their electrical power consumption over a given period.\nMain Screen 2/4\nThe second screen requires the customer\u0026rsquo;s monthly consumption values. Any extra power purchased during the specified period must also be entered.\nMain Screen 3/4\nThe third screen accounts for the customer\u0026rsquo;s thermal data, such as oil or gas consumption. Since the generator produces waste heat while running and that heat can be reused for heating purposes, these values need to be factored into the calculation as well.\nMain Screen 4/4\nOn the fourth screen, the electrical generator\u0026rsquo;s specifications are selected before proceeding to the final calculation.\nThe application can load, save, and print customer data along with the calculation results.\nOverview\nBalance\nThe preferences screen provides access to configuration values such as the data path and other parameters.\nPreferences\nType Freelancer Project Environment MS-DOS, Turbo Pascal 6.0 Link wkbekb.tar.bz2 (130kB) ","permalink":"https://rumpf.eu/michael/projects/eccalc/","summary":"\u003cp\u003eAn application for comparing the cost of traditional power supply against a power generator.\u003c/p\u003e\n\u003cp\u003eThe \u0026lsquo;Energy Cost Calculation\u0026rsquo; application was used by the sales department of a company selling electrical generators and standby sets. A sales representative\u0026rsquo;s typical task was to compare the efficiency and potential savings of an electrical generator against a standard power supply. This application automates most of the steps that previously had to be done by hand.\u003c/p\u003e","title":"Energy Cost Calculation"},{"content":"The Homepage project shows the evolution of this website.\nThe first version of the homepage was simply a project to teach myself HTML. Since version 2.0 I started using it as an online reference page when applying for a new job.\nVersion 1.0 (199?/?? - 1997/12) Homepage 1.0\nThe menu in this version was rendered with the 3D ray-tracing application Lightwave 3D on the Amiga. The big disadvantage of using a full blown image as a menu, is that the menu took a long time to load at the time when 28.8 Modems were state of the art.\nVersion 2.0 (1997/12 - 2001/11) Homepage 2.0\nIn this version HTML 3.2, CGI, Perl, a Java Applet, and JavaScript was used.\nSpecial feature modules:\nAbi91-Access Control (htpasswd, htaccess) Abi91-Database (Perl, CSV File) Abi91-Guestbook (Perl) Chatrooms (Abi91/TSC) (Java-Applet) Version 3.0 (2001/11 - 2004/06) Homepage 3.0\nFor the third version of the homepage I dropped all the fancy features that led to incompatibilities with different web browsers. The only technologies used were XHTML 1.0 and CSS. Unfortunately at that time the current browsers were not able to render the page as the standard expected them to. Therefore I added a picture how the page looks like when using a compliant browser. The reason for doing this was a general refusal to waste my time by testing the page with many different browser versions just to develop workarounds for bugs that the browser vendor were expected to fix.\nVersion 4.0 (2004/06 - 2006/02) Homepage 4.0\nThis version uses \u0026lsquo;XHTML 1.0 Transitional\u0026rsquo; and CSS. All the current browsers can render the pages without known problems.\nFor this version I have written a bunch of scripts that automate many tasks building the homepage:\nConversion of TIFF files into password protected PDFs Link checking of all pages (HTML + LaTex) with linkchecker Spell checking of all pages (HTML + LaTex) with ispell Automatic upload to the ISP storage facility Version 5.0 (2006/03 - 2019/01) Homepage 5.0\nThis version of my homepage is similar to version 4.0 with an updated layout.\nVersion 6.0 (2019/02 - 2025/02) Homepage 6.0\nThis version has been transformed from the previous version to a Jekyll based static page, using the Minimal Mistakes theme.\nVersion 7.0 (2026/02 - present) Homepage 7.0\nThis version has been migrated from Jekyll to Hugo, using the PaperMod theme. The migration replaced all Liquid template syntax with plain Markdown and moved from the Minimal Mistakes theme to a cleaner, faster design with automatic dark mode support.\nType Personal Project Environment Hugo Static Site Generator, PaperMod Theme, Markdown, HTML, CSS, bash ","permalink":"https://rumpf.eu/michael/projects/homepage/","summary":"\u003cp\u003eThe Homepage project shows the evolution of this website.\u003c/p\u003e\n\u003cp\u003eThe first version of the homepage was simply a project to teach myself HTML. Since version 2.0 I started using it as an online reference page when applying for a new job.\u003c/p\u003e\n\u003ch1 id=\"version-10-199---199712\"\u003eVersion 1.0 (199?/?? - 1997/12)\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/homepage1.png\"\u003e\u003cimg alt=\"Homepage 1.0\" loading=\"lazy\" src=\"/michael/images/homepage1small.png\"\u003e\u003c/a\u003e\n\u003cem\u003eHomepage 1.0\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThe menu in this version was rendered with the 3D ray-tracing application Lightwave 3D on the Amiga. The big disadvantage of using a full blown image as a menu, is that the menu took a long time to load at the time when 28.8 Modems were state of the art.\u003c/p\u003e","title":"Homepage"},{"content":"Daimler Vehicle Backend In June 2018 I started as migration lead to move all microservices from the traditional data center to a modern cloud-based environment. The primary objective was to migrate each microservice without impacting customers. A sophisticated Netflix Eureka synchronization mechanism was established to make the transition seamless for microservices, regardless of whether their peers were still running in the data center or had already been moved to the cloud. This also included a bridge for mirroring messaging middleware traffic from the data center to several cloud-based solutions.\nRole Senior Software Architect Environments Mac OSX, Linux, IntellijIDEA, Maven, Gradle, Java 8, Jenkins, Artifactory, SonarQube, Spring, Spring Boot, Spring Cloud, Kubernetes, IBM Cloud, ActiveMQ/RabbitMQ, PostgreSQL, Spring Integration ","permalink":"https://rumpf.eu/michael/projects/ibm/","summary":"\u003ch1 id=\"daimler-vehicle-backend\"\u003eDaimler Vehicle Backend\u003c/h1\u003e\n\u003cp\u003eIn June 2018 I started as migration lead to move all microservices from the traditional data center to a modern cloud-based environment. The primary objective was to migrate each microservice without impacting customers. A sophisticated Netflix Eureka synchronization mechanism was established to make the transition seamless for microservices, regardless of whether their peers were still running in the data center or had already been moved to the cloud.\nThis also included a bridge for mirroring messaging middleware traffic from the data center to several cloud-based solutions.\u003c/p\u003e","title":"IBM"},{"content":"A solution to create offers from product description fragments, stored in an MS Access database.\nThis prototype grew out of the VBA project Autotexts. The Microsoft Word Autotext solution did not scale, was unsuitable for concurrent access, and made it difficult to maintain the set of Autotext fragments in a simple Word document template. The company expressed interest in a more professional solution but ultimately decided to go with an already established application.\nMain Window\nIn this prototype, products are assigned to categories. The category list can be extended freely.\nNew Product\nThe button \u0026ldquo;Edit\u0026rdquo; can be used to edit the product description.\nUnder \u0026ldquo;Settings\u0026rdquo;, the user can specify the template on which the final offer document will be based, as well as the address database containing customer addresses.\nSettings\nThe \u0026ldquo;New Offer\u0026rdquo; button creates a new document based on the specified template. The address is pulled from the customer address database, and the selected product is included in the document.\nOffer-Template\nMS-Access Address Database\n|||\nType Freelancer Project Prototype Environment VisualBasic 6, Office 97 Professional (Word, Access), ODBC, OLE/COM Link inventory.tar.bz2 (8MB) ","permalink":"https://rumpf.eu/michael/projects/inventory/","summary":"\u003cp\u003eA solution to create offers from product description fragments, stored in an MS Access database.\u003c/p\u003e\n\u003cp\u003eThis prototype grew out of the VBA project \u003ca href=\"/michael/projects/autotexts/\"\u003eAutotexts\u003c/a\u003e. The Microsoft Word Autotext solution did not scale, was unsuitable for concurrent access, and made it difficult to maintain the set of Autotext fragments in a simple Word document template. The company expressed interest in a more professional solution but ultimately decided to go with an already established application.\u003c/p\u003e","title":"Inventory Management"},{"content":"My diploma thesis project, focused on CORBA and distributed components. The thesis paper is available as a PDF download below, unfortunately only available in German.\nThe thesis was written in LaTeX and converted to a fully featured PDF document with pdfTeX, including links, page preview thumbnails, and a table of contents overview.\nWhile working on this project, the following smaller spin-off tools were written:\nDDEExecute A command-line tool for issuing Dynamic Data Exchange (DDE) commands to applications that support this Windows API.\nLauncher Starts the default Windows browser (as registered in the Windows registry) and sends control DDE commands to a running instance.\nJavaRT JavaRT stands for \u0026ldquo;Java Run Time\u0026rdquo; and simplifies the start-up of Java applications. The executable searches for installed Java VMs and launches the Java application with whichever VM it finds. For customization, JavaRT.exe can be renamed to MyApp.exe along with an INI file specifying command-line parameters like PATH, CLASSPATH, class name, or other VM arguments. JavaRT assembles the full command line from these settings. Any parameters passed to the JavaRT executable are forwarded as application parameters to the Java application.\nGrpSpawn A workaround for a Windows limitation: the inability to kill a process tree from the outside, as is possible on UNIX systems.\nOnly processes within a process tree created with the CREATE_PROCESS_GROUP flag can be killed. The approach is to install a signal handler inside the process tree that waits for an external termination signal. Upon receiving this signal, the handler terminates the root of the process group, causing all child processes to die. Microsoft Visual Studio, for example, uses this pattern when starting a project build so that the build can be terminated at any time.\nInstaller An InstallShield clone written in VisualBasic. It includes a USER module where custom installer routines can be placed and called from the installer\u0026rsquo;s main loop to perform user-specific tasks. This installer was used for deploying KN2\u0026rsquo;s application server and the associated development environment.\nType Junior Software Engineer at Arthur Andersen Software \u0026amp; Methods Environment Windows NT4/2000, Sun Solaris 6, Visual Studio 6 SP3, Sun C++ 4.2, GNU tool chain, CVS Link diploma thesis PDF (1.1MB) diploma thesis source tarball (2.2MB) ","permalink":"https://rumpf.eu/michael/projects/kn2/","summary":"\u003cp\u003eMy diploma thesis project, focused on CORBA and distributed components. The thesis paper is available as a PDF download below, unfortunately only available in German.\u003c/p\u003e\n\u003cp\u003eThe thesis was written in LaTeX and converted to a fully featured PDF document with pdfTeX, including links, page preview thumbnails, and a table of contents overview.\u003c/p\u003e\n\u003cp\u003eWhile working on this project, the following smaller spin-off tools were written:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDDEExecute\u003c/strong\u003e\nA command-line tool for issuing \u003ca href=\"http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/dataexchange/dynamicdataexchange.asp\"\u003eDynamic Data Exchange\u003c/a\u003e (DDE) commands to applications that support this Windows API.\u003c/p\u003e","title":"Knowledge Now 2"},{"content":"Mercedes Intelligent Cloud (MIC) As Chief Architect for the Mercedes Intelligent Cloud, I am responsible for defining the platform\u0026rsquo;s technical direction and long-term architecture.\nThe MIC follows a multicloud strategy spanning Microsoft Azure and AWS, underpinned by a true zero trust model for all inter-service communication. Rather than building central platform teams that risk becoming bottlenecks, we deliver architecture as blueprints, giving DevOps teams full autonomy over their deployments.\nA core principle is shift left: enabling DevOps teams to work directly with cloud services and equipping them with the right tooling to strengthen their security posture. GitLab Ultimate serves as our single-tool strategy, reducing cognitive load and allowing teams to stay focused on delivering business value.\nRole Chief Architect Environments Microsoft Azure, AWS, Kubernetes, GitLab Ultimate, Zero Trust Architecture, Microservices ","permalink":"https://rumpf.eu/michael/projects/mercedesbenz/","summary":"\u003ch1 id=\"mercedes-intelligent-cloud-mic\"\u003eMercedes Intelligent Cloud (MIC)\u003c/h1\u003e\n\u003cp\u003eAs Chief Architect for the Mercedes Intelligent Cloud, I am responsible for defining the platform\u0026rsquo;s technical direction and long-term architecture.\u003c/p\u003e\n\u003cp\u003eThe MIC follows a multicloud strategy spanning Microsoft Azure and AWS, underpinned by a true zero trust model for all inter-service communication. Rather than building central platform teams that risk becoming bottlenecks, we deliver architecture as blueprints, giving DevOps teams full autonomy over their deployments.\u003c/p\u003e\n\u003cp\u003eA core principle is shift left: enabling DevOps teams to work directly with cloud services and equipping them with the right tooling to strengthen their security posture. GitLab Ultimate serves as our single-tool strategy, reducing cognitive load and allowing teams to stay focused on delivering business value.\u003c/p\u003e","title":"Mercedes-Benz AG"},{"content":"The MAGGIE prototype was developed as a showcase for the New York public transport agency, demonstrating how RFID-based credit card payments could be used to purchase subway tickets.\nThe Micro AGGregatIon Engine prototype demonstrates the concept of aggregating small transaction amounts into larger values before settling them against a traditional payment backend such as a credit card or bank account. This kind of system is useful in markets with very low transaction amounts, where immediate settlement fees would exceed the actual transaction value.\nThe first screen shows the start page. From here the user can enter the shopping area, and the consumer or merchant self-administration.\nStart Page\nOne of the shops in the shopping area is a prototype showing how New York\u0026rsquo;s public transport system (MTA \u0026ndash; Metropolitan Transportation Authority) could let passengers buy subway tickets using the new RFID credit cards. The user swipes an RFID credit card over the card reader; the card is charged with the ticket price and the user is granted access to the station. This can be demonstrated by dragging one of the credit cards over the picture. The green display between the credit cards and the turnstile image shows the transaction result.\nNew York MTA Shop\nIn the ringtone shop, the user can purchase ringtones for their mobile phone.\nRingtone Shop\nAfter selecting a ringtone, the user must provide their payment details. In this case, a credit card is the only accepted payment method.\nCustomer Payment Data\nIn this prototype, no SMS with the ringtone is sent. Instead, the user receives a download link.\nRingtone Download\nOn the following screen, the consumer enters their authentication data to view their transaction history.\nConsumer Self Administration - Authentication\nIn the transaction view, the consumer can review their personal transactions. The screenshot below shows transactions that were aggregated up to 7 USD and then settled, meaning the credit card had already been charged at that point. The last transaction is still in the \u0026ldquo;aggregated\u0026rdquo; state and will be settled later.\nConsumer Self Administration - Transaction View\nA similar view is available for merchants which shows the transactions of all consumers.\nMerchant Self Administration - Transaction View\nA merchant can individually define when settlements should take place by setting up aggregation rules. These rules specify an amount threshold at which settlement is triggered. In this case, the threshold is set to 7 USD, meaning that as soon as aggregated amounts reach 7 USD, a settlement is initiated.\nAggregation Rules\nThe subway ticket showcase uses AJAX (Asynchronous JavaScript and XML) to send payment requests to the server and receive responses without a full page round-trip. The user interface is built on JSF.\nType Senior Software Architect at First Data Mobile Solutions Environment Linux, AIX, Eclipse, AJAX, JSF, JSP, XHTML, CSS ","permalink":"https://rumpf.eu/michael/projects/maggie/","summary":"\u003cp\u003eThe MAGGIE prototype was developed as a showcase for the New York public transport agency, demonstrating how RFID-based credit card payments could be used to purchase subway tickets.\u003c/p\u003e\n\u003cp\u003eThe \u003cstrong\u003eM\u003c/strong\u003eicro \u003cstrong\u003eAGG\u003c/strong\u003eregat\u003cstrong\u003eI\u003c/strong\u003eon \u003cstrong\u003eE\u003c/strong\u003engine prototype demonstrates the concept of aggregating small transaction amounts into larger values before settling them against a traditional payment backend such as a credit card or bank account. This kind of system is useful in markets with very low transaction amounts, where immediate settlement fees would exceed the actual transaction value.\u003c/p\u003e","title":"Micro Aggregation Engine (MAGGIE)"},{"content":"This application was developed to support a small business in selling hardware.\nA customer orders one or more hardware items, and the user enters the order into the application.\nThe user can choose hardware items from different dealers. The software automatically splits the order into separate orders per dealer, based on the user\u0026rsquo;s item selection.\nWhen items arrive from the dealers, they are marked as delivered and then appear on the invoices generated for each customer.\nMain Screen\nEnter Orders\nCustomer Administration\nDealer Administration\nFax Orders\nPrint Invoices\nType Freelancer Project Environment Windows 9x/NT, Microsoft Visual Basic 5, Microsoft Access 6.0, ODBC Link mrcomputer.tar.bz2 (85kB) ","permalink":"https://rumpf.eu/michael/projects/mrcomputer/","summary":"\u003cp\u003eThis application was developed to support a small business in selling hardware.\u003c/p\u003e\n\u003cp\u003eA customer orders one or more hardware items, and the user enters the order into the application.\u003c/p\u003e\n\u003cp\u003eThe user can choose hardware items from different dealers. The software automatically splits the order into separate orders per dealer, based on the user\u0026rsquo;s item selection.\u003c/p\u003e\n\u003cp\u003eWhen items arrive from the dealers, they are marked as delivered and then appear on the invoices generated for each customer.\u003c/p\u003e","title":"MR Computer"},{"content":"This application replaced an old, hard-to-use host-based system for creating offers for electrical power generators, providing a much simpler interface.\nIt was developed to support a sales department in selling electrical generators and standby sets.\nThe user chooses a generator model and selects various components from a list. The selection is driven by customer-defined requirements.\nMain Menu\nThe menu item \u0026lsquo;Create Offer\u0026rsquo; leads the user to a screen where the selection of the generator base model and the optional components takes place.\nThe second item \u0026lsquo;Print Complete List\u0026rsquo; dumps the previous selection to an attached printer.\nThe third item \u0026lsquo;Edit Data\u0026rsquo; is used to modify the selection.\n\u0026lsquo;Add Generator\u0026rsquo;, the fourth menu item, offers an administrative feature for importing more generators to the internal database.\nThe fifth item is used to print the customer database to the screen or an attached printer.\nComponent List\nOn this screen components and generator base models are maintained.\nCustomer Data\nThis screen collects customer data to be included in an offer.\nOptional Components\nThis screenshot shows the selection of optional components for a generator.\nType Freelancer Project Environment MS-DOS, Turbo Pascal 4.0 Link offer.tar.bz2 (39kB) ","permalink":"https://rumpf.eu/michael/projects/offer/","summary":"\u003cp\u003eThis application replaced an old, hard-to-use host-based system for creating offers for electrical power generators, providing a much simpler interface.\u003c/p\u003e\n\u003cp\u003eIt was developed to support a sales department in selling electrical generators and standby sets.\u003c/p\u003e\n\u003cp\u003eThe user chooses a generator model and selects various components from a list. The selection is driven by customer-defined requirements.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/angebot3.png\"\u003e\u003cimg alt=\"Main Menu\" loading=\"lazy\" src=\"/michael/images/angebot3small.png\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003eMain Menu\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThe menu item \u0026lsquo;Create Offer\u0026rsquo; leads the user to a screen where the selection of the generator base model and the optional components takes place.\u003c/p\u003e","title":"Offer"},{"content":"A link collection which was created while doing research about the ORBit CORBA ORB.\nThe CORBA ORB \u0026lsquo;ORBit\u0026rsquo; spawned a large number of spin-off projects, with information scattered across many different websites. That was the motivation for creating an ORBit resource page on SourceForge to serve as a central link collection for all those projects.\nORBit Resource Collection\nWith the arrival of the ORBit2 project, interest in the old ORBit version has faded, and the page is no longer maintained.\nType Personal Project Environment Bluefish, Apache, HTML Link ORBit Resource ","permalink":"https://rumpf.eu/michael/projects/orbit/","summary":"\u003cp\u003eA link collection which was created while doing research about the ORBit CORBA ORB.\u003c/p\u003e\n\u003cp\u003eThe CORBA ORB \u0026lsquo;ORBit\u0026rsquo; spawned a large number of spin-off projects, with information scattered across many different websites. That was the motivation for creating an \u003ca href=\"https://web.archive.org/web/20170815195940/http://orbit-resource.sourceforge.net/\"\u003eORBit resource page\u003c/a\u003e on SourceForge to serve as a central link collection for all those projects.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/orbit-resource.png\"\u003e\u003cimg alt=\"ORBit Resource Collection\" loading=\"lazy\" src=\"/michael/images/orbit-resource_small.png\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003cem\u003eORBit Resource Collection\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eWith the arrival of the ORBit2 project, interest in the old ORBit version has faded, and the page is no longer maintained.\u003c/p\u003e","title":"Orbit Resource"},{"content":"A CORBA TimeService implementation developed for a CORBA ORB with C language mapping.\nWhen I started using Linux on the desktop, I got interested in the small and efficient CORBA ORB called ORBit. The distributed component architecture CORBA is the default inter-process communication protocol used in the GNOME desktop project.\nTo teach myself the CORBA C Language Mapping that ORBit provides, I wrote the CORBA \u0026lsquo;TimeService\u0026rsquo; on top of the ORBit ORB.\nType Personal Project Environment Linux, ORBit 0.5.x, C, GCC, vi, GNU make Link orbit-time.tar.bz2 (30kB) ","permalink":"https://rumpf.eu/michael/projects/time/","summary":"\u003cp\u003eA CORBA TimeService implementation developed for a CORBA ORB with C language mapping.\u003c/p\u003e\n\u003cp\u003eWhen I started using Linux on the desktop, I got interested in the small and efficient CORBA ORB called ORBit. The distributed component architecture \u003ca href=\"http://www.omg.org/\" title=\"Common Object Request Broker Architecture\"\u003eCORBA\u003c/a\u003e is the default inter-process communication protocol used in the \u003ca href=\"http://www.gnome.org/\" title=\"GNU Network Object Model Environment\"\u003eGNOME\u003c/a\u003e desktop project.\u003c/p\u003e\n\u003cp\u003eTo teach myself the \u003ca href=\"http://www.omg.org/technology/documents/formal/c_language_mapping.htm\"\u003eCORBA C Language Mapping\u003c/a\u003e that ORBit provides, I wrote the CORBA \u0026lsquo;TimeService\u0026rsquo; on top of the ORBit ORB.\u003c/p\u003e","title":"ORBit Time Service"},{"content":"A graphical user interface for defining vehicle pathways with real-time control features.\nThis application was developed during a practical course on real-time systems at Saarland University. The course assignment was to build a vehicle with a real-time controller system. I was responsible for the GUI editor used to create paths for the vehicle to follow. Nikolaus Gerteis handled the hardware and Roland Schlosser developed the micro-controller application.\nThe 80C166 micro-controller with its various I/O channels implements the fundamental real-time principle of \u0026ldquo;Input, Processing, and Output.\u0026rdquo;\nInput: The controller is connected to a photo-sensor that measures the distance traveled by each of the two tires. This works the same way as a computer mouse \u0026ndash; a wheel with holes triggers the photo-sensor at regular intervals.\nProcessing: The controller application uses the input signals to calculate a distance, which is then compared against the track information loaded onto the vehicle at startup.\nOutput: If a deviation is detected, the controller issues commands to the two output channels, each connected to one of the vehicle\u0026rsquo;s motors, in order to correct the deviation.\nThe PathEditor application is used to draw tracks that can be loaded onto the vehicle via a serial connection. Once the data is transmitted, the vehicle can be disconnected from the cable and program execution begins.\nFront View\nTop View\nSide View\nPath Editor\nPressing the left mouse button defines track elements. After a line element, a curve element is automatically selected next. The right mouse button serves as an undo function, reverting the last track element. The application also supports loading and saving tracks.\nTo transfer the data, the vehicle must be connected to a computer via a serial cable. The track data is generated as a C source file, which is then cross-compiled using GCC for the Siemens 80C166 micro-controller. After successful compilation, the GDB remote debugger is used to load the application onto the micro-controller via the serial line.\nTo start the vehicle on the uploaded track, it must be disconnected from the computer. An impulse on the wheel\u0026rsquo;s photo sensor then triggers the actual execution of the track.\nType University Project Environment Solaris, XWindows, LEDA, vi, GCC (C++, C-Cross-Compiler for 80C166), Make Link fopra.tar.bz2 (1692kB) ","permalink":"https://rumpf.eu/michael/projects/patheditor/","summary":"\u003cp\u003eA graphical user interface for defining vehicle pathways with real-time control features.\u003c/p\u003e\n\u003cp\u003eThis application was developed during a practical course on real-time systems at Saarland University. The course assignment was to build a vehicle with a real-time controller system. I was responsible for the GUI editor used to create paths for the vehicle to follow. Nikolaus Gerteis handled the hardware and Roland Schlosser developed the micro-controller application.\u003c/p\u003e\n\u003cp\u003eThe 80C166 micro-controller with its various I/O channels implements the fundamental real-time principle of \u0026ldquo;Input, Processing, and Output.\u0026rdquo;\u003c/p\u003e","title":"Path Editor"},{"content":"An application for monitoring productivity in small to medium-sized businesses in the manufacturing industry.\nThe software was used to provide controlling services to customer companies, primarily regional shoe manufacturers. Collected productivity data was analyzed on a daily, monthly, quarterly, and yearly basis, helping customers improve the efficiency of their manufacturing processes.\nMain Window\nThe program uses a numbering system to classify the different data collections. The numbering encodes the hierarchical structure of the company and its departments. Each department is assigned a 3-part number, where each part represents a level in the organizational structure.\nOrganization Number Assignment\nThe next step is to create the actual departments within the previously defined hierarchy. Numbers are mapped to actual department names.\nDefine Organization\nTasks are classified into general, common, and supporting categories. Each task is assigned a two-digit number: common tasks are numbered 80\u0026ndash;89, supporting tasks 90\u0026ndash;99, and general tasks 00\u0026ndash;79. General tasks are defined later during the actual data collection phase.\nAssign Task Numbers\nOn the following screen, employees are assigned to departments and their standard working hours are defined.\nDepartment Base Data\nThe following screens show the data collection interface. Data must be entered into these forms on a daily basis.\nDaily Tasks\nDaily Task Types\nBased on the entered data, the software offers the following reports:\nDaily Productivity Tasks\nDaily Productivity Departments\nProductivity Times\nProductivity Tasks\nDistribution Time Departments\nDistribution Activity Times\nAmount Task Times\nDistribution Task Department\nDaily Productivity Tasks Productivity of all tasks within a department on a given day, including monthly totals. Daily Productivity Departments Daily productivity figures for departments on a single day. Productivity Times Time-based productivity over the specified period. Productivity Tasks Task productivity over the defined period. Only values within the tolerance range are included in the average calculation. Distribution Time Departments Distribution of employee absence times over the defined period. Distribution Activity Times Distribution of employee activity times over the defined period. Amount Task Times Task time totals over time. Distribution Task Department Distribution of tasks per department, limited to the seven most frequent tasks in each department. The macro feature allows combining multiple reports for display or printing.\nDisplay Macros\nMacro Definition\nCreate Department Macro\nCreate Task Macro\nType Software Developer at ProCom GmbH Environment Windows 3.1, Borland C++ 3.1, C++, OWL ","permalink":"https://rumpf.eu/michael/projects/pcon12/","summary":"\u003cp\u003eAn application for monitoring productivity in small to medium-sized businesses in the manufacturing industry.\u003c/p\u003e\n\u003cp\u003eThe software was used to provide controlling services to customer companies, primarily regional shoe manufacturers. Collected productivity data was analyzed on a daily, monthly, quarterly, and yearly basis, helping customers improve the efficiency of their manufacturing processes.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/pcon12main.png\"\u003e\u003cimg alt=\"Main Window\" loading=\"lazy\" src=\"/michael/images/pcon12mainsmall.png\"\u003e\u003c/a\u003e\n\u003cem\u003eMain Window\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThe program uses a numbering system to classify the different data collections. The numbering encodes the hierarchical structure of the company and its departments. Each department is assigned a 3-part number, where each part represents a level in the organizational structure.\u003c/p\u003e","title":"PCon 1.2"},{"content":"A ground-up rewrite of the productivity controlling application 1.2 using the Microsoft Foundation Classes (MFC), aimed at achieving a more polished look and feel and simplifying the user interface.\nVersion 3.0 introduced the following changes:\nAdded a flexible employee model (individual employees, groups, and machines). Added support for data terminals. Implemented a traceability system for base data. Added flexible task types (single, combined, group, and long-running). Used DAO (Data Access Objects) for database access. Implemented a streamlined installation procedure. Added employee data import from ERP systems. Used Crystal Reports V5.0 for reporting. Added flexible customer management. Extended Win32 API support. Removed the hard-to-understand numbering system. Dropped the hour type concept, as it was inconsistent with the productivity calculations. Dropped the macro system. Main Window\nThe main window above shows all available menus and the two button bars. The top bar provides quick access to the application\u0026rsquo;s main functions, the right bar offers access to the reporting system, and the status bar displays the currently active company.\nBase Data\nThe base data dialog is used to define the company\u0026rsquo;s hierarchical structure, including departments, tasks, capacities, terminals, breaks, and employees. Employee records must be imported from one of two supported HR management systems. The number of supported systems is easily extensible thanks to a plugin architecture for accessing employee data from external applications.\nTraceability System (Author: Stefan Bayer) Task Changes\nCapacity Changes\nDepartment Changes\nThe traceability system tracks changes to all base data. The dialogs above show recorded modifications for each data type.\nTask Data Task Data\nThe task data dialog allows entering new data and modifying existing records:\nSingle Task For a single task, the quantity and time spent are known at completion, so productivity can be calculated immediately. Combined Task Combined tasks consist of multiple tasks that cannot be easily separated. At the end, the total quantity and time to completion are known. The time is distributed across the individual tasks, and a productivity figure is derived from that. Group Task A group task is essentially the opposite of a combined task: multiple employees work together. At the end of the day, one employee from the group enters the total quantity achieved. That quantity is then distributed across the group members, and a productivity figure is calculated accordingly. Long-Running Task A long-running task spans several days. At the end of each day, the time is entered into the terminal, but no quantity. When the task is complete, the final quantity is distributed over the accumulated time, and a productivity figure is calculated from those values. Each entered task can be classified as productive or deficient. A deficient task must be further qualified as to whether the produced goods were reworked or the task had to be completely rolled back and restarted.\nStatistical Reports (Design: Frank Blinn) Employee Management Main Dialog\nFor PCon 3.0, two import modules were developed: one for the in-house employee management software, and another for \u0026ldquo;Zesy 2.0\u0026rdquo; from Gisbo Softwareentwicklung und EDV-Beratung GmbH.\nCustomer Management (Author: Stefan Bayer) The customer management system allows creating, modifying, and deleting customer records.\nMain Dialog\nNew-/Modify-Dialog\nType Software Developer at Dr. Tackenberg GmbH Environment Windows 9x/NT, Visual C++ 4.0, MFC, Crystal Reports ","permalink":"https://rumpf.eu/michael/projects/pcon30/","summary":"\u003cp\u003eA ground-up rewrite of the productivity controlling application 1.2 using the Microsoft Foundation Classes (MFC), aimed at achieving a more polished look and feel and simplifying the user interface.\u003c/p\u003e\n\u003cp\u003eVersion 3.0 introduced the following changes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdded a flexible employee model (individual employees, groups, and machines).\u003c/li\u003e\n\u003cli\u003eAdded support for data terminals.\u003c/li\u003e\n\u003cli\u003eImplemented a traceability system for base data.\u003c/li\u003e\n\u003cli\u003eAdded flexible task types (single, combined, group, and long-running).\u003c/li\u003e\n\u003cli\u003eUsed DAO (Data Access Objects) for database access.\u003c/li\u003e\n\u003cli\u003eImplemented a streamlined installation procedure.\u003c/li\u003e\n\u003cli\u003eAdded employee data import from ERP systems.\u003c/li\u003e\n\u003cli\u003eUsed Crystal Reports V5.0 for reporting.\u003c/li\u003e\n\u003cli\u003eAdded flexible customer management.\u003c/li\u003e\n\u003cli\u003eExtended Win32 API support.\u003c/li\u003e\n\u003cli\u003eRemoved the hard-to-understand numbering system.\u003c/li\u003e\n\u003cli\u003eDropped the hour type concept, as it was inconsistent with the productivity calculations.\u003c/li\u003e\n\u003cli\u003eDropped the macro system.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/pcon30main.png\"\u003e\u003cimg alt=\"Main Window\" loading=\"lazy\" src=\"/michael/images/pcon30main_small.png\"\u003e\u003c/a\u003e\n\u003cem\u003eMain Window\u003c/em\u003e\u003c/p\u003e","title":"PCon 3.0"},{"content":"This extension of Productivity Controlling 3.0 added concurrent multi-user access to the application.\nThe most important feature in version 3.5 of the Productivity-Controlling (PCon) application is concurrent user support. The original design did not allow multiple users to access the Microsoft Access database at the same time. Since Access itself does not provide concurrent access capabilities, the most practical fix was to introduce a DCOM server component that monitors database access and keeps track of active connections.\nWhen a user accesses a record, it is marked as locked on the DCOM locking server. If another user tries to access the same record, they receive a message indicating that the record is currently in use. In the list view, locked records are indicated by a red prohibition sign.\nAnother addition is the full implementation of the application\u0026rsquo;s help system using Doc2Help 4.0. On every screen, both the question mark button and the F1 key provide access to the context-sensitive help system.\nType Software Developer at Dr. Tackenberg GmbH Environment Windows 9x/NT, Microsoft VisualStudio 6 (Enterprise Edition), C++, MFC ","permalink":"https://rumpf.eu/michael/projects/pcon35/","summary":"\u003cp\u003eThis extension of Productivity Controlling 3.0 added concurrent multi-user access to the application.\u003c/p\u003e\n\u003cp\u003eThe most important feature in version 3.5 of the \u003ca href=\"/michael/projects/pcon30/\"\u003eProductivity-Controlling (PCon)\u003c/a\u003e application is concurrent user support. The original design did not allow multiple users to access the Microsoft Access database at the same time. Since Access itself does not provide concurrent access capabilities, the most practical fix was to introduce a DCOM server component that monitors database access and keeps track of active connections.\u003c/p\u003e","title":"PCon 3.5"},{"content":"An application for mobile phone-based money transfers.\nThe Person to Person paYment (PPY) prototype was developed in just one week as a showcase demonstrating how a traditional money transfer system could be extended with a mobile phone channel, using SMS to send money orders.\nPPY Transaction List\nMy task was to build the web channel for the PPY prototype. XHTML and CSS, together with Java Server Pages (JSP) and the JSP Standard Tag Library (JSTL), were chosen for developing the page templates. The page flow was kept as simple as possible. Beyond demonstrating the functionality to end users, the prototype\u0026rsquo;s goal was to build experience with graphical user interfaces, since our team had historically focused on server-side software with little or no UI work.\nType Senior Software Architect at First Data Mobile Solutions Environment Linux, AIX, Eclipse, BEA Weblogic 8.1, XHTML, CSS, JSP, JSTL ","permalink":"https://rumpf.eu/michael/projects/ppy/","summary":"\u003cp\u003eAn application for mobile phone-based money transfers.\u003c/p\u003e\n\u003cp\u003eThe \u003cstrong\u003eP\u003c/strong\u003eerson to \u003cstrong\u003eP\u003c/strong\u003eerson pa\u003cstrong\u003eY\u003c/strong\u003ement (PPY) prototype was developed in just one week as a showcase demonstrating how a traditional money transfer system could be extended with a mobile phone channel, using SMS to send money orders.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/ppy.png\"\u003e\u003cimg alt=\"PPY Transaction List\" loading=\"lazy\" src=\"/michael/images/ppy_small.png\"\u003e\u003c/a\u003e\n\u003cem\u003ePPY Transaction List\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eMy task was to build the web channel for the PPY prototype. XHTML and CSS, together with Java Server Pages (JSP) and the JSP Standard Tag Library (JSTL), were chosen for developing the page templates. The page flow was kept as simple as possible. Beyond demonstrating the functionality to end users, the prototype\u0026rsquo;s goal was to build experience with graphical user interfaces, since our team had historically focused on server-side software with little or no UI work.\u003c/p\u003e","title":"Person to Person Payment"},{"content":"Distribution of documents to a remotely hosted web application.\nThe goal of this application was to provide an administration interface for a web-based information database for expatriates. The interface was used to upload new content to the server systems hosted in Chicago, Illinois, USA.\nCountryNet Manager Architecture\nThe information presented by the application comes from SGML documents indexed by a Fulcrum SearchServer. To update these SGML documents, an administration interface called CountryNet Manager was developed.\nCountryNet Manager\nDistributed COM (DCOM) and an ActiveX control serve as the distributed communication mechanisms. The PublishClt ActiveX control accesses the ProjectSrv and PublishSrv components to manage projects, the administrative units of the CountryNet Manager application.\nProjects Dialog\nThe PublishSrv provides functions for uploading and downloading files within a project. It instantiates the IndexFeedSrv component, which processes the uploaded files to create an index via the Fulcrum SearchServer. That index is then passed to the DBFeedSrv component, which stores it in the database and makes it available for searching.\nThe reason for making extensive use of DCOM components was to gain hands-on experience with the technology and to identify any hurdles in using it for remote communication.\nOne key lesson learned was that DCOM relies on distributed reference counting \u0026ndash; a mechanism that tracks how many clients are connected to a server component. The problem is that when a client crashes, there is no way to notify the server to decrement its counter. As a result, the server component cannot be garbage collected because the DCOM layer still considers it in use. The only workaround is to kill the component on the server manually.\nActiveX Control\nType Software Developer at Arthur Andersen Software \u0026amp; Methods Environment Windows 9x/NT4, Visual C++ 5 ","permalink":"https://rumpf.eu/michael/projects/publish/","summary":"\u003cp\u003eDistribution of documents to a remotely hosted web application.\u003c/p\u003e\n\u003cp\u003eThe goal of this application was to provide an administration interface for a web-based information database for expatriates. The interface was used to upload new content to the server systems hosted in Chicago, Illinois, USA.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/publish.png\"\u003e\u003cimg alt=\"CountryNet Manager Architecture\" loading=\"lazy\" src=\"/michael/images/publish_small.png\"\u003e\u003c/a\u003e\n\u003cem\u003eCountryNet Manager Architecture\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThe information presented by the application comes from SGML documents indexed by a Fulcrum SearchServer. To update these SGML documents, an administration interface called \u003cem\u003eCountryNet Manager\u003c/em\u003e was developed.\u003c/p\u003e","title":"Publish C/S"},{"content":"A presentation about \u0026lsquo;Approaches for the integration of distributed computation into the WWW\u0026rsquo;\nThis paper gives an overview of different architectures for smoothly integrating distributed computation into the World Wide Web (WWW). Of the four approaches presented, three address integration at a very basic level. The fourth deals with higher-level problems such as referential integrity and migration transparency.\nType University Presentation Environment Sun Solaris, LaTeX, pdfTeX, vi Link slides.pdf (287kB) report.pdf (430kB) ","permalink":"https://rumpf.eu/michael/projects/seminar/","summary":"\u003cp\u003eA presentation about \u0026lsquo;Approaches for the integration of distributed computation into the WWW\u0026rsquo;\u003c/p\u003e\n\u003cp\u003eThis paper gives an overview of different architectures for smoothly integrating distributed computation into the World Wide Web (WWW). Of the four approaches presented, three address integration at a very basic level. The fourth deals with higher-level problems such as referential integrity and migration transparency.\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e\u003c/th\u003e\n          \u003cth\u003e\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eType\u003c/td\u003e\n          \u003ctd\u003eUniversity Presentation\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eEnvironment\u003c/td\u003e\n          \u003ctd\u003eSun Solaris, LaTeX, pdfTeX, vi\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eLink\u003c/td\u003e\n          \u003ctd\u003e\u003ca href=\"/michael/files/slides.pdf\"\u003eslides.pdf\u003c/a\u003e (287kB) \u003ca href=\"/michael/files/report.pdf\"\u003ereport.pdf\u003c/a\u003e (430kB)\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"Seminar"},{"content":"An extension of the web interface to the SuSE Meta PPP Daemon.\nChristopher Hofmann created a web-based front-end for the SuSE Meta PPP Daemon (SMPPPD). smpppd-web\nMy extension to the original codebase was to support adding and removing ISDN links on the fly and allowing dial-on-demand of ISDN interfaces.\nMy primary user only spoke German, so I added gettext support to the application and translated all texts into German as well.\n|||\nType Personal Project Environment Linux, vi, XSL, HTML Tidy, expect Link smpppd-web.tar.bz2 (17kB), smpppd-web-3.00-0.1.i586.rpm (packaged by Christopher Hofmann) ","permalink":"https://rumpf.eu/michael/projects/smpppd-web/","summary":"\u003cp\u003eAn extension of the web interface to the SuSE Meta PPP Daemon.\u003c/p\u003e\n\u003cp\u003eChristopher Hofmann created a web-based front-end for the SuSE Meta PPP Daemon (SMPPPD). \u003ca href=\"http://www.suse.de/~cwh/\"\u003esmpppd-web\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/michael/images/smpppd-web1small.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/michael/images/smpppd-web2small.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/michael/images/smpppd-web3small.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/michael/images/smpppd-web4small.png\"\u003e\u003c/p\u003e\n\u003cp\u003eMy extension to the original codebase was to support adding and removing ISDN links on the fly and allowing dial-on-demand of ISDN interfaces.\u003c/p\u003e\n\u003cp\u003eMy primary user only spoke German, so I added gettext support to the application and translated all texts into German as well.\u003c/p\u003e","title":"SMPPPD Web"},{"content":"During my time at T-Systems I worked on the following projects:\nDaimler Vehicle Backend In early 2013, I started as the architect of the Vehicle Homepage project, which is part of the Daimler Vehicle Backend. The entire solution was originally designed on top of an enterprise service bus and application server ecosystem. In 2015, we began a major refactoring of the platform, splitting the monolithic services into smaller microservices using the Spring Boot, Spring Cloud, and Netflix OSS stack. In 2018, this refactoring was completed as a prerequisite for moving the whole system from a traditionally operated data center to a hybrid cloud setup.\nSoftware Build Service The \u0026ldquo;Software Build Service\u0026rdquo; (SBS) originated in the AMS@ITP project (see below). Since then, it has evolved into the standard CI/CD platform within T-Systems. Currently, more than 50 projects and over 500 users rely on the service. The hosted platform is updated regularly, ensuring that the latest features of the various tools (Jenkins, Nexus, SonarQube) are always available.\nPrototype: Teilebedarfsermittlung* T-Systems develops and maintains the software that calculates the parts required for Mercedes-Benz vehicle production. This software is written in COBOL and runs on an IBM mainframe system. The idea behind the prototype was to re-implement the core calculation logic in Java and demonstrate how commodity hardware could be used to scale the system. The focus was on keeping the calculation logic separate from any infrastructure code (JEE) so it could be easily tested. To demonstrate the flexibility, we also migrated the algorithm to an Android tablet with a simple user interface. The prototype was a big success: we demonstrated that the full computation could be divided into smaller parts, and by scaling horizontally, the processing time could be reduced almost arbitrarily.\nDynamic Services for Developers The Dynamic Services 4 Developers (DS4D) project was an attempt to create a self-provisioning system for external customers, allowing them to set up development environments for their projects in a public cloud offered by T-Systems. My colleagues and I got involved because of our experience with the \u0026ldquo;Software Build Service\u0026rdquo;, which was planned to be an integral part of the cloud offering.\nApplication Management Service for the Mercedes-Benz AG IT management organization The challenge in this project was that around 50 Java and a few .NET applications had to be transitioned from small suppliers to T-Systems. My job was to design a system that standardized how the software was built and delivered to the customer. The solution was built on top of Jenkins, Artifactory, and Sonar. The biggest effort was migrating the extreme variety of build scripts to a standardized approach. The experience from this project led to the creation of the \u0026ldquo;Software Build Service\u0026rdquo;.\nType Senior Software Architect Environments Windows, Linux, Eclipse/STS, Tomcat, IBM WebSphere 6.1/7.0, Maven, Ant, Java 8, JEE 6/7, Jenkins, Nexus, SonarQube, Android, Spring, Spring Boot, Spring Cloud Findbugs, Checkstyle, PMD, Mercedes-Benz AG Pro Active Infrastructure (PAI) 4.0 - 5.0 ","permalink":"https://rumpf.eu/michael/projects/tsystems/","summary":"\u003cp\u003eDuring my time at T-Systems I worked on the following projects:\u003c/p\u003e\n\u003ch1 id=\"daimler-vehicle-backend\"\u003eDaimler Vehicle Backend\u003c/h1\u003e\n\u003cp\u003eIn early 2013, I started as the architect of the Vehicle Homepage project, which is part of the Daimler Vehicle Backend. The entire solution was originally designed on top of an enterprise service bus and application server ecosystem. In 2015, we began a major refactoring of the platform, splitting the monolithic services into smaller microservices using the Spring Boot, Spring Cloud, and Netflix OSS stack. In 2018, this refactoring was completed as a prerequisite for moving the whole system from a traditionally operated data center to a hybrid cloud setup.\u003c/p\u003e","title":"T-Systems"},{"content":"This application is a wrapper around an MS-DOS fax program, providing a set of fax templates for a fixed set of recipients.\nThe \u0026lsquo;Telefax 1.0\u0026rsquo; application is an extension of an MS-DOS-based fax program.\nRecipient addresses are stored in a plain text file and loaded by the application at startup. Each record is mapped to a function key (F1-F10). This makes the application somewhat restrictive, but the requirement was that only a small number of business partners would receive faxes.\nMain Menu\nAn empty template allows the user to enter address data manually in case a different recipient needs to be reached.\nEmpty Template\nOne of four categories must be selected to classify the fax.\nText Input\nFinally, the fax is sent using the command-line software that came with the modem.\nType Freelancer Project Environment MS-DOS, Turbo Pascal 6.0 Link Telefax.tar.bz2 (23kB) ","permalink":"https://rumpf.eu/michael/projects/fax/","summary":"\u003cp\u003eThis application is a wrapper around an MS-DOS fax program, providing a set of fax templates for a fixed set of recipients.\u003c/p\u003e\n\u003cp\u003eThe \u0026lsquo;Telefax 1.0\u0026rsquo; application is an extension of an MS-DOS-based fax program.\u003c/p\u003e\n\u003cp\u003eRecipient addresses are stored in a plain text file and loaded by the application at startup. Each record is mapped to a function key (F1-F10). This makes the application somewhat restrictive, but the requirement was that only a small number of business partners would receive faxes.\u003c/p\u003e","title":"Telefax"},{"content":"A J2EE/C++ application server running on six different operating-system platforms.\nIn April 2000, I joined the Twister core team of the Brokat Server Technology Division (STD), where the J2EE Application Server \u0026ldquo;Twister\u0026rdquo; was being developed.\nAt the time, the server was sold as an independent product. Unfortunately, in 2001 the decision was made to stop competing with the big players and to use the server as a platform for internal customers only. That remained the state of the product until July 2004, when the final decision was made to discontinue development of the Twister J2EE application server and move to the BEA WebLogic platform instead.\nProjects The following list gives an overview of all the Twister-related projects I worked on.\nTwister 6.0 (Codename: NEO) At the beginning of 2004, a final attempt was made to develop a new major version of Twister. The idea was to get rid of all C++ legacy components and re-implement the functionality in Java.\nIn the Twister 5.x product line the following components were still implemented in C++:\nLauncher LoggingService NamingService LoadbalancinService Support for RDOs and the LicenseService was not required anymore and thus could be dropped for Twister NEO.\nLauncher The Twister Launcher is responsible for starting the various processes and continuously checking them for availability. If an unavailable service is detected, the Launcher attempts to kill the hanging process and eventually restarts it to bring the service back to life. This functionality is nearly impossible to implement in pure Java, so a small native library was necessary to provide these process management features.\nLoggingService The C++ version of the LoggingService, like the NamingService, had many fault-tolerant features. The Twister version of the Java Logging API could detect an outage of the LoggingService and transparently switch to a fallback instance. When no service could be reached the client writes logging records into a local file and retransmits the records as soon as a LoggingService becomes available again. These key features had to be preserved for the pure java solution.\nNamingService In Twister NEO the fault-tolerant CORBA NamingService has been substituted by a NamingService interface directly in the Launcher. Each Service, started by the Launcher is registered in the service repository list and thus can be found by a client lookup. In the first version of the new NamingService, no fault-tolerance features were planned.\nLoadbalancingService The biggest challenge was the LoadbalancingService (LBS), which is responsible for instantiating RDO or EJB objects. The initial request to an object is sent to the LBS, which checks whether an instance of the object is already instantiated and creates one if not. Objects live in containers, and the old LBS had a sophisticated algorithm for distributing load across the configured number of containers. The new, pure Java solution features a plugin mechanism for load-distribution algorithms. By default, a round-robin algorithm is used, distributing requests evenly across the different containers.\nAn alpha version of the services had already been implemented. Unfortunately, the decision was made to completely stop development because the risk of switching to this new Twister version for the various projects was considered too high.\nLoggingService - SNMP Trap Functionality For the C++ LoggingService, I implemented an SNMP trap feature. A section in the configuration file config.xml contained a list of error ID ranges for which an SNMP trap should be sent to a configurable list of trap hosts. When the SNMP trap feature is enabled and an error with an ID from the configured range occurs, the logging service sends an SNMP trap to each of the trap hosts.\nJSR-77 - J2EE Management Specification For Twister 5.3 I evaluated the J2EE Management Specification and implemented the Managed EJB (MEJB) from this specification for the distributed Twister service framework. This implementation is based on a ManagementService component which provides the MEJB via a RMI-IIOP interface. MBeans can be registered at the ManagementService\u0026rsquo;s MEJB by configuration or programmatically.\nThe MBean hierarchy, as proposed by the JSR-77 specification, was planned for the next version of Twister and has not been implemented for Twister 5.3.\nEJB 2.0 Local Interfaces For Twister 5.3, I implemented EJB 2.0 Local Interface support for stateless and stateful session beans (EJBLocalObject, EJBLocalHome).\nTesting For performance testing, we used the J2EE test frameworks ECPerf and SPECjAppServer 2001/2002. I customized the latter to use them as a regression test suite that could be run automatically during nightly builds.\nWe used version 1.3 of the J2EE Compliance Test Suite (CTS, only available to Sun Java Partners) in an attempt to obtain J2EE 1.3 compliance certification for the Twister application server. We tried to automate the J2EE CTS test runner so we could use it during nightly regression tests, but unfortunately the 1.3 version of the CTS did not support this. The test runner had major flaws, forcing us to split the entire test run into many small steps. We never got it working reliably before the strict licensing conditions stopped us from proceeding. Version 1.4 had already been released, and licensees were required to finalize the licensing of a version at least 1.5 years after a new version was released. Due to resource constraints, we were unable to meet this deadline and ultimately gave up on the certification.\nOpenORB When the decision was made to use OpenORB as the basis for the Java components of the Twister application server, I started providing internal support for OpenORB-related issues.\nIn October 2001, I obtained CVS write access to the OpenORB CVS server hosted at Exolab. Around December 2002, Steve McConnell and I decided to fork the project to get the community more involved in decisions about its future. We chose the name \u0026ldquo;The Community OpenORB\u0026rdquo; for the project and moved the sources to SourceForge. The current status of the community effort can be tracked on SourceForge. I stopped contributing to the project in December 2004, after it was clear that the Twister project was finally dead.\nA list of all my bug reports to the original OpenORB project can be found here (70 bugs). My contributions to \u0026ldquo;The Community OpenORB\u0026rdquo; can be found in SourceForge CVS and on the mailing-list archives.\nSecurity In Twister 4.x, the C++ Secure Socket Layer (SSL) implementation was not fully standards-compliant and caused incompatibilities when communicating with the standards-compliant Java Secure Socket Extension (JSSE) used by OpenORB\u0026rsquo;s SSL module. My task was to make our legacy C++ SSL implementation fully compliant with OpenORB\u0026rsquo;s SSL/JSSE implementation.\nFor Twister 5.3, I started a Common Secure Interoperability Version 2 (CSIv2) implementation in order to pass the interoperability category of the J2EE Compliance Test Suite (CTS). This effort was stopped when it turned out that J2EE certification was no longer a goal. A first draft of the implementation can be found here.\nBuild Process As the Twister 4.x/5.x versions evolved, the software\u0026rsquo;s core functionality started spreading across many different CVS modules. As a consequence, maintenance became very time-consuming due to the dependencies. To address this, I created the Twister Meta-Project (TwiMP), which wraps the different CVS modules into a single Ant-based project, creating the impression that there is only one pure Java module and hiding the C++ legacy components behind the Ant build script.\nFor Twister 5.3 and Twister 6, we used a customized version of our internal CruiseControl system for continuous build integration on a TwiMP instance. Part of the customization involved making tools like FindBugs, PMD, and Checkstyle work on a TwiMP instance to generate code quality, test coverage, and bug-pattern detection reports for the Twister source code.\nFault-tolerant NameService and JNDI Service Provider In Twister, the CORBA NameService is an integral part of the application server. The Twister 4.0 implementation provides a fault-tolerance mechanism that causes the service to violate the CORBA NameService specification. The goal for Twister 5.0 was to make the NameService compliant with the OMG specification while preserving the fault-tolerance features.\nThe previous NameService was written in C++. All bindings were stored in the root context, and creating sub-contexts was not possible. For the new version, I chose to implement the CORBA IDL interface defined by the NameService 1.2 specification and to provide the fault-tolerance mechanisms via an IDL interface extension.\nThe \u0026ldquo;CosNamingExtFT\u0026rdquo; extension interface was introduced for creating and manipulating fault-tolerant contexts and bindings. A context can be created in either normal mode or fault-tolerant mode. In fault-tolerant mode, CORBA object instances running on multiple nodes can be bound under a single name in a fault-tolerant context. Upon lookup, the NameService tries to return the entry for the local node first. If no local instance is available, the first entry from the list is returned. The NameService checks with a \u0026ldquo;ping\u0026rdquo; invocation whether the instance to be returned is available. If this check fails, another entry from the sub-context is pinged. Only if no object can be found is a NameNotFound exception thrown.\nAdditionally, a CosNaming Service Provider Interface (SPI) for the Java Naming and Directory Interface (JNDI) was written. This wrapper allows Java clients to access objects in the NameService via standard JNDI lookup mechanisms.\nBase Toolkit The base toolkit is the API for RDOs (Repository Defined Objects), Twister\u0026rsquo;s proprietary component model, used by application developers to interact with the application server. This API is available in the Twister 4.x and 5.x versions.\nThe API was designed with simplicity and consistency in mind. The goal was to minimize the differences between the C++ and Java programming languages. A developer switching between the two languages should not see any major differences, other than the inherent language-specific ones. This was especially important for projects that were migrating from C++ to Java, where many legacy components were still written in C++ while new components were already being developed in Java.\nExamples Implementing examples for the 4.0 version of the Twister application server was my first task on the new job. This gave me the opportunity to start learning about the application server internals.\nThe examples were shipped with the 4.0 version of the product and served as a starting point for application developers building projects on top of the Twister application server.\nThe examples are based on the factory pattern and use the classic Account scenario. The client applications and server objects are developed in all Twister-supported programming languages (Java, C++, TCL) and component models (CORBA, EJB, RDO).\nType Junior Software Engineer to Senior Software Arcchitect at Brokat/Encorus Technologies/First Data Mobile Solutions Environment TODO ","permalink":"https://rumpf.eu/michael/projects/twister/","summary":"\u003cp\u003eA J2EE/C++ application server running on six different operating-system platforms.\u003c/p\u003e\n\u003cp\u003eIn April 2000, I joined the Twister core team of the Brokat Server Technology Division (STD), where the J2EE Application Server \u0026ldquo;Twister\u0026rdquo; was being developed.\u003c/p\u003e\n\u003cp\u003eAt the time, the server was sold as an independent product. Unfortunately, in 2001 the decision was made to stop competing with the big players and to use the server as a platform for internal customers only. That remained the state of the product until July 2004, when the final decision was made to discontinue development of the Twister J2EE application server and move to the BEA WebLogic platform instead.\u003c/p\u003e","title":"Twister"},{"content":"A webcam based on AMIGA M-JPEG digitizer hardware and a collection of scripts to upload the images to an FTP account.\nMain Window\nThis project was an attempt to build a webcam from existing hardware, since professional webcams were very expensive at the time.\nHi8 video camera Amiga 4000 VLab Motion, a Motion-JPEG digitizer card Parallel port connection (PC2Amiga) to the PC Windows PC AOL \u0026lsquo;50 hours free\u0026rsquo; internet access The video camera is connected to the digitizer board on the Amiga. The digitizer software is controlled by an ARexx script that takes a picture every five seconds and sends it via the PC2Amiga client over the parallel port to the PC. On the PC, a VisualBasic application using the Inet ActiveX control uploads the file to an Internet FTP account. On the server, a cron job moves the uploaded file to a folder on a web server, where it can be viewed in a browser.\nApart from the occasional partially uploaded file and several restarts of the various scripts, the webcam worked quite nicely.\nType Personal Project Environment Visual Basic 5, Bash, Amiga Shell, ARexx, FTP, Windows 9x/NT4, A4000 with VLab-Motion and Movieshop 3.x Link WebCam tarball (10kB) (VB Source-Code) pc2am tarball (106kB) (PC2Amiga208.lha and PC2AmFix.lha) WebCam archive (95kB) (ARexx-Script and Batch-File) ","permalink":"https://rumpf.eu/michael/projects/webcam/","summary":"\u003cp\u003eA webcam based on AMIGA M-JPEG digitizer hardware and a collection of scripts to upload the images to an FTP account.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/michael/images/webcamuploader.png\"\u003e\u003cimg alt=\"Main Window\" loading=\"lazy\" src=\"/michael/images/webcamuploader_small.png\"\u003e\u003c/a\u003e\n\u003cem\u003eMain Window\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThis project was an attempt to build a webcam from existing hardware, since professional webcams were very expensive at the time.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHi8 video camera\u003c/li\u003e\n\u003cli\u003eAmiga 4000\u003c/li\u003e\n\u003cli\u003eVLab Motion, a Motion-JPEG digitizer card\u003c/li\u003e\n\u003cli\u003eParallel port connection (PC2Amiga) to the PC\u003c/li\u003e\n\u003cli\u003eWindows PC\u003c/li\u003e\n\u003cli\u003eAOL \u0026lsquo;50 hours free\u0026rsquo; internet access\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe video camera is connected to the digitizer board on the Amiga. The digitizer software is controlled by an ARexx script that takes a picture every five seconds and sends it via the PC2Amiga client over the parallel port to the PC. On the PC, a VisualBasic application using the Inet ActiveX control uploads the file to an Internet FTP account. On the server, a cron job moves the uploaded file to a folder on a web server, where it can be viewed in a browser.\u003c/p\u003e","title":"WebCam"}]