Zum Inhalt, überspringe Kopfzeile Zum Navigation, überspringe Kopfzeile
Wer die Methode FindAll() des DirectorySearcher-Objektes benutzt hat, wird bestimmt schon, je nach LDAP-Filter, festgestellt haben das nur maximal 1000 gefundene Objekte zurückgeliefert werden. Das liegt daran das in den Einstellungen des ADS diese Grenze festgelegt ist. In der Standardeinstellung, wenn man nichts auf dem Server geändert hat, steht der Wert auf 1000.
Was tun wenn man nun aber mehr als 1000 Objekte abfragen sollte?
Schnell fällt der Blick auf die Eigenschaft SizeLimit des DirectorySearcher-Objektes. Setzt man diesen Wert aber auf z.B. 2000 so bekommt man dennoch nur 1000 Objekte mit FindAll() zurückgeliefert. Man kann mit SizeLimit die Anzahl der Objekte nach unten begrenzen, aber nicht über die Server-Grenze hinausgehen.
Die korrekte Lösung findet man in der Eigenschaft PageSize des DirectorySearcher-Objektes. Hat man diesen Wert nicht geändert, so steht er auf 0. Dies bedeutet das maximal die besagten 1000 Objekte – also die Server-Grenze – abgefragt werden.
searcher.PageSize = 2000
Erhöht man nun den Wert auf 2000 so wird man feststellen das man immer noch 1000 Objekte mit FindAll() geliefert bekommt. Eine Erhöhung des Wertes von PageSize über die Server-Grenze ist nicht möglich bzw. erlaubt. Der ADS ignoriert den Wert dann einfach.
searcher.PageSize = 1000
Setzt man den Wert auf 1000, also auf die Grenze die im ADS eingestellt ist, so erhält man mit FindAll() auch mehr als 1000 Objekte. Die Abfrage erfolgt nun Seitenweise im Hintergrund an die ADS. Hat man PageSize gesetzt, so sollte man das DirectorySearcher-Objekt via Dispose() nach der Benutzung aufräumen.
try {
searcher = new DirectorySearcher();
searcher.PageSize = 1000;
// Weitere Einstellungen für searcher
results = searcher.FindAll();
// Ergebnis bearbeiten
} catch {
throw;
}
finally {
if (searcher != null) searcher.Dispose();
if (results != null) results.Dispose();
}
Geschrieben von Stefan Jahn
in C-Sharp
um
16:16
| Kommentare (0)
| Trackbacks (0)
Seit kurzem hab ich einen kleinen Roboter zum Experimentieren von Franzi hier. Der Roboter selber besteht aus einem Mikrocontroller, zwei Servos für den Antrieb, Liniensensor und einen USB-Anschluß. Einen Mikrokontroller zu programmieren – speziell einen Roboter – hat mich schon immer fasziniert.

Die Hardware und Tools kann man seperat erwerben, komplett oder zum selber bauen. Wer es am Anfang leicht haben will kann auch alles zusammen im “Lernpaket Roboter selbst bauen” von Franzis erwerben.
Der Roboter enthält zum Glück einen USB-Chip, so das er über eine normale USB-Verbindung mit dem PC programmiert werden kann. Nach dem Anschliessen an den PC installiert Windows kurz einen Treiber und schon meldet sich der Roboter als “USB Serial Port”. Mit dem Programm “MProg – Multi-Device EEPROM Programmer” erkennt dann auch anstandslos den Mikrocontroller.
Der Mikrocontroller – ein ATmega88, gehört zur AVR-Controllerfamilie – wird für Lernzwecke mit BASIC programmiert. Dazu liegt dem Paket der Compiler BASCOM-AVR bei. Die Installation ist schnell erledigt.
Und jetzt fangen leider die Probleme an. Ich benutze Windows 7 64Bit. Das Programm BASCOM lässt sich leider nicht starten. Egal ob als Administrator oder normaler Benutzer. Das Programm stürzt immer wieder mit einer Ausnahmeverletzung ab. Das nächste was mich stutzig macht ist, das ich nur eine Demo-Version habe. Die Demo-Version kann nur Programme bis 4 KB kompilieren. Das soll mich aber erst mal nicht stören, der Absturz ist viel ärgerlicher. Wie man es so oft kennt sind mitgelieferte Programme auf CD ja meistens veraltet. Laut Handbuch kann man eine neue Version – falls denn vorhanden – bei MCS Electronics runterladen. Dort hab ich dann auch die aktuelle Demo-Version gefunden. Aber selbst die Installation dieses neuen Version brachte keine Besserung. BASCOM läuft hier nicht auf Windows 7.
Jetzt war ich doch schon etwas verärgert, was will ich mit dem Roboter wenn ich ihn nicht programmieren kann? Kurze Suche im Forum brachte mich nicht groß weiter – einige andere Leute hatten ähnliche Probleme mit Windows 7. Anscheinend gab es aber noch keine Fehlerbehebung. Im Forum bin ich dann aber auf den Hinweis auf das Programm AVR-Studio gestoßen. AVR-Studio ist eine IDE für die AVR-Mikrocontroller. Netter Nebeneffekt dieser Software – sie ist frei verfügbar und kostet somit nichts, also auch keine Begrenzung auf die 4 KB wie bei BASCOM. Bei der Firma Atmel kann man AVR-Studio runterladen. Leider ist eine Registrierung erforderlich. Bei Mikrocontroller.net findet man aber diverse Links für den direkten Download.
Wie man den Informationen von Mikrokontroller.net entnehmen kann ist die Programmierung mit AVR-Studio nur mit Assembler-Code möglich. Assembler? Nein, das ist etwas was ich mir bestimmt nicht mehr antun will. Zum Glück kann man den Controller mit AVR-Studio auch in C programmieren. Man muß davor einfach den GNU GCC Compiler für C und C++ für AVR, kurz WinAVR, installieren. Wie bei GNU Compilern üblich ist unbedingt darauf zu achten das das Programmverzeichnis, in dem die Installation erfolgen soll, keine Leerzeichen enthalten soll. Am einfachsten ist es WinAVR in C:\WINAVR zu installieren. Das Installationsprogramm passt auch automatisch die Umgebungsvariabel PATH an. Somit kann man einfach auf der Kommandozeile die Conmpilertools, z.B. avr-gcc, ohne Umwege direkt nutzen.
Hat man WinAVR installiert, so kann nun AVR Studio installiert werden. Das Programm AVR-Studio ist ziemlich groß, das Installationspaket umfasst alleine schon 602 MB. Damit AVR-Studio läuft muß bestimmte Software auf dem PC vorhanden sein. Während der Installation wird dies geprüft und ggf. werden die nötigen Tools, z.B. Microsoft Visual Studio 2010 Shell (isoliert) oder AVR Jungo USB, vorher installiert.
Nun habe ich also AVR-Studio auf meinem PC installiert. Sieht auf den ersten Blick aus wie Microsoft Visual Studio. Mein Experimentierhandbuch enthält aber viele Beispiele für BASCOM – also in BASIC (eine moderne Form davon) geschrieben – und AVR-Studio nutzt die Programmiersprache C). Das könnte noch lustig werden die Beispiele von BASIC nach C zu übersetzen. Mal ganz davon abgesehen das ich nun herausfinde wieviel von dem Wissen meiner Ausbildung über Elektronik noch vorhanden ist. Die Schaltpläne mit Dioden, Widerständen, Kondensatoren, ... im Experimentierhandbuch sehen nicht ganz einfach aus. Mal schauen was die nächste Zeit so bringt.
Update: Mittlerweile habe ich BASCOM doch noch – wenn auch nur durch einen Zufall – zum Laufen bekommen. Windows habe ich vorhin ja schon mal neu gestartet, was ja den Fehler nicht behoben hat. Auch der Versuch BASCOM mit Admin-Rechte laufen zu lassen schlug fehl. Wenn man sich aber als Administrator bei Windows anmeldet, so werden beim Login-Vorgang mehrere Bibliotheken am System registriert. Dies hat zur Folge das man danach BASCOM – auch als normaler Benutzer – ohne Probleme starten kann. Nun, so habe ich jetzt beide IDEs installiert. Eine – mit Einschränkung der Programmgröße – für BASIC und die andere für die Programmiersprache C. Für die ersten Experimente – da sie ja auch so im Experimentierhandbuch beschrieben sind – werde ich wohl BASIC vorziehen.
Update: Bei der aktuellen Version AVR-Studio 5 muß WinAVR nicht mehr installiert werden. Bei der Installation von AVR-Studio wird der entsprechende C-Compiler (im Installationsprogramm als Toolchain gelistet) mitinstalliert.
Geschrieben von Stefan Jahn
in Mikrocontroller
um
21:09
| Kommentare (0)
| Trackbacks (0)
Ein aufregender Tag oder Aktion und man hat viele Fotos mit seiner Digitalkamera gemacht. Wohlmöglich überspielt man die Fotos nicht sofort auf den PC, und so sammeln sich nach und nach immer mehr Fotos auf der Speicherkarte. Man hat dann viele Dateien mit folgendem Schema – oder ähnlichem, je nach Digitalkamera – auf der Speicherkarte:
Mit diesen Dateinamen lässt sich später nur schwer zuordnen welches Foto von welcher Aktion ist. Erst recht dann wenn man mehrmals eine Datei mit identischem Namen in verschiedenen Verzeichnissen hat. Die Fotos sollten sortiert werden. Ich selber bevorzuge bei meinen Dateinamen folgendes Schema:
Mit diesem Schema hab ich immer sofort im Blick wann das Foto gemacht worden ist und um welche Aktion/Thema es sich handelt.
Die entsprechenden Zeitangaben sollen dabei direkt aus den EXIF-Daten des Fotos übernommen werden. Somit ist also vor dem Fotografieren zu achten, das das Datum/Uhrzeit der Digitalkamera korrekt eingestellt ist.
Wie aber die Fotos nun entsprechend so umbenennen? Alle Dateinamen von Hand umbenennen ist zu aufwendig. Mit einem entsprechenden Fotobetrachter, z.B. Zoner Photo Studio, kann man alle Dateien gleichzeitig mit entsprechenden Vorgaben umbenennen. Dies funktioniert recht gut, hat aber den Nachteil das man – wenn man erneut Fotos auf den PC überspielt – wieder von Neuem die entsprechenden Vorgaben machen muß.
Will man es schneller machen und immer wieder das gleiche Schema bei den Dateinamen benutzen, so kann man das Tool jhead auf der Kommandozeile benutzen:
jhead -nf[Formatstring] *.jpg (oder entsprechender Filter)
Als Formatstring kann man alle Angaben machen die die Funktion strftime unterstützt. Folgende Möglichkeiten (Auszug) stehen zur Verfügung:
%a – abgekürzter Name des Wochentages%A – ausgeschriebener Name des Wochentages%b – abgekürzter Name des Monats%B – ausgeschriebener Name des Monats%c – Wiedergabewerte für Datum und Zeit%C – Jahrhundert (Jahr geteilt durch 100, gekürzt auf Integer, Wertebereich 00 bis 99)%d – Tag des Monats als Zahl (Bereich 01 bis 31)%H – Stunde als Zahl im 24-Stunden-Format (Bereich 00 bis 23)%I – Stunde als Zahl im 12-Stunden-Format (Bereich 01 bis 12)%j – Tag des Jahres als Zahl (Bereich 001 bis 366)%m – Monat als Zahl (Bereich 01 bis 12)%M – Minute als Dezimal-Wert%R – Zeit in der 24-Stunden-Formatierung%S – Sekunden als Dezimal-Wert%T – aktuelle Zeit, genau wie %H:%M:%S%y – Jahr als 2-stellige-Zahl (Bereich 00 bis 99)%Y – Jahr als 4-stellige-Zahl inklusive des Jahrhundertsjhead selber stellt noch folgende eigene Platzhalter zur Verfügung:
%i – Fortlaufende Nummerierung. Will man führende Nullen vor der Nummerierung haben, so muß man die Anzahl der Stellen angeben. Für “001”, also 3 Stellen, benutzt man %03i.%f – Ursprünglicher DateinameWill man die Fotos nun nach dem Oben genannten Schema umbenennen, so benutz man folgenden Befehl:
jhead -nf%Y%m%d_%Hh%Mm_wanderung_bernau_%03i *.jpg
Man erhält dann folgendes Ergebnis:
Hinweis: Aus Sicherheitsgründen (verschiedene Betriebssysteme) und der Einfachheitshalber sollten keine Leerstellen und Sonderzeichen im Dateinamen benutzt werden.
Gehören nicht alle Fotos im Verzeichnis zum gleichen Thema (Wanderung in Bernau), so muß man natürlich die Fotos vorher auf verschiedene Verzeichnisse aufteilen. Im selben Vorgang löscht man am besten auch noch alle Fotos die man nicht haben will, z.B. weil sie Unscharf sind. Dadurch ist sichergestellt das man später auch eine fortlaufende Nummerierung ohne Lücken hat. Natürlich kann man den Befehl nach Löschvorgängen immer wieder erneut anwenden.
Soweit so gut. Die Fotos haben nun den entsprechenden Dateinamen. Wer Lust hat kann auch gleich noch das Dateidatum/-Uhrzeit auf die ausgelesenen Werte setzen. Dies geschieht mit folgendem Befehl:
jhead -ft *.jpg
Wenn man sich die Befehle nicht merken kann oder nicht immer wieder erneut eingeben will, so kann man auch ein kleines Script schreiben. Hier mein Script dafür:
Script: photo_rename.cmd
@echo off if "%1"=="" goto KeinParameter jhead -nf%%Y%%m%%d_%%Hh%%Mm_%1_%%03i *.jpg jhead -ft *.jpg goto Ende :KeinParameter echo Fehler : Kein Parameter angegeben. echo Benutzung: photo_rename [Titel] goto Ende :Ende
Geschrieben von Stefan Jahn
in Fotografie, Scripte
um
20:53
| Kommentare (0)
| Trackbacks (0)
Man kennt das Übel: man macht mit seiner Digitalkamera viele schöne Fotos, mal Hochformat, mal Querformat. Und dann, wenn man die Fotos am PC anschauen will ist ein Teil der Fotos – meistens die im Hochformat – verkehrtherum. Zu allen Überdruss zeigen manche Programme die Fotos korrekt an und andere wiederum nicht.
Wenn man eine gute Digitalkamera hat speichert diese die Orientierung/Ausrichtung des Fotos direkt in die JPEG-Datei. Die Orientierung/Ausrichtung ist eine von vielen Infos die man in den EXIF-Daten des Fotos findet. So kann man hier z.B. auch nachschauen wie das Foto belichtet worden ist oder was für eine Brennweite man benutzt hat. Die meisten Digitalkameras auf dem Markt unterstützen mittlerweile diesen Standard.
Je nach Programm was man für die Anzeige der Fotos auf dem PC benutzt wird die Info der Orientierung/Ausrichtung ausgewertet und somit das Foto korrekt dargestellt. Leider machen dies nicht alle Programme und so kann es von Vorteil sein wenn man alle Fotos korrekt dreht. Dies kann man auf verschiedene Arten durchführen:
Werkzeug / Stapelverarbeitung. Hier kann man dann die Option Bild / Verlustfreies Drehen benutzen.Ich selber drehe aber alle Fotos automatisch mit Hilfe des kleinen, mächtigen Tools jhead auf der Kommandozeile:
jhead -autorot *.jpg (oder entsprechender Filter)Diese Variante geht ziemlich schnell. jhead kann noch wesentlich mehr … aber darüber ein andern mal.
Hinweis: Das Tool jhead benötigt zusätzlich das Kommandozeilentool jpegtran.
Geschrieben von Stefan Jahn
in Fotografie, Scripte
um
16:55
| Kommentare (0)
| Trackbacks (0)
Bei meiner Reise in Namibia haben wir bei dem heißen Wetter immer wieder mal einen Rock-Shandy getrunken. Dies ist ein erfrischender, leicht bitter schmeckender, Durstlöscher den ich so nur aus Namibia kenne. Er lässt sich relativ leicht zubereiten und schmeckt – jetzt bei diesen Temperaturen draußen – auch hier immer noch sehr gut.
Ihr benötigt ein großes Glas – z.B. ein Weizenglas – und füllt dies mit 1/2 Sprite und 1/2 Mineralwasser (mit Kohlensäure). Nun rundet ihr das Ganze ab in dem ihr ein paar Spritzer Angostura (ein Bitterlikör) hinzugibt. Der obere Teil des Getränkes müsste sich nun rot verfärben. Je nach eigenem Geschmack mehr oder weniger Angostura hinzugeben. Nun noch eins, zwei Eiswürfel rein und fertig ist der Durstlöscher.
Genießt es.
Geschrieben von Stefan Jahn in Allgemeines um 21:27 | Kommentare (0) | Trackbacks (0)
Mittlerweile hat wohl jeder im Internet eine E-Mail-Adresse. Der klassische Weg auf die E-Mails zuzugreifen ist mit Hilfe eines E-Mails-Clients und den Protokollen POP3 oder gar, was noch besser ist, IMAP. Die meisten Leute werden aber nur die Weboberfläche ihres E-Mail-Providers kennen.
Diese Weboberflächen sind mehr oder weniger gut gemacht. Manche sind von der Funktionalität echt super durchdacht, andere aber leider mehr als mangelhaft. Wer eine E-Mail-Adresse hat kennt auch das leidige Problem mit SPAM, unerwünschter E-Mail. Bei den meisten Providern enthält der E-Mail-Service auch einen SPAM-Filter.
Es gibt aber noch Provider wo das nicht der Fall ist. Oder man hat vergessen diesen anzuschalten. Wenn man jetzt längere Zeit nicht in das Postfach schaut können sich da gerne hunderte bis tausende von Mails ansammeln. Diese nun über die Weboberfläche zu löschen ist nicht immer komfortabel bzw. lässt sich schnell erledigen.
So hatte ich letztens den Fall das ich über 5000 Mails im Postfach eines Webmaster-Accounts löschen musste. Die Weboberfläche lies immer nur das Löschen von 20 Mails zu. Mal ganz davon abgesehen das zwischen jedem Aufruf der Löschfunktion etliche Sekunden verstrichen sind – sprich, die Weboberfläche vom Provider war quälend langsam.
Wie nun am einfachsten alle E-Mails löschen? Ich könnte natürlich meinen E-Mail-Client einrichten das er die E-Mails abholt und gleich via POP3 löscht. Das bedeutet aber das ich alle E-Mails zuerst runterladen müsste. Dies ist aber unerwünscht. Ich entschied mich für folgendes kleines Perl-Script das alle E-Mails im Postfach direkt via POP3 löscht:
#!/usr/bin/perl
use Net::POP3;
print "Loesche alle E-Mails vom POP3-Server...\n";
$server = "pop3.example.com"; # POP3-Server
$user = "peter.mustermann;example.com"; # Benutzername
$password = "geheim"; # Passwort
$pop = Net::POP3->new($server);
die "FEHLER: Kann keine Verbindung herstellen!" unless $pop;
$total = $pop->login($user, $password);
die "FEHLER: Keine Mails vorhanden oder kann keine Verbindung herstellen!" unless $total;
print "Anahl: $total\n";
for($i = 0; $i<$total; $i++) {
print "- #$i\n";
$pop->delete($i);
}
$pop->quit();
exit 0;
Bitte mit Vorsicht benutzen! Alle E-Mails werden ohne Nachfrage gelöscht.
Geschrieben von Stefan Jahn in Perl um 14:00 | Kommentare (0) | Trackbacks (0)
Wenn man Tabellen mit Daten aus einer Datenbank füllt ist die Sortierung eigentlich kein Problem. Man gestaltet entsprechend die Datenbankabfrage (SQL) und sortiert die Datensätze schon beim Einlesen der Daten.
Was ist aber wenn man die Datensätze schon in einer DataTable vorliegen hat, z.B. bei einer manuell gefüllten Tabelle, und diese nun sortieren will? Die Klasse DataTable selber stellt keine Funktion zur Sortierung zur Verfügung.
Man kann den Umweg über ein DataView nehmen. Ein DataView kann man nach jeder beliebigen Spalte sortieren lassen.
DataView view = new DataView( table ); view.Sort = "[Spaltenname]"; table = view.ToTable();
Beispiel:
DataTable table = new DataTable();
table.Columns.Add( new DataColumn( "Nachname", typeof( string )));
table.Columns.Add( new DataColumn( "Vorname", typeof( string )));
table.Rows.Add( new object[] { "de Burgh", "Chris" } );
table.Rows.Add( new object[] { "Minogue", "Kylie" } );
table.Rows.Add( new object[] { "Oldfield", "Mike" } );
table.Rows.Add( new object[] { "Brightman", "Sarah" } );
DataView view = new DataView( table );
view.Sort = "Nachname";
table = view.ToTable();
Als Werte für den Property Sort kann man auch mehere Spalten oder sogar die Sortierrichtung angeben, so wie man es vom Sort-Syntax bei SQL gewohnt ist:
view.Sort = "Nachname, Vorname"; view.Sort = "Nachname DESC"; view.Sort = "Nachname DESC, Vorname";
Geschrieben von Stefan Jahn in C-Sharp um 21:01 | Kommentare (0) | Trackbacks (0)
Je nach Art des Programmes ist es unerwünscht bzw. kann sogar zu Fehlern oder Nebenwirkungen führen wenn man dieses mehrmals startet. Wie aber nun herausfinden ob das eigene Programm schon läuft?
Dafür kann man sich die Mutex-Klasse aus System.Threading zu nutze machen.
using System;
using System.Threading;
class Program
{
private static Mutex mutex;
public static void Main( string[] args )
{
// Falls Programm schon laeuft neuen Start verhindern.
if ( IsRunning() ) return;
Console.WriteLine( "Hello World" );
Console.ReadLine();
}
/// <summary>
/// Pruefen ob Programm schon laueft.
/// </summary>
/// <returns>True = Programm laeuft schon</returns>
public static bool IsRunning() {
// Eindeutige Programmkennung erzeugen
mutex = new Mutex( false, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name+"_MultiStartPrevent" );
if ( mutex.WaitOne( 0, true ) ) return false;
return true;
}
}
Geschrieben von Stefan Jahn
in C-Sharp
um
20:29
| Kommentare (0)
| Trackbacks (0)
Seit C# 3.0 kann man ja via LINQ eine Datenbank abfragen. Eine schöne Sache. Ab und zu, für bestimmte Zwecke, benötigt man aber immer noch die Ergebnisse als klassische DataTable. Wie wandelt man nun das Ergebnis einer LINQ-Abfrage in eine DataTable um?
Hier die LINQ-Abfrage die mir mein Adressbuch ausliest:
DataContext context = new DataContext();
var query = from s in context.Personen
orderby s.Nachname
select s;
Die Datensätze hat man nun in query. Man könnte jetzt nun mit foreach jeden einzelnen Datensatz abfragen und in eine DataTable ablegen. Es geht aber noch etwas einfacher:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
/// <summary>
/// Ergebnis einer LINQ-Abfrage in eine DataTable umwandeln.
/// </summary>
/// <param name="query">Abfrageergebnis</param>
/// <param name="context">Context</param>
/// <returns>Tabelle</returns>
public DataTable ConvertLinqToDatatable( IQueryable query, DataContext context )
{
DataTable table = null;
IDbCommand cmd = null;
SqlDataAdapter adapter = null;
try
{
// LINQ-Abfrage in Tabelle speichern
cmd = context.GetCommand( query );
adapter = new SqlDataAdapter();
adapter.SelectCommand = (SqlCommand)cmd;
table = new DataTable();
cmd.Connection.Open();
adapter.FillSchema( table, SchemaType.Source );
adapter.Fill( table );
return table;
}
catch
{
throw;
}
finally
{
if ( table != null ) table.Dispose();
if ( adapter != null ) adapter.Dispose();
if ( cmd != null )
{
cmd.Connection.Close();
cmd.Dispose();
}
}
}
Somit einfach wie gewohnt eine LINQ-Abfrage durchführen und dann das Ergbnis mit der Funktion ConvertLinqToDatatable() umwandeln lassen:
DataContext context = new DataContext();
var query = from s in context.Personen
orderby s.Nachname
select s;
DataTable = ConvertLinqToDatatable( query, context );
Geschrieben von Stefan Jahn
in C-Sharp
um
22:23
| Kommentare (0)
| Trackbacks (0)
Das interessante Buch von Google mit dem Titel “20 things I learned about browsers and the web” gibt es nun auch auf Deutsch. Google hat die deutsche Fassung als HTML5 realisiert. Echt hübsch gemacht.
Das Buch 20 Dinge, die ich über Browser und das Web gelernt habe erklärt auf leicht verständliche Art so Themen wie Browser, HTML, CSS, IP, ... Hier das Inhaltsverzeichnis:
Der Quellcode der HTML5-Seite hat Google unter der Lizenz GNU GPL v2 veröffentlicht. So kann sich jeder anschauen wie die hübsche Seite gemacht worden ist.
Kleiner Wermutstropfen was HTML5 angeht, im Internet-Explorer funktioniert die Seite – zumindest die Animationen – nicht so wie gewünscht. Den Inhalt des Buches kann man aber trotzdem ohne Probleme lesen. Mit den Browsern Firefox, Chrome und Opera kann ich keine Probleme entdecken.
Quelle: GoogleWatchBlog
Geschrieben von Stefan Jahn
in Webdesign
um
22:10
| Kommentare (0)
| Trackbacks (0)
Zum Inhalt zurück, überspringe Navigation | Zum Seitenanfang