Improving the Reportheld website!

Well, we had to learn it one way or another - marketing matters. We are very happy with the word-of-mouth customers we are getting, and they are getting even more. To tell you the truth, it is pretty awesome, what kind of reception Reportheld got without us doing much (or any?) marketing up to now.

So without going any further, first and foremost: Thank you to all our loyal customers that are talking so enthusiastically about our solutions. You rock!

As always though, for us to be a real startup we need websites. So we have created the Reportheld website with additional, dedicated information about that cool product. Of course, just as software, a website is never done, but for now you can read all about the wind power centered Reportheld. We plan to put all the other business sectors on there that already benefit from our easy "a picture says more than a thousand words" workflow.

Let me invite you to take a look at the new homepage and let me know what you think!


Presenting Reportheld at Husum Wind Conference

Next week we will be presenting our Reportheld Inspection Solution at the HUSUM Wind 2015. Together with our largest customer and partner BayWa r.e. you can find us at the BayWa r.e. booth 2D19.

With a large install base and a fast growing international group of customers Reportheld prides itself of being easy, stylish and efficient. With its unique workflow across multiple device formats, your employees can use the right device at the right time. No matter, if iPhone, Android, Windows Phone - or if it's on their laptop. It doesn't matter. No more manual synchronization or outdated protocols. And the best thing: Multiple engineers can work simultaneously on one protocol with multiple devices!

Find us at the booth and learn in which ways Reportheld helped BayWa r.e. shape, optimize and improve their operation and maintenance of wind turbines and solar plants. Talk to us how this next generation CMMS Software can help you win customers, optimize costs and at the same time make your employees happier.

See you at booth 2D19!


Friends of TypeScript

We are now officially listed as "Friends of TypeScript" on http://www.typescriptlang.org/

And we really, really are friends of TypeScript. Our whole groupXS group framework is written in TypeScript, both the frontend and the backend. I wasn't too sure in the beginning, if it was the best way to go down when it comes to technology. But now with hindsight, we can absolutely say: It was the best decision we did. It is just awesome to have all the flexibility of JavaScript combined with a type system, where you want it.

TypeScript Team: Thank you for your great work, and thank you for putting our logo on your website. You rock!


Kurierdienst DHL Kurier Extension für Magento

Mit dieser Extension erhalten Ihre Kunden genau zum gewünschten Zeitpunkt die bestellte Ware! Durch den neue Service von DHL Paket DHL Kurier können Sie mit diesem Magento Modul Ihren Kunden eine ungeahnte Vielfalt an Einstellmöglichkeiten bieten.

Das DHL Kurier Plugin wurde speziell für Magento entwickelt und angepasst. Besonders die intelligente Auswahl der möglichen Versandarten macht diese Extension sehr intuitiv und einfach zu bedienen, sowohl für Sie als Shopbetreiber, als auch im Besonderen für Ihre Kunden. Gerade durch die neue Versandart mit Kühlung ermöglicht die Extension in Verbindung mit DHL Kurier Lebensmittel oder sonstige verderbliche Ware schnell und sicher zum Kunden zu transportieren.

Machen Sie es Ihren Kunden einfacher Ihre Ware schnell und ohne Komplikationen zu erhalten. Es steigert die Kundenzufriedenheit messbar!

Gleich in unserem Magento Plugin Shop bestellen!


nginx gegen LogJam absichern

Sicherheit und Absicherung von Servern ist wie ein eisernes Vorhängeschloss - wenn man es nicht pflegt und prüft, rostet es und wird immer weniger sicher.

Wir sind uns unserer Verantwortung sehr bewusst, dass Sie uns Ihre Daten anvertrauen. Daher sind wir immer daran interessiert unsere Server gegen gängige und neueste Attacken zu messen.

Heute ist die sogenannte LogJam Sicherheitslücke bekannt geworden. Dabei sind es vor allem die Browser, die die Sicherheitslücke aufreißen. Allerdings kann man hier in diesem speziellen Fall auch als Serverbetreiber die Anwender durch eine richtige, härtere Konfiguration des Servers schützen.

Wir nutzen nginx als unsere Edge, um unsere Backends gegenüber dem offenen Internet zu schützen. Daher haben wir uns heute, inspiriert durch LogJam, unsere nginx Konfiguration nochmal mit der Lupe angeschaut.

Die wichtigsten Punkte für die ssl Sicherheit sind in nginx die Direktiven ssl_ciphers und ssl_prefer_server_ciphers. Damit kann man unsere ssl Verschlüsselungen verbieten und den Browser und Server anweisen dem Server bei der Aushandlung des ssl Ciphers mehr zu vertrauen.

Zusätzlich ist es immer empfehlenswert ssl auch durch einen möglichst starke Diffie-Hellman Gruppe zu erzeugen. Diese wird mit dem Befehl
[crayon-5daa4d6ce56be405502940/]
erzeugt. Eingebunden werden kann diese dann über ssl_dhparam in nginx.

Überprüfen kann man die Einstellungen des Servers über weakdh.org. Schön, dass unsere Server dort "Good News!" verkünden. Wir sind gespannt, wann die nächste Sicherheitslücke unsere Server testen wird. Wir bleiben auf jeden Fall für Sie und Ihre Daten am Ball!


VS 2013 fails to sync with "Invalid description in FETCH_HEAD"

The last couple of weeks one of our Visual Studio Online git repository refused to get pulled by simply hitting "sync" inside VS. It always said:

"An error occurred. Detailed message: An error was raised by libgit2. Category = Merge (Error).
Invalid description in FETCH_HEAD line 61"

As this was obviously a libgit2 error, it was still possible to pull and push via git bash. So we were not out of business, but it was not nice.

Looking into the error we noticed that our .git/FETCH_HEAD contained a branch name in line 61.

Turn out the branch name was "wip/1637-unify_errand's_services/main" which included a ' character in the branch name. This was the root cause of the error - so we simply deleted that branch and everything started working again.


Ein privates NPM Repository mit Sinopia und nginx erstellen

Motivation

Es gibt verschiedene Gründe ein privates npm-Repository für node-Pakete auf einem eigenen Server zu installieren. npmjs könnte down sein, man möchte nur spezifische Pakete oder Paketversionen bei den Entwicklern zulassen oder man will eigene Pakete publizieren, ohne dass sie der Öffentlichkeit zur Verfügung stehen.

Bei uns war vor allem die zusätzliche Sicherheit ausschlaggebend, dass verfügbare Pakete nicht einfach aus den öffentlichen Quellen verschwinden und uns zu ungünstigen Zeitpunkten zu einem Upgrade oder sogar einem Austausch des Pakets zwingen.

Die Kombination aus sinopia und nginx wurde gewählt, da sinopia sehr einfach zu installieren ist und ein paar sinnvolle Default-Einstellungen gleich mitbringt. Nginx wird vor sinopia gesetzt, um eine erhöhte Sicherheit zu gewährleisten und um zu garantieren, dass kein unautorisierter Zugriff möglich ist.

Voraussetzungen

Wir gehen für diese Anleitung davon aus, dass ein vollständig konfiguriertes Linux vorliegt (in unserem speziellen Fall wird Debian verwendet). Zusätzlich ist auf diesem System bereits node installiert, so dass die Befehle node und npm zur Verfügung stehen.

Wir werden keine vollständige Installationsanleitung von nginx erstellen, daher erwarten wir ein gewisses Grundverständnis der Einstellmöglichkeiten von nginx.

Vorbereitungen

Um eine gewisse Absicherung gegenüber Angriffen zu haben, werden wir das npm repository global installieren, aber unter einem eigenen User namens npm laufen lassen. Dazu installieren wir als root sinopia:

# npm install -g sinopia

und legen den Benutzer npm an. Wir erzeugen ihn als Systemkonto und ohne Loginmöglichkeiten.

# adduser --system --home /srv/npm --shell /bin/sh --disabled-login --gecos "NPM repository server" --group npm

Das Homeverzeichnis haben wir auf /srv/npm gelegt, um dort die eigentlichen Pakete, etc. abzulegen.

Um später eine htpasswd-Datei einfach anlegen zu können, installieren wir noch das htpasswd-Tool von Apache. Bei uns ist es im Debian Paket apache2-utils

# apt-get install apache2-utils

Grundkonfiguration Sinopia

Sinopia erzeugt eine Basiskonfiguration beim ersten Starten. Dazu wechseln wir von root zum Benutzer npm und starten sinopia

# su npm
$ cd ~
$ sinopia
warn --- config file - /srv/npm/sinopia/config.yaml
warn --- http address - http://localhost:4873/

Dies sagt uns, dass eine neue config-Datei angelegt wurde und sinopia unter http://localhost:4873/ auf unsere Anfragen horcht. Wir möchten auf jeden Fall beibehalten, dass sinopia nur von localhost Anfragen annimmt, denn nur so können wir garantieren, dass ein Zugriff nur über unsere nginx-Installation möglich ist.

Wir beenden sinopia, indem wir STRG+C drücken.

Sinopia weiter absichern

Dieser Blogpost wurde anhand sinopia@1.0.0-beta.2 verfasst. Eine vollständige Konfiguration kann auf github nachgelesen werden. Die aktuelle npm Version lautet 1.4.28. Da diese Absicherung wohl nicht dem Standard entspricht, können wir nicht garantieren, dass spätere npm-Versionen weiterhin mit diesem Trick funktionieren.

Unser Ziel ist es, dass diese sinopia-Instanz nicht allgemein zugänglich ist, sondern nur für Benutzer, die authentifiziert sind. Zusätzlich sollen sich keine neuen Benutzer einfach anmelden dürfen.

Dazu ändern wir als ersten Schritt in der config.yaml Datei von sinopia die Einstellung max_users auf "-1" und alle allow_access auf "$authenticated".

Als zweiten Schritt erweitern wir unsere nginx-Konfiguration. Wir legen zwei neue Locations an, zum Einen die eigentliche Weiterleitung, zum Anderen eine Sonderregel, die eine erfolgreiche Registrierung eines Benutzers während npm adduser simuliert.

[crayon-5daa4d6ce5931158460345/]

htpasswd Datei erstellen

Zuletzt muss noch die Datei /srv/npm/sinopia/htpasswd erstellt werden, damit sowohl nginx, also auch sinopia, die Benutzer authentifizieren können. Dazu nutzen wir das Tool htpasswd, um neue Benutzer "test" hinzuzufügen.

htpasswd /srv/npm/sinopia/htpasswd test

Die Passwörter in htpasswd sind zwar gehasht. Trotzdem sollte der Zugriff auf diese Datei so weit wie möglich eingeschränkt werden.

Clients konfigurieren

Um das private npm-Repository zu nutzen, muss auf jedem Rechner dieses bekannt gegeben und der Benutzer eingepflegt werden. Zusätzlich muss npm noch mitgeteilt werden, dass es sich beim Zugriff auf unser Repository immer authentifizieren muss.

npm set always-auth true
npm set registry https://hostname:14873/
npm adduser --registry https://hostname:14873/ --always-auth

Wobei hier der hostname und der Port durch die von ihnen in nginx gewählten Einstellungen ersetzt werden muss. Wir empfehlen außerdem dringend nginx so zu konfigurieren, dass https für die Kommunikation zwischen Client und nginx genutzt wird.

Fazit

Wir haben nun ein privates Repository für unsere npm-Pakete. Es ist sehr sicher, da nginx über den Zugriff wacht und eine https-Verbindung zur Kommunikation ermöglicht. Zusätzlich ist der Gesamtaufbau relativ einfach, da sinopia einfach und ohne Abhängigkeiten zu couchdb, etc. betrieben werden kann.


Parameter und benutzerdefinierte URLs in Magento

Das Routing in Magento folgt dem Verhalten des Zend MVC Frameworks. So sind die Routen meist nach dem Schema "modul/controller/aktion" aufgebaut, vorausgesetzt es gibt keinen benutzerdefinierten Router für das Modul.

Im Folgenden verschiedene Varianten der URL-Erzeugung und Abfrage

Standard-Routing nach dem Schema:

http://www.example.com/modul/controller/aktion/id/1
[crayon-5daa4d6ce5a6e391117153/]
Standard-Routing mit Query-String nach dem Schema:

http://www.example.com/modul/controller/aktion/id/1/?param1=wert1&param2=wert2
[crayon-5daa4d6ce5a71813658409/]
Auslesen des ID Parameters in einer Aktion:

http://www.example.com/modul/controller/aktion/id/1
[crayon-5daa4d6ce5a72069655106/]
Auslesen des ID Parameters und Query strings in einer Aktion:

http://www.example.com/modul/controller/aktion/id/1/?param1=wert1&param2=wert2
[crayon-5daa4d6ce5a73809142724/]
 

 

 


Designing a good gadget...

What is a good gadget? And why is it so hard to answer that simple question. We should be experts on gadgets, right? We are very obsessed with gadgets now-a-days. I am guilty of this trend as well. I hoard all kinds of stuff, all things that you could broadly classify as "gadget".

But last week something happened for me: I moved flats. So it was time to clean up, weigh every item's worth, if it makes the cut or gets throw out. And to tell you the truth; little to none of those must have gadgets made the cut. OUT!

So I got to wonder: What is a good gadget? What is a valuable gadget, and how would I design something that would not get cut quickly and without regret? Because I believe that is something people will be drawn to. A product!

Looking back

I know, I know, looking back is not something fashionable right now, it's all about the next thing, right? But I strongly believe that we will find the answer what a good gadget is, by looking back and seeing which gadgets of its time made the cut and are still around even today. Gadgets hipsters buy and possibly "reinvent".

  • Washing machine: nobody, I repeat NOBODY, is still washing regular clothes by hand. Period. It's just too easy and you can worry about other things until it beeps.
  • Dishwasher: No need to get your hands dirty and wash one dish after another.
  • Dryer: Who still has a good old-fashioned washing line? Putting up a basket of wash is just too time consuming.
  • Refrigerator: No need to buy fresh every single day. Do bulk shopping once a week. Done.
  • Central heating: No need to plan ahead in the summer, chop and stack wood or light and maintain a fire. Just flick a switch and your house gets warm and cozy.

I hope you do agree: those gadgets can be found in any modern household. I for one would refuse to move into a flat without dishwasher. Fact!

Comparing that to today's "must haves"

And I didn't. My new household has all of the above mentioned gadgets. But the move left some behind. Like the TV. Gone. Like my collection of micro helicopters. Given away. Just like the rest of all kinds of electronic or mechanical bells and whistles. Stuff I haven't looked at, used or played with for ages.

Why? Because I am too busy and those gadgets simply had one purpose: Capture my time.

So, what is a good gadget?

After realizing what kind of gadget I threw away, it was just all too clear to me: Good gadgets free time. Bad gadgets steal time. It's just that simple. We today live in a time period where new gadgets actually take time away from you. They often are more of a distraction than a real helper. And here is the worst part: most new gadgets my friends buy will not just waste their time, but my time as well.

So for me, I want to find a product that will help me be more efficient. That helps me have more "spare" time. And I will pay for it, no doubt.

Time is today's most vital asset. Let's invent gadgets and apps that honor that!
What was the last one you found most helpful in that matter?

image source: wikicommons


Choosing a name is HARD!

Wow, who would have known. Choosing a name for a company should be easy right? Not in Germany, it isn't.

Get this, company names in Germany must not be misleading (among about a million other things. Hey, it's Germany after all) by law. And "groupXS" apparently is just that. Misleading.

Why? Well, "group" or in German "Gruppe" is strictly reserved for a cooperation made up of different companies. Who would have known. Therefore the Commercial Register has temporarily put or application on hold.

Let's just put it that way: We were not expecting that! :-) Well, you live and learn. Lesson of today: There are a lot of laws in Germany.