091915_2158_TinkeringTu6.jpg

Tinkering Tuesday – Dart Anlage – Oche

Nach dem Wandschutz, den ich am letzten Tinkering Tuesday beschrieben hab, soll heute mein Oche beschreiben werden. Wie schon im letzten Beitrag geschrieben, soll mein Oche also massiv sein, den Boden selbst nicht beschädigen und auch leicht wegzuräumen sein. Meine Wahl fiel auf 16mm starke Spanplatten, 2 an der Zahl, die ich komplett mit Teppich überziehen will. Andere Bauanleitungen sehen ein Scharnier vor. Ich habe auch eines gekauft, allerdings hat es dann doch einen sehr instabilen Eindruck gemacht aufgrund der doch sehr massiven Holzplatten. Außerdem hatte ich keine richtig gute Idee für die Befestigung, sodass trotzdem kein Holz sichtbar ist. Deswegen sind es zwei getrennte Platten geworden. Das ist ganz praktisch, da eine davon mittlerweile auch als Bodenschutz für meinen Schreibtischstuhl dient, wenn die Dart-Anlage nicht in Benutzung ist.

Aber nun zur Bauanleitung. Beim Kauf der Platten sollte man vorher genau ausmessen, wie weit der Abstand zur Wand sein muss (Fußleisten beachten!). Das wiederum 3mal nachgemessen und 4mal überdacht dann nur noch durch 2 teilen und jeweils noch ein paar Millimeter abziehen, je nach Dicke des Teppichs, den man drüber ziehen möchte. Der geht ja auch über die Kanten!

Den Teppich hab ich mir wie schon den Stoff für den Wandschutz aus dem Poco besorgt. Schwarzer Teppich, es gab glücklicherweise gerade ein Reststück, das genau meinen Maßen entsprach und ich sogar noch etwas übrig habe.

Also flugs die Platten auf der zukünftigen Oberseite mit doppelseitigem Klebeband (Teppichklebeband) versehen, auf den Teppich geklebt und wieder einmal mit meinem treuen Helferlein, dem Elektro-Tacker, den Teppich aufgezogen.

An den Kanten hab ich ein bisschen rumgeschnippelt, damit es besser passt:

Unten noch ein bisschen Stückwerk, damit der Boden komplett geschützt ist und sich nichts durchbiegt:

Das Ganze noch ein zweites Mal gemacht und so sieht dann der fertige Oche aus:

Der erste Wurf gehörte diesmal mir und macht definitiv Lust auf mehr!


Und das Ganze lässt sich super verstauen. Außerdem nochmal in der fertigen Ansicht mit Gitarren an der Wand und Schrank davor:

2015-04-29 15.48.41 2015-04-29 15.57.46

2015-10-05 11.58.31

Programming Pursday – Routineer

Die App, die ich schreiben will hat seinen Ursprung in meinen Studien- besser gesagt in meiner WG-Zeit. Damals hatten wir einen Putzplan, den ich in Joomla (Ein CMS, Content Management System: www.joomla.org) implementiert habe. Es gab eine Übersicht aller Aufgaben, die zu erledigen waren inkl. deren Erledigungsintervall. Sobald eine Aufgabe zu erledigen war, wurde sie gelb markiert. War sie überfällig, wurde sie rot. Jede Aufgabe hatte, je nach Zeitaufwand Punkte, die man bekam, wenn man sie erledigte. Pro Tag mussten durchschnittlich 2 Punkte, also etwa 60 Punkte pro Monat erreicht werden. Pluspunkte, konnten in den nächsten Monat übernommen werden, Minuspunkte wurden in Euro in die WG-Kasse gezahlt.

Jetzt wo ich nicht mehr in einer WG sondern mit meiner Frau zusammen wohne, hat natürlich der WG-Kassenaspekt keinen Charme mehr, allerdings wäre die Übersicht sehr hilfreich, welche Aufgabe denn als nächstes ansteht. Außerdem kann man so auch Aufgaben hinterlegen, die man nur ab und zu mal machen muss (Ölstand und Reifendruck beim Auto kontrollieren) oder einfach zu wissen, wann habe ich mein Auto denn das letzte Mal gewaschen. Einige der Dinge sollten selbstverständlich sein, aber mal ehrlich, irgendwas fällt doch immer hinten rüber und das macht man dann doch erst beim nächsten Frühjahrsputz. Oder meine Frau putzt das Bad am Dienstag, ohne dass ich es weiß und weil ich etwas tun will am Mittwoch, mache ich das unwissentlich nochmal (Hm. Okay, das wird nie passieren 😉 )

Ich möchte mir nicht groß Gedanken machen müssen, sondern wie bei allem in unserer heutigen Welt, einfach auf mein Smartphone schauen und das sagt mir, was ich zu erledigen habe. Anders als bei all den anderen ToDo-Listen Apps soll es hier nicht um einmalige Aufgaben, sondern in erster Linie um wiederkehrende Aufgaben gehen. Die Vision ist groß und die Featureliste lang, allerdings werde ich erstmal eine Basis-Version entwickeln, die dem Putzplan von damals ähnlich ist. Dazu habe ich mir die folgenden Features überlegt:

Features Basis-Version

  • Lokale Datenhaltung
  • Ein lokaler Benutzer
  • Aufgabenerstellung
    • Name
    • Intervall
    • Dauer (anstatt Punkte)
  • Aufgabenanzeige
    • Name
    • Letzte Ausführung
    • Fälligkeit
    • Dauer
    • Sortierung: Fälligkeit
  • Aufgabenerledigung
    • Nur sofort

Erweiterte Features

  • Cloud Synchronisation: Wie man in den vorherigen Folgen des Programming Pursdays schon gesehen hat, möchte ich eine Backend-Anbindung, damit man von mehreren Geräten auf seine Aufgaben zugreifen kann (bei mir wären das z.B. das Handy und das Tablet zu Hause)
  • Benutzerregistrierung: Ebenfalls mit dem Cloud-Sync einher geht die Benutzerregistrierung
  • Listen: Standard ist die private Liste, dazu soll es Listen geben, die auch über mehrere Benutzer hinweg geteilt werden können (z.B. WG-Putzplan)
  • Kategorien: Die Aufgaben sollen in mehrere Kategorien aufgeteilt werden (Haushalt, Auto, etc.)
  • Aufgabenerledigung zu einem beliebigen Zeitpunkt (nachträglich)
  • Standardaufgaben: Ich möchte gerne Aufgaben als Standard anbieten, sodass zum einen die Einrichtung leichter fällt (Einrichtungsassistent, z.B. Auswahl „Familienhaushalt“, „WG-Haushalt“, „Auto vorhanden“, etc.), zum anderen aber auch Benchmarks (da schlägt meine Business Intelligence Ausbildung wieder zu) möglich sind („wie oft werden die Aufgaben im Durchschnitt erledigt?“, „bin ich fauler als der Durchschnittsbenutzer?“).
  • Aufgabenbeschreibung: Eigene Notizen und Standardbeschreibungen (z.B. Putz-Empfehlungen, Anleitungen, etc.)

Es gibt noch einige weitere Ideen, aber die behalte ich erstmal für mich, da ich schon nicht sicher bin, ob ich das oben beschriebene überhaupt jemals umgesetzt bekomme 😉 Aber wenn, dann werde ich stinkereich!

Hier noch ein paar Impressionen, wie es dann in der Endversion einmal aussehen könnte (mit der netten App „Wire Flow“ erstellt):

 

 

091915_2141_TinkeringTu11.jpg

Tinkering Tuesday – Dart Anlage – Wandschutz

Ich bin leidenschaftlicher Dart-Spieler, daher musste nach dem Umzug in eine größere Wohnung auf jeden Fall Platz für eine Dart-Anlage her. Geplant ist nicht nur eine vernünftige Scheibe mit Schutz für die Wand, sondern auch ein Schutz für den Boden (wir haben Echtholzparkett, da machen sich Dartspitzen nicht so gut drin). Letzteres kann man dann wunderbar auch mit der Abstandsmarkierung verbinden. Das nennt sich dann Dart Oche. Bei Bedarf soll dieser über 2-Meter lange Bodenbelag aber auch weggepackt werden können. Nachfolgend meine Bauschritte für die Wandplatte, den Oche gibt es dann im nächsten Post:

Wandschutz

Meine Wahl fiel auf eine 1mx1m große Spanplatte mit 10mm Dicke. Darauf wird zum Abfangen der Spitzen noch Styropor mit 3cm Dicke geklebt. Für die Befestigung der Scheibe habe ich in der Mitte noch eine Holzlatte befestigt, für die die Aussparung im Styropor ist.

Zur Befestigung habe ich doppelseitiges Klebeband, sowie (weil ich es noch offen rumstehen hatte und es sonst ausgetrocknet wäre) Acrylat.

Das sieht natürlich nicht sonderlich schön aus. Daher hab ich mir noch schönen roten Stoff aus dem Poco besorgt. Der wird ganz einfach über die ganze Platte gezogen. Auf dem Boden ausgebreitet, die Platte mit der Vorderseite drauf und dann einfach umschlagen und festtackern. Wie man auf dem Bild sieht, hab ich an einer Seite das Styropor überstehen lassen. Das wird die Oberseite und hat einen ganz einfachen Grund: die Wandbefestigungshaken sollen nicht zu sehen sein!


Hier dann die 3 Befestigungsösen (heißen im bauhaus irgendwas mit Küchenschrankbeschlag oder so…). Wichtig ist natürlich, dass die Ösen alle in einer Linie ausgerichtet sind. Beim Ausmessen der Wandhaken muss natürlich berücksichtigt werden, wo diese in den Ösen aufliegen. Das ist ein bisschen Frickelarbeit das vernünftig auszumessen.

Um noch ein wenig mehr Dämpfung gegenüber der Wand zu haben, hab ich über die Befestigungsösen und auch in der Mitte der Platte nochmals Styropor verklebt (übriggebliebenes Verpackungsmaterial, hat nur ein paar Millimeter Stärke).

Dann nur noch die Befestigung für die Dartscheibe in der Mitte der Platte an der Vorderseite befestigt (man sollte sich bemühen die zuvor angebrachte Holzlatte zu treffen, da man sonst ins Styropor bohrt und wenig Halt hat 😉 ). Und dann nur noch die Scheibe anbringen. Naja, und das Ganze an die Haken in der Wand hängen. Da hab ich glaube ich 4mal nachgemessen, 5mal angehalten, 6mal nachkorrigiert, weil falsch gemessen. Aber tatsächlich nur einmal gebohrt 😉


Und siehe da, sie hängt gerade, bis auf einige Millimeter in der richtigen Höhe und sieht einfach spitze aus! Die ersten drei Pfeile durfte dann auch prompt meine Frau werfen (sie ist da eigentlich nicht so ambitioniert und ist froh, wenn sie die Scheibe trifft) und einer der drei ging mitten ins Bull’s Eye! Das verspricht gut zu werden!

092415_1626_Programming6.png

Programming Pursday – ParseUI Login und Registrierung

Also, letztes Mal habe ich mit dem Ausführen der App und dem folgenden Fehler geschlossen:

"com.android.dex.DexException: Multiple dex files define Lcom/parse/AbstractQueryController$1;"

Da soll es dann heute weitergehen. Eine Google-recherche deutet daraufhin, dass die angesprochene Klasse wohl in 2 verschiedenen Libraries definiert ist. Da ich ja mit der normalen Parse-Library angefangen hab und dann die ParseUI zusätzlich eingebunden habe (und dabei einiges probiert habe um es build-fähig zu machen), ist das wohl mein erster Ansatz: Build Paths kontrollieren. Das war zu Eclipse-Zeiten kein Problem, aber da ich Android Studio noch nicht so lange kenne, ist das auch erstmal wieder ein Trial & Error.

In den Modul-Settings (Rechtsklick auf den Projektnamen und dann „Open Module Settings“ oder einfach F4) in den Dependencies findet man alles was das Herz begehrt. Da ist einiges doppelt vorhanden, wenn ich das richtig sehe. Also wird eines nach dem anderen entfernt und immer wieder der Build und die Ausführung angestoßen um den Erfolg zu kontrollieren.

Entfernt hab ich {include=Parse-*.jar, dir=libs}, da mir das mit dem Eintrag {include=*.jar, dir=libs} redundant vorkommt. Build ist weiterhin erfolgreich, Ausführung nicht. War zu erwarten. Als nächstes musste der Eintrag com.parse.bolts:bolts-android:1.+ dran glauben, da es im Modul ParseLoginUI den Eintrag com.parse.bolts:bolts-android:1.2.1 bereits gibt. Build erfolgreich, Ausfürhung immer noch nicht.

Doppelt vorhanden sind auch die ParseFacebookUtils. Also auch den manuellen Eintrag aus dem app-Modul gelöscht. Hat wohl erstmal nichts mit dem Fehler zu tun, aber aufräumen ist immer gut.

Als nächstes habe ich die Parse-Library aus meinem lib-Pfad gelöscht. Die ist ja auch schon im ParseLoginUI-Modul vorhanden. Und siehe da: Kein Fehler mehr bei der Ausführung! Leider führte die Ausführung zu folgendem Scrren in meinem Emulator:

Schade. Der Android Monitor gab folgenden Fehler aus:

Unable to start activity ComponentInfo{eu.boriswerner.routineer/eu.boriswerner.routineer.LoginActivity}: java.lang.NullPointerException
(…)
at com.parse.ParseUser.getCurrentUser(ParseUser.java:879)
at eu.boriswerner.routineer.LoginActivity.onStart(LoginActivity.java:61)

Die Methode erstmal auskommentiert und siehe da, ein Login-Screen (man erkennt ganz leicht den Login-Button schimmern).

Da drauf gedrückt kommt auch der eigentliche Screen mit den Credentials und dem Button für den Facebook-Login:

Da drauf gedrückt wird leider wiederum ein Fehler geworfen (java.lang.NoClassDefFoundError: com.parse.ParseFacebookUtils) und die Anwendung beendet. Naja, aber ein Anfang!

Auch Sign Up führt zu einer Registrierungsseite, leider bricht auch diese mit einem Fehler ab (java.lang.IllegalArgumentException: You must register this ParseObject subclass before instantiating it.)

Okay. Aber das ist schonmal ein neuer Anhaltspunkt. Erstmal wird die normale Registrierung gefixt. Facebook kommt später. Das Problem war schnell identifiziert. Ich hatte Parse zwar in meine erste Activity in die onCreate-Methode eingebunden, aber nicht in meine Login-Activity. Folgender Code brachte dann das gewünschte Ergebnis:

Parse.enableLocalDatastore(this);
//Register Parse Classes
ParseObject.registerSubclass(Task.class);
// Initialize Parse API
Parse.initialize(this, "<Your_Key_Here>", "<Your_Key_Here>");
ParseUser.enableAutomaticUser();
ParseACL defaultACL = new ParseACL();
ParseACL.setDefaultACL(defaultACL, true);
			

Registrierung klappt, was auch ein Blick in das Backend bestätigt:

Die oben auskommentierte Methode getCurrentUser sollte dann auch wieder rein, sonst merkt er ja nix vom Login. Na also, wir können uns also registrieren, erfolgreich einloggen und auch wieder ausloggen:

  
 

Die technischen Grundlagen sind also gelegt. Beim nächsten Mal werde ich mich dann wohl eher einmal dem Konzept widmen und näher beschreiben, was die App überhaupt machen soll.