Zwei separate Stromkreise via Funkschalter gleichzeitig schalten

Immer wieder spannend, was aus einer vermeintlich einfachen Aufgabenstellung so entstehen kann.

Ausgangssituation: Wir haben vor dem Haus sowie hinter dem Haus im Dachüberstand jeweils 4 Lampen verbaut, um eine ausreichende Beleuchtung in der dunkleren Jahreszeit sicherzustellen. Vorne wird von innen per Schalter dauerhaft an/aus geschaltet, zudem werden die Lampen von einem Bewegungsmelder angesteuert. Hinter dem Haus werden die Lampen nur von innen mit einem Schalter bedient, welcher sich im HWR befindet. In der Wohnstube, wo ebenfalls eine Terrassentür verbaut ist, fehlt ein entsprechender Schalter. Die jeweils 4 Lampen hängen an unterschiedlichen Stromkreisen. An der Seite vom Haus, wo u.a. die Mülltonnen stehen, gibt es gar keine Beleuchtung.

Erstes einfaches Ziel: An der Seite vom Haus soll ebenfalls eine Beleuchtung installiert werden.

Und schon ging die Überlegung los, wie soll die Beleuchtung dimensioniert und realisiert werden. Da sie primär zweckdienlich sein soll, viel die Entscheidung auf LED-Fluter mit 10-20 Watt, und um eine ausreichende Ausleuchtung sicherzustellen, gleich zwei davon.

Nächster Punkt: Wie sollen die neuen Lampen geschaltet werden. Häufig kommt man nach Hause, läuft vor dem Haus lang, der Bewegungsmelder schaltet die Frontbeleuchtung. Dann läuft man um das Haus herum, noch ist dunkel. Würde man die neuen Lampen mit an den Bewegungsmelder hängen, hätte man auch hier Licht. Allerdings wäre das dann immer an, wenn der Bewegungsmelder reagiert, ich will hier aber nur Licht, wenn ich auch wirklich um das Haus laufe. Zudem wäre hinter dem Haus immer noch dunkel…

Also vielleicht neue Bewegungsmelder bei den neuen Lampen an der Hausseite? Wäre eine Möglichkeit, die müssten dann aber zuverlässig einen 180° Bereich abdecken und sollten nicht reagieren, wenn die Nachbarin mal durch ihren Garten läuft. Außerdem wäre hinten immer noch dunkel. Gut, da könnte man natürlich noch einen Bewegungsmelder montieren, aber man möchte ja vielleicht auch mal ungestört im Dunkeln im Garten sitzen, dann würde der wiederum stören…

Nach reichlich hin- und herüberlegen, abwägen aller Vor- und Nachteile, gab es schließlich einen Entschluss: Das Ganze wird über Funkschalter realisiert, welche in ähnlicher Form häufig für Garagentore eingesetzt werden. Damit hat man die nötige Flexibilität, der Bewegungsmelder schaltet immer noch nur vorne die Beleuchtung, das reicht für Postboten und Besucher. Hinten wird nach wie vor nur nach Bedarf von innen geschaltet. Möchte man aber um das Haus herumlaufen, kann man per Fernbedienung komplett rund um das Haus das Licht einschalten. Die Fernbedienung wiederum kommt an den Schlüsselbund, damit man sie nicht ständig vergisst.

Nun bleibt noch der Umstand, dass es sich um zwei getrennte Stromkreise handelt, die man nun gemeinsam schalten möchte. Die Lösung dafür nennt sich Relais bzw. Schütz, wobei sich letzteres aufgrund seiner Schaltlautstärke nicht unbedingt eignet. Die neuen Lampen werden zur Arbeitserleichterung auf die beiden Stromkreise verteilt und so angeschlossen, dass sie nicht auf Bewegungsmelder bzw. Lichtschalter reagieren.

Beim Aufgeben der Bestellung des benötigten Materials musste ich dann leider feststellen, dass es keine 4-fach Relais gab, die meinen Anforderung genügten, dafür hätte ich Schütze kaufen müssen, welche aber wie zuvor bereits erwähnt zu laut schalten und daher nicht in Frage kommen. Also wurden statt dessen zwei 2-fach Relais bestellt.

Nächstes Problem war dann die Reichweite der Funkschalter bzw. der Fernbedienungen. Zuerst wollte ich den Schalter im Giebel unterbringen, nach ersten Tests musste ich aber feststellen, dass dieser vom Carport aus (also um 2 Hausecken herum) kein Signal empfangen konnte. Nach ein paar weiteren Positionierungsversuchen dann die Erkenntnis, dass ein Funkschalter wohl nicht ausreichen würde, irgendwo hat man immer einen toten Punkt.

Also wurde der Plan nochmals überarbeitet, diesmal mit zwei Relais und zwei Funkschaltern. Bei der Gelegenheit wurde dann auch gleich ein zusätzlicher Schalter in der Wohnstube für die hintere Beleuchtung ergänzt.

Beide Funkschalter haben eine eigene Frequenz, die Ferbedienung hat zwei Knöpfe. Die Funkschalter wurden vor und hinter dem Haus im Dachüberstand montiert, so ist ein nahezu lückenloser Bereich abgedeckt.

Einen Nachteil hat die gewählte Lösung. Schaltet man vorne, geht ums Haus und drückt beim Ausschalten auf den falschen Knopf, so bleibt das Licht an, weil nun beide Funkschalter aktiv sind. Man muss dann etwas rumprobieren, bis man beide aus hat.

Um das zu vermeiden, hätte ich natürlich die beiden Funkschalter in eine Kreuzschaltung bringen können. Aber dann wäre i.d.R. immer einer angezogen, was sicherlich nicht so zuträglich für die Lebensdauer des Schalters wäre, daher hab ich zugunsten der zu erwartenden Materialermüdung auf die Kreuzschaltung verzichtet und muss mich selbst zu etwas Disziplin beim Ein- und Ausschalten via Fernbedienung erziehen.

Veröffentlicht unter Heimwerken, Technik | Verschlagwortet mit , | Kommentare deaktiviert für Zwei separate Stromkreise via Funkschalter gleichzeitig schalten

Dateien anhand des Anfangsbuchstaben in unterschiedliche Ordner verschieben

Eine Aufgabe, die mir schon ein paar mal bevor stand und händisch einfach eine Katastrophe ist: Ein paar 100 oder 1000 Dateien sollen anhand des Anfangsbuchstaben ihres Dateinamen in entsprechende Ordner von A-Z einsortiert werden.

Dazu musste eine Batch-Lösung her, was aber meine Kenntnisse der Batch-Programmierung etwas überschritt, daher musste Google bei der Suche helfen…was etwas zeitaufwendiger war, denn diese spezielle Anforderung kommt wohl nicht so häufig vor. Herausgekommen ist folgendes Script, welches vom Autor rubberman auf administrator.de veröffentlicht wurde. Ich hab nur das copy gegen move getauscht und natürlich die Pfade angepasst.

@echo off &setlocal
set "quelle=c:\files"
set "ziel=c:\sort"
set ^"LF=^

^"  Die Leerzeile oben ist kritisch - Nicht entfernen!
for /f "delims=" %%i in ('dir /a-d /b "%quelle%"') do (
  set "file=%%i"
  set "first="
  for /f skip^=1^ delims^=^ eol^= %%i in (
    '2^>^&1 cmd /von /c fc "!LF!!file:~,1!!LF!" nul'
  ) do if not defined first set "first=%%i"
  setlocal EnableDelayedExpansion
  if not exist "!ziel!\!first!\" md "!ziel!\!first!"
  move /y "!quelle!\!file!" "!ziel!\!first!\"
  endlocal
)

Veröffentlicht unter Coding, Software, Technik | Verschlagwortet mit , | Kommentare deaktiviert für Dateien anhand des Anfangsbuchstaben in unterschiedliche Ordner verschieben

Runtastic Export – JSON zu GPX konvertieren

Runtastic ist an sich ja eine feine Sache, man kann den Dienst “kostenfrei” nutzen und seine Aktivitäten erfassen, dokumentieren und auswerten. Dafür bezahlt man mit seinen gesammelten Daten, wer mehr will muss dann auch noch ein Premium-Abo abschließen und/oder die Pro-App kaufen. Aber wehe, man möchte seine Daten auch außerhalb der Runtastic-Plattform verwenden, da hört die Freundschaft schnell auf. Dass alle hochgeladenen Daten dem jeweiligen Nutzer gehören und dieser generell damit anstellen darf, was er will, scheint Runtastic nicht im Geringsten zu Interessieren.

Mir geht es speziell um die mit der App erfassten Geodaten. Diese möchte man vielleicht auch gern mit anderen Programmen bzw. mit anderen Online-Plattformen nutzen.

Dabei steht es jedem frei, sich zu EINER Aktivität die Track-Daten in verschiedenen Formaten herunterzuladen. Diesen Vorgang darf man aber nicht beliebig wiederholen, sondern die möglichen Downloads pro Stunde oder Tag sind begrenzt. Man kann also nur wenige Aktivitäten auf einmal exportieren und muss dann warten. Grund dafür sind Tools, die einem in der Vergangenheit das massenhafte Herunterladen aller Aktivitätsdaten ermöglichten. Da Runtastic das nicht gepasst hat, wurde das Download-Limit eingeführt.

Nicht zuletzt der DSGVO haben wir es jedoch zu verdanken, dass wir unsere gesamten Account-Daten auf einen Schlag exportieren dürfen. Dazu meldet man sich bei Runtastic an, klickt oben rechts auf den Pfeil neben dem Benutzerbild und wählt Einstellungen. Auf der linken Seite gibt es den Menüpunkt Export. Dort kann man einen Export seiner Account-Daten anfordern und mit etwas Zeitversatz herunterladen.

ABER: Auch hier hat sich Runtastic Mühe gegeben, die Nutzung der exportierten Daten möglichst umständlich zu gestalten. Dazu werden einfach alle Daten im JSON-Format bereitgestellt, auch die Trackdaten. Und anstatt sich hier zumindest an die allgemein gültige Spezifikation GeoJSON zu halten, hat man sich lieber für eine eigene Darstellungsform entschieden, damit Converter-Programme nicht eingesetzt werden können.

Zum Glück gibt es hilfsbereite Programmierer da draußen, die sowas nicht akzeptieren wollen und entsprechende Hilfsmittel zur Verfügung stellen.

Zuerst bin ich über den Runtastic GPX Converter von SamFent gestolpert. Wandelt zuverlässig die JSON-Daten von Runtastic in gültige GPX-Daten um. Allerdings jede Datei einzeln, man muss viel hin und her kopieren, aber für die Massenumwandlung ist es auch nicht konzipiert worden.

Nach weiterer Suche habe ich dann runtastic-activity-parser von Eugen Mayer gefunden. Dabei handelt es sich um einen Fork von runtastic-activity-lib von Matthias Richter. Letztlich würden es wahrscheinlich beide Projekte gut hinbekommen, aber da nur von Eugen Mayer eine vorkompilierte JAR zum Download angeboten wird, habe ich mich für den Fork entschieden.

Wie man genau vorgeht, ist auf der Projektseite von Github gut beschrieben. Export von Runtastic anfordern, runterladen und entpacken. Dann die JAR-Datei von Github herunterladen. Da es sich um ein Java-Projekt handelt, muss natürlich auch Java installiert sein. Abschließend die Console (cmd.exe) öffnen, in den Ordner mit der JAR-Datei wechseln und dann wie folgt aufrufen:

java -jar runtastic-activity-parser.jar c:\quellverzeichnis c:\zielverzeichnis

Danach beginnt das Programm, die JSON-Dateien umzuwandeln, der Fortschritt wird dabei immer angezeigt. Nach Abschluss liegen die GPX-Dateien im angegebenen Zieverzeichnis. Einziger Wermutstropfen, die GPX-Dateien haben danach den gleichen kryptischen, nichts sagenden Dateinamen wie zuvor auch schon die JSON-Dateien. Schöner wäre es gewesen, wenn diese als Dateiname Datum + Beginnzeit verpasst bekommen hätten, dann könnte man bestimmte Daten gezielt suchen.

Aber da ich keine Ahnung von Java habe und auch nicht von dessen Kompilierung mittels maven verstehe, bleibt mir nur, diesen Umstand zu akzeptieren. Vielleicht erbarmt sich ja irgendwann nochmal jemand und verpasst dem Programm eine bessere Benennung der Ausgabe-Daten.

Update:
Da mir das Ausgabe-Format einfach nicht in den Kram passt, habe ich ein kleines Powershell-Script geschrieben, welches eine Umbenennung der GPX-Dateien bewirkt. Die Dateien werden nach folgendem Schema umbenannt: YYYY-MM-DD HH_MM. Geht bestimmt auch eleganter, aber von Powershell hab ich auch nur relativ wenig Ahnung, außerdem sollte es schnell gehen 🙂

gci 'c:\zielverzeichnis\*.gpx' |
ForEach{
    $var1 = gc $_.FullName
    $var2 = $var1[15].substring(10,16)
    $var2 = $var2.Replace("T"," ")
    $var2 = $var2.Replace(":","_")
    rename-item -Path $_.FullName -Newname ( $var2+".gpx" ) -force
}
Veröffentlicht unter Coding, Software | Verschlagwortet mit , | Kommentare deaktiviert für Runtastic Export – JSON zu GPX konvertieren

JavaScript Funktion – Zahl in Worten / Zahlwort (v2)

So, hier nun Version 2. Etwas schlanker und wie angekündigt nach oben offen, zumindest theoretisch. JavaScript verarbeitet Zahlen als 64 Bit Gleitkommazahl, womit die maximale Größe bei 253 = 9.007.199.254.740.992 liegt.

Das Array einheiten ist daher nur bis Billion gepflegt, sofern größere Zahlen ausgeschrieben werden sollen, muss das Array entsprechend erweitert und eine Möglichkeit geschaffen werden, diese größeren Zahlen auch korrekt verarbeiten bzw. speichern zu lassen. Tipps dazu gibt es u.a. bei stackoverflow.

Eine Live-Version habe ich bei CodePen eingestellt.

function zahlwort(zahl) {
  
  var sonderzahlen = [];
  sonderzahlen[11] = 'elf';
  sonderzahlen[12] = 'zwölf';
  sonderzahlen[16] = 'sechzehn';
  sonderzahlen[17] = 'siebzehn';

  var zahlen = [];
  zahlen[1] = 'ein';
  zahlen[2] = 'zwei';
  zahlen[3] = 'drei';
  zahlen[4] = 'vier';
  zahlen[5] = 'fünf';
  zahlen[6] = 'sechs';
  zahlen[7] = 'sieben';
  zahlen[8] = 'acht';
  zahlen[9] = 'neun';
  zahlen[10] = 'zehn';
  zahlen[20] = 'zwanzig';
  zahlen[30] = 'dreißig';
  zahlen[40] = 'vierzig';
  zahlen[50] = 'fünfzig';
  zahlen[60] = 'sechzig';
  zahlen[70] = 'siebzig';
  zahlen[80] = 'achtzig';
  zahlen[90] = 'neunzig';
  
  var einheiten = ['','tausend','Million','Milliarde','Billion']
  var trennschritte = 1000;
  var zahlinworten = "";

  if(zahl==0) 
    zahlinworten = "null";
  for(var i=0;i<Math.ceil(zahl.length / 3);i++) {
    if(i>einheiten.length-1)
      return "Zahl nicht unterstützt";
    if(i==0)
      zahlenblock = zahl % trennschritte;
    else
      zahlenblock = ((zahl % trennschritte) - (zahl % (trennschritte / 1000))) / (trennschritte / 1000);
    einer = zahlenblock % 10;
    zehn = zahlenblock % 100;
    hunderter = (zahlenblock - (zahlenblock % 100)) / 100;
    einheitenendung = einheiten[i].substr(einheiten[i].length-1,1);

    if(zahlenblock>0) {
      if(zahlenblock>1 && einheitenendung == "n")
        zahlinworten = " " + einheiten[i] + "en " + zahlinworten;
      else if(zahlenblock>1 && einheitenendung == "e")
        zahlinworten = " " + einheiten[i] + "n " + zahlinworten;
      else if(zahlenblock>0 && i==1)
        zahlinworten = einheiten[i] + zahlinworten;
      else
        zahlinworten = " " + einheiten[i] + " " + zahlinworten;
    }
   
    if(zehn>0) {
      if(zehn==1 && i==0)
        zahlinworten = "eins" + zahlinworten;
      else if(zehn==1 && i==1)
        zahlinworten = "ein" + zahlinworten;
      else if(zehn==1 && i>1)
        zahlinworten = "eine" + zahlinworten;
      else if(sonderzahlen[zehn])
        zahlinworten = sonderzahlen[zehn] + zahlinworten;
      else {
        if(zehn>9)
          zahlinworten = zahlen[zehn-einer] + zahlinworten;
        if(zehn>20 && einer>0)
          zahlinworten = "und" + zahlinworten;
        if(einer>0)
          zahlinworten = zahlen[einer] + zahlinworten;
      }
    }

    if(hunderter>0)
      zahlinworten = zahlen[hunderter] + "hundert" + zahlinworten;

    trennschritte *= 1000;
  }
  return zahlinworten;
}
Veröffentlicht unter Coding, Internet, Software, Technik | Verschlagwortet mit | Kommentare deaktiviert für JavaScript Funktion – Zahl in Worten / Zahlwort (v2)

JavaScript Funktion – Zahl in Worten / Zahlwort (v1)

Hin und wieder benötigt man eine ausgeschriebene Zahl. Für einige Sprachen gibt es dafür vorgefertigte Funktionen, die man nur aufrufen muss, für viele andere findet man passenden Code im Netz, aber für JavaScript hab ich auf die Schnelle nichts gefunden, was fehlerfrei arbeitet und ohne Unterfunktion auskommt. Daher hab ich mir selbst eine geschrieben, welche die Zahlen von 0 bis 999.999.999 verarbeiten kann.

Das geht sicher auch kürzer und eleganter, erfüllt aber erstmal seinen Zweck, daher v1. Werde mich aber nochmal dran setzen, und eine kürzere Version mit Schleife scheiben, die dann auch nach oben hin mehr oder weniger offen ist. Das wird dann v2 und bekommt nochmal einen neuen Beitrag.

function zahlwort(zahl) {

  var zahlinworten = "";
  
  var sonderzahlen = [];
  sonderzahlen[0] = 'null';
  sonderzahlen[1] = 'eins';
  sonderzahlen[11] = 'elf';
  sonderzahlen[12] = 'zwölf';
  sonderzahlen[16] = 'sechzehn';
  sonderzahlen[17] = 'siebzehn';

  var zahlen = [];
  zahlen[0] = 'null';
  zahlen[1] = 'ein';
  zahlen[2] = 'zwei';
  zahlen[3] = 'drei';
  zahlen[4] = 'vier';
  zahlen[5] = 'fünf';
  zahlen[6] = 'sechs';
  zahlen[7] = 'sieben';
  zahlen[8] = 'acht';
  zahlen[9] = 'neun';
  zahlen[10] = 'zehn';
  zahlen[20] = 'zwanzig';
  zahlen[30] = 'dreißig';
  zahlen[40] = 'vierzig';
  zahlen[50] = 'fünfzig';
  zahlen[60] = 'sechzig';
  zahlen[70] = 'siebzig';
  zahlen[80] = 'achtzig';
  zahlen[90] = 'neunzig';
  
  var million = ((zahl % 1000000000) - (zahl % 1000000)) / 1000000;
  var tausend = ((zahl % 1000000) - (zahl % 1000)) / 1000;
  var weniger = zahl % 1000;
  var hunderter;
  var zehn;
  var einer;

  if(zahl==0||zahl=="") {
    zahlinworten = "null";
    return zahlinworten;
  }

  if(zahl>=1000000000) {
    zahlinworten = "nicht unterstützt";
    return zahlinworten;
  }
  
  if(million>0) {
    hunderter = ((zahl % 1000000000) - (zahl % 100000000)) / 100000000;
    zehn = ((zahl % 100000000) - (zahl % 1000000)) / 1000000;
    einer = ((zahl % 10000000) - (zahl % 1000000)) / 1000000;
 
    if(hunderter>0)
      zahlinworten += zahlen[hunderter] + "hundert";
    if(zehn>0) {
      if(zehn==1)
        zahlinworten += "eine Million ";
      else if(sonderzahlen[zehn]) {
        zahlinworten += sonderzahlen[zehn];
        zahlinworten += " Millionen ";
      }
      else {
        if(einer>0)
          zahlinworten += zahlen[einer];
        if(zehn>20)
          zahlinworten += "und";
        if(zehn>9)
          zahlinworten += zahlen[zehn-einer];
        zahlinworten += " Millionen ";
      }
    }
  }

  if(tausend>0) {
    hunderter = ((zahl % 1000000) - (zahl % 100000)) / 100000;
    zehn = ((zahl % 100000) - (zahl % 1000)) / 1000;
    einer = ((zahl % 10000) - (zahl % 1000)) / 1000;
 
    if(hunderter>0)
      zahlinworten += zahlen[hunderter] + "hundert";
    if(zehn>0) {
      if(zehn==1)
        zahlinworten += "ein";
      else if(sonderzahlen[zehn])
        zahlinworten += sonderzahlen[zehn];
      else {
        if(einer>0)
          zahlinworten += zahlen[einer];
        if(zehn>20)
          zahlinworten += "und";
        if(zehn>9)
          zahlinworten += zahlen[zehn-einer];
      }
    }
    zahlinworten += "tausend";
  }

  if(weniger>0) {
    hunderter = ((zahl % 1000) - (zahl % 100)) / 100;
    zehn = zahl % 100;
    einer = zahl % 10;
    
    if(hunderter>0)
      zahlinworten += zahlen[hunderter] + "hundert";
    if(zehn>0) {
      if(sonderzahlen[zehn])
        zahlinworten += sonderzahlen[zehn];
      else {
        if(einer>0)
          zahlinworten += zahlen[einer];
        if(zehn>20)
          zahlinworten += "und";
        if(zehn>9)
          zahlinworten += zahlen[zehn-einer];
      }
    }
  }

  return zahlinworten;
}
Veröffentlicht unter Coding, Internet, Software, Technik | Verschlagwortet mit | Kommentare deaktiviert für JavaScript Funktion – Zahl in Worten / Zahlwort (v1)

Formeln zur Zinsberechnung

Sammelbeitrag mit Formeln zur Zinsberechnung. Auf die Herleitungen verzichte ich, mir geht es nur darum, nicht immer auf verschiedenen Seiten danach Suchen zu müssen.


Legende

K = Startkapital
R = monatliche Sparrate
S = jährlicher Sparbetrag = 12 * R
Z = Zinsen
p = Zinssatz in %

n = Jahre
m = Monate
t = Tage
E = Endkapital
K1 = Kapital nach einem Jahr


Einfache Zinsberechnung


Zinseszins bei einmaligem Sparbetrag für n Jahre


Startkapital und jährlicher Sparbetrag für n Jahre (Sparkassenformel)


Monatlicher Sparbetrag und jährliche Zinsauszahlung

Endkapital nach n Jahren


Quellen (teilweise mit Herleitungen)
www.formelsammlung-mathe.de
www.uni-protokolle.de

Veröffentlicht unter Coding, Hobby | Verschlagwortet mit | Kommentare deaktiviert für Formeln zur Zinsberechnung

Stundensatz bei monatlichem Festgehalt berechnen

Manchmal interessiert einen ja sein eigener Stundenlohn, sei es für die Vergleichbarkeit mit anderen Jobs oder aber wenn es um die Vergütung von Überstunden geht. Sofern man ein monatliches Festgehalt bezieht, ist einem dieser Wert aber gar nicht unbedingt bekannt. Daher hier kurz die Berechnungslogik, mit der der Stundenlohn durch Firmen ermittelt wird.

Für die Berechnung benötigt man das Brutto-Monatsentgelt und die Wochenarbeitszeit (WAZ). Im Beispiel gehen wir von 2.500 € bei einer WAZ von 40 Stunden aus. Zusätzlich benötigt man die genaue Zahl an Wochen pro Monat. Diese bekommt man mit folgender Herangehensweise ermittelt:

Ein Jahr hat 365 Tage, alle 4 Jahre haben wir ein Schaltjahr mit 366 Tagen.
(4 * 365 + 1) / 4 = 365,25 Tage im Jahr

Ein Jahr hat 12 Monate.
365,25 / 12 = 30,4375 Tage im Monat

Eine Woche hat 7 Tage.
30,4375 / 7 = 4,34821429 Wochen im Monat

Nun wird die Arbeitszeit errechnet, die man im Mittel in einem Monat verrichtet, indem man die Wochen pro Monat mit der WAZ multipliziert:
4,34821429 * 40 = 173,9285714 Stunden im Monat

Und zu guter Letzt wird das Monatsentgelt durch die Stunden im Monat geteilt, was den übers Jahr immer gleichen Stundensatz ergibt:
2.500 / 173,9285714 = 14,37371663 ≈ 14,37 Euro Brutto pro Stunde

Alternativ kann man den Stundensatz auch mittels Jahresentgelt und täglicher Arbeitszeit ermitteln. Dafür werden dann die Arbeitstage des Jahres genutzt. Am Beispiel von oben macht das 30.000 € und bei 5 Arbeitstagen 8 Stunden am Tag.

Für die Herleitung der Arbeitstage des Jahres braucht man einmalig eine bereits nach erster Methode erfolge Berechnung des Stundensatzes, an der Zahl ~260,89 ändert sich dann aber nichts mehr.

Es braucht einen korrekt berechneten Stundensatz, welcher mit der täglichen Arbeitszeit multipliziert wird:
14,37371663 * 8 = 114,9897331 Euro am Tag

Das Jahresentgelt wird dann durch den Verdienst pro Tag geteilt:
30.000 / 114,9897331 = 260,8928571 ≈ 260,89 Arbeitstage pro Jahr

Urlaubstage und Feiertage brauchen in der Berechnung nicht berücksichtigt zu werden, denn diese werden ebenfalls voll vergütet, als wenn man an dem Tag am Arbeitsplatz gewesen wäre.

Veröffentlicht unter Coding, Sonstiges | Verschlagwortet mit | Kommentare deaktiviert für Stundensatz bei monatlichem Festgehalt berechnen

File Thingie – Syntax-Highlighting mit Ace-Editor

Als webbasierter Dateimanager kommt bei mir nach wie vor aufgrund seiner Einfachheit bevorzugt File Thingie zum Einsatz (Download Version 2.5.7). Diesen nutze ich auch gerne, um mal kurz was am Code bestimmter Dateien zu ändern, wenn ich grade keinen FTP-Zugang zum Server habe. Aber leider besteht der Standard-Editor nur aus einem Textfeld, und die im vorigen Beitrag angesprochenen Editor-Plugins wollte ich nicht nutzen, da ich WYSIWYG-Editoren nicht mag und für Code auch gar nicht gebrauchen kann.

Mit Ace gibt es aber auch einen reinen Code-Editor mit sehr gutem Funktionsumfang wie Syntax Highlighting für mehr als 110 Sprachen, verschiedene Themes sowie jede Menge weiterer Anpassungsmöglichkeiten. Dieser muss allerdings erst in File Thingie integriert werden. Nachfolgend möchte ich die dafür nötigen Änderungen aufzeigen.

Anforderungen
– Alle in File Thingie zur Bearbeitung freigegebenen Dateitypen sollen mit Ace dargestellt werden.
– Es soll je nach geöffneter Datei die korrekte Sprache für Syntax Highlighting geladen werden.
– Möglichst wenig Änderungen an der Funktionsweise von File Thingie selbst

Umsetzung
Zuerst müssen in der config.php die Dateitypen festgelegt werden, welche mit File Thingie bearbeitet werden sollen. Dafür sind an 2 Stellen Anpassungen erforderlich:

$ft["settings"]["FILETYPEBLACKLIST"] = ""; // File types that are not allowed for upload.

Nicht vom Kommentar irritieren lassen, diese Option gilt nicht nur für den Upload, sondern die hier eingegebenen Dateitypen werden generell nicht angezeigt.

$ft["plugins"]["edit"] = array(
  "settings" => array(
    "editlist" => "txt html htm css php js xml",
    "converttabs" => FALSE
  )
);

Danach geht es weiter mit der Datei edit.plugin.php im plugins-Verzeichnis. Der Editor in File Thingie ist eine einfache textarea. Diese kann von Ace aber nicht direkt verarbeitet werden. Ace ist für die Nutzung mit Containern wie div oder pre ausgelegt. Daher ist es erforderlich, ein neues div anzulegen.

In dieser Datei ist zusätzlich noch die Ermittlung des Dateityp erforderlich. Dazu wird ein zusätzliches verstecktes Eingabefeld angelegt, in welchem nur die Dateiendung der aktuell geladenen Datei gespeichert wird.

// Make form or show lock message.
$split_file = explode(".",$_REQUEST['file']);
$file_ext = $split_file[sizeof($split_file)-1];
$str .= '<form id="edit" action="'.ft_get_self().'" method="post">
  <div>
    <textarea cols="76" rows="20" name="filecontent" id="filecontent">'.$filecontent.'</textarea>
    <div name="ace_editor" id="ace_editor">'.$filecontent.'</div>
  </div>
  <div>
    <input type="hidden" name="file_ext" id="file_ext" value="'.strtolower($file_ext).'"</>
    <input type="hidden" name="file" id="file" value="'.$_REQUEST['file'].'" />
    <input type="hidden" name="dir" id="dir" value="'.$_REQUEST['dir'].'" />
    <input type="hidden" name="act" value="savefile" />
    <button type="button" id="save">'.t('Save').'</button>
    <input type="submit" value="'.t('Save &amp; exit').'" name="submit" />
    <input type="submit" value="'.t('Cancel').'" name="submit" />
    <input type="checkbox" name="convertspaces" id="convertspaces"'.($ft['plugins']['edit']['settings']['converttabs'] == TRUE ? ' checked="checked"' : '').' /> <label for="convertspaces">'.t('Convert spaces to tabs').'</label>
    <div id="savestatus"></div>
  </div>
</form>';				  

Zu guter Letzt muss in der Datei ft2.php der Ace-Editor eingebunden, aktiviert und der Inhalt des neuen Editor-div in die “alte” textarea übertragen werden, damit die Änderungen auch gespeichert werden. Die textarea selbst wird ausgeblendet, damit nicht zwei Eingabebereiche ausgegeben werden. Zusätzlich wird geprüft, um welchen Dateityp es sich handelt, um die Syntax Highlighting Regeln für die entsprechende Sprache zu laden.

	<style type="text/css">
	  @import "css/ft.css";
    <?php echo implode("\r\n", ft_invoke_hook('add_css'));?>
	</style>
    <style type="text/css" media="screen">
      .ace_editor {
        position: relative !important;
        border: 1px solid lightgray;
        margin: auto;
        height: 600px;
        width: 800px;
      }
    </style>
    </head>
<body>

	<?php echo $str;?>
  <?php echo ft_make_scripts_footer();?>
  <?php echo implode("\r\n", ft_invoke_hook('destroy'));?>
<script src="./js/ace-builds/src/ace.js" type="text/javascript" charset="utf-8"></script>
<script>
  var editor = ace.edit("ace_editor");
  editor.setTheme("ace/theme/twilight");
  var file_ext = document.getElementById("file_ext").value;
  switch(file_ext) {
    case "php":
      editor.session.setMode("ace/mode/php");
      break;
    case "js":
      editor.session.setMode("ace/mode/javascript");
      break;
    case "htm":
    case "html":
      editor.session.setMode("ace/mode/html");
      break;
    case "css":
      editor.session.setMode("ace/mode/css");
      break;
    case "xml":
      editor.session.setMode("ace/mode/xml");
      break;
    default:
      editor.session.setMode("ace/mode/text");
  }
  var textarea = $('textarea[name="filecontent"]').hide();
  editor.getSession().setValue(textarea.val());
  editor.getSession().on('change', function(){
    textarea.val(editor.getSession().getValue());
  });
  editor.setPrintMarginColumn(false);
  </script>
</body>
</html>

Die erforderlichen Dateien für Ace kann man von der Webseite beziehen und beispielsweise im Unterverzeichnis js ablegen (wie im Code dargestellt). Möchte man weitere Dateitypen zur Bearbeitung freigeben, müssen die neuen Endungen wieder in der config.php freigegeben und in der ft2.php als neuer case ergänzt werden.

Veröffentlicht unter Coding, Hobby, Software | Verschlagwortet mit | Kommentare deaktiviert für File Thingie – Syntax-Highlighting mit Ace-Editor

MoWeS Portable startet nicht unter Windows 10 Version 1607

Habe zum Ende der kostenlosen Wechselphase noch schnell das Upgrade von Windows 7 auf Windows 10 durchgeführt. Kurz darauf folgte dann auch das Anniversary Update (Version 1607).

Nun wollte ich mal wieder MoWeS starten, da ich es trotz veralteter Apache und PHP Version dennoch gerne als schnell verfügbares Testsystem für einige Sachen nutze.

Nun musste ich leider feststellen, dass der Apache Dienst nicht mehr startet.

MoWeS-Status

Nach ein wenig Recherche war der Grund schnell gefunden: der WWW-Publishingdienst ist in Windows 10 standardmäßig aktiviert und blockiert den Port 80. Somit kann Apache in der Default-Konfiguration nicht starten.

Vorübergehend Abhilfe kann man sich über die Konsole verschaffen. CMD mit Admin-Rechten starten und folgendes eingeben:

net stop w3svc

Anschließend MoWeS bzw. die Server neu starten. Nun sollte alles wieder laufen.

Dies hilft aber nur temporär. Nach dem nächsten Neustart von Windows ist der WWW-Publishingdienst wieder aktiviert. Wer ihn dauerhaft abschalten möchte, muss den Dienst deaktivieren. Dazu gibt man in der Windows Suche bzw. Cortana das Wort Dienste ein und sollte eine passende Desktop-App finden. Diese öffnen und nach dem Eintrag WWW-Publishingdienst suchen. Mit der rechten Maustaste in die Eigenschaften wechseln und dort den Dienst von Starttyp Automatisch auf Deaktiviert ändern.

WWW-Dienst

Nach dem nächsten Neustart von Windows bleibt der Dienst abgeschaltet und man kann sofort mit MoWeS oder anderen WAMP-Installationen loslegen.

Veröffentlicht unter Hobby, Software, Technik | Verschlagwortet mit , , , , , | Kommentare deaktiviert für MoWeS Portable startet nicht unter Windows 10 Version 1607

WordPress Fehlermeldungen nach Update auf Version 4.6

Grade das neue Update auf WordPress Version 4.6 installiert und feststellen müssen, dass anschließend Fehler-/Warnmeldungen auf der Seite und im Admin-Panel angezeigt werden. In der wp-config.ini nachgesehen, ob hier falsche Einstellungen vorliegen, aber daran lag es schonmal nicht:

@ini_set('display_errors', 0);
define('WP_DEBUG', false);

Nach etwas Suchen bin ich dann aber auf WordPress.org fündig geworden. Im Ticket #37680 wurde der Fehler erfasst und auch ein funktionierender Workaround veröffentlicht.

Nach den vorgeschlagenen Änderungen an der Datei load.php ist das Problem behoben. Mit dem nächsten Update auf 4.6.1 soll der Wordaround auch offiziell verteilt werden, aber bis dahin kann es noch ein paar Tage dauern.

Alternativ kann man auf seinem Server auch in der php.ini die Nutzung von ini_get_all() aktivieren, sofern man die Möglichkeit hat. Hier auf Pytal kann man die Einstellungen nicht eigenständig ändern, sondern ist auf den Serverbetreiber angewiesen.

Veröffentlicht unter Blog, calumoth.de, Coding | Verschlagwortet mit , | Kommentare deaktiviert für WordPress Fehlermeldungen nach Update auf Version 4.6