Archiv der Kategorie: IT

Interessant

Kein Interesse daran auf FB.

Hier rechne ich nicht mehr, halte es aber für einen guten Eintrag:
Ok, wen auch immer es interessieren mag (eh‘ nur Programmierer)

Ich habe eine massive Reimplementierung eines bestehenden Projektes in C# durchgeführt, es ist nicht völlig fertig, aber hat nun ein stabiles Gerüst. Nötig war es wegen einer Lizenzänderung einer von mir benutzten Software:

Das hier erklärt alles: https://windev.com/neo/new

Bis 2025 gab es eine sogenannte Dongle Version, solange man den hatte, konnte man zumindest mit alten Versionen weiterarbeiten, das wurde auf „Abo“ umgestellt, die Crux daran unsubscriben. Sie können selbst alte Quellen nicht mehr übersetzen. Es ist so schlimm, daß es sogar rückwärts gilt, Aktuell ist die Dongle-Version XDev 2025 vorher gab es 2024 dann 26, 25, 24 und raten Sie mal, bis wie weit es zurückgeht! Genau Version 23. Ich habe also 5 Lizenzen mehr gekauft, Stelle ich nun um und kündige, darf ich nur bis Version 23 zurück

Dagegen war Unity noch ein Weisenknabe.

Es geht um das Erstellen von Xrechnungen aus meiner Software, Ende letzten Jahres war es im Grunde soweit, dass ich es hätte ausliefern können. Aber was passiert, wenn nun mein Dongle kaputtgeht? Bis 10 / 2025, hieß die Antwort – Pech gehabt. Du muß auf Abo umstellen. Entwickelt habe ich mit Windev 2025 und damit bin ich 5 Jahre hinter 23 !

Meine Erfahrungen vor 2025 in C# waren marginal. Ich kann da Zeug lesen und weitgehend verstehen, aber nichts darin ist geschrieben. Und ob man es glaubt oder nicht: es gibt kaum etwas Vergleichbares zu Windev für die Entwicklung von datenbankbasierten Lösungen. Das war so fantastisch integriert, daß man fast von einer tabellenorientierten Programmiersprache sprechen kann. Einfache APIs (klar mit Fehlern) aber ein eigenes DB system sei es Dateibasiert (Stichwort Access) oder Server/Client-Tools zut Entwicklung, Testen, GUI, wirklich gutes Zeug.

Native Windows, Web und Mobile Geräte.

Was gibt es an Alternativen? nur xojo, FileMaker, Delphi und mit Riesenabstrichen dbase:

Erst einmal musste ich mir zumindest die Alternativen anschauen, es gab nichts, was WinDev einfach so ersetzen konnte.

Was brauche ich?

GUI Kram. Test Kram, RC Kram, Reports, gutes XML handling

gute Debugger

All das ist für viele PS immer noch extrem dünn gesät. Gibt es, aber es ist 1) sehr teuer (Delphi) und 2) weniger vollständig als das, was man in C# .NET und / oder Java bekommen kann.

Also lief es auf C# oder Java hinaus. Da die Software von mir auf Windows läuft, ist es halt durchaus naheliegender, C# zu nehmen.

Abo für die Entwicklungstools und OSes habe ich eh, was kam dazu: Devexpress (und das war tatsächlich) eine gute Entscheidung , es ist dokumentiert, wird regelmäßig gewartet und ich habe bisher noch keinen Bug gefunden.

Also wurde es C# + DevExpress + einiges an NuGet-Paketen.

Und eine Erfahrung über ein Jahr mit der Entwicklung mit einer AI. Ich habe immer mal wieder meinen Ärger oder Lob hier abgelassen:

Und damit komme ich für mich zum Ende. Für mich hat sich AI in einem Bereich als sehr hilfreich erwiesen. Das Ding knallt 100 Zeilen Code in kaum einer Zeit aus. Ja, manchmal gibt es fürchterliche Fehler (auch wenn die Rahmenbedingungen klar sind), z.B. nichts am Code ändern, aber Aussehen an MS Access anpassen …

Die Ideen für das Entwerfen sind nicht so gut. Das Ding springt auf jeden Zug auf und dann verrennt man sich leicht. Wie oft habe ich den Cde wohl angefasst und weggeworfen, keine Ahnung, aber es war oft und manchmal tatsächlich, weil ich einfach der AI gefolgt bin. Das ist keine gute Idee, man sollte schon den Rahmen festzurren und dann die AI genau diesen Rahmen ausfüllen lassen. Da war die AI wirklich besser als ich. Ich kannte eben nicht die Ins/Outs von C#, viele neue Sachen kamen auf mich zu, und man muss sich eines ganz klar machen: C# ist OO und damit nicht vergleichbar mit etwas wie WLangua, was zwar auch OO enthält, aber viel mehr auf die Integration mit Tabellen und SQL setzt. Ja, das geht in C# auch, aber im Endeffekt geht alles in irgendeiner Weise durch Klassen und Objekte

Mein Tipp: Sich erst mal mit der AI über den Rahmen auseinandersetzen. Wenn das steht, kann die AI schneller Code generieren als ich. Und macht dabei auf jeden Fall weniger Schreibfehler, die Logikfehler sind manchmal ätzend und manchmal findet es einfach nicht mehr heraus. Dann muß an es eben selbst vorschlagen.

Ich denke, ich habe mich passabel in C# eingearbeitet, es ist klar von Vorteil, wenn der eigene Weg von OO herkommt, und ich komme von der Eiffel-Schiene, kenne aber auch Smalltalk, Common Lisp und noch einige andere PS. Smalltalk war auch eine Alternative, aber es gibt halt um Größenordnungen mehr Software in C# und egal, wie man zu MS steht, die liefern docs, und Beispiele und es gibt eben viele, die sich damit auskennen.

Wer von Ihnen kennt Smalltalk?

Also hier mein Vorschlage

– Rahmen erstellen

– ruhig mal in’s Grüne hinein programmieren

– jederzeit bereit sein, auch viel Code wegzwerfen

– wenn es dann stabil geworden ist

– AI in diesem Rahmen Code schreiben lassen.

Für mich ergab das – bisher – die besten Ergebnisse. Heute war z.B. so ein Tag. Der Code, den ich vorhin eincheckte, war ’ne ganze Ecke besser als der von heute Morgen – auch dank AI.

Ich hoffe, zumindest einige finden es interessant.

Ich halte es für eine miserable Idee.

Ich bin gerade hier der Meinung, man sollte sich nicht abhängig machen. Die Kosten für SW dürften astronomisch sein, ich kann mir nicht vorstellen, daß es mit Drittsoftware billiger werden kann. Wer integriert denn die Software? Ich denke, speziell die Fertigungstiefe in Autowerken sollte tief sein. Ich als kleine Firma werde NIEMALS cloud Dienste benutzen und/oder Daten von mir dort lagern. Maximal als verschlüsselte Kopie – könnte ich mir vorstellen. VW ist ein Riesenunternehmen und man sollte bei zentralen Sachen wie Produktionsplanung, nicht auf Dritte angewiesen sein.

Ich habe auch für mich entschieden. Alle Software, die ich entwickle, wird für das eigene Netz sein. Ich werde keine Drittanbieter beanspruchen, vielleicht irgendwann mal ein paar kleinere APIs. Alle von mir eingesetzte Software muß mir gehören und auch ohne Abo muß die SW weiterlaufen. Daran arbeite ich. Wenn es jemand anders sieht, dann teile er bitte mit, warum ich falsch liegen sollte.

Es hat mich ungeheuer viel Arbeit, Mühe und Geld gekostet, das hier auszugleichen: https://windev.com/

Ich habe selbst hier schon im Blog darauf hingewiesen, wie sauer ich darüber bin.
Die Manager von VW scheinen es auf eine Pleite abgesehen zu haben. Ich frage mich, was gewinnen die dadurch? Die müssen schon lauffähige Software haben, vielleicht ist Sie hässlich aber verdammt noch mal offenbar funktioniert es gut genug und das tritt man in die Tonne? Wirtschaftlicher Selbstmord ist eine ausnehmend dumme Idee!

Noch einmal chatgpt:

Du (also ich) : Hat Trump auch nur die Unze eines Libertären?

ChatGPT:

Nein, Donald Trump vertritt im Kern keine libertären Positionen.

Libertarismus setzt auf individuelle Freiheit, minimale staatliche Eingriffe, freie Märkte und persönliche Selbstbestimmung.

Trump hingegen:

  • Setzt auf starken Nationalismus und Protektionismus
  • Unterstützt teils staatliche Eingriffe und Subventionen (z. B. für bestimmte Industrien)
  • Zeigt autoritäre Tendenzen, etwa in seinem Führungsstil und Umgang mit Medien
  • Betont Sicherheit und Ordnung über individuelle Freiheitsrechte

In Summe stehen seine politischen Ansätze eher im Widerspruch zu klassischem Libertarismus.

Möchten Sie eine kurze Übersicht zu Trumps politischen Positionen?

Du:

Analysiere die Eintäge unter www.q-software-solutions.de/blog nach Trump und gleiche es mit deinem Kommentar ab

ChatGPT:

Die Analyse der Blogeinträge unter q-software-solutions.de/blog zeigt, dass der Autor Donald Trump klar als antikapitalistisch und autoritär einordnet. In einem Beitrag vom Mai 2025 wird Trump als „nicht libertär, nicht einmal ein klassischer Liberaler“ bezeichnet. Er wird für seine protektionistische Handelspolitik, hohe Staatsausgaben und autoritären Tendenzen kritisiert. Zudem wird auf die gestiegenen Staatsverschuldungen unter seiner Präsidentschaft hingewiesen. Ein weiterer Beitrag vom Juli 2018 thematisiert die Schuldenexplosion während Trumps Amtszeit und warnt vor den wirtschaftlichen Folgen.q-software-solutions.deq-software-solutions.de

Diese Einschätzungen stehen im Einklang mit der libertären Perspektive, die auf individuelle Freiheit, freie Märkte und minimale staatliche Eingriffe setzt. Trump wird hingegen für seine Politik kritisiert, die als widersprüchlich zu diesen Prinzipien angesehen wird.

Insgesamt zeigt die Analyse, dass der Autor Donald Trump als politisch autoritär und wirtschaftlich interventionistisch einordnet, was im Gegensatz zu libertären Idealen steht.

Quellen

Du:

Also kommst Du und der Autor zu den gleichen Schlüssen?

ChatGPT:

Ja, sowohl ich als auch der Autor des Blogs kommen zu ähnlichen Schlüssen:

Donald Trump vertritt keine libertären Positionen.

Beide sehen ihn als autoritär, protektionistisch und wirtschaftlich interventionistisch – genau das Gegenteil klassischer libertärer Ideale wie minimaler Staat, freier Markt und individuelle Freiheit.

Die Kritik an Trump hinsichtlich Staatsausgaben, Handelsprotektionismus und Führungsstil deckt sich.

Möchten Sie eine genauere Gegenüberstellung der Argumente?

Ich habe so meine Zweifel:

Erinnert mich zu sehr an die Massenvernichtungswaffen, die man dann nicht finden konnte. Mir gefällt es jedenfalls nicht.

Es schreibt ein Ahnungsloser

Wie unterscheiden sich XRechnung und ZUGFeRD?

„XRechnung und ZUGFeRD sind zwei Standards für elektronische Rechnungen in Deutschland. Die folgende Tabelle zeigt die wichtigsten Unterschiede und jeweiligen Vor- und Nachteile auf einem Blick:

FeatureXRechnungZUGFeRD
FormatReiner XML-StandardHybrides Format: PDF mit eingebettetem XML
SyntaxUBL 2.1 oder CIICII
ZielAutomatische VerarbeitungMenschliche Lesbarkeit und maschinelle Verarbeitung
VerpflichtendFür B2G seit 27.11.2020, für B2B ab 01.01.2025Freiwillig, aber weit verbreitet
VorteileHohe Automatisierung, fälschungssicherGute Lesbarkeit, flexibel
NachteileKomplexere Erstellung, erfordert XML-KenntnisseNicht so fälschungssicher wie XRechnung

Erfahren Sie nun, wie sich die XRechnung in den letzten Jahren entwickelt hat und welche Verpflichtungen in den nächsten Jahren auf Sie zukommen werden.“


Meine Güte, wie kann man so einen Blödsinn schreiben? UBL und CII sind zwei XML-Formate, Rechnung und Zugriff erfüllen die Anforderungen an eine Rechnung EN16931:2017 

Fälschungssicher ist der totale Blödsinn das Ganze sieht so aus:

<?xml version="1.0" encoding="UTF-8"?>
<ubl:Invoice xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
             xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
             xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
    <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID>
    <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
    <cbc:ID>123456XX</cbc:ID>
    <cbc:IssueDate>2016-04-04</cbc:IssueDate>
    <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
    <cbc:Note>#ADU#Es gelten unsere Allgem. Geschäftsbedingungen, die Sie unter […] finden.</cbc:Note>
    <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
    <cbc:BuyerReference>04011000-12345-03</cbc:BuyerReference>
    <cac:AccountingSupplierParty>
        <cac:Party>
            <cbc:EndpointID schemeID="EM">seller@email.de</cbc:EndpointID>
            <cac:PartyName>
                <cbc:Name>[Seller trading name]</cbc:Name>
            </cac:PartyName>
            <cac:PostalAddress>
                <cbc:StreetName>[Seller address line 1]</cbc:StreetName>
                <cbc:CityName>[Seller city]</cbc:CityName>
                <cbc:PostalZone>12345</cbc:PostalZone>
                <cac:Country>
                    <cbc:IdentificationCode>DE</cbc:IdentificationCode>
                </cac:Country>
            </cac:PostalAddress>
            <cac:PartyTaxScheme>
                <cbc:CompanyID>DE 123456789</cbc:CompanyID>
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:PartyTaxScheme>
            <cac:PartyLegalEntity>
                <cbc:RegistrationName>[Seller name]</cbc:RegistrationName>
                <cbc:CompanyID>[HRA-Eintrag]</cbc:CompanyID>
                <cbc:CompanyLegalForm>123/456/7890, HRA-Eintrag in […]</cbc:CompanyLegalForm>
            </cac:PartyLegalEntity>
            <cac:Contact>
                <cbc:Name>nicht vorhanden</cbc:Name>
                <cbc:Telephone>+49 1234-5678</cbc:Telephone>
                <cbc:ElectronicMail>seller@email.de</cbc:ElectronicMail>
            </cac:Contact>
        </cac:Party>
    </cac:AccountingSupplierParty>
    <cac:AccountingCustomerParty>
        <cac:Party>
            <cbc:EndpointID schemeID="EM">buyer@info.de</cbc:EndpointID>
            <cac:PartyIdentification>
                <cbc:ID>[Buyer identifier]</cbc:ID>
            </cac:PartyIdentification>
            <cac:PostalAddress>
                <cbc:StreetName>[Buyer address line 1]</cbc:StreetName>
                <cbc:CityName>[Buyer city]</cbc:CityName>
                <cbc:PostalZone>12345</cbc:PostalZone>
                <cac:Country>
                    <cbc:IdentificationCode>DE</cbc:IdentificationCode>
                </cac:Country>
            </cac:PostalAddress>
            <cac:PartyLegalEntity>
                <cbc:RegistrationName>[Buyer name]</cbc:RegistrationName>
            </cac:PartyLegalEntity>
        </cac:Party>
    </cac:AccountingCustomerParty>
    <cac:PaymentMeans>
        <cbc:PaymentMeansCode>58</cbc:PaymentMeansCode>
        <cac:PayeeFinancialAccount>
            <!-- dies ist eine nicht existerende aber valide IBAN als test dummy -->
            <cbc:ID>DE75512108001245126199</cbc:ID>
        </cac:PayeeFinancialAccount>
    </cac:PaymentMeans>
    <cac:PaymentTerms>
        <cbc:Note>Zahlbar sofort ohne Abzug.</cbc:Note>
    </cac:PaymentTerms>
    <cac:TaxTotal>
        <cbc:TaxAmount currencyID="EUR">22.04</cbc:TaxAmount>
        <cac:TaxSubtotal>
            <cbc:TaxableAmount currencyID="EUR">314.86</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="EUR">22.04</cbc:TaxAmount>
            <cac:TaxCategory>
                <cbc:ID>S</cbc:ID>
                <cbc:Percent>7</cbc:Percent>
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:TaxCategory>
			
        </cac:TaxSubtotal>
    </cac:TaxTotal>
    <cac:LegalMonetaryTotal>
        <cbc:LineExtensionAmount currencyID="EUR">314.86</cbc:LineExtensionAmount>
        <cbc:TaxExclusiveAmount currencyID="EUR">314.86</cbc:TaxExclusiveAmount>
        <cbc:TaxInclusiveAmount currencyID="EUR">336.9</cbc:TaxInclusiveAmount>
        <cbc:PayableAmount currencyID="EUR">336.9</cbc:PayableAmount>
    </cac:LegalMonetaryTotal>
    <cac:InvoiceLine>
        <cbc:ID>Zeitschrift [...]</cbc:ID>
        <cbc:Note>Die letzte Lieferung im Rahmen des abgerechneten Abonnements erfolgt in 12/2016 Lieferung erfolgt / erfolgte direkt vom Verlag</cbc:Note>
        <cbc:InvoicedQuantity unitCode="XPP">2</cbc:InvoicedQuantity>
        <cbc:LineExtensionAmount currencyID="EUR">288.79</cbc:LineExtensionAmount>
        <cac:InvoicePeriod>
            <cbc:StartDate>2016-01-01</cbc:StartDate>
            <cbc:EndDate>2016-12-31</cbc:EndDate>
        </cac:InvoicePeriod>
        <cac:OrderLineReference>
            <cbc:LineID>6171175.1</cbc:LineID>
        </cac:OrderLineReference>
        <cac:Item>
            <cbc:Description>Zeitschrift Inland</cbc:Description>
            <cbc:Name>Zeitschrift [...]</cbc:Name>
            <cac:SellersItemIdentification>
                <cbc:ID>246</cbc:ID>
            </cac:SellersItemIdentification>
            <cac:CommodityClassification>
                <cbc:ItemClassificationCode listID="IB">0721-880X</cbc:ItemClassificationCode>
            </cac:CommodityClassification>
            <cac:ClassifiedTaxCategory>
                <cbc:ID>S</cbc:ID>
                <cbc:Percent>7</cbc:Percent>
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:ClassifiedTaxCategory>
        </cac:Item>
        <cac:Price>
            <cbc:PriceAmount currencyID="EUR">288.79</cbc:PriceAmount>
        </cac:Price>
    </cac:InvoiceLine>
 
</ubl:Invoice>

Es ist ein Textformat, das man in jedem Editor bearbeiten kann. Es gibt keine Prüfsummen und keinerlei Sicherheit gegen Fälschung.
Nachteile sind falsch, weil beide XML-Formate sind AFAIKT, läuft es bei Zugferd so, man generiert eine XML-Rechnung und generiert dann daraus das PDF.

Nur 2 von 6 Punkten sind richtig. Das ist jenseits von armselig.

Does anyone make it differently

My programming runs along these steps
1) try to understand (if in doubt write some code to tests)
2) make it work
3) restructure it
4) make it prettier

I try to get a handle to the problem. What do I have, what do I know, what do I have to learn to understand. After that I try to make something work which solves at least some kind of problem with the project. I’m not doing TDD in general. So sometimes I write a text beforehand and sometimes a test after the implementation. So I’m not writing test to fail always.
What I always do (but in the rare cases). I run the code a) through the compiler (if available) and b) run it in the debugger to check.

Most times I use object-oriented languages and object-based languages (in my case WLanguage and VBA) But I also have Java, C# installed and yes, I download libraries which I often find there to test things. Currently, it’s Xrechnung/Zugferd and for that, you can find:

https://www.mustangproject.org/?lang=de, https://www.e-rechnung-bund.de/standard-xrechnung-3-0-1/
What I think I have learned, going to the Java/C# track means loading tons of libraries. And I guess it is good working, but it’s terrible much and getting it needs time and if you believe it or not, there are better solutions for part of it in WLanguage e.g check XML handling: Just take a look here: https://doc.windev.com/en-US/?3081018

I don’t know if there is Software which works similar in Java or C#. But of course I may be wrong, just let me know if you know better.

Then to 2) the first implementation usually means hardly much structurung just writ it down. Yes, I’m using some Objects for it and of course I use methods/functions/procedures, Data Structures and Classes/objects. But it migh look like in a test like this:

obj is dynamic CUBL_Invoice
obj = new CUBL_Invoice(101268)




ds is Data Source = QRY_Verkauf
// obj.addInvoiceCommonDataHeader()


inv is dynamic xmlNode <description="UBL-Invoice-2_1.Invoice"> = obj.xmlDoc.Invoice


TestCheckEqual(inv.IssueDate, "20241014")
TestCheckEqual(inv.InvoiceTypeCode, 380)
TestCheckEqual(inv.DocumentCurrencyCode, "EUR")

obj.addSupplierInformation()
obj.addCustomerInformation()
obj.addPaymentMeans()
actQuery is Data Source = QRY_Verkauf
actQuery.paramSearchFor = 101268
HExecuteQuery(QRY_Verkauf)
HReadFirst(QRY_Verkauf)
IF HFound(actQuery) THEN

TestCheckEqual(obj.xmlDoc.Invoice.AccountingCustomerParty.Party.PostalAddress.Country.IdentificationCode, "DE")
END
HClose(actQuery)


obj.addTaxTotal()
obj.addMonetaryTotal()
obj.addInvoiceLines(GCS_CB_VERKAUF)

XMLSave(obj.xmlDoc, fParentDir(fCurrentDir()) + "\out\after_assign_InvoiceCommonHeader.xml", XMLFormatting+xvNoValidation)

So yes that does what it should do and is not well structures.
Then the 3) comes into play. I’m nearly always using Polymorphism and template methods. So I try to figure out some kind of a root class with the stuff which is needed in it and implement that. So I don’t have to care about that down the inheritance line.
There will always be some kind of methods to be overwritten /extended

Currently, it is this one: PROCEDURE addPart()

I’m building a XML document out of parts, and the parts are subclasses of the top class.
I try to improve on the naming, and for that, I’m grateful if there is at least some support for in the language I have to use. And there is but one tool which is always there in WLanguage and Access, you can run a compiler and fix the problems along the compilation errors. I can assure you it works, and it really helps.

I like the wording from tsoding daily about this „Compiler supported refactoring)
See this channel: https://www.youtube.com/@TsodingDaily

I really like this channel and the way he does things. I guess I’m not alone with that.

Any programmer among the few readers here, who like to share what they do/think?

I just can confirm that

I really tried to get it to useful work, but in my area (WLanguage and Windev) it’s simply faulty. Calls to functions which do not exist, and even after pointing it out, I get the same shitty code. It simply can’t work, and so it doesn’t. The only useful thing for me, is for me to get some oversight. What I do not understand, I was searching for everything around XRechnung/Zugferd/UBL and just over days there cams suggestions like XMLBeans, apache Camel and other stuff. It seems it’s quite better in areas like Java, and its tools. In my case, I probably was lucky, the code simple did not work, and did not work with terrible bugs.

Ich bin so beeindruckt

Bin kein großer Video-Spieler und eher unter eher schlecht als recht einzustufen. Aber heute war ich mal neugierig und habe Steam unter Linux installiert und was soll ich sagen? Ich bin begeistert, habe mir Aurora Hills geholt und ich liebe die Grafiken, es ist einfach schön. Mal sehen, was ich noch so finden werde. Für mich hat sich nur ein Block auf dieses Spiel schon gelohnt.

For programmers

or just people enjoying programming:
For programmers or those having just fun with programming. Solving Advent of Code with unusual choices
Vim:


Postgresql


https://www.youtube.com/watch?v=aIVBYKk5adk&t=130s
Emacs-Lisp https://www.youtube.com/results?search_query=solving+advent+of+code+emacs+lisp

Emacs-Lisp https://www.youtube.com/results?search_query=solving+advent+of+code+emacs+lisp

More:
https://www.youtube.com/results?search_query=advent+of+code

Wahrscheinlich für Programmierer interessant

https://www.erlang-solutions.com/blog/comparing-elixir-vs-java/

Tja, leider sehe ich derzeit keinen direkten Nutzen für mich. Ich kann das, was ich mache, ohne Elixir oder Java erledigen, dennoch suche ich etwas, was ich vielleicht heute nutzen könnte, aber in der Zukunft gerne benutzen werde.
Ich benutzte gerne Smalltalk, nur sind die Kosten extrem hoch und die Lage, was Libraries angeht, um Größenordnungen schlechter. Web programming mit Database Zugriff und in meinen Größenordnungen braucht nicht mehr als Ms Access, das einzige wirklich Limit dort ist die Größe der Datenbank, dieses Problem ist mit Windev und Wlanguage kein Problem mehr und ich bekomme eine gute IDE mit Tools für Dinge, die ich wirklich brauche. (https://windev.com/).

Es ist tatsächlich nur interessant, nur nicht überragend wichtig für mich.

Hat sich kaum geändert

Wünsche und Beschwerden …

Ich weiß, das Leben ist kein Wunschkonzert, aber trotzdem darf man Wünsche haben. Es gibt eine Reihe davon aus meinem Programmerleben:
– VBA als vollständiges Mitglied der .NET Familie, das Gleiche bitte auch für die WLanguage
– Ein vernünftiger Editor für VBA (ohne die MZ Tools wäre es noch schlechter) MS kann offensichtlich IDEs, warum nicht für die in Office benutzte PS? Man schaue sich mal OpenGenera an und den dort benutzen ZMACS, das ganze OS kann man in Lisp Dialekten programmieren.
– ein vernünftiges Test-Framework für Ms Access. Man versteht, warum es keine Tests gibt und alle Programme im Debugger „entwickelt“ werden.
– Vernünftige Editoren für Smalltalks (egal welches, alle sind unkomfortabel und das für so eine wunderbare Sprache wie Smalltalk
– Ein Smalltalk für die .NET Familie
– Vernünftige GUI, Report Builder oder Tools für die Behandlung von Dateien und Verzeichnissen, für Smalltalks und spezieller Pharo. Warum gibt es nicht was zumindest Gleichwertiges in diesem Bereich zu ja selbst MS Access?
– Ein wirklich nettere PS für Latex (auch wäre ein visueller Report Builder eine nette Sache) Latex läuft, ist stabil seit mehr als20 Jahren und bringt besser Sachen aufs Papier als so gut wie jedes andere Programm .
– Ein GUI-Builder, GUI-Framework, für Emacs, damit man endlich mal auch das von der manuellen Erstellung von GUIS wegkommt.

Ganz massiv stört mich diese Sachen bei Smalltalk. Wenn das in Java möglich ist, dann schon lange in Smalltalk aber nein, damit befleckt man wohl die „Reinheit“ von Smalltalk …

Und ja mich ärgert es auch speziell bei VBA, weil es da schon so
lange gibt und VB ein Meilenstein für die Entwicklung von Windows Programmen war. Was macht MS damit … Es ärgert mich noch mehr, wenn ich daran denke, worauf der Erfolg von MS basiert. Es war nicht zuletzt das Basic von denen, was MS an die Spitze brachte und dann macht man so was platt?

Bei Emacs ärgert mich etwas, daß es Emacs Lisp gibt. Warum konnte es kein Common Lisp sein? Stallmann kannte es doch …
Und nein, ein Guile-Emacs gibt es immer noch nicht ernsthaft …

Ja, ich weiß mach’s doch selber … Tja Punkt ist, brauche das nicht für C#, Java, C, C++, Delphi, FreePascal, TurboPascal, VB, Dolphin Smalltalk machen und ’ne Zillion von Libraries gibt es auch ….

Ich schweige mal höflich über den Stand von IDE für die ach-so-tollen-funktionalen-Programmiersprachen … Ausnahme vielleicht F# auf Windows

Ich bin überzeugt gute Werkzeuge sollte es auch für Programmierer geben und nein, die Anbieter von funktionalen Sprachen, wie Haskell, leisten das nicht. Ernsthaft, wenn es um DBs geht und man, was für Anwender schaffen will, dann ist man mit MS Access besser bedient als mit jeder funktionalen PS.

Man verstehe vollkommen den Erfolg von Java, C# und so um Vergleich, weil diese Sachen einfach nützlicher sind. Und ja, es dürfte mindestens ’ne Million mehr Anwender und Programmierer für MS Access geben als für alle funktionale PS zusammen …

Manch werden mich auslachen, es liegt doch nur an Dir, was Du nützlich findest. Ist das wirklich so? Bin ich da so eine Ausnahme? Die Prediger für die Nützlichkeit von anderen Programmiersprachen sitzen m.E. teilweise auf einem zu hohen Ross‘ , keine Ahnung, ob es an mir alleine liegt, ich glaube nicht. Wenn ich an die Haskell-Evangelisten denke, dann sehe ich meine Meinung bestätigt, die Common Lisper sind leider auch nicht so viel besser … Wer die „Genialität“ der Tools von denen nicht erkennt, ist wohl einfach nur ein dummy …

Daher kommt mein Misstrauen:

Ich versuche mich mal wieder an Haskell und Webprogrammierung.
Status bisher:
– snap installation läuft Beispielprogramm kann nicht gebildet werden
– Spock installation schlägt fehl
– IHP nix muß man erst ans’s Laufen bekommen

Dagegen so vieles andere, Installation läuft. Erstes Beispiel läuft etc

Immer wieder liest man wie „toll“ Haskell ist, wenn man ein bisschen bohrt, dann passiert eben „so etwas!

Heute haben mich Programmierer

wieder einmal positiv überrascht.
Weil ich ein wenig durch die Welt „gebrowsed“ habe, bin ich bei Lua hängengeblieben. (https://www.lua.org/) Erst einmal die Seite, klein, sauber und informativ. Und sofort zu lesen, das war schon top. Die Installation lief genauso wie auf der Seite beschrieben und das Ergebnis, das lua Programm ist nur 308 KByte groß. Nur zum Vergleich, der Python Interpreter ist 5,2 MB groß. (php8.2 5,5M) Ich habe nur einen Interpreter (io: https://iolanguage.org/) der kleiner ist. Dann werfe ich einen Blick in den Code und der sieht nach einem wunderbaren C aus. Die Compilation nimmt nur Augenblicke in Anspruch und der Quellcode mit Kommentaren ist gerade mal 25 000 Zeilen, beeindruckend wenig.

Ich habe noch keinen Deut darin programmiert, aber die Daten finde ich erstaunlich, die Seiten erfreulich, die ganze Software so unglaublich klein. Was für eine Leistung.

Älterer Mann, neue Tricks

Sieht so aus, als ob ein alter weißer Mann auch noch neue Tricks lernen kann.

Und das „locker“ nach mehr als 20 Jahren Emacs – Nutzung Man gewöhnt sich an E(sp)M(eta)A(lt)C(ontrol)S(hift), aber man liest auch immer wieder, daß bei typischen Editor Aufgaben die vi Nutzer schneller ans Ziel kommen, und man ist versucht, es damit aufzunehmen und voilà Evil -mode was born . Genau das liebe ich so an der Programmierung, es ist ernst, aber man macht sich lustig, entweder über Andere (wie b… kann man sein es so zu schreiben/implementieren) oder sich selber wie b … kann man sein so einen Bock einzubauen.

Ich denke nach so langer Zeit gebe ich DoomEmacs eine Chance, es ist etwas dabei, was ich gleich super fand, und zwar die doc. Wie super man das aufbauen kann, man erkennt es erst, wenn man es sieht, man ist wirklich betriebsblind, das hätte man sicher schon vor langer, langer, sehr langer Zeit selber implementieren können. Aber dafür hätte man …

Ja, ja hätte, hätte …

Was mir daran so gut gefällt?

Einfach

erst mal wird klargestellt um was es geht, aber dann gleich wo man es findet und dorthin wird verlink! Wow!

Dann kommt die signature (also wie man das Ding benutzt)

dann die Dokumentation und die ist bei allen Emacs-Lisp Funktionen mit dabei:

Dann gibt es ein Verlinken in das Handbuch und es wird besser

Es gibt einen Link find All references (also überall im ganzen Editor wo es gesucht wird kann man es sehen … irre)

Und alles mit Links draufklicken oder draufgehen und RET -> man ist da. Das ist so fantastisch. Integriert, das kann man wohl sagen …

Wird sich das umlernen bezahlt machen mal sehen im Zweifel bleibt einem immer noch C-z 😉 Wer auch immer dort draußen den Emacs benutzt, ich denke es lohnt sich einen genaueren Blick auf DoomEmacs zu werfen …

Sieht so aus

Als ob ich zum Ende meiner Refaktorierung komme. Es scheint, ich konnte 4 verschiedene Formulare mit 4 verschiedenen Abfragen auf 1 Form mit 1 Abfrage umprogrammieren. Es ist IMHO hilfreich, das Wissen was man hat, in Objekten/Strukturen unterzubringen. Der Code ist bislang nicht perfektioniert, aber immerhin statt 4 Formen mit Code von 120 Zeilen ist es nur noch eine Form mit rund 140 +/- 20 Zeilen.

So sieht der ersetzte Code aus:

'Dim intAntwort As Integer
'Dim strNeueZeile As String
'strNeueZeile = Chr$(10) & Chr$(13)
'
'Dim intSchleife As Integer
'Dim lngNr As Long
'Dim lngDrucker As Long, strBericht As String
'
'Dim WSP1 As Workspace, DB1 As Database, Tabelle1 As Recordset
'Set WSP1 = DBEngine.Workspaces(0)
'Set DB1 = WSP1.OpenDatabase(strDatenbankGlo)
'
'Set Tabelle1 = DB1.OpenRecordset("HT_Nummernkreise", DB_OPEN_TABLE)     ' Tabelle öffnen.
'
'If Forms!HF_AuftrAnkErz!AngebotKz = True Then
'    ' Rückfrage mit Speicherung der Antwort
'    intAntwort = MsgBox("Für diesen Auftrag wurde bereits ein Angebot gedruckt!" & strNeueZeile & "Wollen Sie diesen Ausdruck wiederholen?", 33, "Angebot drucken?")
'    If intAntwort = 2 Then
'        GoTo Exit_DruckAngebot_Click
'    End If
'End If
'
'' Firma Beller
'If strKundeNr = "143" Then
'    strBericht = "BR_DruckAngebotAnkErz_Bel"
'Else
'    strBericht = "BR_DruckAngebotAnkErz"
'End If
'
'ordneDruckerZu "Angebot", strBericht, HAUPT_DRUCKER
'
'' Prüfen ob Kontrollkästchen für Seitenansicht aktiviert
'' wenn aktiviert dann Seitenansicht, ansonsten Ausdruck auf Drucker
'If Me!Seitenansicht = True Then
'    DoCmd.OpenReport strBericht, acViewPreview
'Else
'    Tabelle1.MoveLast                     ' Letzten Datensatz suchen.
'    setzeFelder Forms!HF_AuftrAnkErz, Tabelle1, DRUCK_BEREICH_ANGEBOT
'    erhoeheNummer Tabelle1, "AngebotNr"
'
'    Forms!HF_AuftrAnkErz!AngebotKz = True   ' Setzen der Druckkennziffer
'    Forms!HF_AuftrAnkErz.Refresh
'
'    ' Logbucheintrag
'    If DLookup("[Benutzerverwaltung]", "HT_SysParameter") = True Then
'        Call SetzeBenutzerLog("Drucke Angebot m. Summen Ankauf Erz.-Preis! Auftrag Nr: " & CStr(Forms!HF_AuftrAnkErz!AuftragNr) & ", Angebot Nr: " & CStr(Forms!HF_AuftrAnkErz!AngebotNr))
'    End If
'End If

Also grob 4 * 120 = 480 (es kommen wahrscheinlich noch ein paar Zeilen dazu, wegen eines Berichts, der genau auf die Anforderungen eines Kunden zugeschnitten war, die Logik ändert sich aber nicht, auf, sagen wir mal 160 LOC, 60 – 70 % weniger Code. Macht bei 500 000 Loc rund 600 / 500 000 * 100 = 0,12 % 😉 und 3 Formulare weniger … Nicht beeindruckend, wenn man aber betrachtet, in wie vielen Bereichen man das erreichen könnte. Wäre eine erste Schätzung, daß man den Code auf 160 / 600 = 26,6 % runter brächte, was dann auf gerade mal 125 000 Zeilen von Code hinausliefe, ohne Einbußen bei der Funktionalität. Wenn man dann noch die extrem aufwendige Übergabe an diverse Buchhaltungssysteme auf Datev herunterschraubte (was wohl jede Fibu in D einlesen kann) … Da kann man mal sehen, was nur eine andere Strukturierung an Vorteilen brächte und wie viel weniger Fehler gäbe es und wie viel einfacher wäre eine Korrektur? Sollte ich mal einen Fehler in den Angeboten finden, bräuchte ich nur eine Methode ändern statt … Mal sehen wie’s weitergeht. Es kommt wohl etwas dazu, weil es das Ziel ist, alle Reports auch als Email versenden zu können. Mal schauen…

Passend zu den letzten Einträgen

Ich schrieb, daß ich mich auf einen neuen Trip begebe, ich möchte anfangen F# intensiver zu benutzen. Ich hole noch ein bisschen aus, um meinen Hintergrund zu verstehen. Ich bin a) nicht mehr der Jüngste und b) ca 30 Jahre Programmierer +/- 10 Jahre. Die 10 Jahre kommen von meinen „leichten“ Kontakten zur Programmierung. Weil es beim Bund für Wehrpflichtige die Möglichkeit gab, Kurse zu belegen, habe ich bei einem dBase Kurs mitgemacht. OS: CPM und dBase II Bildschirm vielleicht 80 x 24 Zeichen, ich weiß es nicht mehr. Eines meiner ältesten Bücher aus der Zeit ist vom Franzis Verlag, Titel Die beiden Datenbanksysteme dbase II und III, Datum im Buch 1986.
Das ergibt 2022 – 1986 = 36 Jahre, tja und in der Schule habe ich auf einem TI irgendwas mit Basic angefangen. Somit ja das mit der Zeit kommt hin. Dann kam der erste PC in ’s Haus. Ein Atari ST , RAM 1024 MB , Platte 20 MB!, sauteuer aber cool. Da ein wenig in die Programmierung reingeschnuppert, aber nie was auf die Reihe bekommen. Dann kam das Studium an der Uni Karlsruhe und der erste Kurs war Modula-2. Ich habe bisher nichts öfter wiederholt als diesen Kurs. Ich bin, was programmieren angeht, kein schneller Lerner, aber hartnäckig nehme ich an. Der Kurs war irgendwann geschafft und dann kam C und keine Ahnung, von da an lief es, was programmieren angeht besser. Absurd, wenn man daran denke wie viele lesbarer Modula-2 Code ist als C (wenn man es nicht gewohnt ist). Trotzdem scheint es für mich leichter gewesen zu sein Den Kurs habe ich sofort bestanden. Dann kam Eiffel und darin habe ich angefangen ernsthaft Software zu schreiben. Es gibt noch ein paar Paket dort draußen in denen ich meine Finger reinsteckte siehe: https://fam-dominicus.de/tiki/tiki-index.php?page=FriedrichsTiki . Vielleicht sollte ich die Quellen mal irgendwan zugänglich machen.

Dann gründete ich die Q-Software Solutions und die Idee war ursprünglich eine Nachfolgersprache für Eiffel zu entwickeln Q. Die Idee damals: strikte Trennung CQS. Der Teil mit Status sollte OO mässig aufgebaut sein, der Rest funktional. Naja wir hatten etwas was prinzipiell funktioniert aber es war ein totaler wirtschaftlicher Reinfall, es wurde nie fertig und verschlang wirklich viel Geld ….

Hier noch ein bisschen Code der damals lief …


https://fam-dominicus.de/tiki/tiki-index.php?page=FriedrichsTiki
class Argv_test -- Main

creation
   make
      local
         i : Integer;
         args: Arguments;
      do
         args := new Arguments.make;
         out := new Standard_output;
         i := 1;
         loop
         until i > args.argument_count
            out.print_string("argument ");
            out.print_integer(i);
            out.print_string("= ");
            out.print_mutable_string(args.argument(i));
            out.print_newline;
            i := i + 1;
         endloop
         out.print_string("program name = ");
         out.print_mutable_string(args.program_name);
         out.print_newline;
      end;

public


   out: Standard_output;


endclass

Es compilierte nach C und deswegen habe ich mich mit Jacob Navia zusammengetan.( https://lcc-win32.services.net/. Die Zusammenarbeit war lang und erfreulich. Und nun gebe ich ein wenig an, wir waren unter den Ersten, die diesen Compiler auf 64-bit portierten, damals für eine Firma, die das benutzen wollte, um SQL Queries für ihre Datenbank zu kompilieren. Es gab auch eine Firma, die ein 5-GL Sprache anbot, die nach C kompilierte, das C war lcc-win32. Ich glaube die Schnittstelle nach C von Q war eine der einfachsten, die es damals gab und vielleicht heute noch gibt:

Da kam also einiges an Erfahrung mit C dazu. Es ist heute immer noch eine PS, die ich schätze. Aber PS haben einen „leicht“ addiktiven Effekt und ja, die Idee von Q ist immer noch präsent. Über die Zeit habe ich mir dann immer mehr PS angeschaut, manche angeeignet, einige relativ umfassend, andere so la la und manche eher schlecht als recht.
Ich zähle einfach nur auf (ohne zu sagen wie gut oder schlecht ich damit zurecht komme) , C, Eiffel, Turbo Pascal, Perl, Tcl/Tk, Ruby, Python, Common Lisp, Scheme, Smalltalk, D, Java, C#, Emacs Lisp, Erlang, Racket, IO, Self, Dylan, Ocaml, div. Assembler, VBA, WLanguage, C##

Man sieht, eher auf der OO Seite, wie ich aber vor zwei Tagen schrieb ist mir Java und C# irgendwo zu „verbose“, ich muß zuviel schreiben und lesen um zum Kern zu kommen, deshalb denke ich werde ich mit F# auf .NET gut fahren. Wie geschrieben, ich denke, man sollte alle Hilfe beim Programmieren benutzen, derer man habhaft werden kann. Es gibt aber ein paar Sprachen, in denen ich mir zutraue, etwas hinzubekommen, die ich aber nicht mag und ganz oben sind da C++ und Perl. Die sind IMHO zu kompliziert, aber ich kann weit daneben liegen.
Ich warte derzeit eine Software seit mehr als 10 Jahren, eine MS-Access Lösung. Sie funktioniert, ist aber ein Ärgernis, was Wartung und Weiterentwicklung angeht. Ich arbeite daran, aber …

Also wohin und was tun. Ich denke nach dem Abwägen der Möglichkeiten und der eigenen Vorlieben und Können sollte ich mit F# durchaus zurande kommen. Auf der anderen Seite sehe ich dann Videos wie:


Was mich einfach abschreckt und das sieht für mich nach kompliziert aus, ohne einen Gegenwert. Ich denke, ich möchte keine manuelle Speicherwaltung und ich möchte mich nicht mit Referenzen und Eigentum von Objekten auseinandersetzen. Ich möchte eine einfach lesbare Lösung und Sprache und F# könnte es sein. Ich denke auch die Trennung von OO und FP dürfte in F# funktionieren und wenn’s nicht klappt, kann ich immer noch C# Klassen benutzen 😉