Meiner Meinung nach bietet MaxMind die besten Informationen bezüglich GEOdaten über eine IP-Adresse. Und das auch noch zu sehr günstigen Konditionen.

Nur hatten die Jungs leider keinen ColdFusion-Code…also habe ich m/einen auf Anfrage zur Verfügung gestellt.
Von deren City/ISP/Org Web Service unter ColdFusion bzw. ColdFusion GeoIP City/ISP/Org web service example oder gleich hier direkt zum Download bzw. Copy&Pasten.

Der Code ermöglicht den Zugriff sowohl über die ID als auch den Namen.

getGEO_MaxMind.cfm

method=„get“ url=„http://maxmind.com:8010/f?l=LicenceKey&i=#CGI.REMOTE_ADDR#“>

resultMaxMind = cfhttp.FileContent>


qMaxMindByID = structNew()/>
qMaxMindByName = structNew()/>
thisField = „country,region,city,undefined,latitude,longitude,DMA,area,ISP,organization“/>

thisPos = 1/>
thisValue = „“/>
stringField = „false“/>

from=„1“ to=„#Len(resultMaxMind)#“ index=„mmField“>
 
mid(resultMaxMind,mmField,1) IS ‚,‘ AND NOT stringField>
   
qMaxMindByID[thisPos] = thisValue>
   
qMaxMindByName[‚#ListgetAt(thisField,thisPos)#‘] = thisValue>
   
thisPos = thisPos +1/>
   
thisValue = „“/>
 

   
mid(resultMaxMind,mmField,1) IS ‚“‚>
     
stringField = iif(stringField,„false“,„true“)/>
   

     
thisValue = thisValue &mid(resultMaxMind,mmField,1)/>
   

 

 
Len(resultMaxMind) EQ mmField>
   
qMaxMindByID[thisPos] = thisValue/>
   
qMaxMindByName[‚#ListgetAt(thisField,thisPos)#‘] = thisValue>
 


 


/>#qMaxMindByID[3]#
/>#qMaxMindByName[‚city‘]#


var=„#qMaxMindByID#“ label=„qMaxMindByID“> />
var=„#qMaxMindByName#“ label=„qMaxMindByName“> />

cfDump ist einer meiner LieblingsTags in ColdFusion.
In Javascript könnte eine vereinfachte Version wie folgt aussehen:

jsDump
function jsDump(myObj) {
myDump = „JAVASCRIPT OBJECT DUMPn________________________________n“;
for(myVar in myObj) {
myDump = myDump + myVar + ‚: t‘ + myObj[myVar] + ’n‘;
}
alert(myDump);
}

Eine sinnvolle Erweiterung wäre zb. das auslesen von AJAX-Funktionen etc.

Manchmal darf es etwas mehr sein, nämlich dann wenn man wissen möchte, ob ein Mapping bereits im cfAdmin registriert ist:
Beispiel [1] der Funktion #getMappings()# liefert einfach alle Mappings des aktuellen Servers zurück:

getMappings[1]

   
   

Im Beispiel [2] liefert die Funktion #getMappings()# auch alle Mappings des aktuellen Servers zurück, man kann aber 2 optionale Parameter übergeben #getMappings(‚machii‘)#. Ähnlich dem SQL-Befehl FieldName LIKE ‚%machii%‘.

Parameter 1 vom Typ „String“ liefert alle Mappings zurück die diesen String enthalten.

Parameter 2 vom Typ „Boolean“ legt in Kombination mit Parameter 1 fest, ob das Ergebnis der Funktion #getMappings(‚machii‘,false)# alle Mappings zurückliefert die den String in Parameter 1 enthalten [true], oder [false] dann wird nur ein Mapping zurückgeliefert wenn es ein Mapping gibt welches genau dem Parameter 1 entspricht. Ähnlich dem SQL-Befehl WHERE FieldName = ‚machii‘.:

getMappings[2]

 
 

 
 

 
  
   
    
     
    

   
    
     
    

   

  

 
  
 

 

…ist in diesem Fall keine Frage, denn sonst stände das QueryObject in der gesamten ColdFusion Component zur Verfügung.

Durch das VAR bei wird daher gewährleistet, dass dieses QueryObject ausschliesslich in dieser Funktion existiert!

VAR-Scope


  
      SELECT * FROM dig_categorie WHERE isActive = 1 ORDER BY SortOrder
  

  

Voraussetzung dass das Reactor-Framework in Kombination mit Mach II genutzt werden kann, ist natürlich das beides bereits ganz normal und korrekt installiert wurde (siehe auch Mach II und Reactor: Teil1 und Teil2).

Damit die Factory (Basis-CFC) vom Reactor immer zur Verfügung steht trage ich sie wie folgt in die „Application.cfm“ ein:

Application.cfm

dig_digest.cfc (VORHER)


SELECT * FROM dig_categorie WHERE isActive = 1 ORDER BY SortOrder


>

dig_digest.cfc (NACHHER)


Datensätze aus QueryObjekten kann man fast immer ohne evaluate() ausgeben:

im QueryLoop nameDerQuery[„spaltenName“][currentRow]

oder auch

im ListLoop nameDerQuery[spaltenNameAlsVariable][indexDerListe]

Nach mehreren gefrusteten Anläufen in Form von Büchern, Internetforen und Tipps von Profis habe ich festgestellt das Entwurfsmuster (DesignPattern) durchaus Sinn machen ;-) Genau erklären kann es aber dann doch keiner so richtig.
Entwurfsmuster sind ist auch komplett unabhängig von der Art der Programmiersprache, was die Sache (meiner bescheidenen Meinung nach) nicht gerade einfacher macht.

Hier nun der Versuch einer Erklärung von Entwurfsmuster :

Stellen wir uns einmal vor wir wären ein Handwerker der einen Zimmerboden verlegen will.
Hierbei ist es völlig gleich, ob mit verlegen nun das verlegen des Bodens mit Teppich, Fliesen, Holz, Kork, Granit oder einfach nur mit Farbe bestreichen gemeint ist.
In jedem Fall könnten wir ein von mir frei erfundenes Entwurfsmuster anwenden (*hm*, vielleicht gibt es das sogar schon?), nämlich das "sperr Dich nicht ein"-Muster.

Das Entwurfsmuster "sperr Dich nicht ein" bedeutet folgendes:
Wenn man einen beliebigen Raum mit beliebigem Material verlegt, sollte man immer an der Ecke des Raumes mit dem verlegen beginnen, die gegenüber einer Zimmertür liegt. Denn wenn man fertig ist mit dem Verlegen sollte man den Raum ja auch wieder verlassen können, ohne über den frisch gestrichenen Fussboden laufen zu müssen. Logisch, oder?
OK, beim Teppichboden könnte man unter Umständen ‚drüber laufen, wenn er nicht gerade weiss ist und man zuerst die Schuhe auszieht.

Jetzt werden ein paar Jungs wieder sagten: "Mann, das ist ja wohl loooogisch?!".
Nein, das ist es eben nicht, sondern das ich Fachwissen das man sich entweder unter Handwerkern weiter erzählt bekommt, oder man hat sich selbst schon mind. einmal in diese blöde Situation gebracht und daraus gelernt.
Beim verlegen eines Fussbodens könnte man auch durch etwas Nachdenken darauf kommen, weil man den Raum vor sich sieht und sich das ganze verlegen etwas vom Ablauf her vorstellen kann.

Wenn es aber um komplexe technische Zusammenhänge geht, dann wird das ziemlich schwierig bzw. sehr anstrengend, weil man sich eben nicht so einfach komplexe Vorgänge vorstellen kann.

In der Regel ist es ja auch so, dass man erst einmal das Problem an sich verstehen muss um ein Entwurfsmuster anwenden zu können. Also in unserem Fall das verlegen eines Fussbodens. Das Problem oder die Problematik einer komplexen Geschäftslogik erst einmal zu verstehen ist schon recht schwierig und erst wenn man das verstanden hat kann man überlegen ob es für diesen Fall evtl. ein Entwurfsmuster gibt, nachdem man vorgehen kann, um sich eben "nicht aus bzw. einzusperren".

Wenn man in einem Team arbeitet, hat ein Entwurfsmuster noch weitere Vorteile:
1. kennt ein Kollege bereits das Problem und evtl. auch ein dazu passendes Entwurfsmuster, dann kann man das Problem wesentlich besser verstehen, weil man ja das unter Umständen das Entwurfsmuster dazu bereits kennt oder bekannt gibt
2. Wenn alle im Team ein paar Entwurfsmuster kennen, dann spricht man sie gleiche Sprache und kann evtl. weitere Lösungsvorschläge viel besser besprechen

Auch ist es oft so das man nicht nur ein Entwurfsmuster anwenden kann, sondern gleich ein paar Entwurfsmuster auf einmal, je nach Problemstellung.

Abschliessend ein paar Bücherlinks und einen auf Wikipedia über Entwurfsmuster :
Patterns kompakt. Entwurfsmuster für effektive Software-Entwicklung.
Entwurfsmuster von Kopf bis Fuß
Design Patterns. Elements of Reusable Object-Oriented Software.

Eines darf hierbei auch nicht fehlen! Anti Patterns

ColdFusion setzt sich mittlerweile auch in deutschen Firmen immer mehr, als echter JAVA-Applicationserver, für dynamische Web-Seiten durch.
Mehrsprachigkeit in ColdFusion wird zwar serverseitig sehr gut unterstützt, ist aber im täglichen Umgang doch recht umfangreich.
Es geht aber auch einfacher.

Hier der Link zu meinem Artikel auf Dr. Web

"Die Deutsche Seite von Mach-II " erstrahlt seit gestern im neuen Glanz. Naja, technisch gesehen zumind.
Das heisst die CSS sind wieder ohne Fehler und ohne Warnungen, sowie das HTML ist auch wieder xhtml strict validiert.

Was dann die Tage noch ansteht ist das die Mach II endlich ordentlichen und vor allem aktuellen Content bekommt, außerdem möchte ich die neue Version des Mach II Frameworks in Verbindung mit dem Reactor einsetzen (ColdSpring lasse ich erst mal sein).

Eine Art Handbuch zu Mach II gibt es vom Sean Corfield als LiveDocs .