Alle Artikel zu #programmieren


Externe Links extern öffnen

Hier im Blog werden, wenn das Theme gerade richtig funktioniert, externe Links anders dargestellt als interne, und bei den internen wiederum die, die zu Posts führen anders als die die zu anderen Inhalten führen. Damit ich nicht immer von Hand die CSS-Klassen angeben und das target-Attribut für externe Links setzen muss, habe ich mir zuerst ein Makro geschrieben (G11 sei Dank), später dann ein PHP-Script was die Datenbank durchforstet. Das war auch deshalb nötig, weil ich keine Lust hatte, von Hand alle alten Posts durchzugehen und die Links zu markieren.

Da ich irgendwie immer noch zu faul bin die Makros zu benutzen oder die Links zu markieren, benutze ich das Script immer noch ab und an. Und mittlerweile habe ich beschlossen, einen CronJob dafür einzurichten. Dann ist's auch nicht schlimm, wenn ich mal vergesse einen Link zu markieren.

Externe Links sollten sich zur Abgrenzung von der Website, von der aus man sie aufruft, in einem neuen Fenster bzw. heutzutage ja eher in einem neuen Tab öffnen. Ich verstehe die Entwickler von Webseiten, bei denen das nicht der Fall ist, nicht. Der Aufwand ist minimal und mir sind keine Probleme bekannt. Es nervt total, wenn man einem externen Link folgt und die Seite auf der man vorher war dann direkt weg ist. Meine Meinung, aber vielleicht teilen einige Leute die ja.

Für den Fall biete ich jedenfalls mein Script zum Download an. Also, für den Fall, dass jemand meine Meinung teilt, auch einen Wordpress-Blog hat und in diesem Links markieren möchte. Man muss oben seine Domain angeben, damit das Script interne URLs erkennt. Danach müssen die Datenbankdaten angegeben werden. Anschließend werden die Posts durchlaufen und per regulären Ausdrücken auf Links überprüft. Die URL wird bei internen Links gestrichen, einige Schreibweisenfehler werden korrigiert. CSS-Klassen werden gesetzt (ggf. anpassen!) und das target-Attribut bei externen Links. Abschließend geht das Ganze zurück in die Datenbank. An verschiedenen Stellen habe ich Kontrollelemente eingebaut, die genutzt werden können, um die Arbeit des Scripts zu überprüfen; das macht natürlich nur Sinn, wenn man das Schreiben in die Datenbank dieweil deaktiviert.

Das Script darf zu nicht-kommerziellen und kommerziellen Zwecken frei benutzt und verändert werden. Daher keine noch so freie Lizenz, sondern ausnahmsweise mal: Macht was ihr wollt! :D (Das bedeutet in der Konsequenz übrigens auch den Ausschluss jeglicher Haftung durch mich. Sichert also im Zweifel eure Datenbank vorher - ich hab auch mal was kaputt gemacht damit, weil n Fehler drin war.)

Falls wirklich jemand die Datei lädt und benutzt, wär's cool, wenn derjenige hier einen Kommentar schreiben würde. Das gilt auch, wenn noch Fehler drin sind. Auch Fragen sind willkommen, alles wie immer halt hahahah

Achtung Update: Das Script produziert in seiner aktuellen Version Fehler, was man daran sieht, dass es den Link zu sich selbst geschrottet hat -.- herunterladen kann man es, wenn man das http:// killt funktioniert natürlich nur intern. Extern fehlt ein konzertheld.de/ zwischen dem http:// und dem wp-content. Ich fixe das dann mal und gebe ein neues Release heraus.

linksmarkieren-anon.php



Chaos um Fotos

Vor ein paar Tagen wurde ich auf die Idee gebracht, einen Fotoservice zu nutzen statt direkt ins Blog zu posten. Als Alternative zu dem ebenfalls vorgeschlagenen DeviantArt hielt ich das für sinnvoll und habe mich mal bei Flickr angemeldet, bisher mit mäßiger Begeisterung. Direkt in der nächsten Nacht hatte ich meine Zugangsdaten vergessen und habe es nicht geschafft den wiederzufinden - also noch einen Account erstellt.

Nachdem dann heute das Flickr-Wordpress-Plugin nicht so der Knaller ist und mir Flickr selbst außerdem recht überladen erscheint (Community-Krams, bla, Werbung, Yahoo, nerv...) hab ich mir dann Picasa angeschaut, was schonmal deutlich einfacher war dank vorhandenem Google-Account. Picasa Web verlangt zwar für das Hochladen von mehr als 5 Fotos gleichzeitig das Programm Picasa, was aber nicht besonders tragisch ist, da mir das auf Anhieb gefällt und ich eh noch ne Verwaltung für meine Tonnen von Fotos gebrauchen kann. Im Hochladen ist es schneller und die Picasa-Website ist deutlich schlanker.

Mittlerweile fliegen in Wordpress zwei Picasa- und ein Flickr-Plugin rum, das bisherige Lightbox-Plugin und noch ein paar Stückchen von einem neuen, das ich noch nicht ans Laufen bekommen habe. Und alles nur, weil ich meine Fotos von extern einbinden wollte. Das letzte Picasa-Plugin gefällt mir mit Abstand am Besten, nicht nur, weil es das einzige ist, was zumindest die Bilder ordentlich anzeigt (manchmal zumindest), sondern auch weil es (in der Demo) am Schönsten aussieht und die besten Funktionen bietet. Außerdem ist der Quellcode vielfältig anpassbar und übersichtlich. Es handelt sich um picasaView von sattes-faction.

Als Überblick über die noch vorhandenen Schwierigkeiten hier noch mein Kommentar auf der Anbieterwebsite, zu dem ich hoffentlich eine Lösung bekomme:

Moin, die Demo sieht ja sehr gut aus, leider funktioniert bei mir das ein oder andere nicht. Die Bilder werden angezeigt, soweit läuft’s. Allerdings funktioniert weder das Javascript-Blättern (es blättert einfach weiterhin per PHP) noch Lightbox. Ich verwende Lightbox2 von http://www.m3nt0r.de/blog/lightbox-wordpress-plugin/ , aber erst hat Lightbox das Bild nicht geladen und jetzt geht es gar nicht mehr auf. Dafür lande ich bei Google auf einer Fehlerseite, die mir solange meldet, die Datei existiere nicht, bis ich die exakt gleiche URL von Hand aufrufe - sieht nach einer Sperre aus, so dass ich keine Fotos verlinken darf. Allerdings funktioniert es auch aus dem Blog heraus, _nachdem_ ich das Bild einmal von Hand aufgerufen habe. oO

Wenn es helfen würde, würde ich auch das von Dir empfohlene Lightbox-Plugin benutzen, das tut auch was ich haben will, allerdings verstehe ich die Installation nicht… in welche Datei soll ich diesen Header einfügen? Und ist es richtig, dass das Plugin nicht bei den Plugins erscheint?

Viele Fragen… hoffe Du kannst mir helfen. Gerne auch per Mail.
Viele Grüße,
Christian

Edit: Dank den Bemühungen des Plugin-Autors funktioniert es jetzt. hahahah Die Testposts sind entsprechend auch alle weg.



Datenbankzugriffe beschleunigen in Visual Basic

Seit ich bei E.ON den Programmcodeblock zum Update der Datenbank geschrieben habe, stört mich die irre lange Ausführungszeit. Es geht dabei darum, von ca 300.000 Datensätzen anhand zweier Felder zu prüfen, ob sie bereits in der Datenbank sind, und ggf. Ergänzungen vorzunehmen. Beide Felder enthalten numerische Werte.

Bisher habe ich dazu ein Recordset geladen, was alle Datensätze in der Tabelle enthält, und dann eine Schleife geschrieben die alle eventuell zu ergänzenden Datensätze durchläuft. Darin wurde dann jedesmal ein Filter auf das Recordset gesetzt, und entweder blieb dann genau ein Datensatz über oder keiner, wenn's keiner war, musste ich den ergänzen. Das hat natürlich immer ewig gedauert, so etwa 1,5h, denn je nachdem wie intelligent Access da arbeitet, waren das 300.000 Durchläufe - für jeden der 300.000 Datensätze.

Jetzt habe ich einfach mal, in der Hoffnung den Vorgang vielleicht wenigstens auf ein Drittel reduzieren zu können, eine ganz andere Methode gewählt: Ich erstelle ein zweidimensionales Boolean-Array (für jedes Feld eine Dimension) mit den minimalen und maximalen Werten der Fehler als Grenzen (... To ..., ... To ... mit ReDim, Dim lässt da nur konstante Werte zu, meine sind aber dynamisch, da es sich um IDs einer anderen Datenbanktabelle handelt). Dann durchlaufe ich das Recordset, bei dem ich vorher immer den Filter setzen musste, einmal komplett und setze dabei im Array alle Felder, die durch das Recordset angegeben werden, auf true (meinarray (rs("feld1"), rs("feld2")) = true). So erhalte ich ein Array, in dem die vorhandenen Felder markiert sind.

Das Recordset wird jetzt schon nicht mehr benötigt. Der nächste Schritt durchläuft alle möglichen Werte für die beiden Felder (verschachtelte Schleife) und prüft dabei, ob der Wert im Array an der gerade durch die Schleifen gegebenen Stelle false ist. Falls ja, wird das Wertepaar in der Datenbank ergänzt. Dadurch, dass das Array vom minimalen zum maximalen Wert der Felder dimensioniert ist, gibt es, wenn die Tabelle, der die IDs entstammen, nicht durchgehend ist (Datensätze gelöscht...), mehr Positionen im Array als abgefragt werden, die dann auch auf false stehen. Macht aber nix, da die Schleife, in der die Ergänzungen vorgenommen werden, mit den tatsächlich eingetragenen Werten arbeitet und so keine IDs eingetragen werden, die es gar nicht mehr gibt.

Ergebnis: Statt 1,5 Stunden dauert der Vorgang jetzt vielleicht noch 20 Sekunden... Hätte nicht gedacht, dass es SO ineffizient ist, mit einem Recordset zu arbeiten. Anscheinend wird doch keine Kopie im Programm angelegt, sondern immer direkt auf die Datenbank zugegriffen.

Was vielleicht noch anzumerken ist, wäre die Tatsache, dass ich beim Anlegen des Recordsets nebenbei den Zugriffsmodus auf "adLockBatchOptmistic" gesetzt habe, was sich vom Namen her passender anhört als "adLockReadOnly", welches ich zuvor verwendet hatte. Die Beschreibung sagte was anderes, deshalb hab ich das zuvor nicht benutzt. Was genau jetzt den größeren Geschwindigkeitsvorteil ausgemacht hat, weiß ich nicht, ist mir aber eigentlich auch egal :D



LogiFlash: Logische Schaltungen

In unserem Informatikunterricht verwenden wir momentan als Einstieg in maschinennahes Programmieren ein Flash-Tool namens LogiFlash. Damit lassen sich simple Schaltungen bauen, im einfachsten Fall auf der Basis von Schalter (Strom an oder aus), Anzeigen (Lampe an/aus) und logischen Gattern (And, Or, Xor, Not).

Da wir uns in der Einführungsstunde mit dem Binärsystem befasst haben, unter anderem mit dem schriftlichen Addieren von Binärzahlen, und ich gerade Langeweile hatte, habe ich eine Addierschaltung für Binärzahlen mit bis zu drei Stellen gebaut (im Fall des Entstehens einer vierstelligen Zahl wird links angezeigt, dass noch eine 1 im Übertrag steht). Hab's durchgetestet und funktioniert hahahah

Ich hab noch nicht ganz verstanden, warum, aber offensichtlich funktioniert die Schaltung auch, wenn man die von mir dafür gebaute Komponente gar nicht hat. Die Schaltung ist addierer-dreistellig, um sie zu laden, müsst ihr euch von dem Link oben die Flashdatei laden und zusammen mit einem Ordner "circuits" irgendwo speichern. nicht mehr verfügbar. In den Ordner "circuits" kommt dann der Addierer. Dann kann man in der Flashdatei oben den Button für XML öffnen benutzen und durch Eingabe des Dateinamens ohne Endung die Schaltung laden und benutzen.

Edit: UPS. Das Element, was ich zuerst nicht verstanden und daher als unbrauchbar verworfen habe, tut genau das was ich jetzt in zwei Stunden Arbeit gebaut habe... :mrgreen: Soll heißen: Ich habe den Va-Adder nachgebaut und dafür zwei Ha-Adder eingebaut. :D Dabei war ich so froh, dass ich den Ha-Adder gefunden habe, der mir das Ganze etwas vereinfacht hat... mal schaun, ob ich den auch nachgebaut kriege :D (und ja, ich weiß nicht, was die Buchstaben bedeuten) ;)

Edit 2: Okay, den Ha-Adder auch noch selber zu bauen aus Or, Xor, And und Not war jetzt auch nicht so schwierig... aber nett, da sieht man mal wie man alles zusammensetzen kann ^^ Ganz simpel der Ha-Adder, den ich so erweitert habe, dass bei Schaltung beider Eingänge auch beide Ausgänge geschaltet werden (sonst ist es S für einen Eingang und Cout für beide). Davon hab ich dann zwei kombiniert, um schließlich mit recht komplizierten Verbindungen dass zu bauen, was der Va-Adder tut... meine Güte... so im Nachhinein betrachtet, total umständlich, ich hab bestimmt zwischendurch was eingebaut was ich hinterher in der Schaltung wieder deaktiviert habe. :D