AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

ChatGPT - Wow! (Cron-Job)

Ein Thema von hschmid67 · begonnen am 3. Jul 2024 · letzter Beitrag vom 10. Jul 2024
Antwort Antwort
Seite 2 von 4     12 34   
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.519 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

AW: ChatGPT - Wow! (Cron-Job)

  Alt 4. Jul 2024, 07:50
Ich kannst nicht genau sagen, aber ich glaube ChatGPT 4o sollte kostenlos sein.
:https://openai.com/index/gpt-4o-and-more-tools-to-chatgpt-free/
Der Link ist kaputt. Richtig wäre:
https://openai.com/index/gpt-4o-and-...-chatgpt-free/
Thomas Mueller
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
275 Beiträge
 
#12

AW: ChatGPT - Wow! (Cron-Job)

  Alt 4. Jul 2024, 08:09
- Richtige Frage stellen
...
Hab das Gefühl, da scheitert es bei den meisten. Ich kann auch nur positives berichten. Natürlich spukt die KI kein fertiges Programm aus und natürlich muss man die Ergebnisse kontrollieren, aber da setze ich einfach mal genug gesunden Menschenverstand voraus.
Was ich auch schon oft festgestellt habe, wenn man seine Frage etwas offener stellt und die KI dadurch nicht so stark einschränkt, kommen über die Antwort oft Ansätze die man sonst vielleicht nicht verfolgt hätte, bzw. auf die man vielleicht nicht gekommen wäre.

Ich gehe auch oft gerne hin und werfe eine fertige Funktion in ChatGPT und frag nochmal wie er den Code unter dem Aspekt von Lesbarkeit, Performance und Aufbau findet und ob es aus seiner Sicht was zu verbessern gibt. So zu sagen Pair-Programming mit der KI. Das kann richtig laune machen und man kann sich dadurch selbst ständig verbessern.

My 2 Cents.

vG
PJM
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.969 Beiträge
 
Delphi 12 Athens
 
#13

AW: ChatGPT - Wow! (Cron-Job)

  Alt 4. Jul 2024, 13:34
Was ich auch schon oft festgestellt habe, wenn man seine Frage etwas offener stellt und die KI dadurch nicht so stark einschränkt, kommen über die Antwort oft Ansätze die man sonst vielleicht nicht verfolgt hätte, bzw. auf die man vielleicht nicht gekommen wäre.
Und/Oder der Frage entsprechend viele Positiv-Beispiele dabeilegen, die exakt beschreiben, was genau man eigentlich haben will und in welchem Format.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
865 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: ChatGPT - Wow! (Cron-Job)

  Alt 7. Jul 2024, 09:30
Ich habe ja in letzter Zeit öfter mal über KI gemeckert, besonders über Googles Bard bzw. jetzt Gemini. Aber Holladiwaldfee ... ChatGPT ist tatsächlich um Welten besser.

Da ich grade dabei bin, bei meiner Audio-Bibliothek auch Opus-Dateien zu unterstützen, habe ich für ein (bereits implementiertes) Teilproblem mal diese KIs befragt.

Mein Input: Kannst du mir eine Funktion in der Programmiersprache Delphi schreiben, die aus einer gegebenen Ogg-Datei die maximale absolute granule position ermittelt?

Gemini hat (mal wieder) irgendwelche nicht-existenten Klassen herbei-fantasiert und somit nutzlosen Code produziert.
Delphi-Quellcode:
unit OggGranulePosition;

interface
uses
  Windows,
  Messages,
  StdCtrls,
  ExtCtrls,
  OggVorbis;

implementation

function GetMaxGranulePosition(oggFileName: string): LongWord;
  var
    oggFile: TOggVorbisFile;
    oggStream: TOggVorbisStream;
    granulePosition: LongWord;
    granuleCount: LongWord;
    i: LongWord;
  begin
    oggFile := TOggVorbisFile.Create;
    try
      oggFile.Open(oggFileName, ofRead);

      oggStream := TOggVorbisStream.Create(oggFile);
      try
        granulePosition := 0;

        granuleCount := oggStream.Info.Packets;

        for i := 0 to granuleCount - 1 do
        begin
          granulePosition := Max(granulePosition, oggStream.Packets[i].Granulepos);
        end;

      finally
        oggStream.Free;
      end;

    finally
      oggFile.Free;
    end;

    Result := granulePosition;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Maximal absolute granule position: ' +
             IntToStr(GetMaxGranulePosition('C:\path\to\oggFile.ogg')));
end;

end.
ChatGPT liefert hingegen eine Struktur für den Ogg-Seitenheader, ermittelt nach einer Gültigkeits-Überprüfung daraus den gesuchten Wert. Dann wird korrekt die Größe der Seite berechnet, um sich seitenweise durch die Datei zu hangeln, um dann schließlich auf der letzten Seite den gesuchten Wert zu ermitteln.
Delphi-Quellcode:
program MaxGranulePosition;

uses
  Classes, SysUtils;

type
  TOggPageHeader = packed record
    CapturePattern: array[0..3] of AnsiChar;
    Version: Byte;
    HeaderType: Byte;
    GranulePosition: Int64;
    BitstreamSerialNumber: Cardinal;
    PageSequenceNumber: Cardinal;
    Checksum: Cardinal;
    PageSegments: Byte;
  end;

function ReadOggPageHeader(Stream: TStream; out Header: TOggPageHeader): Boolean;
begin
  Result := Stream.Read(Header, SizeOf(TOggPageHeader)) = SizeOf(TOggPageHeader);
end;

function GetMaxGranulePosition(const FileName: string): Int64;
var
  FileStream: TFileStream;
  OggPageHeader: TOggPageHeader;
  MaxGranulePosition: Int64;
  PageSegments: array of Byte;
  SegmentSize: Integer;
  I: Integer;
begin
  MaxGranulePosition := 0;
  FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    while FileStream.Position < FileStream.Size do
    begin
      if not ReadOggPageHeader(FileStream, OggPageHeader) then
        Break;

      if (OggPageHeader.CapturePattern <> 'OggS') then
        Break; // Invalid Ogg page

      if OggPageHeader.GranulePosition > MaxGranulePosition then
        MaxGranulePosition := OggPageHeader.GranulePosition;

      SetLength(PageSegments, OggPageHeader.PageSegments);
      FileStream.Read(PageSegments[0], OggPageHeader.PageSegments);

      SegmentSize := 0;
      for I := 0 to OggPageHeader.PageSegments - 1 do
        Inc(SegmentSize, PageSegments[I]);

      FileStream.Seek(SegmentSize, soFromCurrent);
    end;
  finally
    FileStream.Free;
  end;
  Result := MaxGranulePosition;
end;

var
  FileName: string;
  MaxGranule: Int64;
begin
  Write('Enter the Ogg file path: ');
  ReadLn(FileName);
  try
    MaxGranule := GetMaxGranulePosition(FileName);
    WriteLn('Max Granule Position: ', MaxGranule);
  except
    on E: Exception do
      WriteLn('Error: ', E.Message);
  end;
  ReadLn;
end.
Meine bisherigen Methode, vom Ende der Datei aus den letzten Ogg-Header zu suchen, ist zwar schneller, wenn die Seitengröße klein ist. Aber wenn die fehlschlägt (warum auch immer) ist das, was ChatGPT vorschlägt, die korrekte und sichere Variante.

Hat mich tatsächlich beeindruckt. Vor allem, weil das ja kein "Standard-Problem" ist, was ständig diskutiert wird.
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.519 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

AW: ChatGPT - Wow! (Cron-Job)

  Alt 7. Jul 2024, 09:49
Da fragt man sich dann natürlich, woher ChatGPT diesen Code geklaut hat, denn selbst produzieren kann es ja nicht.
Thomas Mueller
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.969 Beiträge
 
Delphi 12 Athens
 
#16

AW: ChatGPT - Wow! (Cron-Job)

  Alt 7. Jul 2024, 09:56
Und Claude Sonnet 3.5 kommt mit Deiner Frage wohl auch nicht sehr weit.
Das war auch auch ehrlicherweise nur das Standardmodell, weil ich noch keine Subscription habe.
Falls jemand vollenm Zugriff darauf hat, dann würde mich das Ergebnis auch interessieren.
Bisher ist ChatGPT 4o jedenfalls der klare Gewinner, aus meiner Sicht.

Delphi-Quellcode:
function GetMaxGranulePosition(const FileName: string): Int64;
var
  FileStream: TFileStream;
  Buffer: array[0..27] of Byte;
  PageHeader: array[0..3] of AnsiChar;
  GranulePosition: Int64;
  MaxGranulePosition: Int64;
begin
  MaxGranulePosition := 0;
  FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    while FileStream.Position < FileStream.Size do
    begin
      FileStream.ReadBuffer(PageHeader, 4);
      if PageHeader <> 'OggSthen
        raise Exception.Create('Ungültiges Ogg-Dateiformat');

      FileStream.ReadBuffer(Buffer, SizeOf(Buffer));
      GranulePosition := PInt64(@Buffer[6])^;

      if GranulePosition > MaxGranulePosition then
        MaxGranulePosition := GranulePosition;

      // Zum nächsten Ogg-Page springen
      FileStream.Seek(PCardinal(@Buffer[22])^ + 27, soFromCurrent);
    end;
  finally
    FileStream.Free;
  end;
  Result := MaxGranulePosition;
end;
Interessehalber habe ich den Prompt auch nochmal hier eingegeben, bei ChatGPT, dann kommt das raus.
Ähnlich, aber nicht exakt gleich. Kannst Du ja mal vergleichen, sieht jedenfalls deutlich strukturierter aus als alles andere.


Hier ist eine Delphi-Funktion, die die maximale absolute Granule-Position aus einer gegebenen Ogg-Datei extrahiert:
Delphi-Quellcode:
unit OggGranuleExtractor;

interface

uses
  Classes, SysUtils;

function GetMaxGranulePosition(const FileName: string): Int64;

implementation

type
  TOggPageHeader = packed record
    CapturePattern: array[0..3] of AnsiChar; // "OggS"
    Version: Byte;
    HeaderType: Byte;
    GranulePosition: Int64;
    BitstreamSerialNumber: Cardinal;
    PageSequenceNumber: Cardinal;
    Checksum: Cardinal;
    PageSegments: Byte;
  end;

function ReadOggPageHeader(Stream: TStream; out Header: TOggPageHeader): Boolean;
begin
  Result := Stream.Read(Header, SizeOf(TOggPageHeader)) = SizeOf(TOggPageHeader);
  if Result then
  begin
    Result := Header.CapturePattern = 'OggS';
    if not Result then
      Stream.Seek(-SizeOf(TOggPageHeader) + 1, soCurrent); // Synchronize to the next potential page start
  end;
end;

function GetMaxGranulePosition(const FileName: string): Int64;
var
  FileStream: TFileStream;
  OggHeader: TOggPageHeader;
  MaxGranulePos: Int64;
begin
  Result := -1;
  MaxGranulePos := -1;

  try
    FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    try
      while FileStream.Position < FileStream.Size do
      begin
        if ReadOggPageHeader(FileStream, OggHeader) then
        begin
          if OggHeader.GranulePosition > MaxGranulePos then
            MaxGranulePos := OggHeader.GranulePosition;

          // Skip page segments
          FileStream.Seek(OggHeader.PageSegments, soCurrent);
        end
        else
          Break; // No more valid headers
      end;
      Result := MaxGranulePos;
    finally
      FileStream.Free;
    end;
  except
    on E: Exception do
      Writeln('Error: ', E.Message);
  end;
end;

end.
Erklärung der Funktion:

TOggPageHeader: Eine Struktur, die den Header eines Ogg-Pakets repräsentiert.
ReadOggPageHeader: Eine Hilfsfunktion, die einen Ogg-Page-Header aus einem Stream liest und überprüft, ob das Capture-Muster ("OggS") korrekt ist.
GetMaxGranulePosition: Die Hauptfunktion, die die Ogg-Datei öffnet, durch die Pakete iteriert und die maximale Granule-Position ermittelt.

Schritte zur Verwendung:

Speichere den obigen Code in eine Delphi-Unit, z.B. OggGranuleExtractor.pas.
Verwende die GetMaxGranulePosition-Funktion, um die maximale absolute Granule-Position einer Ogg-Datei zu ermitteln:



Delphi-Quellcode:
uses
  OggGranuleExtractor, SysUtils;

var
  MaxGranulePos: Int64;
begin
  try
    MaxGranulePos := GetMaxGranulePosition('path_to_your_ogg_file.ogg');
    Writeln('Maximale Granule-Position: ', MaxGranulePos);
  except
    on E: Exception do
      Writeln('Fehler: ', E.Message);
  end;
end.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.969 Beiträge
 
Delphi 12 Athens
 
#17

AW: ChatGPT - Wow! (Cron-Job)

  Alt 7. Jul 2024, 09:57
Da fragt man sich dann natürlich, woher ChatGPT diesen Code geklaut hat, denn selbst produzieren kann es ja nicht.
Exakt 1:1 kopieren kann es aber auch nicht

Edit:
Vielleicht interessiert sich ja jemand wie es im inneren eines LLM so aussieht, ist hier sehr schön beschrieben.
Pure Matritzenrechnung, wir sind in der Matrix

https://www.youtube.com/watch?v=eMlx5fFNoYc

Geändert von Rollo62 ( 7. Jul 2024 um 10:00 Uhr)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#18

AW: ChatGPT - Wow! (Cron-Job)

  Alt 7. Jul 2024, 10:05
Zitat:
Da fragt man sich dann natürlich, woher ChatGPT diesen Code geklaut hat, denn selbst produzieren kann es ja nicht.
Der Herr ALtman kennt das Problem mit dem Urheberrecht auch. Hat ja auch schon ein paar Klagen am Hals.
Ich vermute, Chatgpt wird das irgendwie umgehen und die Sachen nicht 1:1 wiedergeben.
Müßte man mal bei seinen eigenen Sachen probieren...
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.458 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: ChatGPT - Wow! (Cron-Job)

  Alt 7. Jul 2024, 10:06
Da fragt man sich dann natürlich, woher ChatGPT diesen Code geklaut hat, denn selbst produzieren kann es ja nicht.
Da man auch konkrete Verbesserungen an dem gelieferten Codes anfragen kann, kann das so nicht stimmen. Diese Verbesserungen kann es nirgends einfach abschreiben.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
865 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: ChatGPT - Wow! (Cron-Job)

  Alt 7. Jul 2024, 10:26
Da fragt man sich dann natürlich, woher ChatGPT diesen Code geklaut hat, denn selbst produzieren kann es ja nicht.
Bevor ich mich daran gesetzt habe, den Code selber zu schreiben, habe ich nach Delphi-Code dafür gesucht. Abgesehen von lizenz-technisch inkompatiblem Code von 3delite.hu habe ich wenig brauchbares gefunden. Und in diesem kostenlos downloadbaren Code ist schon die Struktur des Headers signifikant anders - dort ist auch das Array mit den Segmentgrößen im Record enthalten. Beim auslesen wird das Record dann in zwei Schritten gefüllt, da man am Anfang nicht weiß, wie groß das Array tatsächlich ist.

Wenn "geklaut" dann vermutlich von einer anderen Sprache, und dann nach Delphi übersetzt. Aber alleine das ist dann auch schon beeindruckend, finde ich.

Ähnlich, aber nicht exakt gleich. Kannst Du ja mal vergleichen, sieht jedenfalls deutlich strukturierter aus als alles andere.
Das ist ja nun interessant. Der Code ist nämlich fehlerhaft:
Delphi-Quellcode:
// Skip page segments
  FileStream.Seek(OggHeader.PageSegments, soCurrent);
Tatsächlich muss man nämlich "PageSegments" viele Bytes lesen, und aus diesen Werten die Größe der OggPage zu berechnen, die man anschließend per Seek überspringt. Das ist der Teil
Delphi-Quellcode:
SetLength(PageSegments, OggPageHeader.PageSegments);
FileStream.Read(PageSegments[0], OggPageHeader.PageSegments);

SegmentSize := 0;
for I := 0 to OggPageHeader.PageSegments - 1 do
  Inc(SegmentSize, PageSegments[I]);

FileStream.Seek(SegmentSize, soFromCurrent);
aus meinem Ergebnis.
The angels have the phone box.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz