MySQL: Tabellengröße bestimmen

Welche Tabelle lohnt sich aufzuräumen, um die gesamte Datenbank kleiner und performanter zu bekommen?

Mit folgendem Skript bekommt man Zeilenanzahl (row count) und Speicherbedarf (size) aller Tabellen einer Datenbank namens „database_name“:

SELECT round((data_length + index_length)/(1024 *1024),2) sizeMB,
table_rows as row_count, table_name
FROM information_schema.TABLES
WHERE table_schema='database_name'
ORDER BY table_name;

Cheers
Ralf

MySQL: Insert or Update?

Oft weiß man nicht, ob es einen Datensatz bereits gibt, wenn man ihn einfügen möchte. Sollte er  schon vorhanden sein, dann man möchte ihn updaten. Gerade in einer Multiuser-Umgebung ist das aber krititsch, weil der Client nicht wissen kann ob mittlerweile der Datensatz angelegt wurde.

MySQL erlaubt einem mit einem Befehl das Problem zu lösen:

INSERT INTO MyTable (id,a,b) VALUES (1,'description',17)
  ON DUPLICATE KEY UPDATE a='description',b=17;

Cheers
Ralf

Typo3: PHP Error „Allowed memory size exhausted“

Wenn man eine speicherintensive Extension verwendet, kann obige Fehlermeldung kommen. Grund ist, dass Typo3 (oder generell PHP) mit einer maximaler Speichergrenze ausgestattet ist, um dem Server vor einem schadhaften Skript zu schützen. Anderenfalls könnte es passieren, dass der Server an Speicherknappheit leidet.

Man kann diese Grenze etwas erhöhen, sollte dies aber immer mit Verstand machen, weil eben dieser Schutz dadurch reduziert wird.

Man kann diese Grenze beeinflussen indem man folgende Zeile in /typoconf/localconf.php einfügt:

$TYPO3_CONF_VARS['SYS']['setMemoryLimit'] = '64';

Die Grenze wird in MB angegeben.

Cheers,
Ralf

Typo3: Extensions sollen kein JQuery nachladen

Wenn man z.B. im Typo-Skript selbst eine neue JQuery-Version laden möchte, dann will man vermeiden, dass eine Extension eine ältere Version von JQuery nachlädt. Man kann in fast allen Extensions das Laden von JQuery beeinflussen.

Bei „IndexedSearch_Autocomplete“ geht das beispielsweise im Konstanteneditor des Root-Templates (Links im Baum erst Templates, dann  die Startseite auswählen und in der Auswahlbox den „Constant Editor“ auswählen):

Konstanteneditor

Bei dieser Extension heißt der Parameter: „Set to true if jQuery is loaded outside of this extension (page global)“. Einfach auf true stellen und die Extension verwendet die neuere JQuery-Version. Man muss natürlich testen, ob die Extension mit dem neueren Framework noch ordentlich zusammenspielt.

Cheers,
Ralf

 

MySQL: Tabelle mit Inhalt kopieren

Oft möchte man eine Arbeitskopie oder einfach eine Sicherung einer Tabelle in einer Datenbank machen. In MySQL kann man das mit einem Befehl machen:

CREATE TABLE new_table AS SELECT * FROM old_table;

Das DBMS erzeugt die Struktur der Tabelle aus der Quelltabelle und füllt danach auch gleich die neue mit Daten. Nice feature … ist mir bei MSSQL nicht bekannt, dass so etwas möglich wäre.

Cheers,
Ralf

Code Poetry #1

Measuring programming progress by lines of code is like measuring aircraft building progress by weight.
Bill Gates

C#: Dictionary inlinie initialisieren

Es ist extrem praktisch und anschaulich, wenn man  in einer Programmiersprachen ein Array in einer Zeile erzeugen und befüllen kann:

string[] Names = { "Vincent", "Johannes", "Anna" };

Bisher wusste ich nicht, dass es bei einem Dictionary genauso einfach geht. Bei einem einfachen Telefonbuch sieht es dann so aus:

public static readonly Dictionary<string, string> 
    Lieferoffsets = new Dictionary<string, string>()
{
  {"Peter Müller","01234/1234"},
  {"Franz Maier","05678/5678"},
  {"Hans Glück","09876/9876"}
};

Manchmal erfreuen einen auch die kleinen Dinge an einer Programmiersprache …

Cheers,
Ralf

XTC: Transparente Artikelbilder

XTC kann automatisch Vorschaubilder der Artikelbilder erstellen. Diese Bilder werden automatisch mit der PHP-Datei „image_manipulator_GD2.php“ erstellt. Leider kann die Klasse in xt:Commerce v3.0.4 SP2.1 keine Transparenz in den Bilder erzeugen.

Ich habe via Google eine sehr gute Version der Klasse entdeckt, die mit Transparenzen arbeiten kann:
http://vamensvn.googlecode.com/svn/trunk/admin/includes/classes/image_manipulator_GD2.php
Da die Varante für „VaM Shop“ entwickelt wurde, müsste man Zeile 23 entfernen, um es in Gambio oder „normalen“ XTC einzusetzen:

defined( '_VALID_VAM' ) or die( 'Direct Access to this location is not 
allowed.' );

Cheers,
Ralf

HTML: CSS Einführung (Teil 1)

CSS in HTML verwenden

Will man in HTML Dateien CSS-Definitionen einsetzen, muss man in der HTML-Datei nur zwei Schritte durchführen:

1. Schritt
Im <Head> der HTML-Seite werden die verwendeten CSS-Datei(en) verlinken:

<link rel="stylesheet" type="text/css" href="theme1.css" media="all"/>

2. Schritt
Elemente entweder mit:

id=“NameDesElements“

oder

class=“Klassenname1 Klassenname2 Klassenname3 …“

bezeichnen.

IDs sollten immer innerhalb einer Seite (bzw. eines Form-Tags) eindeutig sein.

Da die Klassen mit Leerzeichen getrennt werden, darf kein Leerzeichen im Klassennamen sein.

 

CSS Grundlagen

Kommentare

/* 
Alles innerhalb von Slash-Stern und Stern-Slash wird ignoriert. 
Hier kann man also Bemerkungen eintragen, 
die vom Browser ignoriert werden... 
*/

Elemente via Tagtypen ansprechen

a {
   font-size : 12px;
}

/* alle <a> Tags haben eine 12er Schriftgröße */

Elemente via ID ansprechen

#NameDesElements {
   font-size : 15px;
}

/* 
CSS-Definitionen für einzelne Elemente mit Nummernzeichen.
Nur das Element mit id="NameDesElements" bekommt eine 15er Schriftgröße 
*/

Elemente via Class ansprechen

.Klasse1 {
   background-color : red;
}
.Klasse2 {
   color : black;
}

/* CSS-Definitionen für Klassen mit Punkt */

 

CSS Kombinationen

a.Klasse1{
/*
  alle Elemente, die <a> UND Klasse1 sind 
*/
}

div.Klasse1.Klasse2{
/*
  alle Elemente, die <div> UND Klasse1 UND Klasse2 sind 
*/
}
.Klasse1.Klasse2{
/*
  alle Elemente, die Klasse1 UND Klasse2 sind 
*/
}

#ID1, #ID2, #ID3{
/*
Aufzählung: Betrifft sowohl ID1, ID2 und ID3
*/
}

 

CSS Pfade (Child Selektors)

Man kann in CSS bestimmte Elemente ansprechen, die in einer bestimmten hierarchischen Struktur vorliegen. Das ist nötig, um z.B. Links innerhalb des Content-Bereichs ein anderes Aussehen zu verleihen als im Footer-Bereich. Auch beim Design eines Multilevel-Popup-Menüs wird diese Vorgehensweise verwendet.

HTML:

<body>
  <div id="oma">
    <div id="block1" class="block">ABCD</div>
    <div id="mutter">
      <div id="block2" class="block">EFGH</div>
    </div>
  </div>
  <div id="block3" class="block">IJKL</div>
</body>

CSS:

#oma .block{
  font-size : 17px;
} /* Das selektiert block1 und block2 */

Hier ist das Leerzeichen zwischen #mutter und .block wichtig! Es bedeutet, dass wir Kinder und Kindeskinder vom Element mit der ID=“oma“ ansprechen. In diesem Fall: alle Element mit class=“block“, d.h. „block1“ und „block2“. Das Element mit ID=“block3″ wird nicht beeinflusst, da es nicht innerhalb von „oma“ sitzt.

Würde man das Leerzeichen vergessen, hätte die CSS-Definition nur Einfluss auf ein Element  mit id=“oma“ und class=“block“. Das haben wir in diesem Beispiel nicht.

CSS:

#oma > .block{
  font-size : 17px;
} /* Das selektiert nur block1 */

Hier ist das Größerzeichen zwischen #mutter und .block wichtig! Es bedeutet, dass wir nur Kinder vom Element mit der ID=“mutter“ ansprechen. In diesem Fall: direktes Kind mit class=“block“, d.h. „block1“. Die Elemente mit id=“block2″ und id=“block3″werden nicht beeinflusst, da sie nicht direkt innerhalb von „oma“ sitzen.

Teil 2

Jetzt fehlen noch CSS-Zustände (:hover, :link, :active, :focus, :visited), der Attribut- und der Sibling-Selektor. Das machen wir im zweiten Teil.

Cheers,
Ralf

Windows Forms: Textbox-Text selektieren, wenn Control den Fokus erhält

Man kann nicht im Handler eines Enter-Events mittels Textbox.SelectAll(); alles markieren. Wenn man es asynchron durchführt, geht es aber:

BeginInvoke((MethodInvoker) delegate() {txtOrder.SelectAll();});

Cheers,
Ralf