Monthly Archives: February 2013

Javascript / JQuery: Sorting large HTML lists and tables

While Javascript itself is executed very fast on modern browsers, DOM manipulation still takes a lot of time. Moreover, during extensive DOM manipulations some browsers appear to be freezing. And that is something no web developer will want to happen as it dramatically reduces user experience.

So what to do about it? The solution is to change all operations working with DOM to an O(n) performance. The sorting itself is done on pure javascript arrays and objects.

You can use the following sort map function on any javascript array or pseudo-array. pseudo-arrays need to have a .length property and all elements must be accessible using zero-based numeric indices. It does not change the array itself; it generates an index map to the original array instead. You can use that index map as a sorted view of the original array.

The example is using JQuery but the sort function does not.

/*
  create_sort_map   creates a map to iterate through a sorted view 
                    of list
  list              an array or pseudo-array containing all elements
                    to sort
  prop_fn           a callback function that returns the property to
                    sort by for each element of list
  invert            optional: sort descending 
  prev_sortmap      optional: previous result of create_sort_map, if 
                    you want to sort a list multiple times for 
                    different criteria 
  
  Usage example (JQuery):
  
  // find the table to sort
  var table = $('#my_table');
  // find rows to sort
  var list = table.find('tr');
  // created map to sort the list of rows
  var map = create_sort_map( list, 
    function(my_tr) {
      // find the value to sort by inside a row
      return $(my_tr).find('td.my_sort_col').text();
    });
  // re-insert rows in proper order
  for(var i=0; i<map.length; i++) {
    table.append($(list[map[i]]).detach());
  }
  // clean up
  table=list=map=undefined;

  HTML schema for example:
  
  <table id="my_table">
    <tr>
      <td>
        Some text...
      </td>
      <td class="my_sort_col">
        Sort this!
      </td>
    </tr>
    <tr>
      <td>
        Some other text...
      </td>
      <td class="my_sort_col">
        Sort this too!
      </td>
    </tr>
  </table>    
  
  The usage example can be further improved by removing the whole 
  table from page DOM before sorting and insert it back when all 
  sorting is done.
*/
                      
function create_sort_map(list, prop_fn, invert, prev_sortmap) {
  // make sure invert is a valid boolean if not specified in call
  invert = !!invert;
   
  // arr is the sort map that will be created
  var arr=[];
  // list_prop is an array containing all results of prop_fn
  // this makes sure prop_fn is called O(n)
  var list_prop=[];
  
  // is prev_sortmap an array that matches the length of list?
  if(prev_sortmap!==undefined && list.length==prev_sortmap.length) {
    // then use prev_sortmap as starting point for our new sort map
    arr=prev_sortmap;
    // make the list of all prop_fn results
    for(var i=0;i<list.length;i++) {
      list_prop.push(prop_adjust(prop_fn(list[i])));
    }
  }
  else {
    // if prev_sortmap is invalid, use an identity map as starting 
    // point and make the list of all prop_fn results
    for(var i=0;i<list.length;i++) {
      arr.push(i);
      list_prop.push(prop_adjust(prop_fn(list[i])));
    }
  }
  
  // this is pure javascript, it executes quickly although it's a 
  // very slow sort algorithm, O(n^2): Bubblesort
  // change to quicksort if it actually takes more than a few ms
  var changed=true;
  while(changed) {
    changed=false;
    for(var i0=0;i0<(arr.length-1);i0++) {
      var i1=i0+1;
      if(invert ? (list_prop[arr[i0]]<list_prop[arr[i1]])
                : (list_prop[arr[i0]]>list_prop[arr[i1]])) {
        changed=true;
        var xchg=arr[i0];
        arr[i0]=arr[i1];
        arr[i1]=xchg;
      }
    }
  }
  
  // return the sort map
  return arr;


  // prop_adjust is a helper function to introduce general search 
  // rules.
  // for example: 
  // * convert numbers in strings to numbers
  // * application sort rules. 1: basement, 2: main-floor,
  //                           3: first floor, ...
  // it's inside create_sort_map to keep global namespace clean
  function prop_adjust(prop) {
    if(sort_isNumber(prop)) {
      return Number(prop);
    }
    
    prop=prop.toLowerCase();

    // insert application sort rules
		
    return prop;
  }
  
  // is it a number? change depending on your application.  
  function sort_isNumber (o) {
    return !isNaN(o-0) && o !== null && o !== undefined;
  }
}

Pecunia non olet

Ein neues Zeitalter in der Immobilien-Verwaltung

Institutionelle Eigentümer und Anleger im Immobilien Sektor bevorzugen die Fremdverwaltung ihrer Liegenschaften. Dabei werden nahezu alle Aufgaben vor Ort durch Dienstleister ausgeführt. Das betrifft insbesondere die Reinigung und Instandhaltung der Immobilien  Wartung technischer Anlagen und Geräte sowie Sicherheit und Besucherempfang. Während sich diese Dienstleistungen gut definieren und dokumentieren lassen und damit gut geeignet für Outsourcing sind, bleiben Marketing und Vermietung oft in den Händen der Eigentümer.

Marktübliche FM-Software

Marktübliche Facility-Management-Software wendet sich speziell an die Bewirtschafter der Liegenschaften und ermöglicht diesen, die Vielzahl von wiederkehrenden Dienstleistungen, gesetzlichen Wartungsvorschriften und Störungsmeldungen zu verwalten und zu dokumentieren. Die Komplexität der FM-Software ist hoch, um die Vielzahl der möglichen Anwendungsbereiche abzudecken. Wenn Gebäudedaten in ausreichender Tiefe erfasst wurden, dann ermöglicht die FM-Software den Technikern und den Mitarbeitern der Verwaltung einen effizienten Informationsfluss und eine Lückenlose Dokumentation der Dienstleistungen rund um die Liegenschaften.

Marketing und Vermietung

Für den Bereich Marketing und Vermietung sind diese Software-Lösungen oftmals nicht zielführend. Neben einer großen Menge von nicht relevanten Informationen und Handlungsoptionen präsentiert die FM-Software zwar auch Grundrisse und einfache Tabellen als Nebenprodukt. Die FM-Software erinnert ihre Anwender allerdings durch die umfangreichen Funktionen daran, dass sie nicht für den Zweck von Marketing und Vermietung erstellt wurde. Durch die Komplexität der Software sind die entscheidenden Funktionen nicht mehr einfach genug zu bedienen.

Die wichtigsten Software-Funktionen für den Bereich Marketing und Vermietung:

  • Anzeige, Ausdruck und Änderung von Plänen der Mietbereiche
  • Anzeige, Ausdruck und Änderung von Tabellen (Raumbuch, Mieterlisten usw)
  • Integration in den Industrie-Workflow mit Excel-Tabellen und PDF-Dokumenten
  • Unkomplizierte Übersicht über das gesamte Portfolio
  • Erstellen und Vorbereiten von Berichten

Die derzeitige Praxis

Diese Funktionen werden durch marktüblicher FM-Software nur rudimentär realisiert, da der Fokus dieser Produkte auf der Bewirtschaftung liegt. In der Praxis werden daher Tabellen und PDF-Dokumente von Architekten und anderen Dienstleistern erstellt. Diese Dokumente stellen jedoch stets Moment-Aufnahmen der Liegenschaften dar und selbst einfachste Veränderungen in Mietbereichen oder Mietern erfordern die Neuerstellung oder Überarbeitung dieser Dokumente durch externe Dienstleister.

Pecunia

Mit Pecunia kommt erstmals eine Internet-basierte Software auf den Markt, die sich speziell an den Nutzerkreis der Vermieter richtet. Die Stärken des Pecunia-Systems liegen in der einfachen Erstellung der gewünschten Tabellen und Dokumente sowie in der einfachen, zentralen Änderbarkeit der veränderlichen Daten in einer graphischen Oberfläche. Anstatt eine teure FM-Software zu erwerben, die gleichzeitig wenig geeignet für den Einsatzzweck ist und aufwändige Installationen im Unternehmens-Netzwerk erfordert, können Sie ihre Liegenschaften in einer sicheren Server-Umgebung von jedem internetfähigen Gerät aus anzeigen, präsentieren und verwalten. Präsentationen zu vakanten Mietflächen erstellen Sie in Minuten und können ihren Interessenten damit hochwertige und spezifische Dokumente weitaus schneller vorlegen, als es andere Produkte erlauben.

Lehrevaluation WS 2012/13

Meine Schüler am b.i.b. International College haben ihre halbjährliche Bewertung vorgenommen. Ich unterrichte dort seit einem Semester als Honorardozent eine Klasse angehender Technischer Assistenten im Fach Softwareentwicklung mit 10 Wochenstunden.

Unterrichtsinhalte waren in diesem Semester:

  • Softwareentwicklung in C# (Windows .NET) am Beispiel eines fiktiven Auftrags,
  • Mikrocontrollerprogrammierung am Beispiel der Atmel AVR 8-bit RISC Reihe und
  • Entwicklung von Web-Anwendungen mit PHP, MySQL, Javascript und JQuery.
Rahmenbedingungen
Frage Durchschnittsnote
Wie empfanden Sie die allgemeine Organisation des Schulbetriebs? (Schulleitung, Verwaltung, Studenplanung, IT-Service, Unterrichtsausfall usw.) 2,2
Wie lernfördernd waren für Sie die Unterrichtsräume und die Einrichtung? 2,9
Wie angemessen war die Ausstattung der Unterrichtsräume an die Erfordernisse des Unterrichtsfaches angepasst? 3,0
Wie gut ermöglichte die vorhandene Hard- und Software die Inhalte des Faches praktisch umzusetzen? 2,7
Rahmenbedingungen gesamt 2,7
Fachbezogene Aspekte
Frage Durchschnittsnote
Wie gut vorbereitet und engagiert wirkte der Dozent? 1,5
Wie beurteilen Sie die Fachkompetenz des Dozenten? 1,2
Wie schätzen Sie die Aktualität der vermittelten Unterrichtsinhalte ein? 1,4
Wie gut war die Abstimmung mit anderen Unterrichtsfächern? 1,4
Fachbezogene Aspekte gesamt 1,4
Methodik
Frage Durchschnittsnote
Wie verständlich und strukturiert wurde der Lehrstoff dargeboten? 2,3
Wie methodisch abwechslungsreich gestaltete der Dozent den Unterricht? 1,7
Wie war das Verhältnis von Theorie- und Praxis-/Übungsanteilen? 1,4
Wurde die Wichtigkeit der Lerninhalte und der praxisbezug deutlich gemacht? 1,8
Methodik gesamt 1,8
Leistungsbewertung
Frage Durchschnittsnote
Wie angemessen war der Schwierigkeitsgrad der Leistungsüberprüfungen? 1,8
In welchem Maße war die Bewertung nachvollziehbar und objektiv? 1,7
Leistungsbewertung gesamt 1,8
Persönlichkeitsbezogene / soziale Kriterien
Frage Durchschnittsnote
Wurde die zur Verfügung stehende Unterrichtszeit hinreichend genutzt (Pünktlichkeit)? 1,2
Wie empfanden Sie die Athmosphäre in der Lerngruppe? 1,1
Wie empfanden Sie die Betreuung durch den Dozenten? 1,5
War der Unterricht zielorientiert und wurde die Zielerreichung überpüft? 2,0
Persönlichkeitsbezogene / soziale Kriterien gesamt 1,5
Zusammenfassung
Frage Durchschnittsnote
Welchen Gesamteindruck haben Sie von dem Fach? 1,6