Samstag, 31. Oktober 2009

GRUB2: Timer abschalten

Wie ich beim konfigurieren von GRUB2 feststellen musste wir die Einstellung, das es keinen Timer mehr geben soll, nicht richtig umgesetzt. Es wird dann ein Timer von 5 Sekunden genutzt. Dieser "Fehler" ist in der grub.cfg (/boot/grub/grub.cfg) zu finden.
In der grub.cfg muss dahin gehend ein Wert geändert werden um den Timer zu deaktivieren.

original:
if [ ${recordfail} = 1 ]; then
set timeout=-1
else
set timeout=5
fi

angepasst:
if [ ${recordfail} = 1 ]; then
set timeout=-1
else
set timeout=-1
fi

Nun kann man sich so viel Zeit lassen bei der Auswahl des Betriebssystems wie man möchte.

Ich übernehme keine Haftung für die Beschriebene Veränderung der grub.cfg!!
Alles geschieht auf eigene Gefahr!!

Montag, 19. Januar 2009

RSS Feed im Eigenbau (2 / 2)

Im 1. Teil des Tutorials habe wir uns den Grundaufbau eines RSS Feeds angeschaut und eine Möglichkeit gefunden, gestalterisch etwas Kreativität in unseren Feed zu bringen. Nun ja, dass alles können wir getrost in die Tonne kloppen und mit einem neuen leeren "Blatt" beginnen. Denn nun wird's lustig: wir bringen mit Hilfe von PHP etwas leben in unseren Feed.
Diesmal bauen wir den Code Zeile für Zeile auf:
01 <?php
02 include("../functions/sql.php");
03 include("scribo_rss_fct.php");
04
05 echo "<?xml version=\"1.0\" encoding=\"utf-8\" ?> \n";
06 ?>
07 <rss version="2.0"> \n
08
09 <channel> \n

Dies ist unsere neue Dokumentendeklaration: Zuerst habe ich zwei weitere PHP Dateien "angesprochen", die wir später noch brauchen werden. Die Deklaration des XML Dokumentes darf diesmal nicht als klartext da stehen, weil wir ja statt XML eine PHP Datei schreiben wollen. Darum geben wir diese Zeile unter PHP mit echo aus. Danach schließen wir das PHP Script und der Rest bleibt wie gehabt.

Nun folgen wieder unsere Tags für den Head Bereich:
10 <title>Lautsprecher</title> \n
11 <link>http://blog.mwi-projects.de</link> \n
12 <description>Die Welt aus...</description> \n
13 <language>de-DE</language> \n
14 <copyright>MWi</copyright> \n

Bisher also alles wie gehabt. Doch nun kommen wir zum . Wir brauchen also den Zeitpunkt des neusten Artikels. Und hier kommt es nun darauf an, wie ihr eure Datenbank angelegt habt. Nehmen wir für dieses Tutorial einfach meine Datenbank für Scribo: da erwarten uns folgende Felder in der Artikeltabelle:
Article_ID,
Article_Author,
Article_Topic,
Article_Caption,
Article_Text,
Article_Date,
Article_Time
OK, da steht zwar noch mehr drin und bezüglich des Autoren und des Themas hab ich den Datenbankzugriff jetzt auch vereinfacht, aber wir behandeln hier ja auch nicht das Thema SQL_Querys.
Wie ich schon im 1. Teil anmerkte, müssen die Zeitangaben für RSS-Feeds in einem speziellen Format vorliegen. Also hab ich mir eine kleine Funktion gebaut (diese liegt in scribo_rss_fct.php) die mir das bewerkstelligt. Und so schaut sie aus:
01 <?php
02 function($date, $time)
03 {
04 $a = explode ( '-', $date );
05 $b = explode ( ':', $time );
06
07 $timestamp = mktime($b[0],$b[1],0,$a[1],$a[2],$a[0]);
08 $new_date = date("D, d M Y H:i:s +0200", $timestamp);
09
10 return $new_date;
11 }
12 ?>

Ok, was passiert hier: zuerst sei gesagt, dass die Datumsangabe in meiner Datenbank in MySQL Timestamp Form gespeichert sind. Beispiel für den heutigen Tag wäre also 2008-10-09.
Wir splitten also in Zeile 4 und 5 Datum und Uhrzeit wieder in die einzelnen Ziffern auf. Mit dem Befehl "mktime" machen wir aus den einzelnen Komponenten wieder einen gültigen Unix Timestamp, der unser gewünschtes Datum enthält. Und schon ist es ganz einfach, das für RSS-Feeds benötigte Format zu erzeugen.
Kommen wir nun zurück zu unserem RSS-Feed. Dort müssen wir nun nur noch die Datenbank nach dem gewünschten Datum, etc. abfragen:
16 <?php
17 $query = "SELECT Article_Date, Article_Time
18 FROM $scribo_article
19 ORDER BY Article_ID DESC
20 LIMIT 0,1";
21 $result = mysql_db_query ($dbname, $query, $db);
22 $row = mysql_fetch_assoc($result);
23 $new_date = get_tstamp($row[Article_Date], $row[Article_Time]);
24 ?>
25 <lastBuildDate><?php echo $new_date; ?></lastBuildDate>
OK, lassen wir das Query einfach so stehen wie es ist, ohne es weiter zu erläutern. Sämtliche Variablen für den Datenbankzugriff befinden sich, oh Wunder, in der Datei sql.php.
Zeile 23 ist für uns wieder interessanter, da wir dort unsere Funktion aufrufen und den rückgegebenen Wert in $new_date speichern. In Zeile 25 dann der finale Schritt, wir geben das Datum aus.
Nun kommt wieder ein Datenbank-Query, denn wir wollen ja wieder etwas Inhalt in unseren Feed packen:
26 <?php
27 $query = "SELECT * FROM $scribo_article
28 ORDER BY Article_ID DESC
29 LIMIT 0,20";
30 $result = mysql_db_query ($dbname, $query, $db);
31 while($row = mysql_fetch_assoc($result))
32 {
Reichlich unspektakulär das Ganze. Wir rufen alle Eigenschaften der Tabelle Scribo_Article auf (ist in diesem Fall schneller, als wenn erst die ensprechenden Spalten gesucht werden müssen) sortieren Sie nach der ID absteigend (in dem Wissen, dass der neueste Artikel die höchste ID hat, usw.) und begrenzen das Ganze dann auf die ersten 20. (also die 20 neuesten) Artikel. Die While-Schleife gibt uns dann Artikelweise die benötigten Daten, bis quasi nichts mehr da ist.
Es wird also Zeit nun die einzelnen Tags abzurufen:
33 echo " <item> \n";
34 echo " <title>".$row[Article_Caption]."</title> \n";
35 echo " <author>".$row[Author_Name]."</author> \n";
36 echo " <category>".$row[Article_Topic]."</category> \n";
37 echo " <guid>".$row[Article_ID]."</category> \n";
38
39 $new_date = get_tstamp($row[Article_Date], $row[Article_Time]);
40 echo " <pubDate>".$new_date."</pubDate>\n";
41 echo " <link>/article.php?id=".$row[Article_ID]."</link>\n";

OK, hier ist gerade unheimlich viel passiert, oder? Nein, eigentlich nicht. Wir haben wie in Teil 1 unsere verschiedenen Tags aufgerufen und diese mit Inhalt aus der Datenbank befüllt. Für das Datum haben wir in Zeile 34 wie schon im Header unsere Funktion aufgerufen, die uns das benötigte Zeitformat liefert.
Fehlt jetzt nur noch der eigentliche Text. Und hier scheiden sich die Geister. Einige mögen es, wenn Texte nur als Appetithäpchen serviert werden, für andere sind Feeds die Hauptnahrungsquelle, die bitteschön vollständig zu sein hat. Zur Arbeitsersparniss geben wir an dieser Stelle einfach einen vollständigen Feed aus:
42 $text = '<![CDATA['.$row[Article_Text].']]>';
43 echo " <description>".$text."</description> \n";

Gut, das war jetzt sehr einfach gehalten. Aber prinzipiell könnt ihr hier mit dem Text machen was ihr wollt. Man kann zum Beispiel noch einen Link einbauen, der die Feed Besucher zu den Kommentaren führt, und dergleichen. Wichtig ist nur, dass der Text durch <![CDATA[ umschlossen wird (s. Teil 1)
Zum guten Rest bleibt nur noch das aufräumen schließen der offenen Tags, etc:
44 echo" </item> \n";
45 }
46 ?>
47 </channel> \n
48 </rss>
Und das war es schon. Wie gesagt, Ihr habt nun einen schönen sich selbst aktualisierenden Feed. Eine kleine Sache noch: wenn ihr mit größeren Besucherzahlen zu kämpfen habt, sollte man sich vielleicht überlegen, ob man sich nicht doch auf Grundlage dieses Scriptes, durch PHP eine reine XML Datei generieren lässt. Aber das wäre dann wieder ein anderes Thema.
Und zum Schluss nochmal das komplette Script:
01 <?php
02 include("../functions/sql.php");
03 include("scribo_rss_fct.php");
04
05 echo "<?xml version=\"1.0\" encoding=\"utf-8\" ?> \n";
06 ?>
07 <rss version="2.0"> \n
08
09 <channel> \n
10 <title>Lautsprecher</title> \n
11 <link>http://blog.mwi-projects.de</link> \n
12 <description>Die Welt aus...</description> \n
13 <language>de-DE</language> \n
14 <copyright>MWi</copyright> \n
16 <?php
17 $query = "SELECT Article_Date, Article_Time
18 FROM $scribo_article
19 ORDER BY Article_ID DESC
20 LIMIT 0,1";
21 $result = mysql_db_query ($dbname, $query, $db);
22 $row = mysql_fetch_assoc($result);
23 $new_date = get_tstamp($row[Article_Date], $row[Article_Time]);
24 ?>
25 <lastBuildDate><?php echo $new_date; ?></lastBuildDate>
26 <?php
27 $query = "SELECT * FROM $scribo_article
28 ORDER BY Article_ID DESC
29 LIMIT 0,20";
30 $result = mysql_db_query ($dbname, $query, $db);
31 while($row = mysql_fetch_assoc($result))
32 {
33 echo " <item> \n";
34 echo " <title>".$row[Article_Caption]."</title> \n";
35 echo " <author>".$row[Author_Name]."</author> \n";
36 echo " <category>".$row[Article_Topic]."</category> \n";
37 echo " <guid>".$row[Article_ID]."</category> \n";
38
39 $new_date = get_tstamp($row[Article_Date], $row[Article_Time]);
40 echo " <pubDate>".$new_date."</pubDate>\n";
41 echo " <link>/article.php?id=".$row[Article_ID]."</link>\n";
42 $text = '<![CDATA['.$row[Article_Text].']]>';
43 echo " <description>".$text."</description> \n";
44 echo" </item> \n";
45 }
46 ?>
47 </channel> \n
48 </rss>

dieser Beitrag wurde aus dem Lautsprecher übernommen

RSS Feed im Eigenbau (1 / 2)

Seit einigen Tagen ist der Lautsprecher Besitzer eines gut funktionierenden RSS-Feeds. Klar, davor hab ich auch schon mit Feeds um mich geworfen, die 1 zu 1 von diversen Tutorials "insperiert" waren. Aber die Qualität ließ doch zu Wünschen übrig und so machte ich mich vor kurzem auf die Suche nach weiteren Anregungen und Ideen, um meinen RSS_Feed doch noch hier und da aufzufrischen und zu vervollständigen.
Und damit auch andere von meinen Erfahrungen profitieren, möchte ich in einer kleinen 2teiligen Serie Schritt für Schritt erklären, wie man sich einen vollständigen Feed selber baut.
Ein RSS-Feed ist im Grunde nichts anderes, als ein ganz normales XML-Dokument für welches einige gewisse "Parameter" schon vordefiniert sind. Ansonsten gilt es, wie immer für XML-Dokumente, auf die Wohlgeformtheit zu achten.
01 <?xml version=\"1.0\" encoding=\"utf-8\" ?> \n
02 <rss version="2.0"> \n
03
04 <channel> \n
05 <title>Titel des Feeds</title> \n
06 <link>URL der Webpräsenz</link> \n
07 <description>Kurze Beschreibung des Feeds</description> \n
08 <language>de-DE</language> \n
09 <copyright>Autor des Feeds</copyright> \n
10 <pubDate>Erstellungsdatum("Thr, 9 Oct 2008 14:00:00")</pubDate> \n
11 <item> \n
12 <title>Titel des Eintrags</title> \n
13 <description>Zusammenfassung des Eintrags</description> \n
14 <link>Link zum vollständigen Eintrag</link> \n
15 <author>Autor des Artikels, E-Mail-Adresse</author> \n
16 <category>Kategorie des Beitrages</category> \n
17 <guid>Eindeutige Identifikation des Eintrages</guid> \n
18 <pubDate>Datum des Items</pubDate> \n
19 </item> \n
20
21 <item> \n
22 ...
23 </item> \n
24
25 </channel> \n
26
27 </rss>

Code1: Grundlegener Aufbau eines RSS-Feeds

Laut Wikipedia ist das also der Aufbau eines RSS2.0-Feeds. Und wenn wir uns mit dem Minimalistischsten zufrieden geben, könnten wir hier eigentlich auch schon gleich aufhören. Tun wir aber nicht! Und darum gehen wir jetzt erst einmal Zeile um Zeile den Code durch:
01 <?xml version=\"1.0\" encoding=\"utf-8\" ?> \n
02 <rss version="2.0"> \n
03
04 <channel> \n
Das ist die Deklaration des Dokumentes. Hier legen wir den Dokumententyp (xml) sowie dessen Spezifikation (version=\"1.0\") und das Sprachformat (utf-8) fest. Weiterhin sagen wir ihm, dass das ganze ein RSS-Feed der Version 2.0 werden soll. Lasst euch im übrigen nicht von dem "\n" verwirren. Dieses ist nichts weiter als ein "erzwungener" Zeilenumbruch im Quelltext (damit auch der nachher schön aussieht). In Zeile 4 öffnen wir dann das eigentliche Dokument. Und da kommt schon wieder eine kleine Sache, die man beherzigen sollte: Der Channel Tag darf(!) nur einmal vorkommen.

Nun folgt der Header. Hierbei möchte ich mich auf die notwendigsten Eingaben beschränken.

05 <title>Titel des Feeds</title> \n
06 <link>URL der Webpräsenz</link> \n
07 <description>Kurze Beschreibung des Feeds</description> \n
08 <language>de-DE</language> \n
09 <copyright>Autor des Feeds</copyright> \n
10 <pubDate>Erstellungsdatum("Thr, 9 Oct 2008 14:00:00")</pubDate> \n

Dies sind die 6 Eingaben, die in jedem Fall vorhanden sein müssen. Ich denke, dass die Namen hier auch für sich sprechen. Etwas Tricky wird es nur bei der Zeitangabe. Diese muss in einem speziellen Format vorliegen (genauso und nicht anders wie in der Klammer). Wenn diese Konvention nicht eingehalten wird, gibt's keine Datumsangabe und es gibt ja nicht wenige, die sich unvollständige RSS-Feeds nicht anschauen. Mal abgesehen davon, dass wir ja auch einen Ruf zu verlieren haben. Mit diesem Problem werden wir uns unter anderem auch nochmals im zweiten Teils des Tutorials genauer befassen. Trotzdem noch ein letztes Wort dazu: viele nutzen im Header statt dem Tag <pubDate> viel eher den Tag <lastBuildDate> und schreiben dort das letzte Aktualisierungsdatum dort rein. Wir werden das in Zukunft genauso handhaben.
Als nächstes wollen wir endlich unseren Feed mit Inhalten füllen und dazu sind folgende Zeilen zuständig:
11 <item> \n
12 <title>Titel des Eintrags</title> \n
13 <description>Zusammenfassung des Eintrags</description> \n
14 <link>Link zum vollständigen Eintrag</link> \n
15 <author>Autor des Artikels, E-Mail-Adresse</author> \n
16 <category>Kategorie des Beitrages</category> \n
17 <guid>Eindeutige Identifikation des Eintrages</guid> \n
18 <pubDate>Datum des Items</pubDate> \n
19 </item> \n
Ich hatte ja schon weiter oben die Wohlgeformtheit angesprochen. Und hier schlägt sie nun voll zu. Jeder Beitrag wir zwischen den <item>...</item> Tags geschrieben. Sprich für jeden neuen Beitrag brauchen wir einen neuen <item> Tag, der durch weitere Tags genauestens Definiert ist. Halten wir die Reihenfolge der Tags nicht ein: nothing goes. also seid sorgsam.
Ansonsten sollten die Namen wieder für sich sprechen. Ein Beitrag zeichnet sich eine Überschrift, einen Text, einem Datum wann er veröffentlich wurde, einer ID, etc. aus. Und die können hier alle rein. Können ist deshalb makiert, weil ihr an diesem Punkt prinzipiell freie Hand habt, aber die Auflistung, wie sie hier ist, darf als durchaus brauchbar bezeichnen lassen.

Zum Schluss müssen wir natürlich noch die restlichen offenen Tags schließen:
25 </channel> \n
26
27 </rss>
In diesem Teil des Tutorials wollen wir auch erstmal gar nicht weitergehen, als unsere Beiträge hart reinzucodieren. Dynamisch machen wir das Ganze dann im nächsten Teil. Wir nehmen uns jetzt also erst einmal einen Artikel (den HTML Source Code des Artikels), packen ihn so wie er ist den Feed und speichern das ganze als "feed.rss" (oder ähnliches) ab.
Wenn wir nun in einem Feedreader (quasi jeder neue Browser bringt einen halbwegs brauchbaren Feedreader mit) unseren Feed öffnen, merken wir eines sehr schnell: Umbrüche, Links und so weiter funktionieren nicht. Keine Graphiken, Bilder: nix!
Sehr unschön die ganze Sache und auch nicht wirklich lesbar. Also brauchen wir einen kleinen "Trick" um uns wieder einen kleinen HTML Grundbefehlssatz zugänglich zu machen. Zu unserem Glück gibt es inzwischen eine offiziell erlaubte Methode um dies Grundbefehlssatz zu erhalten. Und das Ganze sieht so aus:

13 <description><![CDATA[Zusammenfassung<br>des<br>Eintrags]]></description> \n
Tja, das war es schon. Alleine durch <![CDATA[ werden unsere <br> Tags anerkannt und als Zeilenumbruch definiert. Also statt:

ZusammenfassungdesEintrages
sehen wir nun:
Zusammenfassung
des
Eintrages
Damit werden wieder textbeschreibende sowie Images- und Linktags übersetzt.

Nun ist es aber in den seltensten Fällen so, dass wir in unseren Feed hart reincodieren wollen. Viel spaßiger wäre es ja, die Inhalte direkt von einer Datenbank zu ziehen und uns nie wieder sorgen um unseren RSS-Feed machen zu müssen. Und dafür wird Teil 2 des Tutorials zuständig sein.

dieser Beitrag wurde aus dem Lautsprecher übernommen

Letzte Änderungen

GRUB2: Timer abschalten (starfiii, 31.Okt 09, 13:11)

Leider kein weiterer Artikel zu... (starfiii, 13.Mär 09, 14:01)

Windows 7, Build 7000 (public Beta),... (starfiii, 22.Jan 09, 11:45)

Deadlinks und andere Peinlichkeiten (mwi, 22.Jan 09, 09:53)

Wie werde ich "Webdesigner"? (mwi, 21.Jan 09, 11:17)