Datenbank-Optimierung - mein Highlight der Woche
Bei meiner Arbeit an der Uni Bern war ein Grossteil der Zeit in die Optimierung von Datenbank-Zugriffen geflossen. Das betraf hauptsächlich ein System für ein Portal für Dozierende und Studierende mit Stundenplänen, Kurseinschreibungen, Feeds zu etlichen Themen und nach Studienjahr getrennt, Kalendersynchronisation von personalisierten Kalendern uvm. Jenes Portal ist uralt und wurde einmal mit PHP4 entwickelt und sollte abgelöst werden. Wurde es aber nicht, sondern es wurde vor vielen Jahren mühsam unter PHP5 lauffähig gemacht, aber der Code blieb noch immer zumeist prozedural, mit vielen Includes und gespickt mit allen erdenklichen Highlights an Programmiersünden, sei es Wartbarkeit, Caching/ Performance, SQL-Injection oder Verständnis von Algorithmen und Gestaltung von Datenbankabfragen. Seit dem ersten Ablösetermin sind nun 8..9 Jahre vergangen … aber Herbst 2019 wird es endlich(!!) abgelöst. Heisst aber: bis dahin muss es weiter am Leben erhalten werden.
Es wurden 5 Applikationsteile, die “am meisten weh tun” ausgemacht und jene optimiert. Letzten Dienstag wurde es eingespielt. Doch, es hat sich gelohnt - da ist so ein markanter Abfall:
Man könnte meinen: da ist was kaputt. Aber nein: es funktioniert genau gleich!!
Ich hoffe, ich kann euch mit diesem Praxis-Beispiel motivieren: macht einmal eine Performance-Analyse und schaut genauer auf die Top 3!
Texte anhand einer Quelle einfärben
Meine Nachrichten-Feeds benennen die Nachrichten-Quelle und färben sie ein. Es entsteht eine “bunt” eingefärbte Quelle, bevor deren Meldungs-Überschrift genannt wird.
Und wie funktioniert es, dass “Tagesschau”, “Spiegel” oder “Heise” jeweils spezifisch eingefärbt sind?
Naja, der Text - also String - der Quelle wird mit einer MD5 Funktion gehasht. Dann erhält man so einen Hexcode aus einem vorgegebenen String.
Wenn man sich vom Beginn des Hex-Strings jeweils die aufeinanderfolgenden 2..3 Stellen herausgreift, kann man diese dem Anteil für rot, grün und blau zuordnen.
Damit der Hintergrund und Vordergrund relativ zueinander passen, definiere ich für beide einen eine Range von..bis. Der ermittelte Wert aus dem Hash wird relativ zum von-bis-Range für Vordergrund und Hintergrund eingeordnet.
Und das ist der zugehörige PHP-Code:
/** * return html code for a span with background color based on a checksum of the given text * @param string $sText text that is used for checksum; if false it returns a gray box * @param string $sContent optional: text to show * @return string */ function _getChecksumSpan($sText, $sContent = '') { if ($sText) { // color ranges in decimal values for RGB from ... to $iFgStart = 60; $iFgEnd = 160; $iBgStart = 180; $iBgEnd = 240; // divider: 3 digits of md5 will be extracted $iFgDivider = 16 * 16 * 16 / ($iFgEnd - $iFgStart); $iBgDivider = 16 * 16 * 16 / ($iBgEnd - $iBgStart); $sHash = md5($sText); $sColor = '' . 'color: rgba(' . ($iFgStart + round(hexdec(substr($sHash, 0, 3)) / $iFgDivider)) . ',' . ($iFgStart + round(hexdec(substr($sHash, 3, 3)) / $iFgDivider)) . ',' . ($iFgStart + round(hexdec(substr($sHash, 6, 3)) / $iFgDivider)) . ',' . '1' . ');' . 'background: rgba(' . ($iBgStart + round(hexdec(substr($sHash, 0, 3)) / $iBgDivider)) . ',' . ($iBgStart + round(hexdec(substr($sHash, 3, 3)) / $iBgDivider)) . ',' . ($iBgStart + round(hexdec(substr($sHash, 6, 3)) / $iBgDivider)) . ',' . '1' . ');' ; } else { $sColor = "color: #888; background: #ccc;"; } return '<span style="' . $sColor . '; border-left: 0.8em solid; padding: 0.1em 0.4em 0.1em 0.3em ;">' . ($sContent ? $sContent : ' ') . '</span>'; }
weiterführende Links:
- meine RSS-Seite: Nachrichten
Magix Music Maker - keine Abspielanzeige und mehr
Quasi von einem Tag zum anderen mochte “meine” Musiksoftware nicht mehr so recht.
- Die senkrechte Linie zur Anzeige der Position beim Abspielen bewegte sich nicht mehr
- Die Zeit-Anzeige der Abspielposition verblieb immer auf “001:01:000”
- Öffnete man den Mixer während des Abspielens, war die Anzeige des Equalizers zur Amplitude der Ausgabekanäle tot
- Diverse Menüpunkte waren nicht mehr wählbar. Darunter alle Export-Funktionen (das ist dann schon eine erhebliche Einschränkung)
- das Userinterface war bei geladenen Songs extrem langsam.
Meine Setup-Binaries habe ich alle da - sowohl von der Software, als auch den Soundpools und Synthesizern.
Was ich alles versuchte, und NICHT half:
- Programmeinstellungen -> Audio: Treiber umstellen - funktionierte in keiner Kosntellation - egal ob Wave, DirektSound, ASIO, …
- Setup von MMM ausführen und “Reparieren”
- Setup von MMM ausführen und “Deinstallieren” - anschliessend erneut ausführen und komplett neu “installieren”
Lösung Teil 1:
Von Magix gibt es ein Uninistall Tool, das noch weitere Installationsreste findet.
- Setup von MMM ausführen und “Deinstallieren”
- MX Uninstaller herunterladen - ausführen - Es gab einen Registry Eintrag, den ich gelöscht habe. Achtung: nicht wahllos alles löschen, was das Cleanup-Werkzeug so hergibt: Soundpools und die erstellten Dateien will man ja nicht unbedingt wegwerfen.
- Reboot des Rechners (kann sein, dass es das nicht braucht, aber wenn man schon “ewig” frustriert daran herumschraubt…)
- Setup von MMM ausführen und “Installieren”
- Meine Soundpools waren noch da - die Setup von MMM Premium Synthesizer mussten nochmals installiert werden.
Jetzt ist “nur” noch der Punkt mit dem langsamen Userinterface. Das ist etwas subtil. Nach Programmstart ist alles normal flüssig schnell. Nach Laden eines meiner Songs schläft die GUI ein. Simple Dinge, wie eine Einzelspur stumm oder solo schalten braucht ca. 2 Sekunden. Aber halt nicht nur das: sobald auch nur irgendein Objekt-Synthesizer in irgendeiner Spur verwendet wird, werden sämtliche Aktionen inder UI langsam. Sei es einen Snthesizer zu öffnen oder den MIDI Editor oder Verschieben/ Anpassen von Blöcken in den Tracking-Spuren - kurz: gefühlt alles.
Das bin ich noch am Untersuchen.
Dieselben Songs in einer älteren Version geladen - dort ist die UI auch nach dem Laden unverändert. Es hängt zum einen definitiv an der MMM Version 2017. Alos zurück zur 2017er Version. Durch Entfernen einzelner Spuren in einem Song wurden die Verursacher ausgemacht: Sobald ein Objekt-Synthesizer in einer Spur ist, ist die Behandlung jener Spur extrem langsam. Das Verhalten ist allen Objekt-Synthesizern gemein - alle unter Instrumente -> Objekt-Synthesizer gelisteten habe ich durchprobiert.
Nochmal das Setup von MMM ausführen und “Reparieren” … bringt nichts.
Im Moment habe ich gerade noch keine weitere Idee. Hmmm :-(
weiterführende Links:
Immer wieder hilfreich: SMS mit Roaming-Kosten
Zum Jahreswechsel war ich mal wieder St. Petersburg. Von meinem Mobilanbieter bekomme ich stets eine SMS mit Roamingkosten für das jeweilige Land, sobald er mich irgendwo neu lokalisiert.
Auch wenn wir 2017/2018 haben - und ich “mitten in Europa” war (der Ural als Europagrenze zu Asien ist 1.500 km weg), war dies eine hilfreiche Info:
Ich nehme mal an, das meinen sie ernst: 10 Franken für 1 Megabyte.
Wenn man es hochrechnet: 1GB Datenvolumen kosten 10.000 Franken (=9.000 Euro). *Schluck*