Quantcast
Channel: Continous Integration – Seite 3 – mynethome.de
Viewing all 61 articles
Browse latest View live

Nachtmagazin: Interview mit Chefredaktuer der Titanic

$
0
0

Tim Wolff, der Chefredaktuer der Titanic hat im Interview mit dem Nachmagazin/ARD wirklich grandiose Antworten gegeben:

auf tagesschau.de

Hoffen wir, das sich viele eine gute Scheibe von der Besonnenheit und seiner Haltung abschneiden – und das Nachrichtensprecher wie Sven Lorig sich vielleicht nochmal gedanken über ihre Art und Weise machen, Fragen zu stellen….


Ubuntu 14.10: Switch from 32bit to 64bit

$
0
0

I just had the need to switch a 32bit Ubuntu system to 64bit – without reinstalling the whole thing.
Luckily I found this step-by-step howto that worked pretty well:

Migrate/Upgrade Ubuntu 14.04 LTS (Trusty Tahr) GNU/Linux from 32 bit to 64 bit HowTo

Basically, what you need to do is switching the kernel and (at least) all base libraries to the x64 architecutre. Effectively you would try to migrate all packages for which it is possible and just fall back to 32bit compatibility where it is not.

I needed to boot with a live cd on reboot as the system wouldn’t come up. Howtos like this are very handy in that case ;-)

Afterwards, the system is working nicely on x64 :-)

Fotografie im öffentlichen Raum

GitLab hangs on check for ability to automerge

$
0
0

GitLab is a very nice plattform software that provides you a application to host and manage git repositries similar to GitHub, yet it is free and open source and you can install it for your own usage whereever you want.

Recently, we faced a strange error after the machine gitlab runs on had an outage: the previously perfectly working UI to process merge requests on the web ui hung while checking if the merge can be done without further user interaction.

So, in case your gitlab’s merge view hangs on „Checking for ability to automatically merge“ and the hints from the trouble shooting guide do not help:

Check your gitlab-satellite’s working copy if it is inconsistent – in our case, such state blocked the check in the merge view to be completed and rendered the automerge feature of gitlab unusable. If it isn’t, delete it (maybe you also need to remove the tmp/repo_satellites directory) and recreate it with

sudo -u git -H bundle exec rake gitlab:satellites:create RAILS_ENV=production

After that, gitlab was back to normal in our case :)

AsciiDoctor & Gradle: Documentation brought to life

Engineering culture at Spotify

$
0
0

Es wurde kürzlich angemerkt, das ich zu wenig blogge. Stimmt.

Also hier ein kleiner Artikel mit zwei Videos, die Spotify veröffentlicht hat:

https://labs.spotify.com/2014/03/27/spotify-engineering-culture-part-1/

https://labs.spotify.com/2014/09/20/spotify-engineering-culture-part-2/

Sehr sehenswert. Auch wenn man schnell sagen kann, das einige der vorgestellten Punkte speziell sind für Spotify und eine Firma die sich auf ein Produkt das als Plattform übers Internet bereitgestellt wird konzentriert, werden einige interessante sowie wichtige Aspekte vorgestellt (oder zumindest wiederholt dargestellt), die man mindestens als Anregung in betracht ziehen kann. Zum Beispiel die Fokussierung auf eine Kultur, die so stark ist, das feste Regeln nicht aufgestellt werden müssen.

Kurzgesagt: 20 Minuten, die gut ‚investiert‘ sind ;-)

Browser UI Testing with Geb: Select first element of dropdown

$
0
0

Another short note regarding browser automation / web testing with geb:

If you want to select the first element of a dropdown element (aka <select>) but you don’t know the title nor the label as the element are fetched from the volatile test-env database, this might help:

        new Select($("select#ImportantEntity").firstElement()).selectByIndex(1)

It works by combining the geb selector with the native selenium webdriver API (see book of Geb), in this case the Select class from Selenium.

That might be useful in the context of angular.js 1.4 as there have been breaking changes in how option elements are generated and a simple select.value("1") stops working.

Happy testing :-)

Git Geschichte


PostgreSQL upgrade 9.1 zu 9.3 – einfach & unkompliziert

$
0
0

Upgrading PostgreSQL ist einfach ein Traum, gerde zum x ten mal gemacht, diesmal mit Hilfe dieser kurzen Anleitung von 9.1 auf 9.3.

Praktisch ist es seit Postgres 7.x nie ein Problem oder aufwändiger als eben erwähnt gewesen.

Schön. :)

Digitales Fotoalbum reloaded: Von Gallery zu Piwigo

$
0
0

Das großartige Gallery Projekt, mit dem ich bisher meine Fotos im Netz gezeigt habe, wird wurde leider schlafen gelegt – und mit einem Aufwachen ist wohl eher nicht zu rechnen, wenn nicht gerade jemand darauf aus ist eine sehr große PHP Codebasis zu übernehmen. (Wobei ich sagen muss, das das, was ich über die Jahre den denen ich alle 3 Majorreleases der Gallery in verschiedensten Kontexten benutzt und angepasst habe, an Code innerhalb der Gallery gesehen habe, definitiv zum besseren PHP Code gehört, der mir so untergekommen ist! ;-) )

Wirklich schade, das das Kernteam sich entschlossen hat, nicht mehr weiter zu machen. Vielen Dank für die viele Arbeit und jahrelange Pflege dieser guten Software!

Also war es an der Zeit, nach einer Alternative zu schauen. Kurz nach der Ankündigung im letzten Sommer haben sich das auch andere gedacht und interessante Übersichtsartikel verfasst.

Piwigo geht dort als ein sehr vielversprechender Kandidat hervor, insbesondere da ein Migrationsskript für vorhandene Gallery-Installationen angeboten wird. (Wobei schon schade ist, dass Piwigo wiederrum auf PHP basiert und kein alternativer Softwarestack zum Einsatz kommt… ;-) ) Ein weiterer sehr detaillierter Beitrag über die Installation von Piwigo findet sich bei BenHup.

Was auf der Homepage noch nicht so deutlich zu sehen ist: in der Zwischenzeit ist Piwigo auch auf GitHub migriert und das Project unter https://github.com/Piwigo/Piwigo zu finden.

Nach soviel gutem Input habe ich meine Gallery zu Piwigo migriert, was im Großen und Ganzen wie erwartet von statten ging, einige Erfahrungen:

  • Leerzeichen in Verzeichnis oder Dateinamen sind in der Gallery erlaubt, in Piwigo in der Standardeinstellung nicht. Daher eine Konfigurationsänderung, die man in der Datei local/config/config.inc.php ablegt, nicht in include/config_default.inc.php :
    $conf['sync_chars_regex'] = '/^[a-zA-Z0-9-_.~\s\(\)\[\]]+$/';
    
  • EXIF auto rotate wird nicht übernommen, mit der imageRotate Erweiterung kann man das wieder anwenden – aber wie für alle Bilder? -> Das geht über die sehr ausgereifte Stapelverarbeitung in Piwigo, mit der man zunächst sehr Flexibel per Suche und Filter den Satz der zu bearbeitenden Bilder zusammenstellen kann und dann eine Änderung auf alle Bidler in diesem Satz anwenden kann. Diese Änderung kan auch die auto-rotate (basierend auf den EXIF Informationen des Bildes) der Erweiterung sein.
  • Berechtigungen werden nicht übernommen – ich habe zwar die Benutzerkonten übertragen können, jedoch müsst ihr einmal die „Passwort vergessen“ Funktion benutzen um ein neues Passwort zu erstellen. Wenn ihr bestimmt Alben sehen wollt, die jetzt verborgen sind, lasst es mich wissen ;-)

    Falls es jemanden interessiert, die Benutzerkonten konnte ich in zwei Schritten einfach mit SQL übertragen:

    --Transfer users
    INSERT INTO piwigo.piwigo_users(username, password, mail_address)
    SELECT g_userName, g_hashedPassword, g_email
    FROM gallery.g2_User g2u
    WHERE g2u.g_userName NOT IN ('admin', 'guest', 'test')
    
    --create default settings
    INSERT INTO piwigo_user_infos (user_id, nb_image_page, status, language, expand, show_nb_comments, 	show_nb_hits, 	recent_period, 	theme,registration_date ,	enabled_high, 	level, 	activation_key ,	activation_key_expire ,	lastmodified)
    SELECT u.id, 30,  'normal', 'de_DE',false,false,false,	7, 'simpleng', now(),	true, 0, NULL, NULL,now()
    FROM piwigo_users u
    WHERE id NOT IN (1,2)
    
  • Bewertungen wurden nicht übernommen. Von daher musste ich ein wenig Hand anlegen (zum Glück sind die Benutzerkonten schon übertragen):
    INSERT INTO piwigo.piwigo_rate (user_id, element_id, anonymous_id, rate, date)
    SELECT pusers.id, pimages.id, CONCAT(LEFT(rm.g_remoteIdentifier, INSTR(rm.g_remoteIdentifier,':')),RAND()) ,rm.g_rating, now()
    FROM gallery.g2_RatingMap rm 
    , gallery.g2_User u
    , gallery.g2_Item i
    , gallery.g2_FileSystemEntity fse
    , piwigo.piwigo_users pusers
    , piwigo.piwigo_images pimages
    WHERE rm.g_itemId = i.g_id
    AND fse.g_id = i.g_id
    AND rm.g_userId = u.g_id
    AND pusers.username = u.g_UserName
    AND fse.g_pathComponent = pimages.file
    
  • Setzt man ein Album auf „private“, ohne Berechtigungen zu vergeben, wird es auch dem Admin nicht mehr angezeigt – sehr interessanter Effekt wenn man später durch seine Alben wandern muss um zumindest wieder Minimalberechtigungen zu vergeben…
  • Es scheint im Gegensatz zur Gallery keine Funktion zu geben, mit der man Alben verstecken und per direkt Link auch ohne Passwort aufrufen kann. In diesem Fall werde ich also in Zukunft mit einem einfachen Passwortschutz arbeiten oder man muss sich anmelden, um die/alle Bilder zu sehen.

Als finalen Akt des Umzug konnte ich dann noch die hier im Blog links eingebetteten Bilder direkt mit Hilfe des Piwigo WordPress Plugin durch die Piwigo Galerie speisen lassen.

Fazit
Ich bin sehr froh, auf Piwigo gestossen zu sein – auch wenn ich das ein oder andere Finetuning noch von Hand machen musste, der Umzug der Bilder war völlig unproblematisch und auch die Bewertungen konnte ich verhätnismäßig einfach übernehmen. Nur das die zum Teil sehr feingranular vergebenen Berechtigungen nicht mehr gesetzt sind, ist schade – auf der anderenSeite aber wahrscheinlich verkraftbar, da sie nicht sooo intensiv genutzt worden. Wie gesagt, wenn jemand etwas vermisst, bite melden :)

Und schliesslich habe ich damit endlich eine etwas modernere Fotogalerie, die über ein besonderes Feature verfügt, das mich sehr begeistert: Man kann Elemente frei miteinander Verknüpfen. D.h. das ich ein Bild aus einem Event-Album z.B. auch in den shots platzieren kann ohne es doppelt Hochladen zu müssen. Das macht das Erstellen von Themenalben deutlich einfacher.

Außerdem ist das Layout mit dem neuen Theme zusammen mit demals standard bereitgestellten Theme für mobile Endgeräte deutlich ansprechender, was die Betrachter der Bilder hoffentlich auch freut. :-)

Android Security: Alles Safe?

$
0
0

Da in letzter Zeit doch recht viele Sicherheitslücken bei Android bekannt geworden sind, habe ich mich gefragt, ob es nicht eine Übersicht gibt, welche davon schon geschlossen sind und für welche Geräte die Fixes verfügbar gemacht/ausgerollt worden sind.

Leider war nicht bei meiner Suche bisher nicht erfolgreich. Nachfolgend eine Liste der Lücken zusammen mit ein paar Detailinformationen, die ich jeweils gefunden habe. Wenn jemand eine gut Übersichtsseite kennt: Bitte teilen :)

Stagefright

Remote-Code-Execution via Mediaserver

IBM: „One Class to Rule Them All“

  • heise.de: Android: und noch eine schwere Sicherheitslücke
  • Die Lücke (CVE2015-3825) ist mittlerweile durch Google geschlossen worden; jedoch muss man im Auge behalten, ob der Patch auch durch den hersteller oder Provder auf das eigene Smartphone ausgerollt wird.
  • Schutz: Nur Apps aus „vertrauenswürdigen Quellen“ (Play Store) installieren – und hoffen das die dort verfügbaren Apps ausreichend geprüft sind.

Certifigate

Außerdem habe ich Sony eine Mail geschrieben mit der Bitte bezüglich des Xperia Z3 Compact Stellung zu den Lücken zu beziehen – und bin gespannt, ob eine Antwort kommt … ;-)

Samsung Galaxy S3 Mini oder Motorola Moto E

$
0
0


Nachdem es im letzten Artikel um die Sicherheit von Android ging, ist es auch naheliegend, wenn man darüber nachdenkt, ein evtl. hoffnunglos veraltetes Smartphone durch eines mit aktueller Androidversion zu ersetzen. Und da ich die nachfolgenden Punkte eh‘ schonmal zusammengetragen habe, kann ich sie auch gleich bloggen ;-)

Ab Donnerstag ist das Smasung Galaxy S3 mini bei Aldi Süd für 100 € im Angebot, was ein gutes Preis/Leistungsverhältnis für ein Smartphone ist. Ist es denn auch ein Schnäppchen?
Ich würde sagen, nicht unbedingt, denn auf dem Gerät läuft die schon veraltete Android Version 4.2, die nur noch auf etwa 15 % der Android Geräte läuft.

Meiner Meinung nach ist das Motorola Moto E (digitec.ch, amazon.de) für wenig mehr Geld (ca. 25 €) eine gute Alternative.

kleine Nachteile:

  • kein rückseitiger Blitz
  • kein FM Radio

dafür die Vorteile:

  • Android 5 (Lollipop)
  • 3G & 4G (LTE)
  • 4.5″ statt 4″ Displaygröße
  • höhere Auflösung (960×540 statt 800×480)
  • 4 statt 2 CPU Kerne
  • Schutz vor Kratzern und Spritzwasser
  • Größerer Akku

Die Nachteile sind m.M.n. bei den Vorteilen zu verkraften – die Fotos werden, gerde bei Fotos von Handys dieser Preisklasse mit dem Blitz sowieso nicht zwangsläufig besser. Und FM Radio habe ich bis jetzt nur sehr wenige Leute mit dem Smartphone nutzen sehen – wofür gibts Podcasts? ;-)

Und selbst wenn es doch das S3 mini sein soll: bei http://maclaw.pl/ gibt es die CyanogenMod Portierung für das S3 Mini mit denen man dem Gerät eine aktuelle Android Version und damit zumindest z.T. Sicherheit ggÜ den kürzlich aufgetauchten Sicherheitslücken verschaffen kann.

Viel Spaß beim Handy Upgrade :)

Convert DZSlides presentation to PDF

$
0
0

Given you have created and given a presentation based on DZSlides (maybe powered by AsciiDoctor & Gradle ;-) ), you might have the need to publish it at one point.
One of the most compatible way is to put the slides into a PDF, but that might not be as much obvious as you might expect. Here is one approach:

* Convert the slides to png files using the slides2png script:

groovy ./dzslides/scripts/slides2png file:///Users/markus/Documents/20151001_Presentation/slides/src/slides.html

As the script it uses GEB to utilize the browser and take screnshots from your slides, it requires a fully qualified URL to find your presentation. In this case, it resides on the filesystem, so it starts with file:// – you could also fire up a minimal HTTP server (python -m SimpleHTTPServer , anyone? ;-) ) to shorten the URL.

* The results are safed in /tmp/geb-reports by default, including a presentation.pdf file that is the desired PDF. Voilà :-)

Have fun!

Android Security @ Xperia Z3 Compact : Sonys Antwort

$
0
0

Vor kurzem habe ich über die Sicherheitslücken bei Android geschrieben und meine Anfrage an Sony über die Zukunft des Xperia Z3 Compact erwähnt.

Mittlerweile habe ich Antwort erhalten, die ich euch natürlich nicht vorenthalten möchte.
Nachdem man man mir in der ersten Antwort sehr unscharf versichert wurde, dass an „Software-Updates […] immer mit Hochdruck gearbeitet (wird)“, und es sich leider jedoch „selten vorhersagen“ lässt, wann diese fertiggestellt werden, habe ich nochmal genauer nachgefragt, ob die von mir genannten Sicherheitslücken denn für das Z3 Compact noch geschlossen werden.

Die knappe, aber klare Antwort lautet:

Dies wird der Fall sein.

Immerhin, es wird Fixes geben. Dann sind wir mal gespannt.

heise berichtete zwischenzeitlich, dass von Seite Google und via CyanogenMod Stagefright 2.0 gepatcht ist – und wie der Stagefright Detector auf dem Z3 Compact zeigt, ist zumindest dieser Patch (CVE-2015-3876) auch schon angekommen.

Heise berichtet übrigens weiter, dass laut einer Studie 87 % aller Android Geräte angreifbar sind.

Also immer schön umsichtig bleiben und darauf vertrauen, das die Hersteller mit dem Patchen bald nachkommen ;-)

Browser UI testing with Geb: Debugging Geb tests

$
0
0

Geb provides a very good way for end-to-end tests of browser applications.

One drawback while writing is that it might get rick to get the selectors for the UI elements right. Being able to debug, stop in the middle of a test and adjusting the selectors would come in very handy.

But, as things are not always as smooth as we want them to be, the error message you are confronted with when you just hit the „run debug“ button for the Geb Spec class you are woking on might look like:

Process finished with exit code 1
Class not found: "de.mynethome.GebSampleSpec“ Empty test suite.

This will happen especially when you’re working on a Java based project and have pulled in the dependencies on Groovy only for „test“ to be able to profit from the combined power of Spock/Geb. The reason for that error is, that your IDE did not pick up that compile time dependency and thus you groovy files have not been converted into byte code that can be run and debugged.
(hint: this applies most likely only to maven based projects. From my experience, this error has not popped up with projects that use gradle as their build system)

Solution to this is simple: Tell your IDE to run the necessary steps to compile your test suite.
That is, for example in IntelliJ Idea, done by adding a „before launch“ task to the run configuration as schon in the picture :-)

Happy debugging&testing!


Lazybones Template for Dolphin Platform Jumpstart

$
0
0

As Hendrik stated rightfully in his post about the Dolphin Platform Jumstart maven archetype, Starting with a new technology is often hard.
To make getting started with the Dolphin Platform in combination with Gradle easier for a broader audience, Maxim and me created a lazybones template for the jump start project of the Dolphin Platform during the last Hackergarten in Basel.

It is based on the maven archetype (and adopting the actual example project from there) but is completely build with gradle and provides some other improvements like an integrated build for the polymer client.

You can find it’s source project at https://github.com/canoo/dolphin-platform-lazybones-templates

To actually use the template you need to have lazybones installed. The easiest way to get it is via SDKMAN.
So first, let’s install that:

$ curl -s http://get.sdkman.io | bash 

(Windows users: look for the Powershell version)

Then, we can use it to install gradle and lazybones:

$ sdk install lazybones
$ sdk install gradle

Next register the dolphin-platform-lazybones-templates repository with Lazybones‘ config file. Edit $USER_HOME/.lazybones/config.groovy

bintrayRepositories = [
    "canoo/dolphin-platform-lazybones-templates",
    "pledbrook/lazybones-templates"
]

If everything is fine, issuing the command

$ lazybones list

should list the Dolphin Platform template:

Available templates in canoo/dolphin-platform-lazybones-templates

    dolphin-platform-spring-boot

Now, we can use it to create a new Dolphin Platform project:

$ lazybones create dolphin-platform-spring-boot MyProject

The generated project contains a complete Gradle build, so you can use that to import it into your IDE that supports Gradle (like Eclipse or IntelliJ).

To get an idea on how to proceed from here, have a look at the README of the generated project.

If you have any questions about Dolphin Platform you can now use the “dolphin-platform” tag at stack overflow. If you are new to Dolphin Platform, find more about it on dolphin-platform.io

Happy coding :)

Das darf niemals in Netz! (NeoMag Royale)

SyncThing Android – still no SD card support

$
0
0

TL;DR: GoLang doesn’t support Android Stroage API properly so syncthing cannot access an external SD card properly at the moment.

I’m taking a lot of pictures – not only with my camera but also with my mobile – as it happens to be the camera that always available ;-)
But sorting pictures on the phone is a little bit painful for me, I’d prefer to sort them on a larger screen while the result of that sorting should be effective to the mobile, of course.
I’ve had a solution to that for a short time in the past with BitTorrent Sync – bu then, they changed their licensing and dropped some features and my use case could not be fulfilled anymore.
On top of that, a „feature“ was introduced to Android that makes it harder to deal with files on the SD card.

Then, I stumbled upon SyncThing and hoped to get back to a working setup for my photos-from-mobile workflow.
Unfortunately, SyncThing was also suffering from the sd-card-read-write-permissions problem and thus not an option for me.

Last night, I decided to check again and found that it’s still not usable for me :(
The situation has improved a little bit as in Android land exists an API not to handle files on the SD card as flexible as required. Bad thing is, that those API is currently not available to syncthing as it has not been implemented to the software stack used there (GoLang), see issue #10588 of Go.

I’ll check back on this regularly as long I can’t find a better solution ;-)
Would also love to have sync back to have a very easy way to maintain the set of music I’ve on my phone (and add/remove stuff from there).

see also: syncthing-android issue #29: repos on extSdCard

OpenJDK on RaspberryPi / Raspian: Fallback to Oracle JDK

$
0
0

Lately I wanted to use Java on the RaspberryPi a little more intensive. With that involved, there is of course a Gradle build. But it went not as easy a I expected.

I attempted to use the openjdk-8 package, the system in question was based on a Hypriot OS 0.7.0 Berry (beta), which is based upon Rasbian Jessie.

While running the build, I ran into some SSL related issues on downloading the dependencies:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: 
   sun.security.validator.ValidatorException: PKIX path validation failed: 
   java.security.cert.CertPathValidatorException: signature check failed

First of all, I tried to fix it with the commands

sudo update-ca-certificates -f

sudo apt-get install --reinstall ca-certificates-java

but those didn’t seem to have any effect.

From past experience I knew that it’s – unfortunately – often worth to give the official Oracle builds a try in case the OpenJDK does not behave as expected. Even though I have the feeling that shouldn’t be the case anymore as the usage of OpenJDK has been spread a lot. For example, Amazon, being a very big name and serving a large installation base within AWS and it’s other services is using OpenJDK.

Trying to find the most convenient way to get the Oracle JDK installed (using their packages and having to run update-alternatives and such by hand is the least desired option in that case), I learned that the Oracle JDK packages are provided within the RaspberryPi Foundation repositories located at http://archive.raspberrypi.org/debian/

So I added a file foundation.list to /etc/apt/sources.list.d with the content

 deb http://archive.raspberrypi.org/debian/ jessie main

and run apt-get update after which apt-cache search oracle listed

...
oracle-java8-jdk - Java™ Platform, Standard Edition 8 Development Kit

Which I decided to install instead of OpenJDK. And voila – it works. Seems like OpenJDK, or at least the package provided within Raspian has still some things to catch up with :(
I’m looking for the proper place to report or track this – does anyone have a hint for that? :)

Oh, and as a side note: Always take case of the CPU architecture you are working with – it’s so easy to fall into that ARM / X86 trap ;-) But that’s a topic for another blog post…

Facebook verwertet WhatsApp Daten: Zeit umzusatteln!

$
0
0

Einen weiteren Punkt, warum man wirklich versuchen sollte auf Whatapp zu verzichten und seine Whatapp Kontakte von alternativen Diensten, die die Privatsphäre respektieren wie Threema, Wire oder Signal liefert die News, dass WhatsApp zwei Jahre nach der Übernahme durch Facebook stärker mit der Plattform verzahnt werden soll, denn:

  • „…soll Facebook die Telefon-Nummer des WhatsApp-Nutzers bekommen sowie Informationen dazu, wann er bei dem Dienst aktiv war.“
  • „Mit dem Abgleich der Telefonnummer solle unter anderem relevantere Werbung bei Facebook angezeigt werden…“
  • „… können Facebook verbieten, die Profilinformationen zur Personalisierung der Werbung und Freunde-Vorschläge einzusetzen, heißt es. Die Telefonnummer und Daten zur Nutzung würden aber in jedem Fall mit Facebook geteilt„.

Braucht es wirklich noch mehr Argumente?
Na gut, eins hab ich noch: Wenn Werbenetzwerke und Verkaufsplattformen genügend Daten über euch gesammelt haben, führt das in der mordernen Welt dazu, dass Ihr beim Onlineshoppen mehr bezahlt. Das Zauberwort heisst „elastic pricing“.
Dazu ein Artikel bei BR:Dynamic Pricing: Warum Online jeder einen anderen Preis zahlt

Schützt eure Privatsphäre! ;-)

Viewing all 61 articles
Browse latest View live




Latest Images