Dienstag, 12. Januar 2016

Macbook - Kopfhörer gehen nicht mehr

Heute Abend eine nette Überraschung - meine Kopfhörer gehen am Macbook nicht mehr.

Leider hat mich Google nur bedingt weitergebracht. Deshalb hier die Lösung für alle die keine Lust haben eine Stunde herumzuprobieren.

Systemeinstellung > Ton > Ausgabe

Dann das WICHTIGE: Kopfhörer einstecken

Erst dann sieht man sieht man als Gerät die Kopfhörer. Mein Problem: Ein anderes Programm hatte hier noch ein Gerät eingerichtet und die Ausgabe auf dieses Gerät gesetzt. Setzt man die Ausgabe wieder auf Kopfhörer kann man sofort wieder seine Musik geniesen.

Alles andere hilft nicht - Reboot, PRAM-Reset, etc. etc. alles nutzlos. So einfach kann es sein, wenn man weiß wie es geht :-(

Noch ein Tip zum Schluß. Wenn man das Programm löscht, daß die ärgerlichen Audiodevices erzeugt hat, sollte man wissen, daß man nach dem Löschen einen Reboot durchführen muß. Erst dann sind die Devices verschwunden (und können uns nicht mehr ärgern).

Rest Service mit Perl und Dancer

Wenn man heute einen Informationservice über das WEB zur Verfügung stellt, verwendet man meist REST-Services.

Wie man das implementiert, dazu gibt es viele Tutorials im Netz. Allerdings beziehen sich die meisten auf Java. Wie ist das aber mit anderen Programmiersprachen? Wenn man nicht einen eigenen Server im Netz betreibt, wir es schwierig mit Java. Einfache Hostingangebote für ein paar Euro im Monat bieten keinen Javaserver an. Die Verwendung von Skriptsprachen wie Perl, PHP oder Python ist jedoch fast immer möglich.

Deshalb möchte ich hier zeigen, wie man REST und Perl miteinander verheiratet. Wir werden sehen: Es ist unglaublich einfach! Besonders intereressant ist es, dieses Verfahren mit einer einfachen Java-Implementierung des gleichen Problems zu vergleichen. Dazu plane ich noch zwei weitere Artikel.

Donnerstag, 7. Januar 2016

Mapnik 2.2 Inkompatibilitäten

Ich hatte letzte Woche ein Problem, daß mal wieder schön demonstriert:
  • was passiert, wenn man seinen Vorurteilen vertraut, statt die Dinge wirklich zu überprüfen
  • wie mühsam es sein kann, mit Open Source Produkten zu arbeiten
  • wie man viele Stunden Zeit verlieren kann, wenn beide Dinge zusammen kommen
Eigentlich wollte ich nur mal "kurz" eine Bayernkarte mit bereits vorhandenen Styles rendern. Sollte eigentlich kein Problem sein.

Montag, 14. Dezember 2015

Ding Dong Klingel reparieren

Ding Dong Klingeln sind schön - solange bis das Kling-Klog verstummt. Dann öffnet man die Klingel und stellt fest, daß diverse lockere Teile drin sind, die irgendwie nicht mehr funktionieren. Man denkt kein Problem. Baut die paar Teile auseinander und stellt sich plötzlich die Frage: Wie zum Teufel funktioniert eigentlich so eine Ding Dong Klingel? Keine Ahnung! 

Also Google fragen. Leider Fehlanzeige. Bei der Suche nach "Ding Dong Klingel reparieren" kommen viele Treffer, so wie meist, aber nichts brauchbares. 

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!