Dienstag, 15. April 2014

Optimierung durch Entity Abstraktion - Teil I Datenbankdesign

Beim Datenbankdesign hat man oft hauptsächlich die Daten vor Augen. Es wird geprüft, ob die Daten Redundanzen enthalten. Wenn ja, führt man die üblichen Normalisierungen durch. An die Implementierung denkt man in der Regel dabei noch nicht oder nur selten. Meistens nimmt man an, daß sich aus den richtigen Datenstrukturen in der Datenbank die passenden Datenstrukturen für die Implementierung einfach ergeben. Dass das nur die halbe Wahrheit ist, möchte ich in diesem Artikel zeigen.

Ich arbeite für eine bekannte Wetterseite. Aus diesem Umfeld möchte ich auch das Beispiel entlehnen. Es geht um Wetterberichte. Diese erhalten wir als XML Dateien. Es gibt z.Z. ca. 20 verschiedene Wetterberichte. Für meine Überlegungen reichen drei Typen aus und die stelle ich hier auch nur vereinfacht dar.

Die Wetterdaten


Da wäre zunächst der Kurzwetterbericht wetterbericht_kurz.xml mit folgender Struktur:

1:  <?xml version="1.0" encoding="UTF-8"?>   
2:   <wt_kurz>   
3:    <datumzeit>   
4:     <datum>2013-11-10</datum>   
5:     <zeit>12:00:00 </zeit>   
6:    </datumzeit>   
7:    <titel>Langwetter Nachrichten</titel>   
8:    <ueberschrift>Wetterbericht fuer Bayern, Sonntag 15. Juli, 12:00 Uhr</ueberschrift>   
9:    <kopfzeile>Im Westen regnerisch, im Osten anfangs noch warm</kopfzeile>   
10:    <ueberschrift_wt_text>Das Wetter in Bayern:</ueberschrift_wt_text>   
11:    <wt_text>Hier steht jetzt der Wettertext ... blalalalallala</wt_text>   
12:    <ueberschrift_wt_naechste_tage>Die weiteren Aussichten bis Donnerstag:</ueberschrift_wt_naechste_tage>   
13:    <wt_naechste_tage>und auch in den kommenden Tagen viel Wetter .... </wt_naechste_tage>   
14:    <fuss>MeteoInfo: Meteorologe vom Dienst: Tel: 089 / 123456</fuss>   
15:   </wt_kurz>   


Freitag, 7. Juni 2013

Probleme mit dem tabindex beim IE lösen

Beim IE 8 verhält sich der Tabindex nicht wie bei Chrome 27 und Firefox 18. Normalerweiser erwartet man, daß bei  der Kennzeichnung eines HTML Elements z.B. Inputfeld mit tabindex="1" der erste TAB genau auf dieses Element springt. Macht der IE nicht.

Lösung:

Man fängt mittels keydown die Tabtaste ab und setzt sie explizit auf das HTML Element.

Die Variable tabFocusHandle ist global und wird mit false nach dem Laden der Seite initialisiert. Ist nicht besonders schön. Vielleicht hat jemand eine bessere Lösung.

 $(document).keydown(function(event) {  
       var keyCodeSelectedButton = event.keyCode || event.which;  
       var tabButtonCode = 9;  
       if (tabFocusHandle == true && keyCodeSelectedButton == tabButtonCode) {  
         var naviElement = $('[tabindex="1"]');  
         naviElement.focus();  
         tabFocusHandle = false;  
         return false;  // bei true geht er gleich einen Tab weiter, was wir ja nicht wollen  
       }  
     });  

Mittwoch, 10. April 2013

JBoss Logfiles geschickt durchsuchen

Zeitliche Abschnitte filtern

Manchmal will man nur einen bestimmten zeitlichen Abschnitt eines Logfiles durchsuchen. Gerade bei sehr umfangreichen Logdaten ist es manchmal sehr interessant, das Geschehen in einem bestimmten Zeitraum zu untersuchen.
Dazu kann man sehr wirkungsvoll das nachfolgenden Perl Skript einsetzen. Hier wird das Geschehen am 9.4.13 ab 15:00 - 16:00 herausgesucht

1:  perl -e'  
2:  open FH, "server.log" or die "err open $!\n"; $line=1;  
3:  while(<FH>){  
4:    if(/^2013-04-09 15:/){  
5:     if(!$first){  
6:       { $first = $line; }  
7:     else  
8:       { $last = $line; }  
9:    }              
10:    $line++;}  
11:  print `sed -n "$first,${last}p" server.log` if $first;  
12:  '  

Warum reicht hier nicht einfach ein 'grep' nach dem Datum mit Uhrzeit?

Treten irgendwelche Exceptions in der Zeit auf oder auch andere Outputs mit Zeilenumbruch auf, werden diese vom grep ignoriert.

Gerade bei großen Logfiles kann es schon sehr zeitsparend sein, erst einen zeitlichen Bereich herauzusuchen und dann mit 'grep' o.ä. nach Detailproblemen zu suchen.

Exceptions filtern

Angenommen man hat viele Java Exceptions, die im server.log nur sehr unübersichtlich sind, kann man sich mit nachfolgendem Skript helfen.
Die Haupt-Exceptions werden speziell mit '===========' gekennzeichnet.
1:  grep -n Exception: server.log |   
2:  perl -ne '  
3:  if(/^\d+\:2013-/g)  
4:  {print "===================================\n\n$_\n";}   
5:  else   
6:  {print "$_\n";}' | more  

Beispiel:
1:  ===================================  
2:  214:2013-04-09 00:00:02,808 ERROR [org.hibernate.ejb.AbstractEntityManagerImpl] (DefaultQuartzScheduler_Worker-0) Unable to mark for rollback on PersistenceException:   
3:  215:java.lang.IllegalStateException: [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] The transaction   
4:  is not active!  
5:  380:java.lang.IllegalStateException: [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] The transaction   
6:  is not active!  
7:  ===================================  
8:  508:2013-04-09 00:00:02,845 ERROR [org.jboss.aspects.tx.TxPolicy] (DefaultQuartzScheduler_Worker-0) javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.GenericJ  
9:  DBCException: Cannot open connection  
10:  510:java.lang.IllegalStateException: [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] The transaction   
11:  is not active!  

Donnerstag, 16. September 2010

Primary FAT32 unter VMWare erweitern

Backup der VM-Warefiles anfertigen!!!
  • VMWare beenden und alle Files der Installation in ein Backupverzeichnis sichern (die Rechte müssen unverändert bleiben!)
Laufwerk vergrößern
  • in das VM Ware Verzeichnis gehen und mit vmware-vdiskmanager Disk physikalisch erweitern

    vmware-vdiskmanager -x 15Gb winXP.vmdk
    • Fehler: Cannot grow 'win_xp.vmdk' as it possibly has one or more redo-logs
      Alle Snapshots von der VMWare aus löschen. ACTUNG!!! Das Löschen dauert einige Zeit. Bitte Warten und nicht Prozess vorher beenden, sonst ist das Win XP u.U. nicht mehr bootbar.
Primäre Partion mit gpartd vergrößern
  • CD-ROM im Setup von VMWare als erstes Boot Device einstellen
    • CD-ROM bei 'Edit virtual machine settings' korrekt einstellen, d.h. wenn CD IDE ist auch als IDE einstellen + Legacy emulation
    • beim Boot mit F2 in Setup gehen und dort Boot konfigurieren
  • gpartd CD booten
  • FAT32 Partion auf die notwendige Größe erweitern