AZ's Blog » Software https://azapps.de Einmal mit Profis arbeiten… Sat, 28 Jun 2014 13:46:52 +0000 de-DE hourly 1 http://wordpress.org/?v=4.2.4 Mirakel https://azapps.de/blog/2013/10/17/mirakel/ https://azapps.de/blog/2013/10/17/mirakel/#comments Thu, 17 Oct 2013 11:23:37 +0000 https://azapps.de/?p=17853 Mirakel ist nun in Version 2.0 raus – also wird es mal Zeit etwas darüber im Blog zu schreiben 😉

Mirakel ist unsere freie (+ Open Source) App, die für das Verwalten von TODO-Listen zuständig ist. Die großen Vorteile gegenüber „handelsüblichen“ Apps sind, dass man die Listen und Aufgaben mit dem eigenen Server synchronisieren kann und es gibt ein paar unübliche nette Features.

Die App ist vor allem für Poweruser gedacht, was sich darin wiederspiegelt, dass es sehr viele Einstellmöglichkeiten gibt. Man kann quasi alles so konfigurieren, wie man es haben will.

Funktionen

Mirakel hat ein paar tolle Features, die man in anderen Apps nicht findet:

Erweiterte Listen

Statt irgendwelchen statischen Listen wie „Alle“, „Heute“, „Diese Woche“, … (Wunderlist). Gibt es bei Mirakel die Möglichkeit selber spezielle Listen anzulegen. Diese werden in der Übersicht ganz normal angezeigt, aber man kann selber die Bedingungen festlegen, was angezeigt werden soll. Ich persönlich nutze hier nur die Standardlisten:

  • Heute (alle spätestens heute fälligen Aufgaben. Wenn eine neue Aufgabe erstellt wird, bekommt sie den Termin „morgen“)
  • Diese Woche (ähnlich Heute)
  • Alle Aufgaben

Semantische neue Aufgaben

Ja, der Name ist komisch, aber ich finde, dass ist eine der besten Funktionen 😉 Hiermit ist es möglich bestimmte Eigenschaften einer Aufgabe gleich bei der Erstellung mitzugeben. Z.B. erstelle ich häufig folgende Aufgaben „Heute Mirakel Fehler beheben“. Mirakel erstellt dann eine neue Aufgabe „Fehler beheben“, setzt den Termin auf das aktuelle Datum und schiebt die Aufgabe in die Liste „NA: Mirakel“. Natürlich lassen sich die Bedingungen frei Konfigurieren. Hier mal meine Bedingungen:

  • Heute (Terimn: Heute)
  • Morgen (Termin: +1 Tag)
  • Tomorrow (nochmal auf Englisch)
  • Today
  • Woche (Termin: +7 Tage)
  • Wichtig (Priorität: +2)
  • Mirakel (Schiebe in Liste „NA: Mirakel“)
  • Computer (Schiebe in Liste „NA: Computer“)
  • In (Schiebe in Liste „Inbox“)
  • Uni (Schiebe in Liste „NA: Uni“)

Dateien anfügen

Das ist eine sehr praktische Funktion. Ich hänge sehr gerne irgendwelche Fotos oder Screenshots (von Mirakel) an meine Aufgaben dran. Beispielsweise sind das Fotos von irgendwelchen Sachen, die ich nicht aufschreiben will oder Screenshots von Fehlern in Mirakel 😛

Das schöne ist auch, dass man direkt aus der App die Kamera aufrufen kann.

Unteraufgaben

Das war die einzige Funktion, bei der wir uns mit Georg nicht einig waren, wie sie zu implementieren ist 😉 Meiner Meinung nach fügt man Unteraufgaben hinzu indem man auf (+) drückt und eine neue Aufgabe erstellt. Georg wollte vorhandene Aufgaben als Unteraufgaben hinzufügen. Nach einer kurzen Diskussion haben wir uns darauf geeinigt, dass wir beide Möglichkeiten Anbieten und der Nutzer einstellen kann, was er als Standard haben will.

Sync

Der war ein Kampf. Erst haben wir es so implementiert, dass man mit der Mirakel-Weboberfläche synchronisieren kann. Das hat bei mir aber nie wirklich gut funktioniert. Dann kam irgendjemand mit der Idee, dass man ja mit Taskwarrior (was ich bis dahin nicht kannte) Synchronisieren könnte. Die Idee haben wir dann auch umgesetzt, aber da der Taskwarrior-Sync leider nicht über HTTP geht, mussten wir ziemlich lange ziemlich viel basteln um es zum laufen zu bekommen. Hoffentlich funktioniert es jetzt richtig 😉

Dann haben wir ja noch den CalDAV-Sync umgesetzt. CalDAV ist ein grauenhafter Standard… Mal schauen, wann sich die ersten mit Problemen melden 😉 – Ich hoffe es funktioniert einfach.

Download

Ach ja, das gibts auch noch 😉

Mirakel gibt es (natürlich) im Play Store und bei F-Droid. Den Quellcode haben wir bei Github gehosted. Natürlich haben wir noch eine feine Seite für Mirakel.

]]>
https://azapps.de/blog/2013/10/17/mirakel/feed/ 32
Gitshots – Post-commit Fotos mit Git https://azapps.de/blog/2013/05/16/gitshots-post-commit-fotos-mit-git/ https://azapps.de/blog/2013/05/16/gitshots-post-commit-fotos-mit-git/#comments Thu, 16 May 2013 16:01:28 +0000 https://azapps.de/?p=4035 Vor einiger Zeit hab ich eine lustige Sache auf Coderwall gefunden: imagesnap git post-commit photo rewrite. Also Webcam–Snapshots nach jedem Commit anfertigen. Klingt lustig, ist es auch, der Sinn ist fraglich, aber egal.

Nach etwas rumprobiere hab ich eine für mich (aktuell) optimale Lösung gefunden:

~/.git/hooks/post-commit:

#!/bin/bash
~/.scripts/gitshot

~/.scripts/gitshot:

#!/bin/bash
streamer -s 1280x720 -o ~/.gitshots/`date +%Y-%m-%d_%H:%M:%S`.jpeg -q &!

Dieses Script sorgt dafür, dass nach jedem Commit ein Foto mit der Webcam gemacht wird und nach ~/.gitshots/ gespeichert wird. Da dies etwas dauert (Wahrscheinlich wegen dem initialisieren der Kamera), wird es im Hintergrund erledigt. (Dafür muss das Paket xawtv (unter Archlinux) installiert sein.)

Damit dieser Hook automatisch in neuen Repos aktiviert wird, musst du das Verzeichnis ~/.git als Template definieren:

git config --global init.templatedir ~/.git/

Um den Hook für bestehende repos zu aktivieren, einfach die Datei rüberkopieren:

cp ~/.git/hooks/post-commit .git/hooks/

(Im Git-Verzeichnis Ausführen)

Viel Spaß!

]]>
https://azapps.de/blog/2013/05/16/gitshots-post-commit-fotos-mit-git/feed/ 0
PDF Export mit Rails und LaTeX https://azapps.de/blog/2012/11/14/pdf-export-mit-rails-und-latex/ https://azapps.de/blog/2012/11/14/pdf-export-mit-rails-und-latex/#comments Wed, 14 Nov 2012 19:19:33 +0000 https://azapps.de/?p=159 Für ein Praktikum an der Uni sollte ich mir überlegen, wie man am besten mit Rails einen PDF-Export realisiert. Ich habe mich im Endeffekt für die Kombination von LaTeX und dem Gem rails-latex entschieden. Wieso und wie die Implementierung aussieht liest du weiter unten.

Grundlegendes

Es gibt eigentlich drei Arten wie man mit Rails relativ einfach PDF’s generiert. Alle haben ihre Vor- und Nachteile, deshalb musst du selbst entscheiden, ob meine Lösung auch in deinem Fall die beste ist.

HTML zu PDF–Konverter

Die gibt es, die gibt es auch für Rails. Die Vorteile liegen auf der Hand:

  • Du kannst HTML, also ist es einfach zu schreiben
  • Du musst dich nirgendwo einarbeiten

Doch die Nachteile überwiegen:

  • Diese Konverter sind meistens ziemlich langsam
  • Man kann wenige PDF-Spezielle Sachen machen (z.B. Kopf– und Fußzeilen)

Prawn oder ein anderer In–Ruby–PDF–Generator

Du schreibst Rails–Code direkt in deiner Anwendung und lässt dir von dem Gem einfach das PDF generieren.

Vorteile:

  • Man muss keine externen Programme aufrufen
  • Man kann den Code in Ruby schreiben und muss nichts neues lernen

Nachteile:

  • Der PDF-Generierungscode ist meistens ziemlich schlecht überschaubar
  • Anpassungen sind relativ schwer vorzunehmen
  • Nicht wiederverwendbar für andere Dokumente

LaTeX

Du generierst mit Rail LaTeX-Code, jagst diesen durch den LaTeX–Parser und bietest die PDF zum Download an.

Vorteile:

  • Portabler Code
  • LaTeX kann auch jemand schreiben, der vom Programmieren sonst keine Ahnung hat
  • Viele Anpassungsmöglichkeiten (Du kannst auch gleich eine Präsentation schreiben)

Nachteile:

  • LaTeX muss installiert sein und LaTeX ist groß…

Umsetzung

Am entspannten ist es wohl, wenn man den Gem rails-latex benutzt. Füge es in das Gemfile hinzu:

gem rails-latex

Danach natürlich mit bundle install installieren.

Damit Rails weiß, wie es PDF-Anfragen handhabhaben soll, musst du noch in der config/initializers/mime_types.rb den Mimetype setzen:

Mime::Type.register "application/pdf", :pdf, ['text/pdf'], ['pdf']

Der Rest ist ziemlich simpel gestalten:

Wenn du einen Link auf eine PDF-Datei setzen willst, tust du dies folgendermaßen:

<%= link_to "print", story_path(@story,:format => :pdf) %>

Weiterhin solltest du dir passende Views anfertigen:

  • app/views/layouts/application.pdf.erbtex
  • app/views/[view]/[seite].pdf.erb

Dort kannst du ganz normalen LaTeX–Code mit Embedded Ruby schreiben.

Wenn du willst, dass pdflatex 2 mal läuft kannst du das in der application.pdf.erbtex einstellen:

<% @latex_config={:parse_twice => true} %>

 Fehlerbehebung

Der PDF-Viewer zeigt nichts an, oder sagt, das PDF ist ungültig? Schau doch mal nach, was der Server antwortet.

Bei mir kam lange Zeit ein 406 Not Acceptable Fehler. Der Grund daran liegt an den respond_to – Blöcken in den Controllern. Warum genau weiß ich nicht, schau doch einfach in die Dokumentation und sag mir Bescheid 😉

Das zu beheben war ganz einfach: Lösche die Blöcke, die sind überflüssig.

Lesenswertes

]]>
https://azapps.de/blog/2012/11/14/pdf-export-mit-rails-und-latex/feed/ 0
Spaß mit Chrome https://azapps.de/blog/2012/10/19/spas-mit-chrome/ https://azapps.de/blog/2012/10/19/spas-mit-chrome/#comments Fri, 19 Oct 2012 14:01:44 +0000 https://azapps.de/?p=145 Chrome macht einige Sachen anders als die „Anderen“. Wenn man im Firefox entwickelt und sich dann die Sachen im Chrome anschaut kann es passieren, dass da gar nichts funktioniert.

Es liegt wohl eher daran, dass Chrome die Sachen „richtiger“ macht als die anderen, aber wenn man nicht daran denkt, kann man ziemlich lange den Fehler suchen. Hier die Sachen, die mir aufgefallen sind:

(Es geht übrigens um JavaScript und PHP 😉 )

Objekte

Angenommen, du willst eine Sortierte Key–Value– Liste an den Browser per JSON schicken und JavaScript soll die dann anzeigen.

PHP-Code (kann auch ne andere Sprache sein:

<?php
echo json_encode(array(
  'foo'=>'bar',
  'bla'=>'blubb'
));
?>

Dann dürfte beim Browser ungefähr folgendes ankommen:

{'foo':'bar','bla':'blubb'}

Soweit so klar. Bei einem Firefox, IE, etc… kann man mit JavaScript auf dieses Objekt in der „richtigen“ Reihenfolge zugreifen. Chrome sortiert das Objekt aber so, wie es will. Das ist laut JS-Spezifikation auch vollkommen ok, nur sollte man einfach darauf achten.

So macht man es richtig: (und besser)

<?php
echo json_encode(array(
  array('foo'=>'bar'),
  array('bla'=>'blubb')
));
?>

Das erzeugt folgenden JSON-Code:

[
  {'foo':'bar'},
  {'bla':'blubb'}
]

Man muss dazu natürlich auch den JavaScript-Code umschreiben, das ist dann aber Standartkomform und funktioniert in allen Browsern.

[edit]

Die Alternativvariante wäre noch Folgende:

<?php
echo json_encode(array(
  array('key'=>'foo','val'=>'bar'),
  array('key'=>'bla','val'=>'blubb')
));
?>

[/edit]

Variablendeklarationen

Es sei folgender JS-Code gegeben:

function foo(blubb) {
  if(typeof(blubb)!='Object'){
    return
  }
  var blaaa=blubb.foo;
}

Beim FF & Co macht dieser Code keine Probleme. Wenn die Funktion im Chrome aber mit einem Nicht-Objekt aufgerufen wird, schmeißt dieser einen Fehler. Warum?

Dies liegt daran, dass Chrome alle Variablendeklarationen, die mit var … anfangen stets an den Anfang der Funktion schieben. Man kann nun entweder die Variablen am Anfang der Funktion ohne Wert deklarieren oder man lagert die Variablen in einen else-Zweig aus.

Dateiupload

Das Chrome Uploads anders behandelt, als man es gewöhnt ist, habe ich bereits hier beschrieben.

]]>
https://azapps.de/blog/2012/10/19/spas-mit-chrome/feed/ 0
MSDNAA (Dreamspark) unter Linux https://azapps.de/blog/2012/09/13/msdnaa-dreamspark-unter-linux/ https://azapps.de/blog/2012/09/13/msdnaa-dreamspark-unter-linux/#comments Thu, 13 Sep 2012 11:52:57 +0000 https://azapps.de/?p=93 Du möchtest dir bestimmt eine legale Version von Windows holen. Du nutzt aktuell Linux. Was machst du? Du gehst brav auf die Dreamsparkseite, bestellst dir dein OS, und klickst auf Download. Hups eine .pkg – WTF? Da hast du wohl die Secure Download Manager Datei für MacOS geladen. Herzlichen Glückwunsch. OK, dann nimmst du deinen User-Agent-Switcher und schaltest auf IE um. „Download!“ – schön eine MSI-Datei.

Hier ein kurzes Tutorial, wie du den Secure Download Manager mit Wine zum laufen kriegst.

Vergiss es! Nein Google nicht, du wirst nichts finden. Gibs auf! Der ist so „secure“ das geht nicht. Danke Microsoft, ich will eure Software nutzen, kann sie aber nicht mal runterladen…

Scheinbar hat MS Angst vor Linux-Usern. Aber es gibt dennoch eine Lösung: Nimm dir ne VM installiere ein Windows rein und dann klappt alles prima. Du hast keine Windows-Lizenz? Pech gehabt. Musst wohl ein illegales Windows nehmen um ein legales Windows zu installieren. Macht doch Sinn – oder?

]]>
https://azapps.de/blog/2012/09/13/msdnaa-dreamspark-unter-linux/feed/ 10
Raspberry Pi als Mediacenter https://azapps.de/blog/2012/09/10/raspberry-pi-als-mediacenter/ https://azapps.de/blog/2012/09/10/raspberry-pi-als-mediacenter/#comments Mon, 10 Sep 2012 10:19:00 +0000 https://azapps.de/?p=70 Ich wollte ein Raspi als MediaCenter für unseren uralt-Fernseher nutzen. Ich hatte zuerst Raspbian mit XBMC installiert, doch wirklich intuitiv war die Bedienung nicht. Sogar Videos schauen machte keinen Spaß. Dann kam noch dazu, dass er mit Kernel-Panics nach einem Update um sich warf. Nun habe ich mich einfach dazu entschlossen Raspbmc drauf zu machen. Im Gegensatz zu der Version von vor rund 2 Monaten funktioniert das aktuelle Raspbmc ziemlich gut. Es macht sogar Spaß. Die Einrichtung ist auch ganz einfach: http://www.raspbmc.com/wiki/user/os-x-linux-installation/

Leider gibt es kein Plugin um Live-TV auf allen Sendern zu sehen. Zattoo gibts ja nur für 32Bittige x86-Systeme.

 

]]>
https://azapps.de/blog/2012/09/10/raspberry-pi-als-mediacenter/feed/ 3
Intelligente Software https://azapps.de/blog/2012/09/06/intelligente-software/ https://azapps.de/blog/2012/09/06/intelligente-software/#comments Thu, 06 Sep 2012 09:00:39 +0000 https://azapps.de/?p=73 Du kennst das sicherlich. Du benutzt Software (egal wo), und die ist toll. Dann sagt sie dir irgendwann: „Du machst da grad was falsch, das kann nicht sein, das darfst du nicht“. Das ist ja vollkommen in Ordnung, wenn man dadurch irgendetwas kaputt machen könnte. Aber manchmal reicht es doch zu fragen: „Willst du das wirklich machen? Bist du dir da ganz sicher?“.

Diese Art zu intelligenter Software hat schon Menschen das Leben gekostet. Das übliche Beispiel: Lufthansa-Flug 2904. die damalige Fly-by-wire Technologie. Wenn die Software die Eingaben für unsinnig hielt, ignorierte sie diese ohne Rückfrage: Aufgrund eines Vorhergehenden Unfalls hat man bei der Software definiert, dass sie den Schubumkehr zum bremsen erst dann einleiten kann, wenn das Fahrwerk mit mindestens 12 Tonnen belastet ist, die Räder drehen und demzufolge beide Räder auf der Fahrbahn sind. Dem war bei dem Flug auf Grund einiger unglücklicher Faktoren nicht so und das Flugzeug tat im Automatik-Modus nicht das, was es hätten machen sollen.

Anderes Beispiel, aber wesentlich aktueller: Bei der Olympiade dieses Jahr hat die Software gesagt, zwei identische Messwerte aufeinander kann nicht sein, den Kampfrichtern ist ein Fehler unterlaufen.

Es ist schön, wenn die Software mitdenkt, aber manchmal will der Nutzer genau das, was er gerade macht auch wirklich. Also beim nächsten Projekt erst überlegen: „Kann diese Eingabe auch richtig sein?“ und dann eine UserToDumpException werfen.

Warum mir das gerade jetzt einfällt? Heute habe ich meine neue Anschaffung (eine Pulsuhr [Review gibts demnächst]) weiter getestet und wenn ich ein Training plane und sage ich will n km laufen oder Fahrrad fahren, sagt die mir beim starten des Trainings: „Für dieses Training wird aber der Schrittezähler benötigt, ohne dem geht das nicht“. Wie wäre es mit: „Für dieses Training empfehle ich dir einen Schrittzähler, bist du dir sicher?“. Toll… ich halte einen Schrittzähler für ziemlich sinnlos für die Messung von Entfernungen. Beim nächsten mal weiß ich dann Bescheid.

]]>
https://azapps.de/blog/2012/09/06/intelligente-software/feed/ 1