Results for category "Uncategorized"

40 Articles

Open Tabs: Resources for Web Developers, How to write perfect blog posts, Argus

Resources for Web Developers

  • Freepik is a search engine for finding free vector graphics, PSDs, icons and and photos.
  • If you have to quickly create a landing page for your AppStore product, you can use the free service Landing Harbor.
  • Searching for a tool for your freelancer job? Take a look at The Freelance Stack.
  • Need a new Bootstrap-based theme? Bootstrap Zero should give you a good start.

How to write better blog posts

You have no idea how to start your next blog post? Try the free Content Idea Generator. And after you have found your topic you should definitely follow the rules of the awesome article After 10,000+ data points, we figured out how to write a perfect Medium post. The article contains a lot of hints how to optimize your blog posts.

Monitor your time series with Argus

Argus is an open source project proided by Salesforce to monitor your time series and receive alerts. I will take a deeper look at this project in the coming weeks.

lumiverse.io

On lumiverse.io you can find some interesting videos about neural networks.

Making money with GitHub

I stumbled upon these two projects on HN: CodeMill and Bountysource both provides a marketplace service for GitHub pull requests. You can search for open tickets, make a pull request and get paid by the community or the project owner.

GitHub project management

zube.io is a payed service to organize your GitHub projects. The open source alternative gh-board can be hosted on your own servers and has a lot of features like linking multiple GH repositories to one Kanban board.

Collecting and visualizing metrics with statsd, InfluxDB and Grafana on Fedora 22

My employer NeosIT offers a web based SMS notifiyng solution for organizations with security roles named ZABOS. In the last months we extended the ZABOS application to support digital alerting through POCSAG. After some problems with a third party component we implemented the ability to collect all POCSAG telegrams delivered in the near circumcircle and to notify the authorized recipients by SMS. Most of the incoming telegrams are discarded because they are not assigned in our database. But nevertheless I was interested in graphical representation of all incoming POCSAG messages, and additionally in a comparision to alerts sent with ZVEI, an analogue notification protocol. The ZABOS application log file contains all relevant information, which I wanted to extract.

Setting the stage

Our current infrastructure is based upon Fedora systems and some CentOS boxes. A central Logstash server collects incoming log messages through the Lumberjack input filter. After reviewing possible alternatives I had decided to implement statsd, InfluxDB and Grafana.

InfluxDB

InfluxDB is an open-source distributed time-series database which stores points in time and assigns key/values to it. Installing it on Fedora 22 is easy: get the latest RPM, install it and open the TCP ports:

wget https://s3.amazonaws.com/influxdb/influxdb-0.9.4.2-1.x86_64.rpm
sudo dnf install ./influxdb-0.9.4.2-1.x86_64.rpm</code>

# open network ports
# 8083: admin GUI port
sudo firewall-cmd --add-port=8083/tcp --permanent
# 8086: REST API
sudo firewall-cmd --add-port=8086/tcp --permanent
sudo firewall-cmd --reload

systemctl start influxdb
journalctl -f -u influxdb

After installing the RPM, navigate to http://localhost:8083 and set up a new database. The screenshots in the official documentation are slightly outdated, so use the query input:

CREATE DATABASE "demo"
CREATE USER "demo" WITH PASSWORD 'demo'

Make sure, that you can although open the URL http://localhost:8086/ping. It should return a valid HTTP 204 response.

statsd

statsd is node.js service which collects time series, provided through UDP or TCP. Most producers, e.g. Logstash, provide a statsd interface. statsd itself is pluggable and has a backend plug-in for InfluxDB. Every incoming time series is forwarded to the InfluxDB instance.

# get required packages
sudo dnf install nodejs npm git
cd /opt
sudo git clone https://github.com/etsy/statsd.git
cd statsd

# download InfluxDB backend
npm install statsd-influxdb-backend -d

# open network ports
firewall-cmd --add-port=8125/tcp --permanent
firewall-cmd --add-port=8125/udp --permanent
firewall-cmd --reload

# make configuration directory an copy example configuration
mkdir /etc/statsd/
cp exampleConfig.js /etc/statsd/config.js

# create a user
adduser statsd
# add systemd unit
vi /etc/systemd/system/statsd.service

The statsd.service file contains the unit definition for systemd. I mostly used the sample given at digitalocean.com:

[Service]
ExecStart=/usr/bin/node /opt/statsd/stats.js /etc/statsd/config.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=statsd
User=statsd
Group=statsd
Environment=NODE_ENV=production</code>

[Install]
WantedBy=multi-user.target

After saving the unit definition, edit the /etc/statsd/config.js:

{
influxdb: {
version: 0.9, // !!! we installed 0.9
host: '127.0.0.1', // InfluxDB host. (default 127.0.0.1)
port: 8086, // InfluxDB port. (default 8086)
database: 'demo', // InfluxDB database instance. (required)
username: 'demo', // InfluxDB database username. (required)
password: 'demo', // InfluxDB database password. (required)
flush: {
enable: true // Enable regular flush strategy. (default true)
},
proxy: {
enable: false, // Enable the proxy strategy. (default false)
suffix: 'raw', // Metric name suffix. (default 'raw')
flushInterval: 1000 // Flush interval for the internal buffer.
// (default 1000)
}
},
port: 8125, // StatsD port.
backends: ['./backends/console', 'statsd-influxdb-backend'],
debug: true,
legacyNamespace: false
}

If you miss the version property, statsd-influxdb-backend uses the old protocol version. 0.9 is incompatible with prior versions, so you will receive HTTP 404 errors after forwarding messages from statsd to InfluxDB.

# enable service
systemctl enable statsd
systemctl start statsd

journcalctl -f -u statsd

Logstash

In our special case I had to use the logstash-forwarder to forward the ZABOS application log to Lumberjack. To be compatible with our existing Logstash infrastructure, I configured a special input filter to extract POCSAG RICs and ZVEI series from the ZABOS log file. The filter itself is out of scope of this blog entry.

The statsd output filter for Logstash provides the ability to send extracted log data to statsd. The configuration is straight forward:

filter {
 file {
  # log extraction logic skipped
 }
}

output {
 if [pocsag_subric] {
  statsd {
   host => "127.0.0.1"
   port => 8125
   increment => "pocsag.incoming.%{pocsag_subric}"
  }
 }
}

This conditional output filter increments a key with the given POCSAG SubRIC if a pocsag_subric field is not empty.

After manual running the Logstash agent with the configuration above, Logstash sends all found POCSAG SubRICs to the local statsd instance which in turn forwards it to InfluxDB.

One note about logstash-output-influxdb: it supports a direct output into InfluxDB without using statsd, but it supports only the old API piror 0.9. In addition, most time series producers are sending in a statsd format. So the setup I described is more complex but you gain an advantage in flexibility.

Grafana

At this point I was able to forward all POCSAG telegrams to InfluxDB. To visualize the collected information, I installed Grafana. The Grafana client connects to different backend databases like OpenTSDB, ElasticSearch and InfluxDB to produce time series based graphs. Installing Grafana can be accomplished with yum/dnf:

sudo dnf install https://grafanarel.s3.amazonaws.com/builds/grafana-2.1.3-1.x86_64.rpm</code>

# open ports
firewall-cmd --add-port=3000/tcp --permanent
firewall-cmd --reload

systemctl enable grafana-server
systemctl start grafana-server

After navigating to http://localhost:3000 you need to set up a new data source: Click on Data Sources > Add New and enter the credentials to your InfluxDB instance.

Important information: You have to enter a FQDN as database URL and not http://localhost! Your browser will directly connect to the InfluxDB backend, so your browser must have access to the InfluxDB REST endpoint.

If you need professional consulting or development services for the topics above, just look on our website or leave us a message at info[at]neos-it[dot]de.

Wie ich einen HNO-Arzt in Wolfsburg suchte und IT-Probleme fand

In diesem Blog-Eintrag will ich meine Erkenntnisse schildern, die ich während meines Tinnitus gesammelt habe.
For the non-german-readers of this blog: This blog post deals with the experiences I made during my tinnitus.

Zur Vorgeschichte

Am Dienstag vor genau zwei Wochen wachte ich im frühen Morgen von einem hohen Fiepen im Ohr auf. Da ich bis dahin noch nie Probleme mit meinen Ohren hatte, wartete ich den Dienstag ab und hoffte auf Besserung. Leider wurde es auch am Mittwoch nicht besser. Ich muss dazu sagen, dass mich z. B. bereits leise Geräusche beim Einschlafen stören. So nehme ich das Entladen von Kondensatoren als extrem nervig wahr. Der Ton in meinem Ohr bzw. Kopf hatte in etwa die gleiche Frequenz. Bevor ich also verrückt werden würde, entschloss ich mich, einen Arzt aufzusuchen.

Die Suche nach einem Hals-Nasen-Ohren-Arzt

Während der Sommerferien im Allgemeinen und der Werksferien von Volkswagen im Speziellen, ist hier in Wolfsburg wenig los. Das trifft auch auf die Besetzung der Arztpraxen zu. Ich versuchte den halben Mittwoch eine Arztpraxis zu erreichen. Highlight war unter anderem, dass ich in vier Arztpraxen von deren Anrufbeantwortern auf die nächste Vertretung verwiesen wurde, von denen die letzte Vertretung nicht erreichbar war. Teilweise waren bei Google die Telefonnummern der Praxen veraltet oder die Öffnungszeiten stimmten nicht. Hier bekam ich dann auch die erste Idee, eine simple Webseite zu entwickeln, auf der die Ärzte ihre Vetretung eintragen können.

Letztendlich erreichte ich dann telefonisch doch noch eine Arztpraxis, in der mir gesagt wurde, dass diese keinen neuen Patienten aufnehmen. Ich solle doch in die Notaufnahme fahren. Die zweite Anforderung für die Webseite war also ein simple Checkbox: “Nimmt neue Patienten auf”.

Verwechslung in der Notaufnahme

Am Donnerstag Vormittag fuhr mich meine Frau in die Notaufnahme. Ich bekam ein Bändchen mit Barcode um das Handgelenk und wurde in die HNO-Abteilung geschickt. Auf dem Weg dahin überlegte ich, dass es eigentlich ganz cool wäre, wenn man mit dem Bändchen sich seinen Weg durch das Klinikum zeigen lassen könnte. Sei es über einen RFID anstelle des Barcodes oder einen RasPi mit Barcode-Leser und Mini-LCD in den Gängen.

Nachdem ich in der HNO-Abteilung ankam, bin ich direkt verwirrt gewesen. Nirgendwo ein Arzt oder Zimmer, wo ich mich hätte anmelden können. Im Wartezimmer wurde mir gesagt, dass irgendwann eine Ärzten vorbeikommt. Dem war auch glücklicherweise so. So ein automatisierter Check-In wäre nett gewesen…

Ich wurde überraschend schnell ins Behandlungszimmer gerufen. Insgesamt war ich bis dahin nur ca. 45 Minuten im Klinikum. Im Behandlungszimmer fragte mich die Ärztin, ob die Ohrschmerzen sehr stark seien. Ich war wieder verwirrt. Das Geräusch war nervig, aber nicht unbedingt schmerzhaft. Wir stellten beide fest, dass es noch einen weiteren Patienten mit meinem Nachnamen gab. Glück für mich: ich durfte im Behandlungszimmer bleiben und sparte somit jede Menge Zeit. Was mich natürlich andererseits schockierte: Was wäre passiert, wenn sie mir ohne weitere Nachfragen Tabletten gegeben hätte, die überhaupt nicht zu meinen Symptomen passten? Mit einer gezogenen Nummer im Wartezimmer und einem Abgleich mit meinem Handgelenkbändchen wäre das alles erst gar nicht passiert.

Hörtest

Mit meiner Krankenakte und meinem Handgelenkbändchen wurde ich zum Hörtest geschickt. Während sich die zuständige Ärztin auf ihre langsame PC-Software wartete und ich sah, wie der Ladeanzeige im LCD des Hörtestgeräts bedrohlich blinkte, irritierte mich der laute PC-Lüfter. Der gesamte Raum war so isoliert, dass man von draußen absolut nichts hörte. Aber dafür brummte der PC. Nervig. Der Hörtest sollte gerade losgehen, als plötzlich der Akku des Hörtestgeräts leer war. Hätte das Ding gepiept, hätte man das wahrscheinlich schon vorher gemerkt.

Der Hörtest verlief ohne nennenswerte Unterbrechungen. Ich drückte den Knopf, wenn mich mal das Brummen des PCs nicht ablenkte. Alles in allem hatte ich wohl ein glückliches Händchen. Mir wurde das Gehör eines jungen Gottes bescheinigt. Ein junger Gott mit Tinnitus oberhalb von 8 kHz.

Rezepte

Ich durfte mit meinem (ausgedruckten) Testergebnis in der Hand wieder runter in die HNO-Abteilung, wartete kurz und wurde herein gerufen. Die behandelnde Ärztin verschrieb mir Tabletten. Ich bekam einen Zettel mit dem Rezept in der Hand und sollte diesen in der Notaufnahme abgeben. Außerdem erfuhr ich, dass mich nun der HNO, bei dem ich als letztes angerufen hatte, aufnehmen musste.

Den Tag im Klinikum beendete ich damit, dass mir in der Notaufnahme der Zettel mit dem Rezept durch ein wirkliches Rezept ersetzt worden war und ich wurde entlassen.

Terminklärung beim HNO

Im Anschluss an den Krankenhausbesuch rief ich die HNO-Praxis an. Leider nur Anrufbeantworter ohne Ansage. Scheinbar war für heute bereits der Arbeitstag zu Ende. Ich rief am nächsten Tag noch einmal früh an, ärgerte mich über eine äußerst schlechte Warteschleifenmusik, wurde als Patient aufgenommen und bekam direkt für den folgenden Montag einen Termin.

An dieser Stelle fragte ich mich, warum so wenig Arztpraxen die Buchung von Terminen über das Internet ermöglichen. Die Dienste sind ja vorhanden. Für mich als Person, die äußerst ungern telefoniert, wäre das ein Segen. Außerdem wären die Arthelferinnen vermutlich deutlich weniger gestresst. Viele der Telefonate drehen sich vermutlich (?) um Terminabsprachen.

Termin beim Arzt

Montag Nachmittag suchte ich die Arztpraxis auf. Wegen schlechterer Beschilderung liefen ich und ein weiterer Patient bis in die 4. Etage – nur um festzustellen, dass die Praxis im Erdgeschoss war (Memo für die Webseite: Etage und Barrierefreiheit muss sich eintragen lassen).

Nach einer sehr kurzen Wartezeit von 10 Minuten war ich an der Reihe. Ich durfte wieder einen Hörtest absolvieren – den ich auch diesmal mit gutem Drückergebnis meisterte. Der Arzt schrieb mich für den Rest der Woche krank.

Eine Woche später

Die “Erlebnisse” während des Tinnitus beschäftigen mich immer noch. Als Softwareentwickler bin ich es gewohnt, Probleme zu identifizieren und Prozesse zu optimieren. Da sich die Ärzte aber keine Sorgen um einen Mangel an Patienten machen müssen, wird es wohl schwer werden, dort etwas zu optimieren. Der Druck und das Ärgernis besteht eher auf Seite des Kunden (Patienten).

An dieser Stelle muss ich auch noch einmal sagen, dass ich mich von den beiden Ärztinnen im Krankenhaus gut und nett behandelt fühlte. Diese mussten alleine (!) beide Abteilungen leiten, da der Rest der Kollegen krank war. Auch der HNO-Arzt und seine Mitarbeiterinnen waren nett und sympathisch. In diesem Sinne: +1 für die Ärzte, -1 für Prozesse und -1 für das Gesundheitssystem.

Integration testing the mail dispatching in Laravel 5.1

When using the Mail facade in Laravel it is not so easy to test the output of the parsed mail template. Like http://stackoverflow.com/questions/31120567/unittesting-laravel-5-mail-using-mock I received the error Method Mockery_0__vendor_Swift_Mailer::getTransport() does not exist on this mock object. I ended up in listening to the mailer.sending event:

    public function testRegistrationMailIsSend_afterSubmittingForm()
    {
        // flag for closure has been called
        $mailerAssertionHasBeenCalled = false;

        // receive every Event::fire method and pass the reference from the outer scope into the closure
        Event::shouldReceive('fire')->andReturnUsing(function($event, $params) use (&$mailerAssertionHasBeenCalled) {
            // filter only the mailer.sending event
            if ($event != 'mailer.sending') {
                return;
            }

            // reference will be modified
            $mailerAssertionHasBeenCalled = true;
            // Swift_Message; Illuminate\Mail\Mailer::sendSwiftMessage
            $msg = $params[0];

            $this->assertEquals('Verify your e-mail account', $msg->getSubject());
            $recipients = $msg->getTo();

            $this->assertTrue(array_key_exists('my@domain.com', $recipients));
            $verificationKey = Registration::first()->verification_key;

            // assert registration key is present in parsed template
            $this->assertContains('/registration/verify-email?key=' . $verificationKey, $msg->getBody());
        });

        // visit our registration controller
        $this->visit('/registration')
            ->submitForm('Register', ['email' => 'my@domain.com'])
            ->see('Mail has been sent');

        // make sure that our closure has been called
        $this->assertTrue($mailerAssertionHasBeenCalled);
    }

Seeding the database for integration tests in Laravel

In my last post I wrote about how to define the test environment for database integration tests. Now I want to describe, how the database can be populated with test or stam data.

First of all, every test inherited from the generated TestCase class executes the Artisan migrate command (TestCase::prepareForTests()). The trait Illuminate\Foundation\Testing\DatabaseMigrations is only required, if all tables of the schema have be dropped after the test execution. This could be necessary for system tests in which the whole schema is populated with test data. For “simple” integration tests using transactions should be sufficient.
One word about the traits DatabaseMigrations and DatabaseTransactions: Both are executed by PHPUnit before every test method. PHPUnit scans all methods in the test class for the documentation annotations @before, @after, @beforeClass and @afterClass (PHPUnit_Framework_TestCase::runBare() and PHPUnit_Util_Test::getHookMethods()). The traits both uses the @before annotation to setup the context:

trait DatabaseMigrations
{
    /**
     * ckl: this annotation advises PHPUnit to run the trait before every test case
     * @before
     */
    public function runDatabaseMigrations()
    {
        $this->artisan('migrate');

        $this->beforeApplicationDestroyed(function () {
            $this->artisan('migrate:rollback');
        });
    }
}

With this in mind the seeding of the database can be placed on two different locations. First of all, the non-working approaches. Putting the seeding inside the setUp() or prepareForTests() method does not work, because at runtime there is no active transaction:

    public function setUp() {
        parent::setUp();
        // ckl: wrong place; this method is called on startup. The seeding is outside an active transaction
        // $this->seed('QualificationsTableSeeder');
    }

    public function prepareForTests() {
        $sut = $this->app->make('\App\Services\ExperienceService');
        // ckl: wrong place; this method is called on startup. The seeding is outside an active transaction
        // $this->seed('QualificationsTableSeeder');
    }

Using a pure seeder method with @before does although not work. ReflectionClass::getMethods(), which is used by PHPUnit, returns at first all “native” / non-traited methods and after that the traited methods:

    /**
     * ckl: local methods have higher precedence than traits, so this method is called *before* the DatabaseTransactions trait has been called
     * @before
     */
    public function seedTables() {
        $this->seed('MyTableSeeder');
        $testInstance = factory('App\User')->create();
    }

By starting a transaction inside the seedTables(), we have the seeding inside a running transaction:

    /**
     * @before
     */
    public function seedTables() {
        // already start the transaction and let DatabaseTransactions only rollback the transaction. This does only work on the first test case
        DB::beginTransaction();
        $this->seed('MyTableSeeder');
    }

The rollback is done by the DatabaseTransactions trait. It is no problem having two DB::beginTransaction() calls and only one rollback. MySQL does not allow nested transactions, so Laravel starts only the transaction on the first DB::beginTransaction() call. Every other invoke only increments a counter.
Laravel only executes the rollback, if all DB::rollBack() methods have been called. The seedTables() has to look like

    /**
     * @before
     */
    public function seedTables()
    {
        DB::beginTransaction();

        $this->beforeApplicationDestroyed(function () {
            $this->app->make('db')->rollBack();
        });

        $this->seed('MyTableSeeder');
    }

A much cleaner solution is to call the seedTables() method inside every test case:

    public function seedTables() {
        $this->seed('MyTableSeeder');
    }

    public function testSeeding() {
        // ckl: transaction has been started
        $this->seedTables();

        $this->assertTrue(true);
    }

Test environments for database integration tests in Laravel 5

As far as I have read, in Laravel 4 you could define your database integration test environment by adding a testing/database.php or .env.testing.php file containing your configuiration. In Laravel 5 both ways does no longer work. To switch your environment you have two options:

  1. Put both configuration definitions (testing, dev/production) inside your config/database.php:
        'connections' => [
    
            'sqlite' => [
                'driver' => 'sqlite',
                'database' => storage_path('database.sqlite'),
                'prefix' => '',
            ],
            'mysql' => [
                'driver' => 'mysql',
                'host' => env('DB_HOST', 'localhost'),
                'database' => env('DB_DATABASE', 'schema'),
                'username' => env('DB_USERNAME', 'root'),
                'password' => env('DB_PASSWORD', 'root'),
                'charset' => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix' => '',
                'strict' => false,
            ],
            'mysql_testing' => [
                'driver' => 'mysql',
                'host' => env('DB_HOST_TEST', 'localhost'),
                'database' => env('DB_DATABASE_TEST', 'schema_test'),
                'username' => env('DB_USERNAME_TEST', 'root'),
                'password' => env('DB_PASSWORD_TEST', 'root'),
                'charset' => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix' => '',
                'strict' => false,
            ],
    

    and store the configuration defaults in your .env file by adding the configuration keys DB_HOST_TEST, DB_DATABASE_TEST and so on. Eventually you must modify your base TestCase::createApplication to use the mysql_testing connection:

        /**
         * Creates the application.
         *
         * @return \Illuminate\Foundation\Application
         */
        public function createApplication()
        {
            putenv('DB_CONNECTION', 'mysql_testing');
    
            $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
    
            return $app;
        }
    
  2. I prefer the second solution: Copy the .env file to .env.testing, modify the settings and override the default Dotenv file .env by modifying your base TestCase::createApplication:
        public function createApplication()
        {
            $app = require __DIR__.'/../bootstrap/app.php';
            // ckl: use .env.testing in favor of .env; clear separation between configuration values and configuration definition
            $app->loadEnvironmentFrom('.env.testing');
    
            $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
    
            return $app;
    

Using Subselects with CQL in CMDBuilds “filter” type properties

CMDBuild supports the usage of SQL queries inside the “filter” options if the type is a REFERENCE.

Given:

  • A lookup table named “Software Type” [{Code: DBMS}, {Code: App}]
  • A class Application [{Code: MySQL, Type: DBMS}, {Code: PostgreSQL, Type: DBMS}, {Code: Tomcat, Type: App}]; “Type” references the lookup table “Software Type”
  • A class ApplicationRelease [{Code: “MySQL 5.0”, Application: MySQL}, {Code: “PostgreSQL 9.x”, Application “PostgreSQL”}, {Code: “Tomcat 7.0”, Application “Tomcat”}]; “Application” is a foreign key to the Application class.
  • A class DbmsInstance with a reference/foreign key to ApplicationRelease

Target:

  • By adding/modifying a DbmsInstance, only ApplicationReleases shall be shown which are of type “DBMS”.

How to solve this by using a subselect:

from ApplicationRelease where Id (/(
  SELECT "Id" FROM "ApplicationRelease" WHERE "Application" IN 
	(SELECT "Id" FROM "Application" WHERE "Type" = 
		(SELECT "Id" FROM "LookUp" WHERE "Code"='DBMS')
	)
)/)

Please note, that every referenced column must be quoted with double quotes. Every value of WHERE clause must be quoted using single quotes only!
The (/(…)/) construct introduces plain SQL.

Trying to install CMDBuild and receiving an ORMException “ORM_GENERIC_ERROR”

CMDBuild is a free (“free” as in GPL v2) ITIL solution. The installation of the 2.3.1 version has been a pain in the ass. After applying the database information in the setup wizard, I always received an org.cmdbuild.exception.ORMException: ORM_GENERIC_ERROR. CMDBuild stores its log files (cmdbuild.log, cmdbuild_dd_sql.log) in the “logs” folder of Tomcat where I could find the root cause for this issue. Our PostgreSQL instance is installed on a Windows machine and holds two database templates. template0 has UTF-8 default encoding, template1 uses WIN-1252. During the installation of the database schema of CMDBuild, the template1 is used. The WIN-1252 encoding of template1 is not compatible with the used UTF-8 encoding of CMDBuild/Java. I fixed this issue by re-creating the template1 schema with UTF-8:


DROP DATABASE template1;
CREATE DATABASE template1 WITH template = template0 ENCODING = 'UTF8';
UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

The next time I hit the install button of the wizard, I received another ORM_GENERIC_ERROR. This time the log stated that the plpgsql language was missing for template1. I altered the template1 by issuing a “CREATE LANGUAGE plpgsql”. After that I was able to install CMDBuild.

Unattended installation of Windows Server 2012 R2 in VirtualBox and getting an 0x80042565 error

Today I struggled with a working configuration for an autounattend.xml for 9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_SERVER_EVAL_DE-DE-IR3_SSS_X64FREE_DE-DE_DV9.ISO (Windows Server 2012 R2, Standard, Standard Core, Datacenter and Datacenter Core). The unattended installation inside VirtualBox always failed with an error 0x80042565 or did not use the partition scheme I had previously provided.

I suppose that the problem occured in the first place because of the disabled UEFI of my VM. The usage of the following DiskConfiguration section installs Win2K12 R2 correctly:

https://gist.github.com/schakko/d5df24a2aab89e5e7ed0

Second Hackcamp Wolfsburg – December 2014

Last Saturday our second Hackcamp Wolfsburg in 2014 took place. In the run-up to the Hackcamp I had suggested to use the NeosIT office as the event location. @stevenschwenke agreed to that and so I prepared our office on Friday evening. Before the event I expected a team programming session but in the end I explained (too?) much about the Spring Framework and showed samples, use cases and technical approaches to solve different problems with the framework.

Nevertheless it was an enjoyable circle consisting of Steven, Karsten, Sven, Nikolai, Daniel, Kevin, Tobse and me. Besides the usual software development topics we talked about TV series and net political issues. For lunch time we had ordered pizza and Steven bought a lot of juice and fruit. And certainly we had a lot of Club Mate available.

I am really looking forward to the next Hackcamp in 2015 – thank you for the participation and patience 😉