Web-Browser und -Server… was reden die da eigentlich??? Server-Sockets mit nc

Wer sich mit Webservern und -browsern beschäftigt, wird irgendwann an den Punkt kommen, wo man einfach mal wissen will, „Was zur Hölle der Browser und der Server da genau bereden“

Tools wie wget helfen einem zwar, zu überprüfen, ob ein Server eine Datei wirklich ausliefert, aber viele Funktionen werden im HTTP-Header ausgehandelt und die Server reagieren dabei speziell auf die unterschiedlichen, browserspezifischen Anfragen.

Wenn es also so aussieht, als würde der Server einem Firefox andere Daten schicken, als einem Chrome, möchte man sicherlich wissen, ob es wirklich so ist und wie sich die Kommunikation generell unterscheidet.

Hier kann ein Trick helfen, über den ich kürzlich gestolpert bin. Er beruht auf dem Befehl nc (netcat), der in vielen Konstellationen hilfreich sein kann.

nc (netcat)

nc öffnet entweder eine Verbindung zu einem Server-Port (z.b. dem HTTP-Port (80) eines Webservers) und verhält sich dabei sehr ähnlich zu telnet.
Im Gegensatz zu telnet kann nc jedoch auch selbst einen Socket öffnen und auf eingehende Anfragen antworten. Hierfür wird der Switch -l verwendet.

Egal, in welcher Richtung die Kommunikation aufgebaut wird, verbindet nc immer die Standard-Eingabe (stdin) mit dem Kommunikationspartner.
Wird der Befehl also einfach so verwendet, können Sie direkt mit der Tastatur eingeben, was dem Kommunikationspartner gesendet werden soll.
Startet man auf einem Rechner ein lauschenden Server-Socket auf Port 54321:

# nc -l 54321

… kann man sich von einem anderen Rechner aus damit verbinden:

# nc hostname.des.servers 54321

Nun hat man eine Verbindung, die man zum Chatten verwenden kann.

Auf dem üblichen Weg lassen sich per Pipe auch die Ausgaben anderer Befehle über diese Leitung zu übertragen, statt die Tastatur Eingabe zu verbinden.
Startet man den Server z.B. so:

# ls -l | nc -l 54321

… bekommt man beim Verbinden mit dem Socket das aktuelle Verzeichnis, in dem der Server gestartet wurde angezeigt. Danach schließt sich die Verbindung und sowohl Server- als auch Client-Prozesse werden gestoppt.

Sehen was der Browser sendet:

So ist nc also schon nützlich: Man kann einen Server-Socket öffnen und im Webbrowser dessen Adresse eingeben. Im obigen Beispiel also http://localhost:54321/. Zwar wird im Browser so nicht unbedingt etwas sinnvolles angezeigt, weil unser nc-Server kein HTTP spricht, aber auf der Konsole können wir nun sehen, welche Anfrage genau der Browser an unseren Server geschickt hat:

GET / HTTP/1.1
Host: localhost:54321
Connecdern: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36 Vivaldi/1.0.403.20
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: _pk_id.2478.1fff=bda69bf5b5894886.1457526065.1.1457526065.1457526065.

Dies ist nun aber nur eine einzelne Anfrage und wir können nicht die Antwort des Servers sehen, der uns eigentlich interessiert.

Umleiten einer Verbindung

Hier kommt nun eine weitere praktische Zutat ins Spiel: Named Pipes. Während wir mit dem Pipe-Symbol (Senkrechter Strich: |) nur die Ausgabe eines Programms mit der Eingabe des direkt folgenden Programms verbinden können, werden Named Pipes im Filesystem abgelegt und können auf diese Weise angesprochen. Diese Pipes werden mit dem Befehl mkfifo angelegt, sie verhalten sich dabei weitgehend wie Dateien.

Named Pipes können wir nun dazu verwenden, zwei nc-Prozesse miteinander zu verbinden: Einen, der auf Verbindungen vom Browser wartet, einen der eine Verbindung zu einem Webserver herstellt:

Anlegen der Named Pipe (der Name und Pfad können frei gewählt werden):

# mkfifo /tmp/proxyfifo

Zwei nc-Prozesse starten und verbinden

# nc -l -p 54321 </tmp/proxyfifo | nc server.domain.de 80 >/tmp/proxyfifo

Löschen der Pipe:

#rm /tmp/proxyfifo

Statt http://server.domain.de geben wir nun im Browser ein: http://localhost:54321.

Der Browser zeigt uns nun die Webseite des Servers an. Da unsere nc-Prozesse aber nur jeweils eine Verbindung aufbauen und sich danach beenden, werden wahrscheinlich Bilder und CSS-Dateien nicht vollständig geladen. Beherrschen Browser und Webserver beide „Keep-Alive“ werden jedoch durchaus mehrere Ressourcen übertragen bevor die Verbindung beendet wird – nur halt nicht alle.

Dies ist bis jetzt noch wenig sinnvoll, aber da die Verbindung nun durch unsere Hände geleitet wird, können wir uns einklinken, und mitlesen, was die beiden Gesprächspartner miteinander austauschen.

Belauschen der Verbindung:

# mkfifo /tmp/proxyfifo
# nc -l -p 8080 </tmp/proxyfifo | tee /dev/stderr | nc server.domain.de 8480 | tee /dev/stderr >/tmp/proxyfifo
# rm /tmp/proxyfifo

Der Einfachheit halber werden hier beide Kommunikationsrichtungen per tee zusätzlich auf der Standard-Fehlerausgabe (stderr) ausgegeben, was zum Mitlesen ausreicht.

In manchen Fällen möchte man darüber hinaus in die Kommunikation Eingreifen und die übertragenen Daten „on-the-fly“ manipulieren, auch dies ist mit diesem Ansatz möglich.

Da der Browser im obigen Beispiel glaubt mit „localhost“ zu kommunizieren, überträgt er in seinem HTTP-Request einen falschen Host, dies könnte man beispielsweise mit sed korrigieren wollen:

# mkfifo /tmp/proxyfifo
# nc -l -p 8080 </tmp/proxyfifo | sed -u "s/Host: localhost:8080/Host: rrzk.uni-koeln.de/g" | tee /dev/stderr | nc rrzk.uni-koeln.de 80
# rm /tmp/proxyfifo

Mit diesem Beispiel kann man die Webseite des RRZK über den Aufruf http://localhost:8080 laden und sich anschauen welche Daten ausgetauscht werden. (Wie erwähnt wird die Seite so nicht vollständig geladen).

Aufräumen:

Damit keine Bruchstücke liegenbleiben sollte man eine Named Pipe immer wieder neu anlegen und nach dem Aufruf direkt löschen.

Andere Anwendungsgebiete:

nc kann hier mit jeder Art TCP/IP-Verbindung umgehen, es ist also nicht auf Webkommunikation begrenzt. Besonders bei Anwendungen mit dauerhaft gehaltenen Verbindungen kann nc hier sein volles Potenzial ausspielen. Dies kann besonders Interessant sein bei:

  • Mail-Servern
  • Chat-Servern
  • Spiele-Servern
  • generell allem, bei dem man eine Serveradresse angeben muss

Sie können so rausfinden, welches Protokoll Ihr Netzwerkdrucker spricht und ob eine angeblich verschlüsselte Verbindung wirklich verschlüsselt ist (nc zeigt Binärdaten, wie verschlüsselte oder komprimierte Verbindungen und Dateiinhalte natürlich nur in Form von Datenmüll an).

Fazit:

Mit nc lassen sich auf viele Weisen Daten sammeln, die einem bei der Fehlersuche und -analyse hilfreich sein können.
Obige Beispiele sind nur ein erster Ansatz, sicherlich gibt es noch raffiniertere Kombinationen. Schreiben Sie gerne Ihre eignen Tricks zu diesem Thema in die Kommentare.

Was ist ein CMS? Oder: Manchmal muss man das Einfache komplizierter machen, um das Komplizierte einfach machen zu können.

Die Uni Köln setzt schon seit vielen Jahren Content Management Systeme (CMS) für die Gestaltung ihrer Webseiten ein. Dabei werden verschiedenste Systeme bunt gemischt. Das Rechenzentrum setzt dabei auf TYPO3, für das ich als Webmaster verantwortlich bin.
Ich möchte hier auf kein spezielles CMS eingehen weil Joomla, Drupal, WordPress, TYPO3 und die vielen anderen Systeme vor der gleichen Aufgabe stehen. Die einen können das eine besser, die anderen etwas anderes, unterm Strich unterscheiden sie sich nicht viel.

Doch CMS werden häufig missverstanden. Im Gegensatz zu den Anfangszeiten des Internets, in denen jeder, der Webseiten erstellte, auch ein profundes Wissen über die zugrundeliegende Technik hatte, ist – zumindest an der Uni – die Verantwortung für die Erstellung von Web-Inhalten längst von den „Techies“ weg-gewandert und zählt nun im Grunde zur normalen Büro- und Schreibarbeit.

Das Internet lässt sich jedoch nur deswegen so kinderleicht bedienen, weil viele schlaue Köpfe sich die komplizierte Arbeit gemacht haben, es einfach zu machen.

Zudem wachsen – von vielen oft unbemerkt – die Anforderungen. Der Masse verborgen bleiben, zum Beispiel, die Bemühungen, die Webseiten auch für Sehbehinderte und Menschen mit anderen Handicaps bedienbar zu machen. Dies wird aber wieder interessant, wenn wir versuchen Webseiten mit unseren Smartphones und anderen Mobilgeräten zu bedienen.
Die neusten Generationen von Smartphones mögen mit ihren hohen Bildschirmauflösungen in der Lage sein, Webseiten darzustellen wie es ein Computer mit großem Monitor macht, aber die Schrift wird auf den kleinen Displays unleserlich klein, während – im Vergleich zur Bildschirmgröße – unsere Finger viel zu groß für Links sind, die für die Bedienung mit einem kleinen Mauszeiger optimiert sind.

Was ist „Content“?

Wikipedia bescheinigt Content Management Systemen: „Besonderer Wert wird bei CMS auf eine medienneutrale Datenhaltung gelegt. So kann ein Inhalt auf Wunsch beispielsweise als PDF- oder als HTML-Dokument abrufbar sein“.
In der Theorie schreibt ein Redakteur also seine Texte frei von den Beschränkungen des Mediums, welches zur Auslieferung der Inhalte verwendet wird. Die Inhalte wären in dieser Philosophie also reine Information.

Wer aber schon einmal unsäglich missverstanden wurde, weil eine eigene E-Mail vom Adressaten völlig anders interpretiert wurde, als sie gemeint war, weiß, dass die bloßen Wörter eines Texts nicht alle Informationen übertragen. Im persönlichen Gespräch kann man zusätzliche Gestik, Mimik, Betonung und dramatische Pausen nutzen. Im Geschriebenen versuchen wir diese Stilelemente mit Fettdruck, Kursivschrift, farbigen Unterlegungen und nicht zuletzt auch mit Smileys und anderen Emoticons zu simulieren.

Diese Methoden sind jedoch nicht „medienneutral“. Ein Farbenblinder übersieht vielleicht rote Unterlegungen. Und wie erklärt man einem Text-To-Speach-Programm, wie es von Blinden benutzt wird, was ein kursiver Text ist, und wie dieser vorzulesen ist?
Es ist aber nicht nur die Barrierefreiheit, in der Industrie werden teilweise „Hands-Free“-Systeme nachgefragt, wie Sie sie vielleicht von (SMS-)Vorlesefunktionen neumodischer Autoradios kennen.
In vielen Bereichen ist es einfach praktisch, sich das Medium, mit dem man Inhalte konsumiert jederzeit frei aussuchen zu können.

Ein weiteres Schlagwort ist dabei auch das „Semantische Web“. Gemeint ist dabei der Versuch, die Inhalte im Internet so aufzubereiten, dass Computer (Hauptsächlich die der großen Suchanbieter) auch die Bedeutung dessen verstehen, was auf einer Seite steht, anstatt Webseiten als einfache Zeichenketten zu betrachten. Wie viel besser wären Suchmaschinen, wenn sie unterscheiden könnten, ob ein Text von „Frau Rosa Blume“ handelt, oder von einer Blume, die rosa ist?

Wie kann mir ein CMS dabei helfen?

Natürlich muss zwischen der Theorie und dem praktisch Anwendbaren ein Kompromiss gefunden werden, der mal besser, mal weniger gut auf einen konkreten Anwendungsfall passt.

Die meisten Content-Managemant-Systeme haben natürlich ein Hauptausgabemedium, welches in den allermeisten Fällen eine normale Webseite ist. Daher werden von den meisten CMS Rich-Text- oder gar vollständige WYSIWYG-Editoren angeboten. Die Funktionen (Textstil, Überschriften, Absätze, Einrückungen, Einfügen von Tabellen und Bildern…) kennen die meisten aus Office-Programmen. Und an dieser Stelle kommt es häufig zu einem Missverständnis: Ein CMS ist kein Word. Man arbeitet nicht auf einer freien weißen Seite, dessen Layout frei bestimmt werden kann, sondern eher auf einem Formular mit Textbereichen, welche mit Inhalt gefüllt werden sollen.
Idealerweise positioniert man also nicht die Elemente, sondern man zeichnet sie aus, um die fehlenden Informationen medienneutral und für den Computer verständlich nachzutragen.

Beispiele:

Will man einen Textabsatz, zu dem ein Bild gehört, anlegen, so wäre es nicht medienneutral cm-genau oder Pixel-weise die Position des Bildes zu bestimmen. Besser wäre es, den Text und das Bild zu speichern und die Beziehung dazwischen einzutragen. Diese Text-Bild-Beziehungen könnten sein:

  • „Das Bild ist eng mit dem Inhalt des Textes verknüpft, beide bilden eine Einheit, der Text sollte das Bild umfließen.“
  • „Das Bild begleitet den Text eher lose, und kann auch einfach daneben stehen.“
  • „Der Text, erklärt das Bild, welches der eigentlich wichtige Inhalt ist. Das Bild sollte also so groß wie möglich dargestellt werden, und der Text darunter stehen.“

Dies ist natürlich nur ein kleiner Auszug der Möglichkeiten, die so vielseitig sein können, wie die Menschen, welche die Inhalte erstellen. Um dies also nicht allzu sehr ausufern zu lassen, wird ein CMS daher eher vereinfachte Optionen anbieten, ohne auf den konkreten Grund für die Text-Bild-Beziehung einzugehen:

  • „Text mit Bildumfluss“
  • „Text mit Bild daneben“
  • „Text mit Bild darüber“

Ein anderes Beispiel ist ganz pragmatischer Natur: Wichtige Textpassagen werden gerne rot markiert. Wenn man mal von den Schwierigkeiten von Menschen mit Rot/Grün-Schwäche absieht, kann das Problem entstehen, dass bei einem Wechsel des Designs diese Passage unleserlich wird, wenn sich auch die Farbe des Texthintergrundes im neuen Design geändert hat. Häufiger ist aber der Fall, dass die konkret gewählte Farbe nicht mehr mit dem Farbkonzept des Designs harmoniert. Vorleseprogramme kommen hier, wie gesagt, ebenfalls an ihre Grenzen.
In diesem Fall ist es ratsam, den Textteil als „wichtig“ zu markieren. Im Design würde man dann wiederum definieren, wie „wichtiger Text“ dargestellt werden soll – dies kann dann wieder, wenn es zum Design passt, rot sein, später aber leicht von zentraler Stelle dem Design entsprechend geändert werden können.

Dem Semantischen Web würden hier natürlich Auszeichnungen helfen, die besagen „Das ist ein Name“, „Hier steht eine Adresse“ oder auch „Dies ist ein Akronym“. Von Suchmaschinen ausgewertet, könnte man schnell Suchanfragen formulieren, die einem zum Beispiel alle Seiten anzeigen, auf denen eine bestimmte Person erwähnt wird. Dies ist jedoch – zumindest bei redaktionell erstellten Texten – Zukunftsmusik, für die aber derzeit die Grundlagen geschaffen werden.

Natürlich kann nicht mit allem so abstrakt verfahren werden, und dem Redakteur sollen durchaus noch Möglichkeiten bleiben, seine Inhalte auch optisch ansprechend zu gestalten. Ob ein Bild im Text Rechts oder linksbündig sein soll, um die Gesamtseite aufzulockern, oder ob er zum Verdeutlichen von Zusammenhängen auch Farbmarkierungen anbringen kann, auf die in nicht-visuellen Darreichungsformen verzichtet werden kann, sollte ihm dabei offen stehen.
Dennoch sollte man das Credo „Weniger ist manchmal mehr“ nicht aus den Augen verlieren und hin und wieder einen Kompromiss eingehen, um in der Zukunft weniger Probleme zu haben.

Fazit:

Zwischen dem utopischen Ideal, alle Informationen mitsamt aller Metadaten zu jeder Zeit und über jede denkbare Kommunikationsform in jeweils bester Weise zur Verfügung gestellt zu bekommen, und einem aramäischen Pergament, welches Sie nur nach jahrelangem Studium entziffern können, liegt irgendwo ein Kompromiss, der die Kommunikation für uns alle vereinfacht. Dazu ist es also manchmal nötig, etwas weniger darüber nachzudenken, wie ich einen Inhalt grafisch aufbereite, und dafür etwas mehr darüber, warum ich ihn genauso haben möchte, wie ich mir das vorgestellt habe.
Oder überspitzt ausgedrückt: „Frage nicht (immer) was das CMS für Dich tun kann, frage auch mal, was Du für das CMS tun kannst (damit es Dich besser versteht)“

MySQL-Speicherverbrauch

Wer sich ein wenig mit MySQL beschäftigt hat, weiß, dass es nicht nur in den Features, sondern auch im Handling einige Unterschiede zwischen den DB-Engines MyISAM und InnoDB gibt.
Die Transaktionssicherheit von InnoDB erkauft man sich u.a. durch eine geringere Transparenz, wo welche Daten liegen und auch wie viel Speicherplatz von den einzelnen Tabellen und Datenbanken belegt werden, da die InnoDB im Gegensatz zur MyISAM ihre Daten nicht in separaten Dateien ablegt, sondern alle Daten aller Datenbanken in nur einer Datei vereint.. Hat man viele Datenbanken mit vielen Tabellen, erschwert dies die Fehlersuche und Optimierung ungemein.

Ich habe hier ein paar MySQL-Queries zusammen gestellt, welche die gewünschten Informationen aus den Tabellen der MySQL-eigenen Datenbank „information_schema“ lesen.

Wer sich ein wenig mit MySQL beschäftigt hat, weiß, dass es nicht nur in den Features, sondern auch im Handling einige Unterschiede zwischen den DB-Engines MyISAM und InnoDB gibt.
Die Transaktionssicherheit von InnoDB erkauft man sich u.a. durch eine geringere Transparenz, wo welche Daten liegen und auch wie viel Speicherplatz von den einzelnen Tabellen und Datenbanken belegt werden, da die InnoDB im Gegensatz zur MyISAM ihre Daten nicht in separaten Dateien ablegt, sondern alle Daten aller Datenbanken in nur einer Datei vereint.. Hat man viele Datenbanken mit vielen Tabellen, erschwert dies die Fehlersuche und Optimierung ungemein.

PHPMyAdmin zeigt zwar die Größe der Tabellen an, aber man muss dazu jede einzelne Datenbank anklicken und verliert so den Überblick.

Ich habe hier ein paar MySQL-Queries zusammen gestellt, welche die gewünschten Informationen aus den Tabellen der MySQL-eigenen Datenbank „information_schema“ lesen.

Voraussetzung für alle folgenden Queries ist eine SQL-Verbindung zum Server mit einem Account, der für das Lesen der Informationen aus der Datenbank „information_schema“ berechtigt ist – also z.B. „root“;

Warnung: Diese Anweisungen sammeln Daten über sämtliche Inhalte eines Servers, bei großen Datenmengen und langsamen Servern können diese eine Laufzeit von mehreren Minuten haben und den Betrieb des Servers stark beeinflussen!

Gesamt-Verbrauch aller DBs

Möchte man die Größe aller Datenbanken auf einem Datenbank-Server erfahren, so kann dazu der folgende SQL-Befehl verwendet werden:
SELECT concat( round( sum( data_length + index_length ) / ( 1024 *1024 ) , 2 ) , 'M' ) size
FROM information_schema.TABLES ;

Hierbei wird die Speicherplatzbelegung, die in Bytes vorliegt gleich in MB umgerechnet, für Fälle, in denen das nicht sinnvoll ist, lässt man natürlich die Funktionen round und concat weg und teilt auch nicht durch ( 1024*1024 ).
Diese Abfrage addiert den Speicherplatz-Verbrauch der Daten und ihrer Indices, wer diese Größen getrennt braucht, kann obige Abfrage leicht modifizieren.

Diese Abfrage lässt sich natürlich weiter verfeinern. Da man die Speicherplatzbelegung der MyISAM-Tabellen leicht anhand der Größen der einzelnen Dateien ablesen kann, gehen wir ab hier nur noch auf die InnoDB ein.

Gesamt-Verbrauch aller InnoDB-Tabellen

Die Daten der InnoDB-Engine liegen, wie gesagt, in nur einer Datei. Häufig ist diese Datei mit der Option „autoextend“ konfiguriert, so dass die Datei automatisch vergrößert wird, sobald neue Daten in die Datenbank geschrieben werden. Jedoch schrumpft sie nicht, wenn Daten gelöscht werden. Der freigewordene Speicherplatz innerhalb der Datei, kann wieder von Daten in der InnoDB belegt werden, es dauert also, bis die InnoDB-Datei wieder voll ist, und sie mittels autoextend vergrößert werden muss, aber auf der Festplatte des Servers wird dieser Speicherplatz nie wieder freigegeben. So kann es sein, dass die Datei auf der Festplatte deutlich größer ist, als die Nutzdaten darin.
Um zu erfahren, wie viele Nutzdaten sich also derzeit wirklich in der InnoDB befinden, ist folgende Abfrage nützlich:
SELECT concat( round( sum( data_length + index_length ) / ( 1024 *1024 ) , 2 ) , 'M' ) size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB' ;

InnoDB-Speicherverbrauch pro Datenbank

Um zu erfahren, in welcher Datenbank der Speicher verbraucht wird, kann man sich hiermit leicht einen Überblick verschaffen:
SELECT table_schema 'database', concat( round( sum( data_length + index_length ) / ( 1024 *1024 ) , 2 ) , 'M' ) size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB'
GROUP BY table_schema
ORDER BY sum( data_length + index_length );

In diesem Fall wird das Resultat auch noch nach der Größe sortiert.

Hinweis: Nicht vergessen, in diesen Größen-Angaben werden alle Daten, die nicht mit der Engine InnoDB verwaltet werden ignoriert. Will man alle Daten sehen muss die Anweisung WHERE ENGINE='InnoDB' weggelassen werden.

InnoDB-Speicherverbrauch pro Tabelle

Um zu erfahren, in welcher Tabelle einer bestimmten Datenbank der Speicher verbraucht wird, kann hiermit die Datenbank näher inspizieren, dabei muss in der Abfrage natürlich der Name der betreffenden Datenbank anstelle des Platzhalters [DATABASE_NAME] eingetragen werden:
SELECT table_name 'table', concat(round((data_length+index_length)/(1024*1024),2),'M') size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB'
AND table_schema = '[DATABASE_NAME]'
ORDER BY ( data_length + index_length );

Große InnoDB-Tabellen auf einem Server finden

Möchte man einen ganzen Server nach Tabellen einer bestimmten (Mindest-)Größe durchsuchen, ohne den Umweg über die Größe der Datenbanken zu nehmen, kann man dies auch direkt in einer Anweisung formulieren. Da viele Tabellen sehr klein sind, ist es selten sinnvoll sich die Größe aller Tabellen eines Servers anzuzeigen, daher dient die letzte hier vorgestellte Abfrage dazu, alle Tabellen eines Servers anzuzeigen, die in der InnoDB mindestens 100MB belegen. Die Angabe der Mindestgröße geschieht hierbei in Byte, daher steht in der WHERE-Anweisung des SQL die Zahl 104857600 (=100*1024*1024):
SELECT table_schema 'database', table_name 'table', concat(round((data_length+index_length)/(1024*1024),2),'M') size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB'
AND data_length + index_length >104857600
ORDER BY ( data_length + index_length );

CSS neu laden, ohne die Webseite neu laden zu müssen…

Mit dem Add-on CSS Reloader kann man im Firefox, den CSS-Code einer Webseite neu laden, ohne den HTML-Code neu laden zu müssen.

Wer Webseiten erstellt und an dem Punkt angekommen ist, an dem das Fine-Tuning des CSS-Codes beginnt, kennt das Problem:

Eigentlich will man nur schauen, ob die jüngste Anpassung den gewünschten Effekt hatte aber beim Drück auf F5 muss man die ganze Seite neu laden, PHP-Skripte müssen gestartet werden, Datenbanken abgefragt usw.

Einfacher können es nun Benutzer des Firefox-Browsers haben: Mit dem Add-on „CSS Reloader“.

Einfach installiert, lädt er beim Druck auf F9 lediglich das CSS einer Seite neu, ohne den HTML-Code neu abzufragen.

Das Add-on kann man hier herunterladen: https://addons.mozilla.org/en-US/firefox/addon/46211/