Was sich über die letzten Tage abzeichnete, ist jetzt offiziell: Der niederländische E-Bike-Hersteller Vanmoof ist pleite … Wer ein Fahrrad des niederländischen Herstellers besitzt, muss um die Funktionalität seines Vanmoof-Rades bangen. Viele Funktionen sind an die Server des Herstellers gebunden.
Es gibt inzwischen immer mehr Produkte, die dauerhaft an die Server des Herstellers gebunden sind, und nicht mehr funktionieren, wenn die ausfallen. Was bei einer Insolvenz unvermeidlich ist. Muss man künftig die Bilanzen des Herstellers studieren, bevor man etwas kauft?
Behind the simple but not-unappealing website of Brutman Labs, there are some surprising features and statistics. In a recent update posted to the site, it was revealed that the server behind the web destination has run for an impressive „2,500 hours of continuous runtime.“ However, probably far more eyebrow-raising is the fact that the web server is a 39-year-old IBM PCjr that’s packing a 4.77 MHz CPU.
Alles, das funktioniert und ausreicht, so lange zu verwenden, bis es irreparabel auseinanderfällt, wäre der größte nur denkbare Beitrag zum Umweltschutz. Aber das passt den ultrareichen Investorgruppen hinter den Grünen natürlich nicht ins Geschäftskonzept, deshalb soll alles, Verkehrswesen, Energiewirtschaft, abgerissen und neu gebaut werden. Niemand schadet der Natur mehr als die Grünen.
Der EU-Digitalkommissar Thierry Breton ist nicht gerade für seine Zurückhaltung bekannt und stellte Plattformen wie Twitter oder Tiktok auch schon mal ein europaweites Verbot in Aussicht, falls sie die Regeln des Digital Services Act (DSA) nicht umsetzen sollten.
Es ist ein „interessanter“ Politikstil: Mit Klima, Trans und Migration richtet man das eigene Land zugrunde, und sobald die Leute anfangen, darüber zu reden, verbietet man ihnen den Mund.
Viele Diskussionen malen gerne den eigenen Mitarbeiter als IT-Sicherheitsrisiko an die Wand. Die tatsächliche Gefahr, die von ihm ausgeht, ist aber oft unklar. Verschiedene Täterprofile interner Angreifer können größeren Schaden anrichten. Eine Erkennung und Abwehr dieser Aktionen sind nur durch einen permanenten Blick auf den Netzwerk-datenverkehr und die Endpunkte möglich.
Interessante Übersicht für die Möglichkeiten, Einbrecher im Netzwerk zu erkennen und zu identifizieren.
Fedora 38 ist nun schon eine ganze Weile draußen, aber vielleicht bietet Ihr System es Ihnen noch immer nicht an? Upgrade-Voraussetzung bei Fedora ist, dass das System ALLE Updates eingespielt hat. Erst wenn diese Bedingung erfüllt ist, wird der Upgrade auf die nächste Major-Version angeboten. Häufig übersieht man dabei aber ausgeschlossene Updates, z.B. weil mal ein Kernel mit einer Regression dazwischen war, oder eine Software nur in einer älteren Version ordnungsgemäß funktoniert. Und um solche Updates nicht dauernd wieder und wieder angeboten zu bekommen, nimmt man i.Allg. in /etc/dnf/dnf.conf einen Eintrag excludepkgs= oder exclude=auf. Und vergisst es dann.
Aber damit gilt das System nicht mehr als „voll gepatcht“ und Fedora wird den Upgrade auf die nächste Version nicht anbieten. Man muss in diesem Fall also erst diese Einträge auskommentieren, alle Updates einspielen, danach den (endlich angebotenen) Upgrade ausführen, und dann sehen, ob man die Exclude-Einträge noch immer braucht. Und wenn man da nicht von alleine draufkommt, wartet man bis zum Sankt-Nimmerleins-Tag auf den Upgrade, Fedora ignoriert kommentarlos alle verfügbaren Major-Upgrades, solange nicht absolut alle verfügbaren Updates eingespielt sind.
Übrigens, falls Sie nach dem Upgrade noch immer Ärger mit irgendwelchen Packages hätten, und eine ältere oder neuere Version davon suchen müssen, https://rpmfind.net/ ist ein sehr guter Anlaufpunkt. Sie können Packages dort direkt herunterladen und dann mit sudo dnf install <package> installieren – doch Sie sollten dabei sehr genau prüfen, ob das eine legitime Software ist. Rpmfind benutzt aber nur Packages aus offiziellen Distributionen und gibt an, aus welcher ein Package ist – falls Sie unsicher sind, also mit der Original-Distribution abgleichen.
Let’s admit the truth. Testing is often an overlooked aspect of software development and an afterthought in most teams. There are very few developers who actively enjoy writing tests. Only a few know how to write automated tests effectively. Albeit we all admit and learned that testing helps ensure that our application is robust, reliable, and works as intended, there’s not much traction in this area. In this article, we’ll look at the most common testing Spring Boot testing best practices to provide a good starting point for testing enterprise Spring Boot applications.
Sehr interessanter Überblick für die Strategien zum „Entlausen“ von Spring Boot Code. Übrigens konnte ich neulich nicht mehr drucken. Treiber neu installiert, dies das. Am Ende guckte ich dann doch mal auf den Drucker. Ich hatte es noch gehört, am Klicken der Rückmeldungen, ein winziges Insekt war über dessen Touchscreen spaziert – und hatte damit wahllos irgendwelche Funktionen angewählt, die den Drucker in einen Wartezustand (auf eine weitere Eingabe) versetzt hatten, und solange er darin war, nahm er keine Druckaufträge mehr an. Tja, es gibt sie immer noch, die echten Bugs (Käfer), genau wie damals ihren Namensgeber, dem verschmorten Insekt, das 1950 oder so einen der ersten Großrechner per Kurzschluss lahmgelegt hatte.
Wenn der Compiler versteht, dass OPENSSL_cleanse keine Seiteneffekte hat außer key zu überschreiben, dann ist das ein klarer Fall für die Dead Store Elimination. Ähnlich sieht es mit einem memset() vor einem free() aus. Das ist vor ein paar Jahren aufgefallen, dass Compiler das nicht nur tun können sondern sogar in der Praxis wirklich tun. Plötzlich lagen im Speicher von Programmen Keymaterial herum. Also musste eine Strategie her, wie man den Compiler dazu bringt, das memset nicht wegzuoptimieren.
Sehr spannende Analyse von Fefe, wie Optimierungen des Compilers die Sicherheit von Software untergraben können. Da gibt man sich als Programmierer alle Mühe, sensible Daten aufzuräumen, und dann schmeißt der Compiler den Code wieder raus, weil er ihn für unnötig hält. Und Abhilfe ist gar nicht so einfach.
Kein Wunder, dass immer neue Lücken gefunden werden in Betriebssystemen und Software. Die Komplexität der SW-Entwicklungs-Prozesse hat ein derartiges Ausmaß angenommen, dass sie nur noch mit sehr hohem Testaufwand beherrschbar sind. Fefes Artikel beleuchtet dabei den interessanten Aspekt, dass sogar eine neue Compiler-Version Sicherheitslücken in Code reißen könnte, der ursprünglich sicher geschrieben war. Wer würde bei Recompilation mit einer neuen Compiler-Version den erzeugten Assembler-Code neu überprüfen? Es benötigt also umfangreiche und ständige Kontrollen des Outputs, um die Stabilität der Ergebnisse des Codes auch bei der Weiterentwicklung zu gewährleisten.
Der ChatGPT-Anbieter OpenAI hat angesichts der geplanten Regulierungen der Europäischen Union (EU) für künstliche Intelligenz (KI) mit einem möglichen Rückzug aus Europa gedroht. „Der derzeitige Entwurf des EU-KI-Gesetzes wäre eine Überregulierung“, sagte Sam Altman, Chef der Microsoft-Beteiligung OpenAI, gestern auf einer Veranstaltung in London. Zwar wolle sich der Konzern bemühen, neue gesetzliche Regulierungen einzuhalten, doch im Zweifelsfall wäre das Unternehmen bereit, dem europäischen Markt den Rücken zu kehren.
In der EU wird es immer schwieriger, eine Website zu betreiben oder technische Dienste anzubieten. De facto ist mittlerweile in der EU nahezu jede Website illegal. Zum Beispiel ist die Nutzung von Google Tag Manager oder Google Analytics an sich nicht erlaubt, weil die Google-Bedingungen dafür nicht mit der GDPR vereinbar sind. Die interessante Frage ist, welche Absicht eigentlich dahinter steckt.
für den Einsatz im Home-Office und beim Kunden vor Ort.
Über uns
Die Cephei AG ist ein Software-Unternehmen, das Konzerne bei der digitalen Transformation mit innovativen Konzepten und Produkten unterstützt. Wir entwickeln seit über 30 Jahren Lösungen um bestehende Geschäftsprozesse zu digitalisieren und neue digitale Geschäftsmodelle zu erschließen. Unsere Spezialgebiete sind Produktkonfiguration, Web-Portale, elektronische Beratungslösungen, mobile Apps und Telematik-Anwendungen.
Unsere Anforderungen für die ausgeschriebene Stelle
Universitätsabschluss im Bereich Informatik oder eine vergleichbare Ausbildung (bzw. ggfs. Nachweis der Befähigung durch bisher durchgeführte Projekte)
1 – 2 Jahre Berufserfahrung min., Praktika im Studium werden berücksichtigt
Java
Spring Boot
Hibernate
SQL
GIT
REST
Nicht Bedingung, aber durchaus willkommen wären außerdem
Kubernetes, Docker
Functional Programming
Clean Code
Postgres
Javascript
Application-Security
Microservice Architecture
Wir berücksichtigen auch Berufseinsteiger, setzen jedoch eine gewisse Mindesterfahrung mit der SW-Entwicklung voraus. Als anerkannter Ausbildungsbetrieb (IHK) haben wir bereits mehrere Fachinformatiker ausgebildet und Erfahrung darin, Berufseinsteigern eine gute Perspektive zu bieten.
Weitere Informationen
Falls Sie für Ihre neue Stelle bei uns umziehen müssen, helfen wir Ihnen mit einem Zuschuss zu den Umzugskosten und bei der Wohnungssuche.
In unserem Team arbeiten viele langjährige Mitarbeiter. Mehr als 60% der Belegschaft sind seit mehr als 10 Jahren bei uns. Wir bieten Vertriebsprovision und Erfolgsbeteiligung und fördern aktiv Familien mit Kindern durch eine Kinderzulage sowie flexibles Zeitmanagement mit ggfs. der Möglichkeit zum Home-Office.
Unsere Mitarbeiter üben ihre Tätigkeit vorwiegend im mobilen Office aus, jedoch sind gelegentlich Arbeiten vor Ort beim Kunden erforderlich. Deshalb sollten Sie im Einzugsbereich München wohnen, oder planen, dorthin umzuziehen, wenn Sie sich bei uns bewerben möchten.
Über Ihre Bewerbung mit den üblichen Unterlagen würden wir uns sehr freuen. Bitte senden Sie Ihre Bewerbung entweder via Monster oder an bewerbung@cephei.com.
Für telefonische Rückfragen oder weitere Informationen wenden Sie sich bitte an Frau Ahrens, Tel. 089 898267-10.
Cephei AG
Herzogstr. 33
80803 München
Tel: 089 898267-0
Fax: 089 898267-22 https://www.cephei.com
bewerbung@cephei.com
Neulich wollte ich einen längeren Text mit ChatGPT diskutieren. Allerdings gibt es in dessen Version 4.0 derzeit eine Prompt-Begrenzung auf 2048 Zeichen. Naja, kein Problem, dachte ich, da soll mir doch ChatGPT ein Programm dafür schreiben, und sich selbst am eigenen Schopf aus dem Gefängnis seiner Begrenzung befreien. Allerdings sollte das nicht ein simpler Split sein, sondern mit Überschriften für die einzelnen Teile und der Möglichkeit, sowohl einzelne Dateien zu erzeugen, als auch eine Gesamtdatei, die alle Teile, getrennt durch Überschriften, enthält. Außerdem sollte das Programm nach Möglichkeit nicht innerhalb einer Zeile umbrechen.
(Bestehende Tools legen einzelne Dateien ab, aber das ist ziemlich schwierig zu handhaben, wenn man die einzelnen Stücke in den Prompt einfügen will. Für so etwas ist eine Gesamtdatei mit Separatoren leichter zu bearbeiten.)
Jedenfalls, das erwies sich zunächst als gar nicht so einfach, ChatGPT servierte mir erstmal zwei Entwürfe, die beide mit oom-kills endeten (mein Rechner ging komplett in die Knie dabei, und ich habe mich schon gefragt, ob ich etwa gerade gehackt werde 😀). Dann kam aber doch eine funktionierende Version dabei heraus, die, wie ich meine, einen zwar ungewöhnlichen, aber dennoch sehr interessanten Ansatz verfolgt, um die Anforderungen zu erfüllen. Ich hatte dabei sozusagen die Rolle des Projektleiters, diktierte meine Anforderungen an die Software, aber ich war auch Tester und Mentor, d.h. ich habe auf Fehler und wünschenswerte Features hingewiesen. Nun, das dauerte zwar ein wenig, aber dann war die erste Version fertig, schneller, als ich das selbst hinbekommen hätte, und außerdem weitaus effizienter als mit Stack Overflow. Diese erste Version hatte dann nur noch einen Fehler, wenn eine Zeile länger war als die Begrenzung, erzeugte das Skript einen Teil, der die Begrenzung überschritt.
Also gab ich ChatGPT den Auftrag, eine Lösung dafür zu finden, und erklärte ihm, dass er Zeilen, die länger als die Begrenzung sind, eben doch umbrechen soll, mit einem (optischen) Hinweis auf die Fortsetzung im nächsten Teil, und dass zusätzlich nicht mitten in einem Wort getrennt werden soll. Interessanterweise landete ChatGPT dabei dann völlig im Wald und erwies sich als hoffnungslos überfordert, eine Lösung für dieses Problemchen zu programmieren. Am Ende war sogar der Code völlig zerstört (nichts funktionierte mehr), und ChatGPT gab irgendwann tatsächlich auf (es erzeugte keinen neuen Code mehr).
Nun ja. Das kleine Python-Tool finden Sie untenstehend. Vielleicht können Sie es einmal brauchen, es eignet sich übrigens auch für Twitter u.dgl. (Für Twitter etc. müsste man aber mit –max-chars eine andere Begrenzung setzen, der voreingestellte Default ist für ChatGPT-Prompts).
Den Teil, den ChatGPT nicht geschafft hat, habe ich dann eben selbst hinzugefügt (er ist mit blauer Schrift gekennzeichnet). Ich fand das insgesamt eine recht spannende Erfahrung. Eine Fragestellung, die ich durchaus als nicht so trivial empfand, wurde mit einigen Anläufen und Hilfestellung (z.B. ist das RegEx-Muster zur Erkennung der Teiler von mir – das muss unbedingt eindeutig sein, damit es nicht versehentlich falsch aufteilt, und das Muster, das ChatGPT zuerst vorschlug, hatte diese Gefahr) recht ordentlich gelöst. Aber bei etwas, das auf mich nicht allzu kompliziert gewirkt hat (und es dann auch nicht war), verrannte sich ChatGPT völlig. Auch dass ChatGPT den ursprünglich funktionierenden Entwurf bei diesem Fehlerbehebungsversuch völlig zerstörte, zeigt m.Mng., dass ChatGPT zwar eine große Hilfe beim Programmieren sein kann, aber ohne die Zusammenarbeit und die Hilfe eines menschlichen Entwicklers ist es, zumindest bisher, aussichtslos. Das wird dauern, bis ChatGPT Programmierer ersetzen kann – falls das jemals überhaupt eintreten wird. Die sich selbst weiter entwickelnde KI ist noch in weiter Ferne, würde ich meinen.
import argparse, os, re
def split_text(input_filename, output_filename, max_chars, delimiter, single_output, replace_input):
with open(input_filename, 'r') as file:
text = file.read()
paragraphs = text.split(delimiter)
result = []
part_count = 1
result.append(f"Teil {part_count:02}\n{'='*20}\n")
char_count = len("Teil 01\n" + "=" * 20 + "\n")
header_length = len(f"Teil {part_count:02}\n" + "=" * 20 + "\n")
for paragraph in paragraphs:
if char_count + len(paragraph) + len(delimiter) > max_chars:
part_count += 1
result.append(f"Teil {part_count:02}\n{'='*20}\n")
char_count = header_length
while len(paragraph) + header_length > max_chars:
slice_pos = max_chars-header_length
while slice_pos >= 0:
if paragraph[slice_pos] == " ":
break
slice_pos -= 1
if slice_pos == 0:
slice_pos = max_chars-header_length
else:
slice_pos += 1
pglist = list(paragraph)
pglist[slice_pos-1] = '>'
paragraph = ''.join(pglist)
result.append(paragraph[:slice_pos])
result.append(delimiter)
paragraph=paragraph[slice_pos:]
part_count += 1
result.append(f"Teil {part_count:02}\n{'='*20}\n")
char_count = header_length
result.append(paragraph)
result.append(delimiter)
char_count += len(paragraph) + len(delimiter)
if single_output:
if replace_input:
os.remove(input_filename)
with open(output_filename, 'w') as file:
file.write("".join(result))
else:
base, ext = os.path.splitext(output_filename)
for i, part in enumerate(re.split("Teil\s\d+(?=\n)\n====", "".join(result))[1:]):
with open(f"{base}-{i+1:02}{ext}", 'w') as file:
file.write(f"Teil {i+1:02}\n===={part}")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Split text files into smaller parts.")
parser.add_argument('input', help="Input filename")
parser.add_argument('-o', '--output', help="Output filename", default=None)
parser.add_argument('-m', '--max-chars', type=int, help="Maximum number of characters per part", default=2048)
parser.add_argument('-d', '--delimiter', help="Delimiter between paragraphs", default="\n\n")
parser.add_argument('-s', '--single-output', action='store_true', help="Store the result in a single output file")
parser.add_argument('-r', '--replace-input', action='store_true', help="Replace the input file with the result")
args = parser.parse_args()
if args.output is None and not args.replace_input:
parser.error("Output filename must be provided if not using --replace-input")
output_filename = args.output if args.output is not None else args.input
split_text(args.input, output_filename, args.max_chars, args.delimiter, args.single_output, args.replace_input)
Sie können das Script entweder aus obiger Box herauskopieren, oder eine Archivdatei herunterladen. (OpenAI erhebt keinerlei Anspruch auf Copyright etc. und stimmt deshalb der Veröffentlichung zu).
Noch zwei Hinweise: Sollte bei Ihnen eine Teildatei auf Platte größer werden als die Begrenzung, liegt das vermutlich an Umlauten, bzw. daran, dass UTF8 für gewisse Zeichen auf Platte zwei Bytes erzeugt. Der tatsächliche Text in einer Teildatei wird aber (incl. Überschrift und Trenner) niemals größer als die Begrenzung. Außerdem müsste man eigentlich noch den Fall abgefangen, dass max_chars kleiner angegeben wäre als die Länge der Separatoren, aber dazu war ich zu faul, wer würde schon so kleine Teile brauchen?
Wie Sie vielleicht schon gehört haben, hat Fox News kürzlich seinen (mit Abstand!) erfolgreichsten Moderator, Tucker Carlson, fristlos vor die Tür gesetzt. Dazu ein Tweet von Robert F. Kennedy jr:
Fox fires @TuckerCarlson five days after he crosses the red line by acknowledging that the TV networks pushed a deadly and ineffective vaccine to please their Pharma advertisers. Carlson’s breathtakingly courageous April 19 monologue broke TV’s two biggest rules: Tucker told the truth about how greedy Pharma advertisers controlled TV news content and he lambasted obsequious newscasters for promoting jabs they knew to be lethal and worthless. For many years, Tucker has had the nation’s biggest audience averaging 3.5 million — 10 times the size of CNN. Fox just demonstrated the terrifying power of Big Pharma.
Carlson hatte natürlich einen harten Knebelvertrag, und er darf nun eigentlich bis 2025 keinen Vertrag als Moderator mehr annehmen. Naja, heutzutage mit Social Media alles kein Problem mehr, er macht einfach seinen eigenen Kanal bei Twitter auf. Und da Elon Musk wieder und wieder betont, wie wichtig ihm die Redefreiheit ist, und außerdem die Monetarisierung für Content Creators stark verbessert hat, kann man nun gespannt sein, was Carlson erzählen wird, wenn es, wie bei den großen Hirnwaschanstalten, nicht mehr „das Wichtigste ist, was man NICHT sagen darf“, wie er in seiner ersten Videobotschaft erklärt.
„Pressefreiheit ist die Freiheit von zweihundert reichen Leuten, ihre Meinung zu verbreiten“, meinte Paul Sethe, einer der Gründer der FAZ. Er hatte jedoch nicht mit Elon Musk gerechnet. Und mit Pavel Durov (Telegram) erst recht nicht.
Anmerkung, zum Titel: „Flucht von Alcatraz“ ist ein US-amerikanischer Thriller von 1962, er handelt von einem Ausbruch aus dem ehemaligen Hochsicherheitsgefängnis auf der Insel Alcatraz.
Kürzlich hat Geoffrey Hinton, ein führender KI-Entwickler, seinen Posten bei Google aufgegeben, um über die Risiken der KI zu sprechen. Er warnt vor Superintelligenz, die die Menschheit auslöschen könnte. Aber wie konkret das geschehen könnte, sagt auch er nicht. Ich finde dieses Szenario wenig überzeugend. Denn das würde in der Maschine zwei menschliche Eigenschaften voraussetzen, deren Ursache wir wissenschaftlich selbst kaum im Ansatz verstehen – und vermutlich nie ausreichend verstehen werden, um sie in Maschinen replizieren zu können.
In diesem Artikel wird die Frage diskutiert, ob künstliche Intelligenz (KI) eine ernstzunehmende Bedrohung für die Menschheit darstellt. Es werden Bedenken geäußert, dass sich KI verselbständigen und in eine Superintelligenz verwandeln könnte, die die Kontrolle übernimmt und die Menschheit versklavt oder vernichtet. Der Autor ist jedoch skeptisch, da er argumentiert, dass KI Bewusstsein und eigene, zielgerichtete Absicht benötigen würde, um solch eine Bedrohung darzustellen – Eigenschaften, die wir bisher nicht in Maschinen replizieren können.
Der Artikel fordert dazu auf, sich auf realistischere Herausforderungen im Zusammenhang mit KI zu konzentrieren, wie Deep Fakes, Betrug, den Verlust von hochqualifizierten Arbeitsplätzen und die Verschmelzung virtueller und realer Geschehnisse. Der Autor hält die Angst vor einer Superintelligenz für unbegründet, da die Wahrscheinlichkeit ihres zufälligen Entstehens praktisch null ist.
(Hinweis: Diese Zusammenfassung des Artikels haben wir von ChatGPT 4.0 erstellen lassen, um die Gefahr des „Verlustes von hochqualifizierten Arbeitsplätzen“ zu illustrieren.)