Juli 6, 2023

Node js und der fetch

IpV4 vs IPV6

Weiterlesen
Juni 20, 2022

PythonDF

PDF hacking in Python

Weiterlesen
November 2, 2021

Fun with HTML5

making some noise

Weiterlesen
Juli 27, 2021

Mit Node.js gegen den Rest der Welt

Heute: easy SFTP Upload

Weiterlesen
Cover Image

Node js und der fetch

IpV4 vs IPV6

Juli 6, 2023 - Lesezeit: ~1 Minute

Wenn man in Node JS schnell mal nen fetch absetzten will und der dann auf einen lokalen Server geht, kann man ja schnell mal Localhost einsetzen. Das ist aber tricky, wenn der Server nur auf IPV4 hört, da NodeJS dann versucht über IPV6 zu verbinden.

Einfache Lösung: 0.0.0.0 eintragen, dann nimmt NodeJS auch die IPV4 Adresse. Nett.


Cover Image

PythonDF

PDF hacking in Python

Juni 20, 2022 - Lesezeit: 11 Minuten

Das PDF Format ist ein hervorragendes Format um Dokumente nicht nur per Email zu transportieren, sondern auch zum Drucken oder Archivieren. Die Unterstützung dieses Formats ist inzwischen so ziemlich überall verfügbar. Daher ist es naheliegend, dass auch Symolo dieses Format vollständig unterstützt. Intern wird zum Beispiel jeder einzelne Druckauftrag zuerst als PDF abgebildet und dann an den Drucker weitergereicht. Das bedeutet, dass immer die Möglichkeit zur Verfügung steht, dass gegebenenfalls das Dokument auch nur gespeichert wird oder zusätzlich als Archiveintrag hinterlegt werden kann. Zudem ist das zu erwartende Druckbild immer schon vorher ersichtlich. C# bietet hier schon seit langem Bibliotheken, die aus Java übernommen wurden. Jetzt ist es immer recht aufwendig in C# einfache Aufgaben mit PDFs zu erledigen, da dann immer erstmal ein komplettes Projekt aufgemacht werden muss und wir die ganzen großartigen Typenprüfungen haben. Mit Python kann man meistens schneller ein Prototyp entwickeln und die Logik grundsätzlich mal prüfen, bevor das Ganze dann sauber als C# in den Symoloserver wandert. Alternativ kann man natürlich auch das Python in de Server verfrachten und nutzen. Dazu ist gar nicht so viel notwendig.

Wie immer geht es mit entsprechenden Bibliotheken los:

import pdfplumber
from PyPDF2 import PdfFileWriter, PdfFileReader  # pip install PyPDF2

Plumber wird hierbei für die Analyse verwendet und PyPDF2 für die Verwaltung der Datei.

Fangen wir mal mit der Verwaltung an. Möchte man z.B. die Dateien in einzelne Seiten splitten ist das jetzt ganz einfach:

infile = "<myFile>.pdf"

input_pdf = PdfFileReader(open(infile, "rb"))

counter = 0

for p in input_pdf.pages:
    outfile = "data/Output_" + str(counter) + ".pdf"
    output_file = open(outfile, "wb")
    output = PdfFileWriter()
    output.addPage(p)
    counter += 1
    output.write(output_file)

Die Analyse des Inhaltes kann, mithilfe von pdfplumber, genauso einfach erfolgen:

FileToUse = "<myFileToUse>.pdf"  # sys.argv[1]

pdfText = ""

with pdfplumber.open(FileToUse) as pdf:

    for page in pdf.pages:
        pdfText += page.extract_text()

print(pdfText)

Und schon kann man die Text zum Beispiel mithilfe von Regex einfach analysieren und Informationen aus den Dateien gewinnen.

Hier sollte vielleicht noch erwähnt werden, dass das Verfahren so nicht auf Bilder in PDFs anwendbar ist. Entweder ist die PDF Datei einen elektronisch erstellte Datei oder es wurde nachträglich entsprechende OCR Daten angefügt. Für einen schnellen Test ist dieses Verfahren aber mehr als ausreichend. Wenn eine OCR Analyse benötigt wird, bringt der Symoloserver dafür bereits passende Funktionen mit. Da der Server ja unkompliziert via Python angesprochen werden kann, ist auch dann immer noch ein schnelles Prototypen unkompliziert realisierbar.


Cover Image

Fun with HTML5

making some noise

November 2, 2021 - Lesezeit: 25 Minuten

Jetzt gibt es soviele verschiedene Betriebssysteme und so viele unterschiedliche Musikplayerprogramme von VLC über mplayer oder der im Windows integrierte Grooveplayer. Nur sind die meisten Programme entweder nicht direkt installiert oder umständlich einzurichten, wollen ins Internet um irgendwas runterzuladen oder erstmal die ganze Festplatte durchsuchen. Ich will doch einfach nur ein paar mp3 Dateien anhören. Aber es gibt ja glücklicherweise den Browser, der das Abspielen von Musikdateien im HTML5 Standard ja bereits unterstützt. Super, also schnell die mp3 Datei gesucht und via Drag und Drop in den Browser ziehen und schon wird sie abgespielt. Nach 5 Minuten dann die nächste Datei draufziehen. Und dann nach 5 Min.? Genau: nächste Datei draufziehen. Nach 20 Min. war mir das dann zu doof und zu zeitaufwändig. Aber bis ich jetzt im Grooove mir was zusammengezogen habe und das Ganze dann noch für mein Linux und mein Androiden zusammengstellt habe, kam mir die Idee, warum nicht alles einmal fertig machen und auf jeder Plattform genießen. Also hab ich das Ganze mal in eine Website gepackt:

<audio id="audio" preload="auto" tabindex="0" controls="" type="audio/mpeg">
<source type="audio/mp3" src="./Voodoo Suite - Little Grass Shack.mp3">
Sorry, your browser does not support HTML5 audio.
</audio>

Ok, das war easy. Jetzt kann ich eine Datei abspielen. Die Datei muss im selben Ordner liegen und das Ganze kann, in zusammenarbeit mit einem einfachen Webserver, sogar schon gestreamt werden. Ist aber nur eine Datei, brauchen wir noch eine Playlist:

<ul id="playlist">
<li><a class='active'href="./Voodoo Suite - Little Grass Shack.mp3">Voodoo Suite - Little Grass Shack.mp3 (Local)</a></li>
<li><a href="https://files.freemusicarchive.org/storage-freemusicarchive-org/music/WFMU/Voodoo_Suite/blissbloodcom/Voodoo_Suite_-_03_-_Little_Grass_Shack.mp3">Voodoo_Suite_-_03_-_Little_Grass_Shack.mp3</a></li>
</ul>

Ok, jetzt haben wir eine Playlist. Wenn ich die aber anklicke, dann navigiert der Browser und ich bin soweit wie vorher. Dann packen wir doch einfach noch ein bisschen oldskool Javascript dazu:

<script>
  var audio;
  var playlist;
  var tracks;
  function init() {
    audio = document.querySelector('#audio');
    playlist = document.querySelector('#playlist');
    tracks = playlist.querySelector('li a');
    let links = playlist.querySelectorAll('a');
    links.forEach(e => {
      e.onclick = (evt) => {
        evt.preventDefault();
        playlink(e);
      }
    });
    audio.addEventListener('ended', function (e) {
      var current = playlist.querySelector('li a.active');
      var next = current.parentNode.nextElementSibling;
      if (next) {
        let e = next.querySelector('a');
        playlink(e);
      }
      else {
        let links = playlist.querySelectorAll('a');
        playlink(links[0]);
      }
    });
  }
  function playlink(link) {
    let e = link;
    playlist.querySelectorAll('a').forEach(l => { l.classList.remove("active") });
    e.classList.add("active");
    audio.src = e.getAttribute('href');
    audio.load();
    audio.play();
  }
  init();
</script>

So, jetzt kann ich mir in der Playlist aussuchen was ich will und die ganze Liste läuft solange ich nicht stoppe. Ich kann ich der Playlist entweder lokale Einträge verwenden oder Quellen aus dem Internet. Das Ganze lässt sich mithilfe eines Webservers bequem bedienen und funktioniert sogar mit der Xbox. Was will man mehr. Kein generve vom VLC für Updates oder das Verhalten des mplayers unter windows. Man muss nur seinen Browser aktuell halten und das war's schon.

Das Javascript in diesem Beispiel kann zweifelsohne noch deutlich verbessert werden. Ist aber für den vorliegenden Fall vollkommen ausreichend. Denn sonst hätt ich ja auch einen Player installieren können.


Cover Image

Mit Node.js gegen den Rest der Welt

Heute: easy SFTP Upload

Juli 27, 2021 - Lesezeit: 14 Minuten

Immer mal wieder hat man die Anforderung schnell mal ein paar Dateien von einem Rechner auf einen anderen zu laden. Besonders wenn dann noch das Internet beteiligt ist, ist man bestrebt das Ganze auch noch sicher ablaufen zu lassen. Damit entfällt die alte aber zuverlässige Methode des FTP. Aber dafür hat man ja SFTP. Nodejs macht es einem dann sogar recht einfach, da es bereits ein paar tolle Pakete dafür gibt. Eins davon hab ich dann heute mal eingesetzt und wieder lässt sich ein Anforderung in wenigen Zeilen elegant lösen. 

Installation

npm i sftp-upload

Danach eigentlich nur noch passend konfigurieren und fertig:

const SftpUpload = require('sftp-upload');

async function uploadFiles() {
  return new Promise((resolve=> {
    process.stdout.write('\r');
    new SftpUpload({
      host: '<HOST HERE>',
      username: '<USER HERE>',
      password: "<PASS HERE>",
      path: './',
      remoteDir: '/<DIR HERE>',
      excludedFolders: ['node_modules'],
      exclude: ['package-lock.json''package.json'],
      dryRun: false
    })
      .on('error', (err=>  {throw err;} )
      .on('uploading',  (progress=>  process.stdout.write('\r' + progress.percent + '% completed'))
      .on('completed', () => {
        process.stdout.write('\r');
        resolve();
      })
      .upload();
  });
}

(async () => {
  await uploadFiles();
  console.log("DONE");
})();

Lässt sich super für Kontinuierliche Integration einsetzen und man könnte das ganze jetzt mit dem Komprimieren passend kombinieren. Jetzt muss das Ganze nur noch zyklisch ausgeführt werden...