In der aktuellen Computerbild gibt es ein “Blitzstartsystem”, welche “Chromium” enthält. Was sehr verwunderlich ist, da Google das ganze selbst noch nicht als stabil oder fertig deklariert.
Aber ein Grund das ganz mal selbst auszuprobieren!
Hat man ein Netbook, hat man das Problem, dass die CD einem gar nichts nützt, braucht man auch nicht. Alles was man zum Testen braucht ist ein USB-Stick mit mindestens 4 GB.
Mein Testsystem ist ein Samsung NC 10 Plus. Fertige Builds gibts bei http://chromeos.hexxeh.net/. Dann folgt man einfach der Anleitung auf seiner Seite.Leider scheint die Downloadrate auf 40KB/s gedrosselt, was für die 250 MB schon eine etwas längere Wartezeit benötigt. Hat man den Download gemeistert, ist man schon fast fertig, entpacken und auf den USB-Stick schreiben. Nun kann man das Netbook neu starten. Im Bios den USB-Stick als 1. Bootlaufwerk auswählen sollte man auch nicht vergessen.
Es kann an dem billigen USB-Stick liegen oder daran, dass ich ein “Debug Build” erwischt habe, die “unter 10 Sekunden” erreiche ich nicht, es sind eher 20 Sekunden, aber weit besser als das vorinstallierte Windows 7. Im Gegensatz zu vielen im Netz wurde unser W-Lan problemlos erkannt. Anmeldung (über Google Konto) und Browsen war problemlos möglich. Die Einrichtung klappte in unter 3 Minuten. Da kamen aber auch schon die ersten kleinen Fehlerteufel. Keiner davon war gravierend, aber sehr unschön:
Eine kleine Auswahl:
Sieht man aber von diesen Makeln ab, so macht das System einen sehr flotten und stabilen Eindruck.
Mein Netbook ist nun problemlos zu einem Chromebook geworden, Chromium OS hat noch einige kleinen Macken, die aber nicht groß stören. Spätestens wenn Google selbst von einer stabilen Version spricht, ist es eine Alternative für Netbook- Besitzer, welche eigentlich nur schnell mal ins Internet wollen.
Um neue Produkte toll in Szene zu setzen, gibt es mittlerweile Möglichkeiten zu Hauf.
“Interaktive” Youtube-Videos wie zB http://www.youtube.com/user/tippexperience
von Tipp Ex sind innovativ und sprechen sich schnell herum. Fast 10 Millionen Aufrufe sind ein top Wert.
Allerdings kann es auch zu Pannen kommen, zum Beispiel, wenn es um Fakes geht, wird aus Begeisterung schnell Verärgerung. Auch wenn ich nicht zu den Verschwörungstheoretikern wie in diesem Video gehöre, ist es schon beachtlich, wie oft Schleichwerbung gemacht wird.
Andere Interessante Pannen sind natürlich Bugs, also wenn etwas nicht so funktioniert wie gewollt.
Legendär ist Bill Gates und sein abtürzendes Windows .
Weit weniger spektakulär, aber dennoch ärgerlich ist die Seite http://www.dein-leben-ist-3d.de/ von LG.
Hat man sich durch die schön gemachte Präsentation geklickt und gibt bei der Händlersuche eine Postleitzahl aus Sachsen ein, so werde ich als Leipziger (04229) nach Wuppertal geschickt, immerhin 451km weit. Dresdener (01067) werden nach Mayen(542 km), Auer(08280) nach Rosenheim(451 km) verwiesen. Richtig Glücklich können sich die Chemnitzer (09111) schätzen, diese werden gerade einmal 248 km weit nach Schwabach geschickt.
Als Entwickler ist mir klar wie dieser Fehler passieren konnte, als Ossi fühl ich mich gemobbt.
Also bitte schnell nachbessern LG!
Natürlich gibt es auch anderen Änderungen, wie die Aktualisierung der CellTable oder der Integrierte GWTDesigner,
eine Übersicht dazu gibt es hier. Doch die neuen HTML5 Features, mit denen ja einige Firmen wie zB Facebook schon Arbeiten,
sollen heute das Thema sein.
GWT ist ein Framework, welches die unterschiedlichen Javascript- Implementierungen der Browser weitgehend vom Entwickler fernhält.
Doch beim Thema HTML5 und vor allem Canvas gibt es nicht nur unterschiedliche Implementierungen, es kann auch gar nicht vorhanden sein.
Um welchen speziellen Browser es sich handelt, muss man wohl kaum erwähnen, in der neunten Version sollen aber die Features dabei sein.
Wenn es doch schon so weit wäre.
Auch Google hilft einem Webentwickler, welcher die Existenz des bösen Browsers vergessen hat mit ungewohnten Konstruktoren.
canvas = Canvas.createIfSupported(); audio = Audio.createIfSupported();
In Java ist die Entwicklung kaum anders als mit Javascript.
public void draw(Canvas toDraw) { Context2d context = toDraw.getContext2d(); context.clearRect(x, y, 72, 72); String toPrint = image[type][index % image[type].length]; Image map = new Image(IMAGEPATH + toPrint); context.drawImage(ImageElement.as(map.getElement()), x, y); index++; } audio.getAudioElement().setSrc("audio/elf/attack.ogg"); audio.getAudioElement().setAutoplay(true);
Interessanterweise halte ich Apple’ s iPhone für einen Meilenstein der Webentwicklung mit HTML5. Die Entscheidung kein Flash zuzulassen, nebenbei auch kein Siverlight,
hat viele Entwickler vor ein Problem gestellt: Wie kriege ich meine Multimedia-Inhalte aufs iPhone? Neben Videos und Sound geht es auch um dynamische Grafiken.
Und Apple hat als Lösung des Problems HTML5 propagiert. Seit dem letzten Update des App Stores, dass es verbietet, das finanzielle Transaktionen in Apps am Marketplace vorbeilaufen,
suchen Firmen wie Amazon nach einer Alternative um auf dem iPhone weiterhin vertreten zu sein.
Neben den 3 Tags Audio, Video und Canvas gibt es noch andere Features, wie LocalStorage, Offlinemodus und Websockets, welche ich bald auch im GWT erhoffe.
Auch die Branche der Browser- und Socialgames wird wohl kaum an HTML5 vorbeikommen. Zwar scheint dort Flash der Platzhirsch zu sein, das wird sich aber wohl in den nächsten Jahren ändern. Vielleicht schon mit der Version 9 des böses Browsers.
Dass es durchaus möglich ist, mit HTML5 schicke Sachen zu erstellen, soll eine meine kleine Demo zeigen:
http://myasciigenerator.appspot.com/
Ich hab das “Preload” Problem von Canvas nocht nicht ganz behoben, aber es ist auch nur eine Demo.
Grafiken und Sounds stammen aus dem Open-Source Game “Battle for Wesnoth“.
HTML5 kann und wird ein Flashkiller sein und GWT das Framework für Browsergames der Zukunft.
Oder seid ihr anderer Meinung?
In der IT bedeudet das, daß man seine eigene Software selbst einsetzen soll. So macht es z.B. Google mit Blogger und Microsoft mit .NET. Aber auch im Web 2.0 Zeitalter gibt es dafür gute Beispiele 37signals.com: BaseCamp und Co sind unter der Prämisse entstanden, es selbst nutzen zu wollen. Und offensichtlich wollen auch viele andere die Produkte benutzen. Und das, obwohl viele Experten sich über den Erfolg solcher Entwicklungen wundern.
Qualität von Software hat viele Gesichter, genau wie die Art Software wahrzunehmen. Jeder hat seine eigenen Prioritäten und Vorlieben. Um in einem Team gute/benutzbare Software zu schreiben, sollte also für jeden Faktor ein entsprechender Typus Mensch vorhanden sein. Denn manche Kriterien schliessen sich normalerweise aus, dort ist es wichtig einen Mittelweg zu finden. Betrachten wir einmal, bei welchem Entwickler man welchen Kompromiss eingehen muss, denn jeder Entwickler wird seine Prioritäten auf die Prioritäten des Projektes anwenden. Sonst wird das Projekt zwar einen Aspekt von Softwarequalität übererfüllen, andere jedoch vernachlässigen. Aber betrachten wir einfach mal die Typen Entwickler und ihre Vorstellung von “guter Software”.
Eigentlich überflüssig zu erwähnen, daß ein Programm seinen Zweck erfüllen muss. Allzu oft gibt es aber Projekte, in denen ein Teilprojekt, zB ein CRM in einer Auktionsplattform, zu einem Selbstläufer wird und viel mehr Entwicklungsarbeit bekommt als nötig, um den eigentlichen Zweck zu erfüllen. Entwickler halten sich gerne mit solchen Nebensächlichkeiten auf, deswegen an das Ziel erinnern.
Als Beispiel nenne ich hier einfach mal die ganzen IPhone- Apps. Wer hätte gedacht, daß Programme, welche jeweils nur einen einzigen Verwendungszweck haben, zu Millionen gekauft werden? Aber Menschen, die nicht so erfahren mit Computern sind, sind weit weniger verwirrt. “Wo muss ich klicken?” erübrigt sich die geringe Anzahl an Menus und Icons. Eine geringe Anzahl an Optionen, von denen die meißten aber “oft” bis “stets” benutzt werden, runden das Ganze ab. Der Benutzer kann in einem Satz genau sagen, was die App macht.
Entwickler handeln hier gerne nach dem “YAGNI – You ain’t gonna need it” – Prinzip. Dabei wird übersehen, daß die nach der “MoSCoW” -Methode aufgestellten “Should have” Anforderungen den Erwartungen bestimmter Benutzergruppen entsprechen.
GMail durchsucht E-Mails in Bruchteilen von Sekunden. Die gleiche Aktion dauert in Outlook ein Vielfaches. Es gibt diese Performancefreaks, die zB tagelang bei ORM- Frameworks alle Möglichkeiten der Cache- Konfiguration ausprobieren, um noch ein paar Millisekündchen herauszuholen. Die Geschwindigkeit muss akzeptabel sein. Gerade im Web gilt: alles unter einer Sekunde ist gut. Ob 987 ms oder 612 ms - der Benutzer bekommt den Unterschied gar nicht mit. Deswegen bei akzeptabler Geschwindigkeit stoppen.
Es gibt Programme, dort kann man die Daten nur in einem Format abspeichern, zB der gute alte Editor. Andere wiederum können Daten(zB Bilder) in hunderten Formaten speichern. Fakt ist: Wenn man über 90% der standardisierten und/oder vom Benutzer erwarteten Formate unterstützt, ist alles in Ordnung. Ist es ohne großes Refactoring unmöglich ein anderes Exportformat zu implementieren, läuft was falsch. Der Kompromiss bleibt: so viele implementieren wie nötig – so viele zusätzlich erstellbar wie möglich.
Nein, du wirst es nicht brauchen.
Aber du wirst es schreiben, testen, refactoren, dokumentieren und supporten.
Du wirst sehr viel Zeit dafür verwenden und veschwenden für keinen Nutzen.
Das Programm wird nicht rechtzeitig fertig und deine Erklärung ist der Fakt, dass man die Klassen wiederverwenden kann.
Quasi als Framework für das nächste Programm.
Irgendwann kommt endlich der Tag, an dem ein neues Problem mit deinem “Framework” gelöst werden kann, nur ein paar “Anpassungen” sind notwendig.
du benutzt stolz deine Klassen und entdeckst einen Bug. Du löst den Bug,
schreibst gleich noch ein paar neue Methoden für neue Anwendungsfälle, welche dir in der Zeit eingefallen sind. Natürlich getestet und dokumentiert.
Dein Kollege bemerkt beiläufig, dass das Anpassen des Frameworks länger gedauert hat, als die Entwicklung eine Programmes, welches einfach nur das eine Problem löst.
Viele überstrapazieren Entwickler- Credos wie:
und
und entwickeln Code, der scheinbar alle Teilprobleme eines Problems lösen kann.
Dabei fällt einem nicht auf, dass man gerade Overengineering betreibt. Ein Anti-Pattern!
Ich möchte heute mal darüber schreiben, dass YAGNI nicht im Wiederspruch zu anderen Entwicklungs-Patterns steht,
sondern sehr gut damit vereinbar ist.
Als Beispiel soll hier das Problem eines Simplen FTP-Uploads herhalten. Da Oberprojekt sei eine
Web 2.0 Anwendung, bei der Profilbilder hochgeladen werden können.
Dazu soll das Jakarta Commons Net – Paket benutzt werden.
Dieses Problem kann man nun auf 3 Wege lösen.
Man schreibt in seinem Programm eine Methode in der Klasse, welche die Methode benötigt.
public void uploadFile(String filename){ File file = new File(filename) FTPClient ftpClient = new FTPClient(); ftpClient.connect("hardcodededurl"); ftpClient.login("hardcodedusername", "hardcodededpw"); ftpClient.storeFile("filename", new FileInputStream(file)); ftpClient.logout(); ftpClient.disconnect(); }
Man schreibt eine Klasse, die per FTP Bilder hochladen kann.
Diese Klasse hat nur eine Methode und einen Konstruktor.
public class ImageFTPUploader{ public ImageFTPUploader(String host,String user,String pw){ // code } public void upload(String filename){ // code } }
Man baut ein FTP-Framework mit folgendem Interface.
public interface IFTPUploader{ public IFTPUploader(String host); // anonymer Zugang public IFTPUploader(String host,String user,String pw); // normaler Zugang public void setTransfermode(int mode); // ascii oder binary public File downloadFile(String remoteFile); public void uploadFile(String localFile); public String[] listDir(String remoteDir); public void changeDir(String remoteChangeDir); // ... und ne Menge mehr in Version 2 ... }
Schauen wir uns die 3 Lösungen an, ist klar, das Lösung 1 da ausscheidet. Die anderen beiden sind wiederverwendbar.
Allerdings stellen sich mir bei Lösung 3 die Fragen:
Ich bin gezwungen, die Doku zu lesen, weil so viele Möglichkeiten bestehen.
Mit Augenzudrücken gibt es keinen Punktabzug.
Punktestand: 0:1:1
Anders gesagt, schreib soviel Code wie du musst.
Hier scheidet Lösung 3 aus, weil sie viel mehr als nur das eine Problem löst.
Punktestand: 1:2:1
Dieses Pattern ist sehr eng verwandt mit “Mach es wiederverwendbar”, deswegen ist die Punkteverteilung die gleiche
Punktestand 1:3:2
Das ist nicht nur ein Pattern für Firmen, sonder auch ein für Entwickler. Time-To-Market (TTM) ist da der entscheidende Faktor.
Code der irgendwann mal benutzt werden könnte, aber nicht zur Problemlösung beiträgt ist unnütz. Er kostet aber viel Zeit.
Wieder scheidet Lösung 3 aus.
Punktestand 2:4:2
Okay ganz anderes Problem (Phase 2
) jetzt sollen Lebensläufe im .doc,.docx oder .pdf Format hochgeladen werden auf einen anderen Server.
Das Projekt entwickelt ein anderer Programmierer als du.
Bei der Lösung 1 gibt’s das gute alte Copy+Paste. es gibt eine Methode in seinem LebenslaufConroller die sowas macht
Bei Lösung 2 gibt’s ähnliches Copy+Paste, nur heisst die neue Klasse LebenslaufFTPUploader oder DocumentUploader
Bei Lösung 3 gibt es gar 4 Möglichkeiten:
Wollen wir ehrlich sein?
Möglichkeit 3 und 4 würden wir uns alle wünschen. Die anderen Möglichkeiten spiegeln die Realität dar.
Und manchmal sind wir im Urlaub oder krank. Deswegen bekommt Lösung 3 wieder keinen Punkt.
Punktestand 3:5:2
Das muss man zunächst erklären:
Eigentlich eine Sammlung der vorhergehenden Patterns.
Doch Lösung 3 passt einfach nicht dazu.
Punktestand 4:6:2
Kurze Erklärung
Okay, die gleichen Vorraussetzungen wie bei “There’s more than one way to do it”.
Hier geht es um Erwartungen an den Code.
Lösung 1: man erwartet das es im Ausgangskontext funktioniert
Lösung 2: man erwartet das es funktioniert, Bilder über FTP hochzuladen
Lösung 3: man erwartet das es funktioniert, bei allem was man über FTP machen kann
Die Frage ist nun: erfüllt man diese Erwartungen?
Bei Lösung 1 und 2 ist es einfach, jedoch sind die Erwartungen bei Lösung 3 recht hoch.
Man erwartet, das neue Problem damit lösen zu können … und werden diese Erwartungen, von denen man beim Schreiben keinen blassen Schimmer hatte, nicht erfüllt … verdammt man diese Klassse!
Punktestand 5:7:2
Ich könnte die Liste beliebig erweitern, doch das Ergebnis ist klar:
Code den man nicht wiederverwenden kann, ist Mist.
Coder der unter der Prämisse entsteht, alles zu können, ist Mist.
Code ist nur dann sinnvoll, wenn er seinen Zweck erfüllt und diesen Zweck zuverlässig erfüllt
IDE steht für Integrated Development Enviroment oder auf gut deutsch Entwicklungsumgebung. Eine Vielzahl von Tools, die man im Entwicklungsprozess benötigt unter einem Hut. Ich werde hier auf PHP- Entwicklung eingehen, da ich mit ASP noch nicht viel gemacht habe.
Wie installiert man PHP und MySQL für Webmatrix? Auf der Webseite wird doch hoch und heilig versprochen, dass man beides benutzen kann. Und nach langer Suche fand ich einen Weg dies zu bewerkstelligen. Man installiert einfach WordPress.
Webmatrix kommt mit einer Handvoll Webapplikationen. Viele davon sind in ASP, aber auch einige PHP-Apps sind dabei. Installieren kann man diese über den Menupunkt “Neues Projekt -> Projekt aus Web Gallery”. Dort kann man WordPress installieren.
![]() |
![]() |
![]() |
![]() |
| WordPress auswählen | Ja MySQL!!!! | PHP und Mysql werden installiert. |
OOps was ist hier passiert? |
Der letzte Schritt ist den Mitgelieferten MySQL Server zu starten und Webmatrix neuzustarten.
Microsoft hält sein Versprechen und unterstützt MySQL genau so gut wie die hauseigene SQL-Lösung.

Neben Tabellen (wie in der Compact Edition) kann man nun auch Sichten und gespeicherte Prozeduren recht komfortabel erstellen.
Dank der WordPress- Installation bietet Webmatrix nun im Auswahlfeld auch PHP Seiten an, das gleiche Beispiel wir beim letzten Post mal in PHP.
![]() |
![]() |
![]() |
![]() |
| Neue PHP Seite | Coden | Testen | Hochladen |
Hat man die Hürde der Installation überwunden, hat man kostenlos eine Lösung, die sich nicht vor anderen kostenlosen Vertretern (zb PHPEclipse, PHP for Netbeans) verstecken muss. Auch wenn Features wie Codevervollständigung, Outlining und Debugging fehlen, für den Hobbyentwickler bietet Webmatrix alle Tools eines kompletten Entwicklungsprozesses. Alles wirkt wie aus einem Guss und verlangt nur wenig Eingewöhnung. Das Projekt befindet sich zur Zeit in der Beta und ich denke dass die in diesem Post angesprochenen Fehler bis zum Release verschwunden sind. Und dann kann man dieses Projekt ruhigen Gewissens weiterempfehlen.
Zunächst einmal Für alle Microsoft-Jünger LAMP steht für Linux + Apache + MySQL + PHP. Diese Kombination erlaubt es, mit kostenlos verfügbaren Komponenten, einen Webserver für dynamische Webseiten mit Datenbankanbindung bereitzustellen. Etwa 90% des Internets setzen setzen auf diese Komponenten.(zB WordPress/Joomla/Typo/Wikipedia). Erweitert wird die Kombination oft durch FTP (zum Dateiaustauch) und phpMyAdmin(zur Datenbankverwaltung).
Webmatrix ist ein neues Projekt von Microsoft, welches sich aktuell in der Beta-Phase befindet. Dabei werden alle im Vorwort erwähnten Komponenten durch die Basisversionen von Microsoft- Pendants ersetzt und in Einklang gebracht. Zusätzlich steht die Möglichkeit zum Upgrade einzelner Komponenten zur Verfügung.
Es ist wohl eine Frage der Zeit, bis die aktive Linux- Community die Neuerungen in Produkte wie Apache und Mono integrieren, bis dato ist man wohl an Microsoft als Betriebssystem beschränkt. Die Beschränkung ist allerdings keine Leistungs- , sondern eine Kostenfrage. Playground-Workspace (also einen Server zum Testen) auf LAMP- Basis ist im Netz teilweise sogar kostenlos zu erhalten. Windows-Hoster sind rar und vergleichsweise teuer. Wer sich allerdings einen Windowsserver hat, der weiß auch was er für das Geld bekommt.
Auch hier eine Kostenfrage. Das mitgelieferte Modul ist zwar kostenlos, ist aber Einschränkungen unterlegen(2 MB Speicher und 5 MB Arbeitsspeicher), mit der Express Version(auch kostenlos) sind es schon 10 GB Speicher und 1 GB RAM. Richtig Spaß macht ein SQL-Server aber erst ab der Standard- Edition, welche dann aber auch mit über 5000€ zu Buche schlägt. Zusätzlich bietet Microsoft die Anbindung an den neuen Clouddienst Azure SQL an.
Bis auf die dürftige mitgelieferte Version ist der Clou, daß die Datenbankverwaltung direkt in die IDE integriert wurde.
Neben den alten Bekannten C#, VisualBasic und Co von Microsoft unterstützt das Paket PHP und ASP.NET Web Pages(ähnlich PHP und JSP). Gerade ASP.NET Web Pages machen das Ganze interessant, da man schnell und auf bekannten Wegen Applikationen erstellen kann.
Auch dieses wurde in das Paket integriert und bietet die Möglichkeiten FTP,SFTP und Webdeploy(ein microsofteigenes Format).
Nicht mal 40 MB benötigt das Paket in der Basisvariante:
![]() |
| Von |
Selbstverständlich muss ich sowas immer ausprobieren, natürlich immer mit dem “MyNotes” – Beispiel.
Nachdem mit einer “Empty Site” startet, sieht man zunächst den Startbildschirm:
![]() |
| Von WebMatrix |
Die Webseite startet automatisch. Ganz nett: Webmatrix erkennt die Installierten Browser und bietet diese an, es gibt halt mehr als nur IE ![]()
Auf jeden Fall praktisch für Designer.
![]() |
| Von WebMatrix |
Okay leere Seiten sind langweilig, erstellen wir mal eine Datenbank, eine Tabelle und füllen diese mit Testdaten, dank der eingebauten Datenbankverwaltung supereinfach.
![]() |
![]() |
![]() |
![]() |
| Von WebMatrix | Von WebMatrix | Von WebMatrix | Von WebMatrix |
Nach ein paar Zeilen hat man schon eine einfache dynamische Webseite
![]() |
![]() |
| Von WebMatrix | Von WebMatrix |
und ein paar Minuten und Zeilen später hat man die komplette CRUD-Funktionalität hergestellt
![]() |
![]() |
| Von WebMatrix | Von WebMatrix |
Der Einstieg in die “Razor”- Sprache ist sehr einfach und macht Lust auf mehr,
gerade für Einsteiger halte ich sie für sehr geeignet. Wenn man nicht auf Hosting auf Windowsservern angewiesen wäre,
würde es sogar eine wirkliche Alternative zu PHP darstellen. Leider hat diese tolle Projekt den Microsoftbeigeschmack.
Datenbankzugriffe sind teurer als Speicherzugriffe, das ist nicht neu. Viele Frameworks wie Hibernate setzen deswegen auf einen Cache, um die Anzahl der Datenbankzugriffe zu minimieren und damit die Performance zu erhöhen. Das Caching passiert dabei meißt unter der Haube und lässt den Entwickler den Fokus auf die eigentlichen Arbeiten behalten.
Mit Google App Engine und Memcached und dem verteilten Cache ist Caching auch in der Cloud möglich. Doch auch wenn bei App Engine keine Persistenzlösung wie Hibernate oder EclipseLink möglich ist, kann man auf eine einfache Weise Caching nachrüsten.
Eine einfache DAO-Klasse
public class NodeDAO { public Node load(long id) { // code } public Node save(Node node) { if (node.getId() == 0) { insert(node); } else { update(node); } return node; } public void delete(Node node) { // code } private void insert(Node node) { // code } private void update(Node node) { // code } }
Relativ einfach, aber erfüllt den Zweck.
Zunächst erstellen wir ein Interface Indexed, damit die Lösung später für verschiedene Klassen möglich ist.
public interface Indexed { public long getId(); }
Und einen Simplen Cache (hier kann man später auf MemCached umrüsten)
public class SimpleCache { static HashMap cache; public static HashMap getInstance(){ if (cache==null){ cache = new HashMap(); } return cache; } }
Als Schlüssel soll hier Klassenname und ID fungieren
Noch ein paar kleine Interfaces für die 3 Cache- bzw Datenbankfunktionen
@Retention(RetentionPolicy.RUNTIME) public @interface SelectCachable {} @Retention(RetentionPolicy.RUNTIME) public @interface SaveCachable {} @Retention(RetentionPolicy.RUNTIME) public @interface DeleteCachable {}
Ein bisschen Guice-Magie
Starten wir mit dem SELECT oder GET – Befehl. Wenn wir einen Datensatz geladen haben, soll der im Cache verewigt werden. Ist er schon im Cache, soll keine Datenbankverbindung hergestellt werden. Wir benutzen den MethodInterceptor.
public class SelectCacher implements MethodInterceptor{ public Object invoke(MethodInvocation call) throws Throwable { Object[] args = call.getArguments(); Object result; if (args.length==1 && args[0] instanceof Long && SimpleCache.getInstance().containsKey(call.getMethod().getReturnType()+ "@" + args[0])){ // aus dem Cache holen result = SimpleCache.getInstance().get( call.getMethod().getReturnType()+ "@" + args[0]); }else{ // Aus der DB Holen result = call.proceed(); SimpleCache.getInstance().put( call.getMethod().getReturnType()+ "@" + args[0],(Indexed) result); } return result; } }
Auch der DELETE-Befehl ist simpel:
public class DeleteCacher implements MethodInterceptor { public Object invoke(MethodInvocation call) throws Throwable { Object[] args = call.getArguments(); Indexed indexer = (Indexed) args[0]; if (args.length==1 && SimpleCache.getInstance().containsKey(indexer.getClass()+ "@" + indexer.getId())){ SimpleCache.getInstance().remove( indexer.getClass()+ "@" + indexer.getId()); } return call.proceed(); } }
Zuletzt noch der PUT Befehl, hier muss man dazu sagen, dass aufgrund der ID entschieden wird, ob ein Insert oder Update geschieht, beim Insert wird bei @@IDENTITY die ID bestimmt und dem Objekt zugewiesen.
public Object invoke(MethodInvocation call) throws Throwable { Object result = call.proceed(); Indexed indexer = (Indexed) result; SimpleCache.getInstance().put(indexer.getClass() + "@" + indexer.getId(), indexer); return result; }
Nun müssen wir noch die Annotationen mit den Interceptors verbinden. Das passiert bei Guice so:
public class CacheModule extends AbstractModule{ protected void configure() { bindInterceptor(any(), annotatedWith(SelectCachable.class), new SelectCacher()); bindInterceptor(any(), annotatedWith(SaveCachable.class), new SaveCacher()); bindInterceptor(any(), annotatedWith(DeleteCachable.class), new DeleteCacher()); } }
Der finale Schritt, jetzt verbinden, oder besser gesagt injizieren, wir alles, was bisher erstellt wurde. Per Factory-Pattern erhalten wir wir nun eine Erweiterte Variante der Basisklasse. Per Annotationen bestimmen wir, welcher Methode welcher Interceptor zugewiesen wird.
public class NodeDAO { public static NodeDAO create() { Injector inj = Guice.createInjector(new CacheModule()); NodeDAO ret = inj.getInstance(NodeDAO.class); return ret; } @SelectCachable public Node load(int id) { // Code } @SaveCachable public Node save(Node node) { if (node.getId() == 0) { insert(node); } else { update(node); } return node; } @DeleteCachable public void delete(Node node) { // Code } private void insert(Node node) { // Code } private void update(Node node) { // Code } }
Mit Google Guice Funktionalitäten nachrüsten ist recht einfach. Die Lösung ist noch nicht ideal, aber ein guter Start, da alle Komponenten austauschbar sind.
Nachdem Ajaxian schon im letzten Jahr dazu aufrief, den IE6 nicht mehr zu unterstützen, soll dies mein Vorsatz für dieses Jahr sein.
Nach dem die normalen Systemeinstellungen eh ein Upgrade zu IE7 oder IE8 ausführen….. warum muss man dieses Verbrechen an der (Web-Entwickler-) Menschheit weiter unterstützen? I WILL NOT SUPPORT IE6 IN 2010!
Zur Zeit ist es noch ein Buzzword, welches einfach nur durch die Medien geht.
Bei jeder neuen Technologie gibt es 3 Phasen:
Manches ist einfach nur toll, weil es neu und anders ist, ob “Ruby on Rails”, Server Side Pushing(Comet) oder eben gerade eben Cloud.
Egal welche Technologie, hier gibt es immer auch den Zeitpunkt, an dem die Entscheidung die man getroffen hat, einem irgendetwas verbaut.
Cal Handerson(Flickr) zeigt in diesem Video (http://www.youtube.com/watch?v=i6Fr65PFqfk) die Grenzen von Django auf.
Das soll nur stellvertretend sein, für all die bösen Kommentare, die über irgendwelche Frameworks geschrieben oder gesagt werden.
Wenigstens ist es … entertaining.
Kann sich wer an den AJAX-Boom erinnern? Wahnsinniger Boom! Wer nutzt jetzt noch AJAX in der Reinform? Kaum einer!
Das X in Ajax bedeudet XML, ein Übertragungsprotokoll. Leider hat JSON weniger Overhead(Zusätzliche Daten zum Übertragen) und mehr Unterstützung des Browsers.
Aber man nennt AJAX ja nicht einfach in AJAJ um, es bleibt AJAX. Und mit JSON hat es die Phase der Usability bestanden.
Gerade sind viele neue Sachen im Kommen. Google Closure, Ruby On Rails, Grails, Spring Roo und eben Cloud Computing.
Bei allen gilt es abzuwarten, bis die ersten Erfahrungen über die Grenzen der Technologie gefunden werden. Dann gilt es für den jeweiligen Anwendungsfall zu vergleichen, ob Vor- und Nachteile einer Technologie oder eines Frameworks dem Projekt angemessen sind.
Für das Jahr 2010 heisst es also die Augen aufhalten.
Ich hab mir mal ne TVMovie gegönnt, nicht weil ich eine Fernsehzeitung brauch, gibt ja genug Programme, Internetseiten und Gadgets die das umsonst machen, sondern wegen dem Film “Die sieben Schwerter”. Voller Vorfreude lege ich die DVD in mein Laufwerk und dann kommt
Windows Media Player kann diese DVD nicht wiedergeben, weil kein kompatibler DVD-Decoder installiert ist.
Okay … Google ist dein Freund
Ein, Zwei, DREI mal wird mir empfohlen, doch VLC zu benutzen. Die ersten 3 Treffer liefern alle eine Lösung auf mein Problem.
Benutze ich allerdings die Porno- Suchmachine Bing
Eins(falsche Verlinkung),Zwei,Drei(falsche Verlinkung),Vier ,Fünf ,Sechs Suchresultate ohne Lösung für mein Problem!
Wenn man die Konkurrenz ausblendet um Problemlösungen auszublenden, schafft man kein Vertrauen. Ehrlicher und fairer Umgang mit den eigenen Schwächen ist etwas absolut maskulines, aber halt nichts “winzig doofes”.

Categories
Tag Cloud
Blog RSS
Comments RSS
Last 50 Posts
Back
Back
Void « Default
Life
Earth
Wind
Water
Fire
Light 