Kostenloser visueller GUI Designer für Flex

31. Mai 2010

Wer die Anschaffungskosten des Flex Builders von Adobe scheut und trotzdem gerne komfortabel seine Flex-Anwendungen gestalten möchte, kann das folgende Plugin herunterladen:

Amateras Air Gear

In einem ersten Test hat es mir schonmal gut gefallen, zu Einzelheiten werde ich demnächst nochmal einen Artikel verfassen.

Inkonsistenz in CFML?

26. Mai 2010

Nachdem ich mich mal wieder mit CustomTags in Coldfusion/Railo auseinandergesetzt habe, fiel mir mal wieder eine merkwürdige Eigenart in Zusammenhang mit Attributen auf.
Angenommen man möchte einem CustomTag folgende Struct übergeben:

<cfset value={test="meintest",laber="anderer Test"}>

Das minimalistische Tag hat dabei den folgenden Aufbau:

<cfparam name="attributes.model" default="mymodel">
<cfparam name="attributes.params" type="struct" default={}>

Dann wäre nach meiner Ansicht folgender Aufruf logisch:

<cf_modelform model="test" params=value>

Dies führt aber zu einer Fehlermeldung. Hingegen ist der folgende Aufruf erlaubt:

<cf_modelform model="test" params="#value#">

Das mag ja noch Sinn ergeben, erlaubt ist aber auch der folgende Aufruf:

<cf_modelform model="test" params=#value#>

Und das ergibt für mich keinen Sinn. Aus Funktionsaufrufen ist man es gewohnt, dass Referenzen aufgelöst werden, warum ist dies bei Tags anders?

Druckfähige Zusammenfassung von Funktionen in Railo

21. Mai 2010

Manchmal möchte man eine Übersicht über definierte Funktionen schnell zugänglich machen und als Dokumentation die Hints und Descriptions nutzen, die man extra in den entsprechenden <cffunction> und <cfargument> Tags angelegt hat.

Das folgende Skript tut genau das. Dateinamen angeben, ausführen, PDF ansehen. Es ist sehr kurzfristig entstanden und nicht besonders schön, erfüllt aber seinen Zweck.

<cffile action="read" file="filename.cfm" variable="cfcParser">
<cfset functions = REMatchNoCase("(?m)<cffunction.*(name="".*"").*>[\w\W]*?<\/cffunction>",cfcParser) />
<cfdocument format="pdf">
	<h1>Funktionsübersicht</h1>
	<cfoutput>
		<cfloop array="#functions#" index="curFunc">
			<cfset argumentList = "" />
			<cfset signature = "" />
			<cfset result = REFindNoCase("<cffunction.*?name=""(.*?)"".*>",curFunc,1,true) />
			<cfif ArrayLen(result.pos) GT 1>
				<cfset visibility = REFindNoCase("<cffunction.*?access=""(.*?)"".*>",curFunc,1,true) />
				<cfset returntype = REFindNoCase("<cffunction.*?returntype=""(.*?)"".*>",curFunc,1,true) />
				<cfset funcDesc = REFindNoCase("<cffunction.*?description=""(.*?)"".*>",curFunc,1,true) />
				<h2 style="font-family:Verdana; font-size:13pt">
					#ArrayLen(visibility.pos) GT 1 ? mid(curFunc, visibility.pos[2], visibility.len[2]) : "public"# #UCFirst(ArrayLen(returntype.pos) GT 1 ? mid(curFunc, returntype.pos[2], returntype.len[2]) : "Any")# #mid(curFunc, result.pos[2], result.len[2])# 
					<cfset properties = REMatchNoCase("(?=\w\W)*?<cfargument.*?name=""(.*?)"".*?>(?=\W\w)*?",curFunc) />
					<cfif ArrayLen(properties)>
						<cfsavecontent variable="argumentList">
							<dl>
								<cfset signature = "" />
								<cfloop array="#properties#" index="curArg">
									<cfset argName = REFindNoCase("<cfargument.*?name=""(.*?)"".*?",curArg,1,true) />
									<dt>
										<cfif ArrayLen(argName.pos) GT 1>
											<cfset signature &= mid(curArg, argName.pos[2], argName.len[2]) />
											#mid(curArg, argName.pos[2], argName.len[2])# 
										</cfif>
									</dt>
									<cfset myArg = REFindNoCase("<cfargument.*?hint=""(.*?)"".*?",curArg,1,true) />
									<cfset reType = REFindNoCase("<cfargument.*?type=""(.*?)"".*?",curArg,1,true) />
									<cfset myDefault = REFindNoCase("<cfargument.*?default=""(.*?)"".*?",curArg,1,true) />
									<dd>
										<cfif ArrayLen(reType.pos) GT 1>
											<cfset signature &= " : " & UCFirst(mid(curArg, reType.pos[2], reType.len[2])) & ", " />
											Typ: 
											<b>#UCFirst(mid(curArg, reType.pos[2], reType.len[2]))#</b>
										<cfelse>
											<cfset signature &= ", " />
										</cfif>
										<cfif ArrayLen(myDefault.pos) GT 1>
											Default: 
											<i>
												#Len(mid(curArg, myDefault.pos[2], myDefault.len[2])) ? mid(curArg, myDefault.pos[2], myDefault.len[2]) : "emptystring"#
											</i>
										</cfif>
										<br>
										<cfif ArrayLen(myArg.pos) GT 1>
											#mid(curArg, myArg.pos[2], myArg.len[2])#
										</cfif>
									</dd>
								</cfloop>
							</dl>
						</cfsavecontent>
					</cfif>
					(#REReplace(Trim(signature),",$","")#) 
				</h2>
				<cfif ArrayLen(funcDesc.pos) GT 1>
					<h3>#mid(curFunc, funcDesc.pos[2], funcDesc.len[2])#</h3>
				</cfif>
				#argumentList# 
			</cfif>
		</cfloop>
	</cfoutput>
</cfdocument>

Zend Framework 1.10

07. Februar 2010

Für die Programmierung mit PHP bietet sich die Verwendung eines Webframeworks an. Zumindest, sobald der Umfang der Anwendung steigt, macht sich die Aufteilung in Model, View und Controller positiv bemerkbar, die von den allermeisten Frameworks geboten wird. Auch die Verarbeitung (Filterung und Validierung) von Benutzereingaben sind zentrale Themen der Frameworks. Das Zend Framework ist sehr ausgereift und ausgezeichnet dokumentiert, bei meinen Experimenten damit stiess ich allerdings auf ein Problem:
Nach dem Anlegen einer Formularklasse und der Darstellung eines Datensatzes aus der Datenbank über $form->populate() schien zunächst alles zu funktionieren wie erwartet, wenn sich allerdings ein Umlaut in einem der Felder befindet, so ist das korrespondierende Textfeld im Formular leer. Inzwischen wurde der Bug bereits im Bugtracker gepostet, man kann also hoffen, dass er bald behoben wird, wenn auch andere das Problem haben.

Caching mit Railo Teil 2

27. Januar 2010

Es sind neue Beispiele online in denen nun auf EHCache und memcache eingegangen wird. Vorteile sind Caching über mehrere Server hinweg und Ausnutzung von Festplattenspeicher wenn der Arbeitsspeicher nicht. Mehr ausreicht. Auf jeden Fall einen Blick wert.

WordPress und Android

26. Januar 2010

Ein weiterer Vorteil den man durch den Besitz eines Android-Smartphones hat ist, dass man bequem von überall Beiträge in WordPress verfassen kann. Dafür eignet sich zum Beispiel die App wpToGo

Android als ständiger Begleiter

26. Januar 2010

Nachdem ich inzwischen etwa einen Monat mit einem Android-Smartphone durch die Gegend laufe, habe ich mich an einige Eigenheiten gewöhnt. Sehr gewöhnungsbedürftig ist die automatische Rotation. Im Browser funktioniert sie von Haus aus, deshalb kommt man zunächst nicht auf die Idee, dass eine zusätzliche Einstellung notwendig ist. Das Setzen des Häkchens bei auto-orientation sollte das Problem lösen. Man findet es unter Einstellungen->Sound und Display.

Danach funktioniert vor allem auch die Tastatur im Querformat korrekt, was sich gerade in textlastigen Anwendungen sehr positiv bemerkbar macht.

Caching mit Railo

26. Januar 2010

Endlich sind mehr Informationen zum Caching von Daten in Railo verfügbar.Enthalten sind die Funktionen schon seit einem der letzten 3.1.1er Releases, nur gab es bisher eben wenig Informationen zur Benutzung. In einem Blogpost beschreibt der Chefentwickler von Railo nun die Einrichtung und Verwendung, nebenbei bemerkt, wirken sich die Einstellungen auch auf das Tag aus. Gespeichert werden die Daten wie von Caches allgemein bekannt als Schlüssel-Wert Paar, worüber Sie auch einfach wieder abgerufen werden können. Ob hierbei ein Fehler erzeugt wird, wenn der Schlüssel nicht existiert, entscheidet der Entwickler selbst.

Herzlich Willkommen

25. Januar 2010

Auf diesem Blog werde ich über ColdFusion, Railo, MySQL und Programmierung allgemein schreiben.
Insbesondere im Zusammenhang mit Railo bieten sich für Entwickler von Web-Applikationen beeindruckende Möglichkeiten.