Rechte auf dem uberspace

Durch einen kleinen Fehler hatte ich mir alle Rechte im Verzeichnis /var/www/virtual/username überschrieben.

Wie stellt man wieder alles richtig ein?

cd /var/www/virtual/$USER

# Rechte für Ordner (type = directory)  (rwxr-xr-x)
find * -type d -print0 | xargs -0 chmod 755

# Rechte für Dateien (type = file)  (rw-r--r--)
find * -type f -print0 | xargs -0 chmod 644

# FCGI-Scripte müssen ausführbar sein
chmod 700 fcgi-bin/*

# Der Ordner . also /var/www/virtual/$USER sollte die Rechte 750 haben, also
ll /var/www/virtual | grep $USER
# drwxr-x--- 18 username apache 4096 3. Jul 16:06 username

 

Wichtig dabei ist, dass der Webserver (Gruppe: apache) lesend auf alle Dateien zugreifen kann. (php Scripte laufen als fcgi Script im Namen von euch, aber alle anderen Dateien, zB statische Bilder werden direkt vom Webserver (apache) gelesen und weitergeleitet.)

/var/www/virtual/$USER  hat die Gruppe apache und Leserechte für die Gruppe
/var/www/virtual/$USER/html  hat Eintrittsrechte (x) für den Rest (und damit apache)
/var/www/virtual/$USER/html/.htaccess  hat Leserechte (r) für den Rest (und damit apache)

Außerdem dürfen die fcgi-Scripte aus Sicherheitsgründen keine Schreibrechte für die Gruppe oder jeden haben, euer User muss sie aber ausführen können (z.B. 700, rwx——)

Die Leserechte aller anderen Dateien für den Rest (o) stellen kein Sicherheitsproblem dar, da andere spionierende User schon beim Verzeichnis

/var/www/virtual/$USER

ausgesperrt werden.

Kleine Übersicht über das Rechtesystem in Linux:

Für jede Datei können Leserechte (r), Schreibrechte (w) und Ausführ/Eintrittsrechte (x), jeweils getrennt für einen Benutzer, eine Gruppe und den Rest (also alle die Weder der Benutzer sind noch der Gruppe angehören). Das x steht bei Dateien dafür, dass man die Datei direkt ausführen kann und entspricht der Dateiendung .exe unter Windows. Bei Ordnern gibt das x an, ob demjenigen Erlaubt wird, den Ordnerinhalt zu sehen.

ls -l irgendein_Ordner
-rw-r--r--  1 peter gedoens   418 28. Okt 2013  datei1.txt
-rwxrwxrwx  1 peter gedoens   418 28. Okt 2013  datei-die-jeder-bearbeiten-
                                                und-ausführen-kann.sh
-rw-r--r--  1 peter gedoens   418 28. Okt 2013  datei-ohne-endung
|\ /\ /\ /
| |  |  |
| |  |  |-- o Rechte für jeden, der nicht der User peter ist
| |  |        oder der Gruppe gedoens angehört.
| |  |----- g Rechte für Mitglieder der Gruppe gedoens.
| |-------- u Rechte für den User peter, der damit auch 
|             "Besitzer" der Datei oder des Ordners ist.
|----------   Typ des Elements, meist d für Ordner oder 
              f für Dateien. (l für Links, c für character
              devices, siehe /dev, s für gesetztes suid bit)

Was bedeuten die Nummern, zB 755 oder 750?

Die Nummern sind nur eine andere Schreibweise für die rwxrwxrwx Schreibweise.
Man teilt rwxrwxrwx in drei Dreiergruppen auf und weist den Positionen Zahlen zu:

                     rwx rwx rwx
                     421 421 421

Jetzt addiert man einfach die entsprechenden zahlen für die Rechte, die man aktivieren will, zB

r = 4    rw = 6    x = 1    rwx = 7     rx = ?

Wenn man sich das nicht merken will, akzeptiert der chmod Befehl, mit dem man die Rechte ändert auch folgende Schreibweise:

chmod o-r irgendeine-datei.txt

Statt dem absoluten 755 gehen auch relative Änderungen: + steht für das Hinzufügen, – für das Entfernen der Rechte und = für das setzten der Rechte.

Vor +, = oder - steht u g oder o für user, group oder other.
Nach +, = oder - stehen die Rechte, also r w oder x.

Beispiele:    uo+w    o-rwx     u+w    ugo+rwx    u=rwx     u+r,g=r

Ich will 3 Leuten Schreibrechte und einem 4. Leserechte gewähren

Für den normalen Gebrauch als Einzelperson ist dieses Prinzip des Rechtemanagements relativ einfach verständlich, noch überschaubar und trotz vieler Limitationen ausreichend. Wer viele Benutzer hat, kann jedoch ACLs benutzen, mit denen man die Rechte sehr viel feiner zwischen vielen Usern verteilen kann: http://www.knilse.de/download/acl.html

Festival Lautsprecher

Der Bau eines zweiten Festivallautsprechers steht an. Für Nachbauwillige hier ein wenig Dokumentation:

BOM (Bill of Materials) (meist Amazon Links, ich hab noch Prime-Probe :):

  • Lautsprecher: Beyma 8AG/N (bei Hobbyhifiladen (die lassen es direkt über beyma schicken). Bei amazon gibts auch einen 8AG, aber ich weiß nicht ob das der richtige ist) (40,80€ + 5,90€)
  • Verstärker: Lepai LP-2020A+ (Tripath) (26,99 €)
  • Holz: MDF 1,2mm aus dem Baumarkt, direkt zuschneiden lassen (~9€)
  • Schrauben: 4×35 T20 für das Gehäuse (~5€)
  • Schaniere und Schließvorrichtungen für den Deckel (2*2,72€ + 2*2,83€)
  • Schrauben: klein, um innen Verstärker etc festzuschrauben, auch für Schaniere. Alle aus dem Baumarkt von nebenan.
  • Ladegerät: für 12V Bleiakkus, portables Steckerteil zB AL800 ebay oder AL600 amazon (16,99€)
  • Batteriewächter: Kemo (18,50 €)
  • Batterie: 9Ah 12V deep cycle Blei-Gel-Akku (24,85€)
  • USB-Stromversorgung: 12V zu 5V Wandler (7,98€)
  • USB-Verlängerungskabel (je nach 12V zu 5V USB Wandler)
  • Chinch-Panel: 4 Fach, braucht man nicht unbedingt (1,99 €)
  • robustes Cinch-Klinke-Kabel: (13,19€)
  • Kabel, wer keine hat
  • Switch (2€)
  • Sicherung (0,50€)
  • Sicherungsfassung (2€)
  • + viele Versandkosten

Macht 184,86€ + Versand der oben nicht eingerechnet ist (Bei mir +5,50€).

Wallabag auf dem Uberspace

Wallabag (ehemals Poche) ist ein Open-Source-Ersatz für Pocket.

Wallabag wird auf dem eigenen Webserver installiert und kann dann von Überall verwendet werden.

Für Besitzer eines Uberspaces gibt es diesen Blogartikel im Wallabag Blog der auf dieses Tutorial verweist.

Wer sich dran hält hat leider nichts gutes für seine Privatsphäre getan. Durch die Verwendung der Sqllite-Datenbank im vom außen zugreifbaren Webserververzeichnis kann jeder über die URL

http://blaaaaaa.de/wallabag/db/poche.sqlite

die Datenbank downloaden.

(jetzt gefixt, vielen Dank Flo)

 

So ist es besser:

Installation:

# ins Homeverzeichnis wechseln
cd /home/$USER

# ein Verzeichnis für den Code erstellen
mkdir live.wallabag.code
cd live.wallabag.code

# wallabag quellcode downloaden
git clone https://github.com/wallabag/wallabag.git .

Mit Git wird der Quellcode verwaltet. Hierdurch hat man nicht nur Zugriff auf die aktuelle (instabile) Entwicklerversion sondern auch auf alle Softwareversionen davor. Wir wollen die neuste Version. Dazu suchen wir in dieser Liste die neuste Versionsnummer und bauen sie in den folgenden Befehl ein. (Derzeit 1.4.0)

# neuste version auschecken
git checkout 1.4.0

# composer (php dependency management) installieren
url -s http://getcomposer.org/installer | php

# composer die benötigten componenten installieren lassen
# (ins /vendor verzeichnis)
php composer.phar install

# config kopieren
mv inc/poche/config.inc.php.new inc/poche/config.inc.php

# config bearbeiten:
# In die beiden '' nach 'SALT' gehören viele, zufällige Zeichen
#    (ohne das '-Zeichen innerhalb der äußeren '' zu verwenden ;)
#    ( das würde nur eine weiße Seite erzeugen)
nano inc/poche/config.inc.php
# In nano speichert man mit Strg+O , Enter und schließt mit Strg+X

# db-datei kopieren (bei Verwendung von sqlite)
cp install/poche.sqlite db/

# installverzeichnis löschen (meckert sonst)
rm install

Jetzt müssen die Theme-Dateien und die index.php von außen erreichbar sein.

Ich benutze für wallabag eine Subdomain, aber ein Unterverzeichnis in ~/html geht natürlich auch.

# Für die Subdomain legt man ein neues Verzeichnis mit dem Domainnamen an
mkdir /var/www/virtual/$USER/wallabag.invisibletower.de

# und kreiert sich für den einfacheren
# Zugriff einen Link ins Homeverzeichnis
ln -s /var/www/virtual/$USER/wallabag.invisibletower.de /home/$USER/live.wallabag

Jetzt kommt eine index.php-Datei ins Hautverzeichnis, die die orginal index.php aufruft. Ebenfalls braucht man eine Kopie des themes-Ordners (symlinks gehen bei der uberspace apache config nicht).

Da man das Theme-Verzeichnis nach jedem update kopieren sollte, empfehle ich den folgenden Code im Homeverzeichnis als ~/live.wallabag.updatewebdir.sh abzulegen. Das hilft, sich im Updatefall an das Ordnerkopieren zu erinnern.

#!/bin/bash

# nach Update bitte auch ausführen, damit
# neue/geänderte Themedateien auch verfügbar sind 

rm -r /home/$USER/live.wallabag/themes
cp -r /home/$USER/live.wallabag.code/themes /home/$USER/live.wallabag/themes

echo "<?php 
require('/home/$USER/live.wallabag.code/index.php'); 
 ?>" > /home/$USER/live.wallabag/index.php

jetzt ein

chmod 770 ~/live.wallabag.updatewebdir.sh

und ein

chmod 770 ~/live.wallabag.updatewebdir.sh

zum Ausführen des Scripts.

Voila, eine sichere Installation.

Update

Wird eine neue Wallabag-Version veröffentlicht, kann man mittels git leicht updaten:

cd ~/live.wallabag.code
git pull
git checkout 1.5.0
~/live.wallabag.updatewebdir.sh

Tipp: Truecrypt verschlüsselte Laufwerke überprüfen

Das Problem: Bei truecrypt-verschlüsselten Partitionen führt das Betriebssystem standardmäßig keine Dateisystemchecks durch.

Dateisystemchecks dienen dazu, eventuell aufgetretene Fehler in der Dateisystemstruktur zu beheben, die zB durch Systemabstürze im falschen Augenblick entstehen können. Um diese Fehler zu beheben oder ihnen entgegenzuwirken gibt es grundsätzlich zwei Strategien.

Strategie Eins setzt auf sogenannte transaktions-basierte Dateisysteme. Hier wird vor jedem Schreibzugriff an zentraler Stelle der jetzt folgende Schreibzugriff vermerkt. Danach wird der eigentliche Schreibzugriff ausgeführt und daraufhin die Notiz entfernt. Stürzt jetzt das System während des Schreibzugriffs ab, bleibt die Notiz bestehen. Beim nächsten mounten (einhängen) des Dateisystems wird dann anhand der Notiz versucht, den Fehler zu beheben. Bei Truecrypt-Laufwerken kann dies jedoch manchmal in die Hose gehen, weil die eigentliche Verschlüsselung noch dazwischen hängt und quasi einen Buffer bildet.

Dennoch gibt es eine zweite Strategie. Diese führt nach jeden X. mounten (meist nach jedem 30. mal) beim Systemstart einen kompletten Dateisystemcheck durch, bevor das Laufwerk gemountet wird.

Dieser komplette Check kann bei Truecrypt-Systemen jedoch nicht stattfinden, da sie einfach viel zu spät erst entschlüsselt werden. Das heißt man muss manuell ran.

Truecrypt-verschlüsselte Partitionen funktionieren folgendermaßen: Die Partition /sdx9 ist komplett verschlüsselt, d.h. auch das Dateisystem ist verschlüsselt. Truecrypt übersetzt diese verschlüsselte Partition und stellt eine unverschlüsselte Partition unter /dev/mapper/truecrypt1 zu Verfügung. Erst diese Partition verhält sich wie die anderen unverschlüsselten Partitionen, z.B. wie /sda1. Die Partition /dev/mapper/truecrypt1 wird dann mit normalen Linux-Boardmitteln in ein beliebiges Verzeichnis gemountet, zB /home/ich/crypt.

Um die Partition mal zu überprüfen muss man sie erst mal frei geben, d.h. alle offenen Dokumente speichern und die Programme die sie benutzen am Besten schließen. Danach aushängen mit dem umount-Befehl:

sudo umount /dev/mapper/truecrypt1

Das Überprüfen funktioniert dann folgendermaßen:

sudo fsck /dev/mapper/truecrypt1

Sollte alles glatt gehen sieht man dann eine Meldung ähnlich meiner:

e2fsck 1.42.5 (29-Jul-2012)
Pool wurde 130 mal ohne Überprufung eingehängt, Prüfung erzwungen.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe
Zusammenfassung
Pool: 96390/8323072 Dateien (12.1% nicht zusammenhängend), 20707462/33280583 Blöcke

Danach wird die Partition wieder eingehangen:

sudo mount /dev/mapper/truecrypt1 /home/ich/crypt

Wer die Partition mit speziellen Parametern gemountet hat, kennt sich bestimmt gut aus und benötigt deshalb wahrscheinlich keine weiterführende Erklärung.

In diesem Fall ist bei mir übrigens alles gut gegangen. Als ich meine Letzte Überprüfung vor einigen Jahren durchgeführt hatte sah die Sache allerdings anders aus. Da fand fsck ca 100 Fehler, die es aber glücklicherweise automatisch reparieren konnte.

Um Dateisystemfehler zu vermeiden sollte man auch diesen Tipp beherzigen:

Bei Systemaufhängern sollte seinem Linux die Möglichkeit geben, alle zwischengespeicherten Daten auf die Festplatte zu schreiben und nicht einfach durch 5-sekündiges Drücken des Power-Knopfes den Strom abschalten. In den meisten Fällen ist der Kernel nämlich durchaus noch ansprechbar, auch wenn man das von außen nicht bemerkt.

Um den sogenannten Emergency Sync durchzuführen, bedient man sich der SysRQ-Shortcuts:

Alt + Druck gedrückt lassen, und dann nacheinander R, E, I, S, U, B

R: Tastaturzugriff entziehen

E, I: SIGTERM und SIGKILL an alle Prozesse senden, d.h. alle Programme beenden

S: Emergency Sync, d.h. alle gepufferten Daten auf die Festplatte schreiben

U, B: Auswerfen aller Laufwerke und anschließendes Ausschalten

Wer die Tastenkombination schon mal ausprobieren möchte, kann sich ohne Probleme des S-Teils bedienen:

Zum sehen der Kernelmeldung am besten auf eine Shell wechseln:

Strg + Alt + F1

dann den Sync ausführen:

Alt + Druck + S

Dann die ausgegebene Meldung bewundern, das Festplattenlicht beim Schreiben beobachten und mit

Strg + Alt + F7

wieder zurück zum Grafischen Teil deines Linuxes wechseln.

Was zum Teufel sind Katas?

Noch nie von Programmier-Katas gehört? Ich auch nicht. Das Wikipedia-Orakel lässt verlauten:

Die Mehrzahl der [Katas] in den Kampfkünsten sind Einzelformen, bei denen ein einzelner Kampfkünstler die Abfolge ausführt, die einen Kampf mit einem imaginären Gegner darstellen kann, aber auch einfach eine Aneinanderreihung verschiedener Bewegungen sein können

Was bedeutet dies nun bezogen auf den sterblichen Programmierer? Für ihn sind Katas kleine Programmier-Aufgaben, die er immer wieder Lösen kann. Dabei löst man nicht ein Kata nach dem anderen, sondern nur ein Kata immer wieder.

Das hört sich unsinnig an? Dieser Meinung war ich auch bis ich es selbst einmal probiert hatte.

Mein erstes Kata ist von Roy Osherove. Wer das mit dem Kata einmal ausprobieren möchte (und dies empfehle ich ausdrücklich), sollte auf der folgenden Seite erst einmal nur bis zum Beginn der Nummerierung lesen, denn dies stellt die Aufgabe dar. Außerdem empfehle ich, die Videos noch nicht anzuschauen. Der Link zum Kata befindet sich im letzten Wort dieses Satzes :D.

Wer damit dann fertig ist, sollte sich eines der Videos (in meinem Fall das Java Video) anschauen und mal die Schönheit, Sauberkeit und Lesbarkeit des eigenen Codes mit dem im Video vergleichen. Ich war echt überrascht und plötzlich vom Sinn solcher Programmier-Katas überzeugt: Manchmal macht Übung den Meister.

Im normalen Programmieralltag ist es schwer, überhaupt nur in die Nähe von Perfektion zu kommen. Das liegt vor allem daran, dass die meisten Probleme nur einmal auftreten und als erledigt gelten, sobald eine funktionierende Lösung vorliegt. Sich hier dann beim nächsten Auftreten eines ähnlichen Problems zu steigern wird schwer weil man entweder die alte Lösung noch im Kopf hat und sie einfach nachbaut (sie hat sich ja schon als funktionierend erwiesen), oder weil man sie nicht mehr weiß und damit wieder von vorne anfängt.

Bei einem Kata hat man dagegen die Möglichkeit, kontinuierlich an allem zu feilen, was das Problem hergibt, um schließlich eine annähernd perfekte Lösung zu kennen. Nur: Was bringt es mir eine perfekte (oder sehr sehr Gute) Lösung zu kennen? Die Antwort lautet: Um zu erfahren, wie sich guter Code anfühlt. Mit dem Sinn für guten Code kann man dann schnell schlechten Code (oder schlechtes Code-Design), der einem von den Fingern fließt, erkennen und hoffentlich schon während dem Entstehungsprozess verbessern. (Es gibt noch viele weitere Antworten, die mir hierzu einfallen würden, allerdings sei es jedem selbst überlassen, sie zu finden.)

Große Empfehlung: Probier das Kata aus, es sind nur 30 Minuten deines Lebens!

PS: Die meisten Katas sind speziell für Anwender des TDD (Test-Driven Development) geschrieben, was man auch ziemlich einfach an der Struktur der Katas erkennen kann. Nichts desto trotz kann man die Aufgaben natürlich auch mit normalem “Brute-Force” programmieren lösen.

TDD – Der Umstieg

Der Begriff TDD – in Langform Test-Driven Development – war für mich bis vor kurzem bedeutungslos. Erst die zufällige, regen-bedingte Lektüre von Clean Coder: Verhaltensregeln für professionelle Programmierer (geschrieben von UncleBob, einer Ikone im Programmiergeschäft) hat mich mit der Nase drauf gestoßen. Ich denke die allermeisten Nicht-Profis sind bisher relativ gut mit der Methode “programmieren, manuelles testen, debuggen, weiter programmieren” gefahren. Je komplexer das Projekt, desto ausgedehnter werden mithin die Debug-Sessions und desto verworrener wird der Code. Mit TDD hat theoretisch beides ein Ende oder wird praktisch betrachtet zumindest stark minimiert. Zudem soll TDD einem beim guten und sauberen Design der Software helfen, denn auch Code-Design ist vor allem für Anfänger aber auch für Fortgeschrittene und einige Profis keine leicht zu lösende Aufgabe.

Wer sich jetzt fragt, was TDD ist, dem sei einer der hunderttausend Youtube Videos zum thema empfohlen, zB dieses hier: Test Driven Development Introduction oder auch der Wikipedia-Eintrag. Wichtig zu verstehen ist, dass TDD nicht nur einfach bedeutet, mehr und für alles Tests zu schreiben, sondern dass es eine komplette innere Einstellung beim Programmieren darstellt.

Der Selbstversuch soll mir nun zeigen ob die dem TDD nachgesagten Effekte stimmen. Außerdem soll er meine programmiertechnischen Fähigkeiten um ein paar Level erhöhen und professionalisieren.

Wie sieht der Selbstversuch nun aus? Ich füge dem Android Play Store einen weiteren Taschenrechner zu den gefühlt 100000 schon existierenden Taschenrechnern hinzu :D Laut allgemeinem Einvernehmen benötigt man etwa 5 Monate um das TDD-System zu verinnerlichen und um damit schließlich sogar effektiver als zuvor arbeiten zu können. Und ich denke in dieser Zeit wird der Taschenrechner bestimmt einiges lernen können. Falls mir das Endprodukt gefällt werde ich es unter eine offene Lizenz stellen. Solange der Rechner allerdings noch nicht fertig ist, wird er zwar auf GitHub einzusehen sein, aber lizenztechnisch gefesselt.

Mögen die Spiele Beginnen :D

Ich empfehle auch meinen nächsten Blogposts zum Sinn von Katas: Was zum Teufel sind Katas?

Sainsmart LCD Keypad Library

Auf Ebay und Amazon taucht es massenweise auf: Das SainSmart 1602 LCD Keypad Shield.

Meist wird es im Paket mit einem Sainsmart Mega oder Uno angeboten. Diese Mega- und Uno-Boards entsprechen ziemlich genau den Arduino-Boards und lassen sich auch mit der Arduino IDE (Programmiersoftware) programmieren, was dank der OpenSource Politik von Arduino auch so gewollt ist. Die Sainsmart-Produkte sind zwar billiger, dafür unterstützt man beim Kauf eines echten Arduino die dahinter stehende Arbeit, bekommt ein “Thank-you-for-supporting”-Heft, eine schicke Verpackung und 6 Aufkleber.

Worum es hier jedoch eigentlich gehen soll: Die Firma Sainsmart bietet auf ihrer Webseite eine Bibliothek zum Ansteuern des Tastenfelds des LCD Keypad Shields an. Diese Bibliothek ist leider wirklich, wirklich schlimm, wenn nicht sogar falsch programmiert, weshalb ich hier jetzt gerne ein wenig bashing betreiben würde. Stattdessen gibt es hier aber nur den Ausweg: Unter https://github.com/Phaiax/sainsmartkeypad gibt es eine Bibliothek (für Arduino1.0), die es hoffentlich viel Besser macht. Please Fork!

Ein Beispiel ist nie verkehrt (ich werde es auch gleich mal auf Github hochladen). Erstellt einfach zwei neue Dateien im Arduino-Sketch (der Pfeil ganz rechts in der Dateileiste) mit den Namen ‘sainsmartkeypad.h’ und ‘sainsmartkeypad.cpp’ und kopiert den Code der entsprechenden Dateien von Github in diese Dateien. Schau in den Quellcode der Headerdatei um die erweiterten Einstellungsmöglichkeiten kennenzulernen. Die Hauptdatei könnte dann Beispielsweise so aussehen:

#include <LiquidCrystal.h>

#include "Arduino.h"

// github.com/Phaiax/sainsmartkeypad
#include "sainsmartkeypad.h"

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SainsmartKeypad keypad(0);
int value = 0;
uint8_t key;

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("Keypad Example");
}

void loop() {
  key = keypad.getKey_fastscroll();

  // Try the other possibilities:
  // (Only one at a time.
  //  fastscroll, waitrelease and periodic
  //  won't work next to each other.)

  //key = keypad.getKey_waitrelease(); // without fastscroll but usable
  //key = keypad.getKey_periodic(); // not quite usable
  //key = keypad.getKey_instant(); // not quite usable

  if(key != SAMPLE_WAIT) // Do not refresh screen every loop
  {
     switch(key)
     {
       case UP_KEY:
        value++;
        break;
       case DOWN_KEY:
        value--;
        break;
     }
     lcd.setCursor(5,1);
     lcd.print(value);
     lcd.print("        ");
  }
}

 

 

Flächenberechnung mit Inkscape

Zwecks genauer Planung unseres Gartens war ich auf der Suche nach einem einfachen Gartenprogramm für unseren Garten. Es sollte den Garten von oben abbilden und die Möglichkeit bieten, die Flächeninhalte bestimmter Polygone anzugeben, beispielsweise um zu berechnen, wieviel m² Pflaster benötigt wird. Eine 3-D-Ansicht sowie Bibliotheken brauchte ich nicht. Also freundete ich mich mit Inkscape an.

Pläne mit Inkscape zu erstellen ist relativ trivial. Hierfür konnte ich sogar den Maßstab 1:1 benutzen, auch wenn der Garten bei kleinstem Zoom dann nicht mehr ganz auf den Bildschirm passt. Nur das Berechnen des Flächeininhalts von Polygonen kann Inkscape nicht von Haus aus. Ein Script musste her, welches diese Aufgabe übernimmt.

Inkscape benutzt zum Abspeichern der Polygone zum Glück ein XML-Format, aus welchem man leicht die verschiedenen Punkte eines Pfades herauslesen kann. Dank Wikipedia und Gauß bleibt mir die Entwicklung eines eigenen Algorithmus erspart. Wikipedia sagt folgendes:

Wenn die Eckpunkte eines ebenen einfachen (s.o.) Polygons durch kartesische Koordinaten (xi,yi) gegeben sind, kann man die Fläche des Polygons nach der Gaußschen Trapezformel berechnen:

2 A=\sum_{i=1}^n (y_i + y_{i+1})(x_i-x_{i+1})

Wobei die Indizes, die größer als n sind, immer modulo n betrachtet werden müssen, d.h. mit xn + 1 ist x1 gemeint.

Somit sollte das Berechnen des Polygons kein Problem mehr darstellen.

Mein Script ist in Pyton geschrieben, da ich die Erfahrung gemacht habe, dass man mit dieser Programmiersprache am schnellsten und einfachsten kleine Programme schnuddeln kann.

Script-Download: blumenimgarten.py

Das Script muss in eine Datei kopiert werden, beispielsweise blumenimgarten.py

Man kann das Script interaktiv aufrufen oder mit Parametern:

python blumenimgarten.py inkscapedatei.svg pfadID Factor [nonverbose]
python blumenimgarten.py garten.svg path1234 3450 nonverbose
35.105416684

Der Faktor hilft dem Script die in Inkscape benutzte Längeneinheit in Meter oder Zentimeter umzurechnen. Bei meinem Garten waren 1 m ungefähr 3500 Inkskape-Einheiten. Es gibt bestimmt eine Möglichkeit den Umrechnungsfaktor auszulesen oder zu berechnen, aber das war mir die Mühe nicht wert. Deshalb bietet das Script inkeraktiv an, den Faktor mit Hife einer 1cm / 1m Linie auszumessen.

Das Script ist übrigens nur in der Lage geschlossene Pfade zu vermessen. Wie man einen Pfad schließt sagt dir das Script, wenn du versuchst einen nicht geschlossenen Pfad zu vermessen. Außerdem kann das Script keine Kurven verarbeiten. Nur Polygone mit ausschließlich geraden Kanten. Die Ausgabe erfolgt im Quadrat der Einheit, die du beim Vermessen des Faktors benutzt hast. Benutzt du das Script mit einem 4. Parameter, wird ausschließlich das Ergebnis ausgegeben und kein zusätzlicher Text.

Viel Erfolg beim Vermessen.

——————

Dieser Artikel wurde aus meinem alten Blog hierher verschoben.

Hier noch ein hilfreicher Kommentar mit einer eventuell einfacheren Alternative von Casimir:

Alternativ: Als Pixelgraphik in Gimp öffnen und im Histogramm die Pixel ablesen.

 

 

 

Gruß vom Türmchen

Einen Gruß an den werten Leser meines neuen Blogs.

Quatsch beiseite.

Als erstes soll gesagt sein, dass dies nicht mein erstes Blog ist. Mein Erstes Blog hieß Bitbeschleuniger mit dem sagenhaft tollen Untertitel

1 / sqrt( c – vBit ) = ∞

Seid dem 20. April 2010 erschienen insgesamt 2 Artikel, von denen ich einen in dieses Blog übernehmen werde.

Ansonsten nutze ich das Blog als Anlaufstelle für diverse Android und Windows Phone-Apps die ich geschrieben habe und als Publikationsplatform für Codeschnipsel, Programme und Ideen, die vielleicht mal jemand gebrauchen könnte.

Einen Gruß vom Türmchen!