Inch-Rechner, Zeitrechner und Programmierschnipsel

Inch-Rechner


Rechner für die Umrechnung von mil, inch, dpi, pixel/mm und der Berechnung von Mehrwertsteuerbeträgen. Die Benutzung erfolgt ohne Gewähr.

%
     
     
     
     
     

Zeitrechner


Zeitrechner für die Berechnung von Tagesdifferenzen und Wochentagen. Die Benutzung erfolgt ohne Gewähr.

Startdatum

Enddatum


 

Alter aus dem Geburtstag berechnen

Die folgende 'OpenOffice/StarBasic-Funktion' zeigt die Berechnung des ungefähren Alters einer Person ausgehend von einem gegebenen Geburtstag. Das Geburtstag steht jeweils in Spalte B.

StarBasic-Function =(DATWERT(TEXT(HEUTE();"TT.MM.JJJJ"))-DATWERT(TEXT($B1;"TT.MM.JJJJ")))/365,25

Flugsimulationen


Flugsimulator FS X unter Windows 10 installieren

Flugsimulator FS X Einstellungen in fsx.cfg

Game Controller unter Windows 10 konfigurieren

Raspberry Pi


Raspberry Pi 3B konfigurieren

Raspberry Pi Python GPIO-Support nachinstallieren

Raspberry Pi 3B Ein-/Ausschalter (GPIO3) und Statusanzeige (GPIO2)

Achtung: Der Schaltungsvorschlag kollidiert mit I2C1.

Alternative Lösungen bei I2C1-Nutzung

Raspberry Pi Media Center Kodi (ex XBMC)/OSMC installieren

Windows 10


Treiber CanoScan LiDE 25 mit TWIAN-Schnittstelle in Windows10 einrichten

iPhone und iOS


iPhone iOS-Update und Backup lassen sich nicht installieren

Es kommt vor, daß sich ein iOS-Update (hier von iOS 11 nach iOS 14 auf einem iPhone SE) trotz freiem Speichers (hier 1,9 GByte) nicht auf dem iPhone installieren lässt. Wenn man das Update mittels iTunes durchführt, kann das Update mit dem "Unbekannten Fehler 14" abbrechen und das iPhone funktionslos im Wartungsmodus hinterlassen.
Der Wiederherstellungsprozess mit iTunes kann das iPhone mit iOS 14 reaktivieren, aber in meinem Fall lies sich das Backup mit den Benutzerdaten nicht mehr einspielen. Es trat hierbei der "Fehler 0xE800000A" (Backup kann nicht gelesen oder nicht geschrieben werden) auf.

Zu den bekannten Lösungshinweisen kann folgende Prüfung und Lösung ergänzt werden: Zum Zeitpunkt X (vor ca. 3 Jahren bei der Erstinstallation) wurde mit der damaligen iTunes-Version ein lokales Backup in das Verzeichnis %appdata%\Apple Computer\MobileSync\Backup\<ID> erstellt. Zum Zeitpunkt Y (heute) wurde vor dem obigen Update wiederum ein Backup mit der heute aktuellen iTunes-Version erstellt. Dieses Backup wurde von iTunes aus unbekannten Gründen allerdings in das Backup-Verzeichnis vom Zeitpunkt X erstellt, erkennbar an den zwei verschiedenen Zeitstempeln der Dateien. Das eigentliche Problem liegt nun darin, daß iTunes beim Restore versucht, dieses "doppelte" Backup (ca. 8 GByte, also viel zu groß für das 16 GByte-iPhone SE in diesem Falle) auf das iPhone zurückzuspielen und es kommt obiger Fehler. Die Lösung ist einfach, indem aus dem "doppelten" Backup-Ordner die Dateien mit dem Zeitstempel X wegbewegt werden. Dazu kann im Dateiexplorer nach allen Dateien gesucht werden und die Suchergebnisse nach dem Datum sortiert werden. Die überzählichen Dateien werden markiert und wegbewegt oder gelöscht. Damit war ein Restore des Backups vom Zeitpunkt Y nun möglich.

Fotos aus iPhone Backup extrahieren und sortieren

Legt man ein iPhone Backup mit iTunes an, sind in diesem Backup auch alle Fotos enthalten. Mittels folgendem Python-Script werden diese nach dem Aufnahmetag sortiert in ein neues Verzeichnis extrahiert:

from exif import Image
from shutil import copyfile
import datetime, os

src_dir_path = r'.\iPhone\48xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx28'
dst_dir_path = r'.\Fotos'

if not os.path.exists(dst_dir_path):
  try:
    os.mkdir(dst_dir_path)
  except OSError:
    print ("Creation of the directory %s failed" % dst_dir_path)
for root, dirs, files in os.walk(src_dir_path):
  for file_name in files:
    src_path = os.path.join(root, file_name)
    with open(src_path, 'rb') as my_file:
      try: my_image = Image(my_file)
      except: pass
      else:
        if my_image.has_exif:
          try:
            my_date = datetime.datetime.strptime(my_image.datetime_original, '%Y:%m:%d %H:%M:%S')
            dst_path = dst_dir_path + '\\' + my_date.strftime('%Y_%m%d')
            if not os.path.exists(dst_path):
              try:
                os.mkdir(dst_path)
              except OSError:
                print ("Creation of the directory %s failed" % dst_path)
            dst_path = dst_path + '\\' + file_name + '.jpg'
            try:
              copyfile(src_path, dst_path)
              print(src_path + ' ' + dst_path + ' copied')
            except IOError as e:
              print("Unable to copy file. %s" % e)
            except:
              pass
          except: pass

Programmierschnipsel


Wolkwolke aus Excel in HTML

Das folgende VBA for Excel-Script erzeugt aus einer Excel-Tabelle eine Wortworke als HTML, welche direkt im Standardbrowser Firefox dargestellt wird. Hintergrund war die Aufgabe, eine Wortwolke in kurzer Zeit aufzubereiten und zu präsentieren. Die seitenfüllende Volbild-Ansicht erreicht man im Firefox mit F11. Eine korrekte Darstellung im InternetExplorer ist nicht realisiert. Eine Skalierung erfolgt soweit möglich automatisch, indem der Nutzer im Excel-File ein Verhältnis vorgibt, mit dem mehr oder weniger große Wörter generiert werden. Dies hat direkten Einfluß auf die Anzahl der dargestellten Wörter. Überhängende Worte werden in einen bei der Präsentation nicht sichtbaren Bereich gezwängt.

Als Hintergrund findet eine skalierbare SVG-Grafik Verwendung. Diese wurde mit InkScape erstellt und muß, damit sie als Objekt skalierbar wird, mit einem viewBox-Element erweitert werden.

Das Script arbeitet folgendermaßen:

Und so sieht die generierte HTML-Seite aus

Quellen

XLS-File (Excel-File mit VBA-Script)
SVG-Grafik
VBA-Script

Option Explicit
' DLL zum Ausführen von Programmen deklarieren
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
       (ByVal hwnd As Long, ByVal lpOperation As String, _
        ByVal lpFile As String, ByVal lpParameters As String, _
        ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Sub ErzeugeWortwolke()
  'Ein/Ausschalten der Tranzparenz der Verdränger für Layoutansicht, mögliche Werte 0/1
  Const iTranzparenz = 1
  
  Dim MyFile, MyFileNum
  Dim iCounter, iMaxHaeufigkeit, iMinHaeufigkeit, iHaeufigkeit, iHervorhebung, iSkalierung As Integer
  Dim strFontSize1, strFontSize2, strFontSize3, strFontSize4, strFontSize5 As String
  Dim strTranzparenz, strWort As String
  
  ' Erzeuge Wortliste als HTML-Datei
  MyFile = ThisWorkbook.Path & "\Wortwolke.html"
  
  ' Minimum und Maximum der Häufigkeit des Auftretens der Wortbausteine ermitteln
  iMaxHaeufigkeit = MaxHaeufigkeit()
  iMinHaeufigkeit = MinHaeufigkeit()
    
  ' Manuelle Skalierung berechnen
  If ((Cells(1, 5).Value = "") Or (Not IsNumeric(Cells(1, 5).Value))) Then
    MsgBox "Keine Skalierung in Zelle E1 angegeben", vbOKOnly, "Fehler"
  Else
    ' FontSize Dimensionierung aus Skalierung abschätzen
    strFontSize1 = Str(Round(1.5 * Cells(1, 5).Value / 100, 1))
    strFontSize2 = Str(Round(1.8 * Cells(1, 5).Value / 100, 1))
    strFontSize3 = Str(Round(2.4 * Cells(1, 5).Value / 100, 1))
    strFontSize4 = Str(Round(2.9 * Cells(1, 5).Value / 100, 1))
    strFontSize5 = Str(Round(3.5 * Cells(1, 5).Value / 100, 1))
  
    ' HTML File anlegen
    MyFileNum = FreeFile()
    Open MyFile For Output As #MyFileNum
    
    ' HTML Kopf schreiben
    Print #MyFileNum, "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"">"
    Print #MyFileNum, "<html>"
    Print #MyFileNum, "  <head>"
    Print #MyFileNum, "    <title>Wortwolke</title>"
    
    ' Stylesheets definieren -> 5 Elemente zur Zeit, 1280 pixel breit
    Print #MyFileNum, "    <style type=""Text/css"">"
    Print #MyFileNum, "      #tagcloud {  text-align:top;  width:100%; } "
    Print #MyFileNum, "      .tag1 { font-size:" & strFontSize1 & "em; color:#C0C0C0; margin: 0.3em;}"
    Print #MyFileNum, "      .tag2 { font-size:" & strFontSize2 & "em; color:#A0A0A0; margin: 0.3em; }"
    Print #MyFileNum, "      .tag3 { font-size:" & strFontSize3 & "em; color:#808080; margin: 0.3em; }"
    Print #MyFileNum, "      .tag4 { font-size:" & strFontSize4 & "em; color:#606060; margin: 0.3em; }"
    Print #MyFileNum, "      .tag5 { font-size:" & strFontSize5 & "em; color:#404040; margin: 0.3em; }"
    Print #MyFileNum, "    </style>"
    Print #MyFileNum, "  </head>"
    
    ' HTML aufbauen
    Print #MyFileNum, "  <body>"
    Print #MyFileNum, "    <div id=""tagcloud"">"
    
    ' Verdränger aufbauen
    If iTranzparenz = 0 Then
      strTranzparenz = "background-color:#CCCCCC; border:solid; border-width:1px; "
    Else
      strTranzparenz = "background-color:transparent; "
    End If
    
    ' Hintergrund Grafix als SVG einbinden
    Print #MyFileNum, "      <span style=""position:absolute; left:0px;  float:left;  height:100%; width:100%; z-index:-1;"">"
    Print #MyFileNum, "        <object data=""Wortwolke.svg"" type=""image/svg+XML"" width=""100%"" height=""100% "">"
    Print #MyFileNum, "          Ihr Browser kann SVG-Objekte leider nicht anzeigen. Nutzen Sie Firefox 3 oder höher!"
    Print #MyFileNum, "        </object>"
    Print #MyFileNum, "      </span>"

    ' Verdränger Horizontale Ebene 1
    Print #MyFileNum, "      <span style=""position:relative; left:0px;  float:left;  height:10%; width:100%; " & strTranzparenz & " ""></span>"
    
    ' Verdränger Horizontale Ebene 2
    Print #MyFileNum, "      <span style=""position:relative; left:0px;  float:left;  height:20%; width:20%;  " & strTranzparenz & " clear:left;""></span>"
    Print #MyFileNum, "      <span style=""position:relative; right:0px; float:right; height:20%; width:10%;  " & strTranzparenz & " ""></span>"
    
    ' Verdränger Horizontale Ebene 3
    Print #MyFileNum, "      <span style=""position:relative; left:0px;  float:left;  height:15%; width:10%;  " & strTranzparenz & " clear:left;""></span>"
    Print #MyFileNum, "      <span style=""position:relative; right:0px; float:right; height:15%; width:5%;   " & strTranzparenz & " ""></span>"
    
    ' Verdränger Horizontale Ebene 4
    Print #MyFileNum, "      <span style=""position:relative; left:0px;  float:left;  height:25%; width:5%;   " & strTranzparenz & " clear:left;""></span>"
    Print #MyFileNum, "      <span style=""position:relative; right:0px; float:right; height:25%; width:2%;   " & strTranzparenz & " ""></span>"
    
    ' Verdränger Horizontale Ebene 5
    Print #MyFileNum, "      <span style=""position:relative; left:0px;  float:left;  height:10%; width:8%;   " & strTranzparenz & " clear:left;""></span>"
    Print #MyFileNum, "      <span style=""position:relative; right:0px; float:right; height:10%; width:18%;  " & strTranzparenz & " ""></span>"
    
    ' Verdränger Horizontale Ebene 6
    Print #MyFileNum, "      <span style=""position:relative; left:0px;  float:left;  height:10%; width:10%;  " & strTranzparenz & " clear:left;""></span>"
    Print #MyFileNum, "      <span style=""position:relative; right:0px; float:right; height:10%; width:23%;  " & strTranzparenz & " ""></span>"
    
    ' Verdränger Horizontale Ebene 7
    Print #MyFileNum, "      <span style=""position:relative; left:0px;  float:left;  height:400; width:100%; " & strTranzparenz & " ""></span>"
    
    ' Wortbausteine in Wortwolke schreiben
    iCounter = 1
    While (Cells(iCounter, 1).Value <> "")
      ' Häufigkeit aus Zellen lesen
      strWort = Cells(iCounter, 1).Value
      iHaeufigkeit = Cells(iCounter, 2).Value
      
      ' Hervorhebung und Gruppierung der Häufigkeit bestimmen
      iHervorhebung = Int((iHaeufigkeit - iMinHaeufigkeit) / (iMaxHaeufigkeit - iMinHaeufigkeit) * 4) + 1
      
      ' .. und als SPAN-Element ausgeben
      Print #MyFileNum, "      <span class=""tag" & iHervorhebung & """>" & strWort & "</span>"
      iCounter = iCounter + 1
    Wend
    
    ' HTML schließen
    Print #MyFileNum, "    </div>"
    Print #MyFileNum, "  </body>"
    Print #MyFileNum, "</html>"
    
    ' HTML File schließen
    Close #MyFileNum
  
    ' Erzeugtes HTML File im Browser öffnen
    ShellExecute Application.hwnd, "Open", MyFile, vbNullString, vbNullString, vbNormalFocus
  End If
End Sub

Function MinHaeufigkeit()
  Dim iCounter, iMinInt
  
  iMinInt = 0
  iCounter = 1
  iMinInt = Cells(iCounter, 2).Value
  iCounter = 1
  While (Cells(iCounter, 1).Value <> "")
    If iMinInt > Cells(iCounter, 2).Value Then
      iMinInt = Cells(iCounter, 2).Value
    End If
    iCounter = iCounter + 1
  Wend
  MinHaeufigkeit = iMinInt
End Function

Function MaxHaeufigkeit()
  Dim iCounter, iMaxInt
  
  iMaxInt = 0
  iCounter = 1
  While (Cells(iCounter, 1).Value <> "")
    If iMaxInt < Cells(iCounter, 2).Value Then
      iMaxInt = Cells(iCounter, 2).Value
    End If
    iCounter = iCounter + 1
  Wend
  MaxHaeufigkeit = iMaxInt
End Function

Playlist


Retro PC

PCjs
Good Old Games
Richis Lab
Sinclair Spectrum
Visual6502
Bizzley
The 8-Bit Guy
Machinae Supremacy - Gianna Sisters
16-Bit Wave
C64 Music
C64 SID Collection

Music

Nightwish - The Greatest Show on Earth
Dean Kopri - Weak Élan Fantasy (Tambura cover)
Dean Kopri - Last ride of the day (Tambura cover)
Kebu - Bladerunner End Theme
Carlos Trilha - Pulstar
Popcorn!
Space - Magic Fly
Marble Machine
The Motors - Airport
The Tornados - Telstar
Apache - The Shadows
Neil LeVang - Ghost Riders In The Sky
Spaghetti Western Orchestra
Spaghetti Western

Papercraft

Kranich Modelle
MDK-Verlag
Schreiber Modelle
Wilhelmshavener
Kartonmodellshop