Download Firefox -  a safer, easier to use web browser. Return to iribbit.net - Leap into the online experience! Return to iribbit.net - Leap into the online experience! iribbit.net - Leap into the online experience!

Project News :.

The latest project to launch was the site for Gorilla Offroad Company. Aside from their main site, a social media strategy was develop to launch the company into various industry specific automobile enthusist discussion board communities as well as popular social media fronts like Facebook, Pinterest, and Twitter.


Valid XHTML 1.0 Transitional

Valid CSS!

Section 508 Compliant

powered by: Macromedia ColdFusion MX

made with: Macromedia Dreamweaver MX

What is RSS

XML - often denotes RSS Feed information.

Macromedia - ColdFusion Programming
white horizontal rule

ColdFusion News :.

To bring a little life to my site, I've pulled a couple What is RSS Feeds into this page. You can currently choose between the technology related news stories from the following news sources:



You are currently viewing and RSS Feed from coldfusionbloggers.org.



CFCamp: a Crocodile Dundee moment for me
G'day:

That's not a shot glass. This is a shotglass.

It was a bit of a messy night last night. Well, indeed, we basically sat around all afternoon @ the Stadthalle at Germering drinking Tegernseer Hell, so it was getting messy even before the evening.

Am currently sitting in Luis' CommandBox presentation. CommandBox continues to look impressive.

Quite a content-lite article this. I just liked the size of that shotglass, basically.

I'll try to write something more useful later on. But I'm also doing Twitter updates tagged with "#CFCamp" as things occur to me. That might be a better way to find out about what's going on @ CFCamp.

--
Adam
(Tue, 21 Oct 2014 08:05:36 GMT)
[view article in new window]

PHP: getting AspectMock to work
G'day:
First things first: Luis, Brad, everyone at Ortus Solutions: I bloody love you guys. Working with TestBox and MockBox is an absolute pleasure compared to getting their PHP equivalents installed and working properly.

Over the last coupla weeks, meself and Duncan have been investigating unit testing on PHP, and specifically how to mock dependencies. On our old CFML code base, we have 1000s of test, and we use MockBox heavily, as we have rather a lot of dependencies which interfere with testing if they're not mocked. We only ever really moved to TestBox as a proof-of-concept before our CFML codebase was put into maintenance mode, and we shifted to PHP. Prior to that we had been using MXUnit for a number of years.

PHPUnit is a bit rough-and-ready in comparison to TestBox, but it's solid and will do the trick. However we both had an arsehole of a time getting AspectMock to work. And we both failed and moved on to other things. Earlier I'd looked at Mockery as a solution for mocking - its docs are better than AspectMock's (both a recommendation for Mockery, and an indictment of AspectMock), but it did not do something things we expect to need to be doing, whereas AspectMock claims it can (mocking static methods).

Anyway, this afternoon I found myself furrowing my brow and thought "I'm going to get that bloody thing to work... or else". Fortunately after a lot of swearing and wondering if I can hunt down and punish AspectMock's author... I finally noticed what I had been doing wrong. I presume Duncan was doing the same thing wrong, but don't know. Anyway, I got it working.

So here's my AspectMock mission from this afternoon.

Installation

Composer

Before installing AspectMock, I needed to install Composer, which seems to be PHP's package manager. This was really easy: download the binary, run it. It did hiccup once as I didn't have the SSL extension enabled in my PHP install, but that was easy to fix: just uncomment it from php.ini.

AspectMock

Installing stuff with Composer is a breeze. In my app directory I created a composer.json file:

{
"require-dev": {
"codeception/aspect-mock": "*"
}
}

Then run Composer in that directory, and it chugs away and installs whatever it's been told to do:

c:\php\www\experiment\phpunit>composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing doctrine/lexer (v1.0)
    Loading from cache

  - Installing doctrine/annotations (v1.2.1)
    Loading from cache

  - Installing jakubledl/dissect (v1.0.1)
    Loading from cache

  - Installing andrewsville/php-token-reflection (1.4.0)
    Loading from cache

  - Installing lisachenko/go-aop-php (0.5.0)
    Loading from cache

  - Installing codeception/aspect-mock (0.5.1)
    Loading from cache

jakubledl/dissect suggests installing symfony/console (for the command-line tool
)
lisachenko/go-aop-php suggests installing symfony/console (for the command-line
tool)
Writing lock file
Generating autoload files

c:\php\www\experiment\phpunit>

I fell into a bit of a trap here as I saw the bit that says "[whatever] suggests installing [other shite]", and the completist in my went "hmmm... OK". And updated my composer.json file and installed those too. Then those ones has more suggestions of their own. "OK, I'll play yer silly game," thinks Adam, and added those ones in too. And, of course, having installed those, those ones came back with more bloody suggestions... and... well after about four goes of installing more and more shite I went "screw this", and reverted my composer.json and went back to just installing AspectMock. The good thing is Composer removed all the stuff I changed my mind about too.

I figured if I actually needed any of that other shite, I'd install it as/when.

Autoload

Next I had to monkey with my autoloader so AspectMock etc would load. This is done in two parts now (you might recall me going over autoload.php files in earlier articles: "Looking at PHP's OOP from a CFMLer's perspective: classes, objects, properties"), the AspectMock autoload, which calls the Composer autoload, and my own autoloading stuff. Here's the AspectMock one:

<?php
// aspectMockAutoload.php

include __DIR__.'/../vendor/autoload.php'; // composer autoload

$kernel = \AspectMock\Kernel::getInstance();
$kernel->init([
'debug' => true,
'includePaths' => [__DIR__]
]);
$kernel->loadFile('autoload.php');

And note how it calls in my own autoload.php at the end there (it's the same as I always use, so I won't repeat it here).

This all seemed to load fine (it didn't error, and $kernel seemed to have AspectMock stuff in it afterwards.


Test: fail

There some sample code in the AspectMock readme.md file which I thought was as good a place to start as any: "Allows replacement of class methods."

However the code is full of typos (it doesn't even get past the parser, let alone run), and simply doesn't work. Not in an AspectMock sense (although it didn't work for me in that way either, to start with), but in general. Here's their code sample:

<?php
function testUserCreate()
{
$user = test::double('User', ['save' => null]));
$service = new UserService;
$service->createUserByName('davert');
$this->assertEquals('davert', $user->getName());
$user->verifyInvoked('save');
}

The issue here is $user is not a User object, it's a class proxy. Which is fine, and what we want, but it means that we can't call methods on it, like getName(). Because it's not an actual user object. And certainly not the one hidden away in UserService:

<?php
class UserService {
function createUserByName($name)
$user = new User;
$user->setName($name);
$user->save();
}
}

So that's not really encouraging: sample code should work. However I had a breeze through the AspectMock source code, and other than the typos and that one brain fart, the code should work. But it didn't. No mocking was happening. Here's my version on that code:

<?php
// User.php

class User {
private $name;

function __construct(){
echo "User->__construct() called\n";
}

function setName($name){
echo "User->setName() called\n";
$this->name = $name;
}

function getName(){
echo "User->getName() called\n";
return $this->name;
}

function save(){
echo "User->save() called (WE DO NOT WANT TO SEE THIS)\n";
}
}

<?php
// UserService.php

class UserService {
function createUserByName($name) {
echo "UserService->createUserByName() called\n";

$user = new User();
$user->setName($name);
$user->save();

return $user;
}
}

<?php
// UserServiceTest.php

use AspectMock\Test as test;

class UserTest extends \PHPUnit_Framework_TestCase
{
protected function tearDown()
{
test::clean(); // remove all registered test doubles
}

function testUserCreate()
{
$userProxy = test::double('User', ['save' => function(){
echo "MOCKED User->save() called\n";
}]);
$service = new UserService;
$user = $service->createUserByName('Zachary');

$this->assertEquals('Zachary', $user->getName());
$userProxy->verifyInvoked('save');
}

}

The key thing here is that on each method, I'm outputting some telemetry so as to watch what's getting called. Basically UserService creates a User, and calls save() on it (which is completely wrong architecture IMO, but so be it). We have mocked-out the save() call in this test. The theory being that save() would be hitting the DB or something, and we don't want that to happen in our tests.

OK. So now I run it:

C:\php\www\experiment\phpunit\aspectMock>phpunit --bootstrap aspectMock
Autoload.php test\UserServiceTest.php
PHPUnit 3.7.22 by Sebastian Bergmann.

Configuration read from C:\php\www\experiment\phpunit\aspectMock\phpunit.xml

FUserService->createUserByName() called
User->__construct() called
User->setName() called
User->save() called (WE DO NOT WANT TO SEE THIS)
User->getName() called


Time: 0 seconds, Memory: 3.50Mb

There was 1 failure:

1) UserTest::testUserCreate
Expected User->save to be invoked but it never occur.

C:\php\www\experiment\phpunit\vendor\codeception\aspect-mock\src\AspectMock\Proxy\Verifier.php:64
C:\php\www\experiment\phpunit\aspectMock\test\UserServiceTest.php:22

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

C:\php\www\experiment\phpunit\aspectMock>

Dammit.

And this is where I'd got too all the time I was trying to get this bloody thing to work. I had actually concluded AspectMock didn't actually work. Usually I try to blame me when things don't work, but I'd spent a coupla days on this, and similarly Duncan, and we had got to the same point. And I haven't found much usage of AspectMock out there, so could find no proof of people using it.

But this afternoon I read the docs more closely.

Me: fail

I found this in the "Customization" section of the readme.md file:

includePaths directories with files that should be enhanced by Go Aop. Should point to your applications source files as well as framework files and any libraries you use..
excludePaths a paths in which PHP files should not be affected by aspects. You should exclude your tests files from interception.
Their emphasis.

And just down from that (and this is all in bold):

It's pretty important to configure AspectMock properly. Otherwise it may not work as expected or you get side effects. Please make sure you included all files that you need to mock, but your test files as well as testing frameworks are excluded.

You know what I had been doing? As I was just messing around, I had all my files in the same dir. TBH, why the hell shouldn't I? AspectMock should be leaving everything the hell along, except for what I tell it to monkey with. But seemingly no. Hmmm... this is OK though, as it will be how our files are organised anyhow. I just wish it hadn't mattered. Or that I noticed this a few days ago.

Test: pass

So I reorganised my code so that the User.php and UserService.php files where in a /src subdirectory, and UserServiceTest.php was in a /test directory, adjusted my autoload.php file and pointed my includePaths to the right place, and:

C:\php\www\experiment\phpunit\aspectMock>phpunit --bootstrap aspectMock
Autoload.php test\UserServiceTest.php
PHPUnit 3.7.22 by Sebastian Bergmann.

Configuration read from C:\php\www\experiment\phpunit\aspectMock\phpunit.xml

.UserService->createUserByName() called
User->__construct() called
User->setName() called
MOCKED User->save() called
User->getName() called


Time: 0 seconds, Memory: 3.50Mb

OK (1 test, 1 assertion)

C:\php\www\experiment\phpunit\aspectMock>

Yay! It's calling the mocked method!

That's enough of that

And now it's 8pm (I started this all at 4pm), and I want dinner and I've half a bottle of wine staring at me going "well I'm not gonna drink myself?!". And I'm going to Germany tomorrow (CFCamp), so I had better... um... think about deciding what to take with me (I'll not do anything about this until 30min before I need to go to the airport, but I should at least think about it a bit ;-)

Righto.

--
Adam
(Tue, 21 Oct 2014 08:05:36 GMT)
[view article in new window]

A quick look at DI/1
G'day:
I'm at CFCamp at the moment, and one of the better presentations yesterday (out of a lot of good presentations, I might add) was Chris' presentation, "Dependency Injection with DI/1". It looked sufficiently interesting I thought I'd have a quick look-see at it. I have downloaded it in the past, but that's about as far as I had got.

I've been using ColdSpring at work for the last few years, but DI has come a long way since ColdSpring's heyday. So I'm familiar with the concepts of dependency injection, but only ColdSpring's implementation of it.

If you don't know what DI is, go read up on it first otherwise none of this will be very meaningful. I'm not able to get an internet connection at the moment, so I can't find a decent link for you, but I'll try to remember to update this later on. Or, hey, you probably know how Google works.



OK, so DI/1 lives here: https://github.com/framework-one/di1. Installation is simply to clone the repo. Or indeed it's just one file (yeah, one file), so simply grab ioc.cfc and chuck it somewhere. I've put it in /shared/frameworks/di1, and I map it in in Application.cfc:

// Application.cfc
component {
this.name = "di1_1"
this.mappings = {
"/di1" = expandPath("/shared/frameworks/di1")
}
this.applicationTimeout = createTimespan(0,0,0,10)

function onApplicationStart(){
application.beanFactory = new di1.IOC(folders=expandPath("./api"))
}

}

That's all the configuration one needs to do, if one is able to organise one's files the way DI/1 expects them to be.

In my API directory I have a coupla CFCs:

// SomeService.cfc
component {

echo("SomeService pseudoconstructor called<br>")

function init(someDao){
echo("SomeService init() called<br>")
variables.someDao = arguments.someDao
return this
}

function getVariables(){
return variables
}
}

// SomeDao.cfc
component {

echo("SomeDao pseudoconstructor called<br>")

function init(){
echo("SomeDao init() called<br>")
return this
}

}


And if I want a SomeService object, I just have to grab the bean:

//testSimple.cfm

echo("testSimple.cfm, before creating someService<br>")
someService = application.beanFactory.getBean("SomeService")

echo("testSimple.cfm, after creating someService<br>")

dump(var=someService, label="someService")
dump(var=someService.getVariables(), label="someService variables scope")

DI/1 handles the wiring-up of the DAO automatically. Cool.

One thing to be mindful of here is that DI/1 maps the dependencies via the argument name not the argument type. Initially my SomeService.cfc's init()'s method signature was like this:

function init(required SomeDao dao)

To which DI/1's response was:

bean not found: dao; while resolving constructor arguments for SomeService

I'm not sure what to think about that. I s'pose an argument will always have a name specified, but not necessarily a type. However I think the dependency here is that it's a SomeDAO object; not that the method happens to call it someDao.

BTW, the output for the first hit of that code is thus:


testSimple.cfm, before creating someService
SomeDao pseudoconstructor called
SomeService pseudoconstructor called
SomeService pseudoconstructor called
SomeDao pseudoconstructor called
SomeDao init() called
SomeService init() called
testSimple.cfm, after creating someService




someService
Component (shared.scratch.blogExamples.frameworks.di.di1.newapp.api.SomeService) 
Only the functions and data members that are accessible from your location are displayed
public
INITvar.INIT
GETVARIABLESvar.GETVARIABLES
someService variables scope
Variable Scope (of Component)
GETVARIABLESvar.GETVARIABLES
INITvar.INIT
someDao
Component (shared.scratch.blogExamples.frameworks.di.di1.newapp.api.SomeDao) 
Only the functions and data members that are accessible from your location are displayed
public
INIT
Public Function init
source:SomeDao.cfc
arguments
labelnamerequiredtypedefaulthint
return typeany
THISvar.THIS

On second hit, DI/1 has already done all its stuff, so we get this:


testSimple.cfm, before creating someService
testSimple.cfm, after creating someService


So all the dependent bean config & creation happens once on application start-up.

This is all fine if you can implement your code in the way DI/1 wants it to be. But how about if you're working with an existing application which wasn't architected with DI/1 in mind?

I've just knocked together a quick "app" which implements a user login sort of arrangement. There's a bunch of code, but it's all pretty simple. Don't worry about memorising the code... there are notes on the important bits @ the bottom:

// UserService.cfc
component {

public UserService function init(required IUserDAO userDAO, required Logger auditLog){
structAppend(variables, arguments)
return this
}

public User function getUserById(required numeric id){
var userRecord = userDAO.getUserById(id)
if (userRecord.recordCount){
var user = new User()
setFromRecord(user, userRecord)
return user
}else{
throw(type="InvalidUserException", message="User does not exist", detail="No user with ID #id# was found")
}
}

public boolean function authenticate(required string loginId, required string password){
var userRecord = userDAO.getUserByLogin(loginId, password)
if (userRecord.recordCount){
setFromRecord(user, userRecord)
return true
}else{
auditLog.logEntry("Login attempt failed for user #loginId#, pwd #password#")
return false
}

}

private void function setFromRecord(required User user, required query record){
user.setId(record.id)
user.setFirstName(record.firstname)
user.setLastName(record.lastName)
user.setLoginId(record.loginId)
}

}


// IUserDao.cfc
interface {

public query function getUserById(required numeric id);
public query function getUserByLogin(required string loginId, required string password);

}


// MockedUserDAO.cfc
component implements="IUserDAO" {

records = queryNew(
"id,firstName,lastName,loginId,password",
"integer,varchar,varchar,varchar,varchar",
[
[1, "Zinzan", "Brooke", "number", "eight"],
[2, "Daniel", "Vettori", "leftarm", "spin"]
]
)

public MockedUserDAO function init(required Logger transactionLog){
structAppend(variables, arguments)
return this
}

public query function getUserById(required numeric id){
transactionLog.logEntry("getUserById(#id#) called")
return queryExecute("SELECT * FROM records WHERE id = :id", {id=id}, {dbtype="query", records=records})
}

public query function getUserByLogin(required string loginId, required string password){
transactionLog.logEntry("getUserByLogin('#loginId#', 'REDACTED') called")
return queryExecute("SELECT * FROM records WHERE loginId = :loginId AND password = :password", {loginId=loginId,password=password}, {dbtype="query", records=records})
}

}


// Logger.cfc
interface {
public void function logEntry(required string text, string severity);
}


// TransactionLog.cfc
component implements="Logger" {

public TransactionLog function init(required string logFile){
structAppend(variables, arguments)
return this
}

public void function logEntry(required string text, string severity="information"){
writeLog(file=logFile, text=text, type=severity)
}

}


// AuditLog.cfc
component implements="Logger" {

public AuditLog function init(required string logFile, required Encrypter encrypter){
structAppend(variables, arguments)
return this
}

public void function logEntry(required string text, string severity="warning"){
writeLog(file=logFile, text=encrypter.encrypt(text), type=severity)
}

}


// Encrypter.cfc
interface {
public string function encrypt(required string string);
public string function decrypt(required string string);
}


// StubEncrypter.cfc
component implements="Encrypter" {

prefix = "ENCRYPTED_"

public string function encrypt(required string string){
return "#prefix##string#"
}
public string function decrypt(required string string){
return reReplace(string, "^#prefix#", "", "ONE")
}

}


// User.cfc
component accessors=true {

property id;
property firstName;
property lastName;
property loginId;
property name="isAuthenticated" default=false;

public User function init() {
return this
}

public function getAsStruct(){
return {
id = id,
firstName = firstName,
lastName = lastName,
loginId = loginId,
isAuthenticated = isAuthenticated
}
}

}


Basically:

  • there's a user service which contains some business logic around getting a user, and authenticating them.
  • It takes a DAO for DB access. Here's a reasonable use of specifying an interface rather than a concrete type: I'm actually not using a real DAO here, I'm using a mock, but it implements the same interface as the service is expecting.
  • The DAO logs its activity.
  • Also the authentication process logs some info if authentication fails, this log encrypts some of the data it.
  • For the hell of it, I'm using a coupla interfaces in there as well (this had more potential relevance before I realised DI/1 does its wiring via argument name, rather than type).


Don't pay too much attention to what the code here is doing and how I'm doing it. That is not the point here. I just chucked some stuff together to implement different edge cases that I wanted to see how to handle with DI/1.

Firstly, here's an example of creating a UserService, and using it:

// testUserServiceManually.cfm

userService = new theapp.users.UserService(
userDAO = new theapp.users.MockedUserDAO(
transactionLog = new theapp.loggers.TransactionLog(logFile="theappTransactionLog")
),
auditLog = new theapp.loggers.AuditLog(
logFile = "theappAuditLog",
encrypter = new theapp.security.StubEncrypter()
)
)



user = userService.getUserById(1)
dump(user.getAsStruct())


That's a bit of a mouthful.

The main stumbling block for DI/1 here is that my argument names don't have a one-to-one mapping to the data types of the arguments. This will be a fairly common thing, I would have thought? But DI/1 cannot infer how to wire all this up, so I need to give it a hand working all this out. It's surprisingly easy:

// Application.cfc
component {
this.name = "di1_1"
this.mappings = {
"/di1" = expandPath("/shared/frameworks/di1"),
"/theapp" = expandPath("./me/adamcameron/theapp")
}
this.applicationTimeout = createTimespan(0,0,0,10)

function onApplicationStart(){
application.beanFactory = new di1.IOC(folders=expandPath("./me/adamcameron/theapp"))
configureDi()
}

private function configureDi(){
application.beanFactory.declareBean("userDAO", "theapp.users.MockedUserDAO")
application.beanFactory.addBean("transactionLog", new theapp.loggers.TransactionLog(logFile="theappTransactionLog"))

application.beanFactory.declareBean("encrypter", "theapp.security.StubEncrypter")
application.beanFactory.declareBean("auditLog", "theapp.loggers.AuditLog", true, {
logFile = "theappAuditLog",
encrypter = application.beanFactory.getBean("encrypter")
})
}

}

And that's it. I'm doing a few different things here:

  • using declareBean() to force the mapping between my userDAO argument and the mocked DAO component
  • using addBean() to actually create the TransactionLog bean. I could have declared it, but I couldn't be bothered having to horse around working out how to get the logFile value into it.
  • demonstrating declaring a bean, then using its reference in a subsequent bean declaration.

So now here's the code using the UserService:

// testUserServiceDI.cfm

userService = application.beanFactory.getBean("UserService")

user = userService.getUserById(1)

loggedIn = userService.authenticate(user.getLoginId(),"INVALID_PASSWORD")

dump([user.getAsStruct(), loggedIn])


And when we run this, we get:

Array
1
Struct
firstName
stringZinzan
id
number1
isAuthenticated
stringfalse
lastName
stringBrooke
loginId
stringnumber
2
booleanfalse

And in the transaction log:

"INFO","qtp1599915876-16","10/21/2014","12:35:26","","getUserById(1) called"
"INFO","qtp1599915876-16","10/21/2014","12:35:26","","getUserByLogin('number', 'REDACTED') called"

And the audit log:

"WARN","qtp1599915876-16","10/21/2014","12:35:26","","ENCRYPTED_Login attempt failed for user number, pwd INVALID_PASSWORD"


There's nothing revolutionary in my experimentation here, but it has demonstrated to me that DI/1 is really pretty easy to use, and it also confirmed that one doesn't need to rely on its "convention over configuration" approach, which is an apprehension I had initially.

Righto... time for lunch.

--
Adam

PS: apologies for the quality of the writing today... I'm a bit under the weather after being out at the CFCamp dinner last night... mixing ouzo and beer for six hours (!) until 1:30am this morning at the local Greek restaurant has left me somewhat "jaded" today.
(Tue, 21 Oct 2014 08:05:36 GMT)
[view article in new window]

CF Camp Notes: Multiply Like Rabbits
Multiply Like Rabbits - Asychronous Processing with ColdFusion and RabbitMQ
Markus Schneebeli

What is a Message Queue?
order a burger at McDonalds
to get a burger you need a cook
burger goes into the out-tray
to be given to the customer

producer -- cook
queue -- out tray
consumer -- the customer

can produce and send to multiple consumers

"exchange" -- the logic of the message queue
maybe the cook has to pick 1 of several trays to put the burger on

Rabbit MQ is a "Message Queue" product

Competitors --

ZeroMQ

ActiveMQ
-- largest # of installations, Apache product, can also store message via JDMC

ApolloMQ
latest release from Apache, different architecture, supports REST and JSON

HornetQ
jBoss implementation of Message Queue, supports JMS standards

just pick the one that matches your requirements

RabbitMQ
talks to any language - java, c++, node.js, .net, python, ruby, etc.
easily configurable
fast
multiple protocols

benefits --
really nice Management UI
open source
plugin system for creating your own logic
active community

the big players w/ RabbitMQ
Facebook - ajax loading system which goes thru message queue for the different "sections" of your FB page

WhatsApp
50 billion messages / day
almost 600,000 messages / second
(if you put that directly into a database, it'd surely blow up.)
2.8 million concurrent connections on the server

Google Suggestions
all the key typing isn't done by a "real request"
it's put into a message queue, and if possible, you get a request back via Message Queue (in milliseconds)


(Tue, 21 Oct 2014 06:27:32 GMT)
[view article in new window]

Creating An Optimized Switch Directive For Use With ngRepeat In AngularJS
Ben Nadel looks at creating a "Switch" directive that is optimized to work with rendering different templates inside an ngRepeat directive in AngularJS....
(Tue, 21 Oct 2014 04:00:14 GMT)
[view article in new window]

Adding a default commit message to TortoiseSVN
I always seem to struggle finding how to do this since I do it so infrequently, so I'm posting this here to save me a few minutes next time I need to do this. It's really a very simple process and provides a nice reminder of what should be included i...
(Mon, 20 Oct 2014 22:00:13 GMT)
[view article in new window]

Running ColdFusion 10 in Distributed Mode
A recent discussion on CF-Talk had a member trying to find instructions for setting up ColdFusion in "Distributed mode" on a CF 11 server. If you have never heard of "distributed mode" you are not alone among CF developers. It's not a common setup... [More]
(Mon, 20 Oct 2014 18:00:08 GMT)
[view article in new window]

ColdFusion Updates
Last week we released security hotfix APSB14-23 for ColdFusion 9, 10 and 11. In addition, ColdFusion 10 Update 14 was released (it includes security hotfix APSB14-23).
(Mon, 20 Oct 2014 18:00:04 GMT)
[view article in new window]

ColdFusion 10 And Java 8
ColdFusion team member Krishna Reddy has posted notes on using ColdFusion 10 support with Java 8 (this is now possible as of CF10 Update 14).
(Mon, 20 Oct 2014 18:00:04 GMT)
[view article in new window]

Win $1000!! ColdFusion 11 Mobile Application Development Contest

ColdFusion 11 provides a single platform to develop, test, and debug mobile applications in one end-to-end workflow leveraging your existing CFML skills.  

The Adobe ColdFusion Team is sponsoring a mobile application contest where the winner will receive a $1000.00 gift card prize.  More details below.  

 

Requirements:

  • The application must be built using the mobile feature set of ColdFusion 11
  • All entries must be received by midnight Pacific Time on December 15th, 2014.
  • All application source code needs to be uploaded to Github
  • Github repo must be public
  • No private submissions will be accepted
  • There is no specific requirement for application functionality
  • All applications need to compile to an android app and be installable
  • To submit your entry, email rakshith@adobe.com with a brief description

Good luck!! 
And please help us spread the word!

 


(Mon, 20 Oct 2014 16:00:07 GMT)
[view article in new window]


© The connection to the COLDFUSIONBLOGGERS's RSS feed has timed out - please try again later. We are sorry for any inconvenience this may have caused.