knuspermagier.de
Er bloggt noch? Krass!

DateTime

Ich bin ja manchmal sehr resistent dagegen, neue Sachen zu lernen. PHP bietet seit Version 5.2.0 die DateTime-Klasse, aber ich benutze eigentlich so gut wie immer, wenn es um Daten und Zeiten geht noch Funktionen wie date, strftime und strtotime. Achja und mktime nicht zu vergessen!

Also, natürlich habe ich auch DateTime schonmal benutzt, in größeren Applikationen, aber ich meine, wenn ich jetzt eben mal schnell ein Script zusammenklöppel dann kommt es mir nicht so leicht aus den Fingern. Weil seit PHP 8.1.0 nun strftime deprecated ist, nehme ich das zum Anlass, mir mal den neuen heißen Scheiß genau anzugucken und Teile meines Gehirns zu überschreiben. Ich versuche es zumindest.

neonbrand-kyxxmtptzek-unsplash.jpg
Normalerweise verzichte ich ja auf nichts sagende Stockfotos, aber eine verdammte Sanduhr, äh ein holistic hourglass, bot sich hier einfach an.

date

Die Funktion von date ist natürlich das Formatieren eines Unix Timestamps, wär hätte das bei dem Funktionsnamen erwartet.

echo date('Y-m-d H:i:s', 1231234514);
// Ergibt zum Beispiel 2009-01-06 09:35:14

Kann ja nicht so schwer sein, dass jetzt mit DateTime zu machen:

$d = new DateTime('@1231234514');
echo $d->format('Y-m-d H:i:s');
// Ergibt zum Beispiel 2009-01-06 09:35:14

Ja gut, die Syntax mit @ ist ja etwas komisch, aber wenn man kein date benutzt, muss man eigentlich auch fast keine Unix Timestamps mehr benutzen, da man eh alles in DateTime hat, oder halt in Date-Strings, und das kann DateTime ja auch einfach direkt:

$d = new DateTime('2010-10-10 12:15:33');
echo $d->format('Y-m-d H:i:s');
// Ergibt zum Beispiel 2010-10-10 12:15:33

Der Format-String ist auf jeden Fall der gleiche Kram wie bei date, das ist schön. Nicht so wie bei strftime, wo man sich absurde Dinge mit Prozentzeichen merken muss!

strftime

Der hässliche kleine Bruder von date, wo man jedes mal Nachschlagen muss, welche Format-Strings man jetzt benutzen muss. Immerhin jetzt deprecated. Doch wozu habe ich strftime benutzt? Immer, wenn bei der QA jemand sagte “Ja in Deutsch heißt das aber gar nicht February XD”. Ja, stimmt. date kann keine Locale. So im Jahr 2006 habe ich da dann noch folgendes gemacht:

$months = ['', 'Januar', 'Februar', 'März', …];
$monthName = $month[date('n', $timestamp)];

$formatted = date('d.', $timestamp) . ' ' . $monthName;

Wie oft ich in meinem jungen Leben damals wohl Arrays mit Monatsnamen tippte. Damals gab es ja auch noch keine Notizapps und Copy-Paste! Naja, vielleicht doch, aber ich brauche immer so lang um mich an Sachen zu gewöhnen.

Jedenfalls benutzt man strftime jetzt ungefähr so:

echo strftime('%A, %e. %B', 1231234514);
// Ergibt: Tuesday,  6. January

setlocale(LC_TIME, 'de_DE');
echo strftime('%A, %e. %B', 1231234514);
// Ergibt: Dienstag,  6. Januar

Tut also das, was man will. Leider ist das handlen der System-Locale und so immer etwas fummelig und je nach Server-Konfiguration funktioniert es auch nicht, weil de_DE zum Beispiel nicht installiert ist. Zudem der komplett andere Format-String. Trotzdem hab ich es jetzt einige Jahre benutzt.

Wie macht man es nun mit DateTime? Gar nicht! Haha, denn DateTime kann auch keine Locale. Seit PHP 5.3.0 gibt es aber den IntlDateFormatter, wenn man die intl-Extension installiert hat.

$d = new DateTime('@1231234514');
$formatter = new IntlDateFormatter(
    'de_DE', 
    IntlDateFormatter::SHORT, 
    IntlDateFormatter::SHORT,
    null,
    null,
    'EEEE, d. LLLL'
);

echo $formatter->format($d);
// Ergibt: Dienstag,  6. Januar

Ist etwas… klobig, aber zeigt mir eine Programmiersprache, in der internationales Daten-Formatieren nicht mega ausführlich ist. Das Pattern ist natürlich auch ein anderes als bei date und dem normalen format von DateTime, man muss nämlich die offiziellen Symbols aus der Tabelle der ICU nehmen. Immerhin kennt man die schon ganz gut, wenn man öfter unter JavaScript Daten mit datefns formatiert.

Fassen wir zusammen: Vorher dumm, nachher bisschen weniger dumm, aber etwas, was man sich immer zusammenkopieren wird.

strtotime

Eine meiner Lieblingsfunktionen, denn sie tut genau das, was man erwartet. Aus 2009-01-06 09:35:14 wird 1231234514. Wie man oben schon gesehen hat, kann DateTime das ja direkt im Konstruktor, das wird also ein einfaches, mir das anzugewöhnen.

mktime

Selten genutzt und jedes mal gehasst, aufgrund der Parameter-Reihenfolge, wer soll sich das merken:

mktime(
    int $hour,
    ?int $minute = null,
    ?int $second = null,
    ?int $month = null,
    ?int $day = null,
    ?int $year = null
): int|false

Da kann DateTime natürlich punkten:

$d = new DateTime();
$d->setTime(12, 0, 0);
$d->setDate(2010, 1, 4);

Fazit

Eigentlich ist es gar nicht so schwer, man müsste sich nur mal darauf committen, wie bei so vielem im Leben. Zahnseide benutzen ist auch gar nicht so schwer, man muss es nur eben machen! Was Laravel-Apps und sowas angeht wird das auch nicht so schwierig, mal sehen, ob ich auch in meinen Quick’n’Dirty-Scripten darauf umschwenken kann.

Bonus: Carbon

Jetzt kommen sicher alle und rufen, halt, stopp, benutz doch einfach Carbon! Ja, guter Einwand. Carbon ist auch echt nett und hat einen ganz großen Haufen von Convenience-Funktionen, zum Beispiel geht das internationale Formatieren wesentlich schnittiger.

Da Laravel soweit ich weiß, zumindest war es früher so, Carbon mitbringt, hatte ich damit auch schon viel Kontakt und habe es hier und da auch eingesetzt, aber, wie schon dreimal gesagt, der Hauptpunkt, wo ich weg will von den Legacy-Kram sind schnelle Scripte und Quatschkram, bei dem ich nicht erstmal eine Third Party Library installieren will. Daher wollte ich mir hier erstmal die eingebauten Möglichkeiten genau angucken.

M1 Max auslasten

Ich musste heute mal ein paar Videos encodieren, und weil ich gerne Speicherplatz sparen wollte, dachte ich mir, ich nutze direkt den modernen h265-Codec, oder HEVC, wie Apple ihn auch nennt.

Zum Encodieren benutze ich meistens HandBrake, weil da so eine tolle UI für ffmpeg ist. Allerdings musste ich erstmal herausfinden, wie ich damit nun ein HEVC-Video erzeugen kann, unter benutzung voller Hardware-Beschleunigung. Wählt man nämlich einfach nur h265 als Codec aus, dann schafft er gerade mal so 3-4 Frames pro Sekunde, das wäre mir doch etwas langsam gewesen.

Natürlich muss man in der Selectbox “h265-Videotoolbox” auswählen. Was ich für einen komischen scammy Name einer Windows-Shareware hielt, die irgendwie zufällig in den MacOS-Build von HandBrake reinkam ist anscheinend der offizielle Apple-Name für Hardwarebeschleunigte h265-Encodings.

Das kommt wohl mit ein paar Einschränkungen, was Qualität und alles angeht, aber da war für meinen Einsatzzweck erstmal egal. Nach ein paar Minuten Volllast fing das Macbook tatsächlich an zu lüften. Kaum hörbar. Das Encoding lief dann mit über 200 FPS. Traumcomputer, weiterhin.

Danke für den Tipp, Markus!

Dragonball Z Kai (2)

Nun bin ich mehr als fünfzig Folgen drin und, wie im letzten Post erwartet, trafen sie auf Freezer und zwar so richtig. Zuerst ging es noch langsam und abwechslungsreich los, mit verschiedenen Gegnern, die sich von der Kampfkraft langsam stärkten. Die letzten, ich weiß nicht genau, dreißig Episoden der Freezer-Arc umfassten aber nur noch den großen Kampf von Son Goku gegen den Endboss dieser Geschichte. Ich hatte das ja schon wirklich lang und ausgestreckt im Kopf, aber dass es so lang war, hatte ich vergessen. Wie muss das damals gewesen sein, als man da nur eine Folge pro Tag gucken konnte. Oder gab es Doppelfolgen? Ich glaube es waren Doppelfolgen.

Insgesamt fiel mir auf, dass die Serie doch ziemlich brutal ist, das hatte ich nicht so in Erinnerung. Kein Wunder, dass es nicht im RTL2-Nachmittagsprogramm lief. Beim Gucken schaue ich ständig im PERFECT POWER LEVEL LIST Wiki um mir eine Vorstellung zu machen, wie stark jetzt alle sein sollen. Keine Ahnung warum.

Ein witziges Element, dass ich, ja, ich sag es immer wieder, komplett vergessen hatte, war die Ginyu Force mit ihrem bescheuerten Tanz, haha.

ginyutokusentai.jpg
Bitte nicht verklagen, wegen einem Screenshot. Quelle: Dragon Ball Wiki

Nun kämpfen Goku und Freezer ungefähr dreißig Episoden lang und Freezer sagt mehrfach “Ich glaube, dass in so zwei Minuten der Planet explodiert”. Daraufhin kämpfen sie ewig weiter, zehn Folgen vergehen, nicht allerdings die Zeit. Zwei Minuten. Für immer. Naja. Trotzdem bleibt es immer auf eine komische Art und Weise spannend — an und für sich weiß ich ja, was passiert und wer überleben wird. Ab und zu gibt es auch noch einen überraschend Emotionalen Moment. Eigentlich immer noch perfekte Unterhaltung!

(Das einzige, was ein bisschen nervt ist dieser Atombomben-Explosions-Sirenen-Sound nach jeder Energiekugel, die auf dem Planeten einschlägt.)

Noch eine Sache, die ich nie gedacht hätte, dass ich sie über die Lippen bringe: Der englische Dub ist über jeden Zweifel erhaben. Mega gut.

Nachdem Freezer erstmal erledigt ist, geht auch alles super schnell, Dragonball Z Kai, ohne Filler-Arcs, sei dank. Kurz ein bisschen mit den geretteten Namekianern auf der Erde abhängen, alle, die noch tot sind, wiederbeleben und schwupps, zwei Folgen, nach dem man dachte, man sieht Freezer erstmal nicht wieder, landet er schon wieder auf der Erde – und mit ihm Trunks.

Wie cool ist eigentlich Trunks? Ultra.

Kirby 3.6 und PHP 8.1

Ich hatte länger Bedenken auf Kirby 3.6 upzudaten, weil ich dachte, alle meine Plugins gehen durch den Umbau im Panel kaputt, aber dem war gar nicht so klappt alles noch. Endlich kann ich also den eingebauten Builder benutzen! Zeitgleich habe ich auch mal auf PHP 8.1 geupdated und bin jetzt up to date für die nächsten zehn Jahre, juchu!

BetterJournal (3)

So, nicht, dass ich denke, dass irgendjemand es benutzen würde, aber ich dachte, es wäre mal wieder an der Zeit etwas bei Github hochzuladen. Ich legte zum Einen für BetterJournal eine Projektseite im Wiki an, mit ein paar Screenshots und merkte, dass ich da dringend nochmal ans Design muss, das sieht aus wie Kraut und Rüben, also das Wiki, nicht BetterJournal. Zum Anderen pushte ich den Code zu Github.

Mir gibt es nun immerhin so halbwegs das Gefühl mal eine Sache abgeschlossen zu haben, etwas so rund gemacht, dass jemand es theoretisch benutzen könnte, ein gewisses Interesse daran, mit PHP Code rumzuspielen vorausgesetzt. Gleichzeitig sagt in mir wieder eine Stimme, dass das alles nicht genug ist, keiner läd sich ein paar PHP-Dateien runter, warum habe ich es nicht direkt als iPhone App gemacht, die im App Store ist, das wäre cool!

Alles eine Einstellungssache, natürlich. Ich entscheide mich jetzt aktiv dafür, dass ich stolz bin, ein benutzbares Mini-Projekt in kurzer Zeit zusammengebaut habe. Zumindest versuche ich das.

Dragonball Z Kai (1)

Letztens scrollte ich durch Reddit und sah mal wieder ein Gif von einer Szene aus Dragonball Z. Eigentlich habe ich Apollo, den Reddit-Reader meiner Wahl meistens gelöscht, aber ab und zu verspüre ich leider den Drang und dann muss ich ihn installieren und scrollen. Furchtbar. Naja, jedenfalls weckte das in mir die Lust auf Dragonball. Neben Pokémon war das damals einer der ersten Anime, mit denen ich in Kontakt kam. Damals, auf RTL2 um 19 Uhr oder so, mit viel Werbung.

Ich las weder den Manga zuende, noch guckte ich es im Fernsehen fertig, da ich die Lust verlor, oder durch andere Anime abgelenkt wurde, aber eine gewisse Faszination war natürlich weiterhin in meinem Kopf gespeichert. Zum zwanzigsten Geburstag gab es nun, also vor 13 Jahren, einen Remaster oder so. Die alten Folgen wurden aufgepeppt, teilweise wohl Dinge neu gezeichnet und auf High Definition upgegradet. Zudem wurde alles etwas gestrafft und alle Filler-Episoden entfernt, was die Gesamtzahl der Episoden auf 167 reduziert, statt den 291 Folgen der Originalfassung. Das ist doch überschaubarer!

Ich fing mal an zu gucken und war direkt in den Bann gezogen. Ich erinnerte mich an fast gar nichts mehr. Klar, die Charaktere sind mir ein Begriff, aber kaum weitere Details. Das Piccolo nach Son Gokus erstmaligen Ableben erstmal Son Gohan trainiert, und ganz casual den Mond kaputt schießt, haha. Komplett vergessen. Wie ging eigentlich das normale Dragonball zu Ende? War Piccolo da der Endgegner? Keine Ahnung mehr. Schade eigentlich, dass Dragonball Z Kai nicht ganz am Anfang beginnt.

Ich bin jetzt durch mit dem ersten Arc, dem Kampf gegen Vegeta und Nappa und hatte viel Spaß dabei. Ungewöhnlicherweise gucke ich es auf Englisch, aber der Dub ist auch richtig gut, da kann man nicht meckern. Natürlich dauerte der Fight mit Vegeta jetzt irgendwie fünf oder sechs Episoden lang, aber was soll man machen, spannend war es trotzdem, auch wenn man ja doch weiß, wie es ausgeht. Freue mich nun auf den nächsten Teil auf Namek, dem Heimatplaneten von Piccolo! Auch hier sind meine Erinnerungen ziemlich verwaschen. Treffen sie da schon auf Freezer? Bald werde ich es erfahren!

Mein Allerwertester

Letztens, ich glaube, weil ich unter anderen Markus Lanz es sagen hörte, fragte ich mich, wie jetzt eigentlich die richtig offizielle, anatomisch und medizinisch korrekte Bezeichnung für den Teil des Körpers ist, auf dem man sitzt. Hätte ich da jetzt eine große, grüne, nach Rost stinkende Warze und müsste eine Ärztin oder einen Arzt anrufen und ihr oder ihm die Situation schildern, was würde ich sagen?

Markus Lanz sagte jedenfalls “Po”. Das Wort hört man recht häufig und in meinem Kopf ist es irgendwie mit Kindersprache verbunden. Tatsächlich ist es ja auch die Kurzform von “Popo“, das laut Duden aus der Kindersprache kommt. Sollten Erwachsene in normalen Gesprächen also “Po” benutzen?

“Popo” ist übrigens die Kurzform des lateinischen Wortes “Podex”, was allerdings eigentlich “Furzer” bedeutet, also auch kein Wort, was man jetzt benutzen sollte, um gebildet zu wirken. Bei der Gelegenheit schaute ich direkt mal in den Eintrag zu “furzen”, einfach um mal zu gucken, was der Duden dazu zu sagen hat. Gebrauch: derb. Ja, das würde ich auch sagen. Ein Synonym dazu ist koffern. Das habe ich noch nie gehört. Hinten in der Aula wurde laut gekoffert.

Wie dem auch sei, das Wort für den Normalgebrauch scheint “Gesäß” zu sein. Ganz besonders angetan hat es mir allerdings der “Allerwerteste”, der mir erst bei tieferer Recherche wieder ins Gedächtnis gespült wurde. Umgangssprachlich scherzhaft verhüllend, genau mein Sprachstil.

Duden.de ist auf jeden Fall eine ganz gute Quelle für einen verregneten Nachmittag und ziemlich direkt vor “Podex” im Duden ist übrigens ”Podcast”, keine Ahnung, ob es da einen Zusammenhang gibt.