Connect with us

Künstliche Intelligenz

Kine‑Exakta: Die erste Spiegelreflexkamera fürs Kleinbild


Die wegweisende Konstruktion der Exakta wurde zur Blaupause nachfolgender SLR-Generationen. Zum ersten Mal zeigte eine Kleinbildkamera ein Sucherbild, das exakt dem späteren Foto entsprach. Die Mattscheibe mit ihrem stets gültigen Reflexbild definierte das fotografische Arbeiten neu. Schärfe, Schärfeverlauf und Bildkomposition ließen sich präzise beurteilen – und das für alle Brennweiten gleichermaßen, ganz ohne externe Hilfsmittel.

Jahrzehnte später, im Zeitalter grafischer Benutzeroberflächen, bezeichnete das Akronym WYSIWYG (What you see is what you get) eine vergleichbare Errungenschaft in der Computerwelt. Ihagee wählte eine schlichtere Terminologie und verkündete das Ende der „Blindfotografie“. Photo Porst, damals das „größte Photohaus der Welt“, griff dies auf und bewarb die Kine-Exakta als „Kamera der Zukunft“.


Bernd Kieckhöfel

Bernd Kieckhöfel

Bernd Kieckhöfel beschäftigt sich seit 2014 mit der Adaption alter Objektive. Aktuell faszinieren ihn Optiken aus Filmkameras und Kino-Projektoren. Er hat seine Erfahrungen in mehreren Büchern veröffentlicht und schreibt für verschiedene Magazine.

Wer damals mit Sucherkameras fotografierte – sei es mit einer Leica, Contax oder anderen Modellen –, kannte das Parallaxen-Dilemma. Bei Normalbrennweiten ermöglichte der Sucher zwar eine hinreichend genaue Einschätzung, doch im Nahbereich setzte die Physik Grenzen: Während der Sucher die Blüte einer Rose anvisierte, bildete das leicht versetzt angeordnete Objektiv lediglich den Stängel ab. Weitwinkel- und Teleobjektive erforderten zudem separate Aufstecksucher. Zubehör wie Entfernungsmesser und Schärfentiefentabellen halfen zwar, doch um Bildausschnitt und Wirkung zuverlässig zu bestimmen, waren viel Erfahrung und ein kleiner Werkzeugkasten nötig.


Das war die Leseprobe unseres heise-Plus-Artikels „Kine‑Exakta: Die erste Spiegelreflexkamera fürs Kleinbild“.
Mit einem heise-Plus-Abo können Sie den ganzen Artikel lesen.



Source link

Künstliche Intelligenz

heise+ Expertentalk: Balkonkraftwerk – Solarenergie für Einsteiger


Wer heute Stromkosten sparen will, benötigt kein Eigenheim und keine komplizierte Solaranlage auf dem Dach. Balkonkraftwerke haben sich längst vom Nischenprodukt zur massentauglichen Lösung entwickelt. Doch zwischen Anmeldung, Montage und der Wahl der richtigen Module bleiben für viele Einsteiger wichtige Fragen offen. Welche Anlage passt zu meiner Ausrichtung? Was muss ich bei der Anmeldung im Marktstammdatenregister beachten? Und wie viel Ertrag ist an einem bewölkten Tag eigentlich realistisch?

Haben Sie Fragen zu Balkonkraftwerken? Am Mittwoch, 27. Mai 2026, liefern wir Ihnen ab 17 Uhr im Expertentalk die passenden Antworten. In unserem Live-Talk klären wir die wichtigsten Hürden und beantworten Ihre Fragen direkt im Stream.

Durch den Talk führt Sie Moderator Daniel Augustin. Als Experten mit dabei sind die c’t-Redakteure Jan Mahn und Sven Hansen. Ihre Fragen können Sie während der Live-Sendung direkt im Chat stellen oder auch gern vorab im Forum oder per E-Mail. Wir freuen uns auch über weitere Themenvorschläge.


Das war die Leseprobe unseres heise-Plus-Artikels „heise+ Expertentalk: Balkonkraftwerk – Solarenergie für Einsteiger“.
Mit einem heise-Plus-Abo können Sie den ganzen Artikel lesen.



Source link

Weiterlesen

Künstliche Intelligenz

C-Libraries in Java nutzen 3: Komplexe Anwendung, Fallstricke und Best Practices


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Javas Foreign Function & Memory API (FFM) dient dazu, auf Code in einer Shared Library beziehungsweise DLL zuzugreifen, der in einer Programmiersprache wie C oder Rust geschrieben ist. Allerdings muss der Code dazu einige Voraussetzungen erfüllen.

Weiterlesen nach der Anzeige




Rudolf Ziegaus ist Software-Entwickler, Java-Trainer und Geschäftsführer der IO Software GmbH. Seine Lieblingsthemen sind PKi, Kryptographie und systemnahe Programmierung.

Diese dreiteilige Artikelserie zeigt anhand einer in C geschriebenen Demo-Library, wie eine Java-Anwendung die Funktionen der Bibliothek aufruft, welche Vorbereitungen erforderlich sind und welche Regeln zu beachten sind.

Nachdem die ersten beiden Teile die wichtigsten Begriffe und Techniken beim Zugriff von Java auf nativen Code via der FFM-API gezeigt haben, behandelt dieser dritte und letzte Teil einige Spezialitäten, die zu beachten sind.

Es gibt Anwendungen, die nicht das vollständige MemorySegment benutzen sollen, sondern nur einen Teil davon – beispielsweise wenn sie eine Liste übergeben bekommen, aber nur Teile davon benötigen. Dann ist es praktisch, wenn man nicht immer auf das komplette Array zugreifen muss, sondern sich eine Art View über den Speicherbereich legen kann – genau das leistet die Methode asSlice. Sie schneidet einen Bereich aus dem Segment aus und liefert ein neues Segment für diesen Bereich.

Wenn etwa ein MemorySegment 64 Byte lang ist, ließen sich folgendermaßen die letzten 16 Byte davon abrufen:

Weiterlesen nach der Anzeige


MemorySegment segment = arena.allocate(64);
MemorySegment info = segment.asSlice(48, 16);


segment enthält hier den gesamten Speicherbereich. Die Methode asSlice() schneidet die 16 Bytes ab Position 48 heraus.

Die Daten werden dabei aber nicht kopiert, sondern es entsteht eine View über den ausgewählten Bereich. Wenn sich der Inhalt des Bereichs ändert (im Beispiel der Bereich info), dann ändert sich auch der Originalspeicherbereich segment.

Ein Problem entsteht, wenn das Segment eine falsche Länge hat – mit reinterpret kann man die Länge des Segmentes neu festlegen. In manchen Fällen kann es vorkommen, dass das Segment mit der Länge 0 zurückgegeben wird, beispielsweise, wenn die native Funktion einen void*-Pointer zurückgibt. Ein Zugriff auf das Segment würde eine ArrayIndexOutOfBoundException auslösen. Daher muss man zunächst das Segment auf die richtige Länge setzen, was voraussetzt, dass sie bekannt ist.

Für folgendes Beispiel liefert die native Funktion getMemory() einen void*-Pointer auf einen Speicherbereich zurück. Außerdem ist bekannt, dass der Speicherbereich 100 Byte groß ist. Dann kann man folgendermaßen auf das Ergebnis zugreifen:


MemorySegment segment = (MemorySegment) method.invoke();
MemorySegment value = segment.reinterpret(100);
String result = value.getString(0);
System.out.println("Result getMemory:" + result);


Oft ist unklar, wie viele Byte ein Datentyp in C auf einer bestimmten Plattform belegt. Der folgende Code ruft die Größe des Datentyps auf der verwendeten Plattform ab. Der Code ermittelt alle unterstützten Datentypen und zeigt die benötigte Größe in Bytes und das Alignment für den Datentyp long an:


public void printTypeInfos()
{
  Map typeInfos = linker.canonicalLayouts();
  System.out.println("Canonical layout keys: " + 
                     typeInfos.keySet());
  printTypeInfo(typeInfos, "long");
}

private void printTypeInfo(Map typeInfos, 
                           String type)
{
  MemoryLayout typeLayout = typeInfos.get(type);
  if (typeLayout != null)
  {
    System.out.println("C '" + type + "' layout: " + typeLayout +  
                       ", size=" + typeLayout.byteSize() + ", 
                       align=" + typeLayout.byteAlignment());
  }
  else
  {
    System.out.println("Datentyp“ + type + " nicht in“  +  
    „canonicalLayouts() enthalten");
  }
}	


Wer eine Library auf mehreren Betriebssystemen plattformübergreifend nutzen möchte, sollte zunächst mit einem Betriebssystem beginnen und nach dem erfolgreichen Einsatz prüfen, ob die genutzten Funktionen sich auch unter den anderen Betriebssystemen problemlos verwenden lassen.

Ich musste beispielsweise bei meinem Projekt zum Zugriff auf das Hardware-Sicherheitsmodul (HSM) feststellen, dass die Portabilität zum Teil sehr problematisch ist, da sie von den verfügbaren Treibern und Shared Libraries abhängt. So war ein Zugriff auf ein HSM via opensc unter Linux kein Problem, während sich unter Windows einige Funktionen gar nicht nutzen ließen, sondern eine Access Violation in der JVM hervorriefen.

Falls es deutliche Unterschiede zwischen den Plattformen gibt, ist ein Weg, die Funktionen in einer gemeinsamen Basisklasse zu abstrahieren und dann in abgeleiteten Klassen für jede Plattform unterschiedlich zu gestalten.

Mögliche Probleme beim plattformübergreifenden Zugriff sind

  • unterschiedliche Größen der Datentypen,
  • unterschiedliche Größen von Strukturen,
  • unterschiedliches Alignment der Elemente in einer Struktur.

In diesem Fall ist der Zugriff auf den Sourcecode der Shared Library hilfreich. Sollte er nicht möglich sein, lassen sich bestimmte Informationen über die Größe der Datentypen auf der Zielplattform mithilfe der Methode printTypeInfos() ermitteln.

Während meiner Arbeit mit der Foreign Function & Memory API haben sich einige Best Practices herauskristallisiert. So ist es sinnvoll, zunächst mit einfachen Libraries und einfachen Funktionen anzufangen, bevor man sich an größere Libraries beziehungsweise komplexere Funktionen wagt.

Sinnvoll ist es Throwable abzufangen und in eigene Exceptions umzuwandeln, die von RuntimeException abgeleitet sind.

Wer die gleichen Funktionen aus der Library mehrfach benötigt, sollte Method-Handles in einer Map cachen, um nicht immer wieder dieselben Infos abrufen zu müssen. Strukturen sollte man immer per Adresse (ValueLayout.ADDRESS) übergeben und die Strukturen als eigene Klasse mappen, damit der Code übersichtlich bleibt.

Wenn Anwendungen Speicherbereiche allokieren müssen, sollte die Arena dafür möglichst weit oben in der Hierarchie stehen, und die Anwendung sollte die Arena mit try-with-resources erzeugen, damit die Freigabe des Speichers automatisch erfolgen kann.

Das Tool jextract sollte man besser meiden. Eine manuelle Implementierung ist einfacher zu verstehen und vor allem auch zu warten.

Wer den Sourcecode der Shared Library unter Kontrolle hat, sollte auf Datentypen wie int32_t und int64_t setzen, damit klar ist, wie viel Byte sie jeweils belegen.

Für größere Projekte kann es empfehlenswert sein, einen Basis-Layer für den Zugriff auf die C-Funktionen zu implementieren und in einem weiteren Layer die Zugriffschicht für Java draufzusetzen, die keinerlei FFM-spezifische Details mehr enthalten sollte. Bei sehr umfangreichen Projekten empfiehlt sich eine zusätzliche Komfortschicht, die die wichtigsten Use Cases kapselt.

Bei der Suche nach Fehlerursachen im Zusammenspiel zwischen Java und C mit der Foreign Function & Memory API helfen ein paar Fragen:

  • Ist der richtige Library-Pfad angegeben?
  • Ist es die richtige Shared Library (32 Bit oder 64 Bit)?
  • Lässt sich die Shared Library überhaupt laden?
  • Stimmen die Funktionsnamen?
  • Stimmen die Parameter (Anzahl und Datentypen) und der Rückgabewert überein?
  • Bei den Datentypen: Stimmen die Größen überein? Insbesondere der Datentyp long in C ist kritisch, da sich die Größe auf verschiedenen Plattformen unterscheidet – in Windows müssen Anwendungen ihn als JAVA_INT behandeln, unter Linux dagegen als ValueLayout.JAVA_LONG.



Source link

Weiterlesen

Künstliche Intelligenz

PV-Vorhersage für Home Assistant: E-Auto und smarte Geräte effizient laden


„Ich denke niemals an die Zukunft. Sie kommt früh genug“, soll Albert Einstein gesagt haben. Und er lag natürlich falsch. Denn wer über die Zukunft seiner PV-Erträge nachdenkt, kann seine smarten Geräte besser steuern. So läuft die Waschmaschine erst, wenn genug Sonnenstrom vorhanden ist und das E-Auto pausiert das Laden, wenn die Prognose schlecht aussieht.

  • Mit dem Dienst Forecast.Solar lassen sich PV-Ertragsprognosen direkt in die Smart-Home-Zentrale Home Assistant einbinden.
  • Für eine präzise Berechnung müssen spezifische Anlagendaten wie Standort, Neigungswinkel, Ausrichtung und Gesamtspitzenleistung hinterlegt werden.
  • Um Fehler und Systemausfälle zu vermeiden, sollte man mit einfachen Automationslogiken starten, anstatt das System direkt zu überfremden.

Dafür benötigt man präzise Ertragsprognosen. Diese liefert der Dienst Forecast.Solar: Er sagt vorher, wie viel Strom die eigene PV-Anlage in den nächsten Stunden oder Tagen produzieren könnte. Bindet man diese Daten in die kostenlose Smart-Home-Zentrale Home Assistant ein, lassen sich große Verbraucher wie E-Autos, Waschmaschinen oder Wärmepumpen besser steuern.

Wir zeigen, wie man Forecast.Solar einrichtet, die passende Integration in Home Assistant hinzufügt und im Energie-Dashboard verwendet. Als Beispiel erstellen wir eine simple Automation, wie Home Assistant eine Push-Nachricht aufs Handy schickt und den Nutzer über die aktuelle Prognose für morgen informiert. Schließlich gehen wir noch darauf ein, wie man anhand der Prognose sein E-Auto effizient laden kann.


Das war die Leseprobe unseres heise-Plus-Artikels „PV-Vorhersage für Home Assistant: E-Auto und smarte Geräte effizient laden“.
Mit einem heise-Plus-Abo können Sie den ganzen Artikel lesen.



Source link

Weiterlesen

Beliebt