Flash Communication Server MX ktowes@ PangaeaNewMedia.ca - - PDF document

flash communication server mx
SMART_READER_LITE
LIVE PREVIEW

Flash Communication Server MX ktowes@ PangaeaNewMedia.ca - - PDF document

Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca Kevin Towes Flash Communication Server MX ktowes@ PangaeaNewMedia.ca Collaborative Data Management with Ke vin Towe s What we're going to cover


slide-1
SLIDE 1

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Name Please! Kevin Towes

kevsLaptop/ FITOPres/ mainInst

FCS Server:

What we're going to cover

> The Flash Communication Server - Intro

  • The Technology Model

> Demo the Project Proxy > Demo the Secure Ticketing >> Shared Object Primer << > Demo the Collaborative Application

Flash Communication Server MX

with Ke vin Towe s

Collaborative Data Management

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Authorized Macromedia Trainer / Reseller / Consultants If you are interested in Formal Training in the Flash Communication Server MX Give me your Biz Card and see me after the presentation

www.newYYZ.com

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

CODE SAM PLES THIS PRESENTATION ARTICLES AND MORE...

MXRocks03@ kevinTowes.ca

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

  • Collabor

ative Applications (i.e. Messenger

s, Gaming)

  • Medi

a Str eami ng Ser ver

(i .e. Real Audi

  • , Qui

ckti me, W i ndows Medi a)

  • Power

ful Syncr

  • ni

zati

  • n Technology

Examples...

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

http://www.di gi talsamba.com/

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

http://www.tekni si

  • n.com/

What is Flash Communication Server?

slide-2
SLIDE 2

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

http://www.1 0 plus1 .com/

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

http://fultonny.da.r u/

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

http://faces.bascule.co.jp/yeti/

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

http://www.r andommedi a.co.uk/

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

http://echo.r yer son.ca/

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Video content is provided by Reuters, the Associated Press, AccuWeather.com, and Yahoo!'s entertainment properties, including movie trailers and celebrity interviews from Yahoo!

http://sbc.yahoo.com/

What is Flash Communication Server?

slide-3
SLIDE 3

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

ur l not available

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

S i m p l y P u t . . .

F l a s h C

  • m

i s a s e r v e r t e c h n

  • l
  • g

y t h a t c

  • n

n e c t s M u l t i p l e F l a s h P l a y e r s t

  • g

e t h e r .

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

F la sh 6 P la yer

a

b

F la sh 6 P la yer

MAC OS

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Flash 6 Player

MAC OS

Flash 6 Player Flash 6 Player Flash 6 Player Flash 6 Player Flash 6 Player Flash 6 Player Flash 6 Player Flash 6 Player Flash 6 Player Flash 6 Player Flash 6 Player Flash 6 Player

What is Flash Communication Server?

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Web Server (IIS)

.swf .html main.asc Development Server Your User

the Basic FlashCom Model

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Web Server (IIS)

.swf .html main.asc .cfc / .cfm Development Server Your User

Extending FlashCom with Flash Remoting

slide-4
SLIDE 4

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

W eb Ser ver s use HTTP to communicate Fl ashCom uses RTMP to communi cate HTTP is a non-per sistent connecti

  • n

RTMP mai ntai ns a per sistent connection with all Flash Player s Flash Remoti ng uses HTTP

Web Server (IIS)

Server

Flash Remoting VS. FlashCom Server

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Flash Remoting withOUT FlashCom

1 2 3 4 5 6

Web Server (IIS)

1 . Fl ashPl ayer (i n Br

  • wser

) calls Remoti ng usi ng HTTP(S)

  • 2. WebSer

ver r

  • utes r

equest to Col dFusi

  • n

(CFC)

  • 3. Col

dFusi

  • n

quer i es the Database

  • 4. Database r

etur n Data to Col dFusi

  • n
  • 5. Col

dFusi

  • n

par ses and sends to W ebser ver

  • 6. WebSer

ver sends the Results to Fl ashPl ayer

  • HTTP(S)

Understanding Flash Remoting

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Flash Remoting withOUT FlashCom

1 2 3 4 5 6

Web Server (IIS)

NO DIFFERENCE!

Understanding Flash Remoting

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

show e xample ...

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

1

Connection

2Str

eami ng

4

I nfor mation Objects

3

Shar edObject

NetConnection LocalConnection (no n-Flas hCo m) NetStream Remote SharedObject Local SharedObject (Flash Co o kie s) Communicating Changes between Flash Players and the FlashCom Server

The Basic Principles of FlashCom Applications

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

1

Pr

  • ject Pr
  • xy

2Secur

e Ti cki ng

3

Per si stent Data using Re mo te and Lo c al Co nne c tio ns to c o ntro l Flash widge ts o n a single page using Flash Re mo ting, Flash Co mm and Co ldFusio n to se c ure ac c e ss using Flash Re mo ting, Flash Co mm and the Re mo te Share dObje c t mo de l

Lets look at some examples:

slide-5
SLIDE 5

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

show website

1

Pr

  • ject Pr
  • xy

using Re mo te and Lo c al Co nne c tio ns to c o ntro l Flash widge ts o n a single page

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

my_lc.connect("liveVideo"); my_lc.connect("ImageCycler"); my_lc.connect("KTHeader");

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

my_lc.lc_initialize = function(info_str) { _root.message_txt.text = info_str; }; my_lc.lc_getURL = function(url_str) { message_txt.text = "You've been sent to: "+url_str; getURL(url_str, "_blank"); }; my_lc.lc_resetBrowser = function() { getURL("index.cfm"); }; my_lc.lc_openQuestion = function(question_str) { _root.attachMovie("question", "question_mc", 0 ); question_mc["_x"] = 20 5 ; question_mc["_y"] = 0 ; _root.question_mc.question_txt.text = question_str; };

my_lc = new LocalConnection(); my_lc.connect("KTHeader");

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

S haredObject.prototype.proxyS end = function(consumer , method, arg1, arg2 ) { my_lc.send(consumer , method, arg1, arg2 , arg3 ); }; myConnection_nc = new NetConnection(); myConnection_nc.connect(" rtmp:/ kevsS ite/ myInstance" , " S iteUser" ); my_lc = new LocalConnection(); my_lc.connect(" liveVideo" ); Connect to the Flash Comm S erver Establish a Local Connection with other Flash Objects Create a method that will relay messages from FCS to the Local Flash Objects

1 2 3

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

setText = function () {

my_ so.send("proxySend", "ImageCycler", "lc_ setText", top_ txt.text, "top_ txt"); my_ so.send("proxySend", "ImageCycler", "lc_ setText", mid_ txt.text, "mid_ txt"); my_ so.send("proxySend", "ImageCycler", "lc_ setText", bot_ txt.text, "bot_ txt"); };

  • penSite = function () {

my_ so.send("proxySend", "KTHeader", "lc_ getURL", url_ txt.text); };

setVideoM essage = function () {

my_ so.send("proxySend", "liveVideo", "lc_ setText", vidTop_ txt.text, "top_ txt"); my_ so.send("proxySend", "liveVideo", "lc_ setText", vidMid_ txt.text, "mid_ txt"); my_ so.send("proxySend", "liveVideo", "lc_ setText", vidBot_ txt.text, "bot_ txt"); };

reset = function () {

my_ so.send("proxySend", "KTHeader", "lc_ resetBrowser"); };

sendQuestion = function () {

my_ so.send("proxySend", "KTHeader", "lc_

  • penQuestion", question_

txt.text); };

slide-6
SLIDE 6

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

2Secur

e Ti cki ng using Flash Re mo ting, Flash Co mm and Co ldFusio n to se c ure ac c e ss

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

The Problem....

Sending secure Login infomation to FCS to authenticate a connection request !! RTMP is insecure !!

2Secur

e Ti cki ng using Flash Re mo ting, Flash Co mm and Co ldFusio n to se c ure ac c e ss

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

The Solution...

Flash Player running a FlashCom Application

1. 2. 3. 4. 5. 6.

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

2Secur

e Ti cki ng using Flash Re mo ting, Flash Co mm and Co ldFusio n to se c ure ac c e ss

show Fl ashDemo

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

  • 1. Show Flash AS: (login_init)
  • 2. Show CFC: authenticateUser(); & setTicket()
  • 3. Show Flash AS: requesting a connection

4 . Show SSAS: handling request 5 . Show CFC: findTicket();

slide-7
SLIDE 7

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

3

Per si stent Data using Flash Re mo ting, Flash Co mm and the Re mo te Share dObje c t mo de l

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

3

Per si stent Data using Flash Re mo ting, Flash Co mm and the Re mo te Share dObje c t mo de l

The Problem....

Pushing database updates to the user in real time - and Locking records -

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

3

Per si stent Data using Flash Re mo ting, Flash Co mm and the Re mo te Share dObje c t mo de l

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

SharedObjects have two purposes on the Planet:

1 . Shar e Data & ActionScr ipt Objects between Multiple Flash Player s

  • 2. I

nvoke Functi

  • ns on Remote Flash Player

s

SharedObjects are available in 2 places:

1 . LOCAL Shar edObjects (Flash Cooki es) ar e stor ed on the Cli ent

  • 2. REMOTE Shar

edObjects ar e stor ed on the Ser ver

SharedObject Programming Model

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Flash 6 Player

Local Shar edObject Remote Shar edObject

F l a s h 6 P l a y e r F l a s h 6 P l a y e r F l a s h 6 P l a y e r F l a s h 6 P l a y e r F l a s h 6 P l a y e r F l a s h 6 P l a y e r F l a s h 6 P l a y e r

SharedObject Programming Model

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Si mple Var i ables Objects Ar r ays Ar r ays of Objects Recor dSets Functi

  • ns

What can put inside a SharedObject?

Any ActionScr ipt Object

SharedObject Programming Model

slide-8
SLIDE 8

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Flash 6 Player

Connect Define a Slot Access it

SharedObject Programming ModelRemoteSO

remote_so = SharedObject.getRemote("FI

TO_Sample", my_nc.uri, true);

remote_so.connect(my_nc); remote_so.data["myVar"] = "Kevin W as here"; trace("Data: "+ remote_so.data["myVar"]);

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Now lets move on with the demo...

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Now lets move on with the demo...

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

  • 1. FCS Remote SharedObject
  • 2. SLOTS 10 1
  • 3. Converting a RecordSet into a Slot Stucture

4 . Handling Slot change information objects

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

The FCS SharedObject SLOT

> A Slot is a property of the data Property > Slots are monitored by FCS > W hen a Slot value changes, FCS informs the players > name of the slot that has changed > code value (changed, success, > to set a slot value: my_so.data["property"]=value;

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

result_rs RecordSet Object contact_recordSet_so SharedObject

slide-9
SLIDE 9

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

callTheServer = cf_service.getAl l Recor ds();

/ / * * * handle the server response this.getAllRecords_Result = function(result_rs ) { serverData_so.setProperty("result_rs", result_rs); serverData_so.setProperty("contactDb_columnNames", result_rs.getColumnNames()); for ( item in result_rs.items) {

/ / Test for a Valid record item

isRecord = result_rs.items[item].__ID__ != undefined;

/ / If the record is valid - then copy it into the S haredObject

if (isRecord) {

contact_recordSet_so.setProperty(item, result_rs.items[ item]);

} }

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

createLocalRecordSet = function () {

/ / RecordSet FieldNames fieldNames_array = remote_so.data["contactDb_columnNames"]; / / Local Recordset my_rs = new RecordSet(fieldNames_array); / / Purge the RecordSet my_rs.removeAll(); / / copy the RecordData into a local RecordSet to make it easier to work with for (slot in contact_recordSet_so.data) {

my_rs.addItem(contact_recordSet_so.data[slot]); }

updateList(); };

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

S O_onS ync = function (info) {

slotToChange = info[0 ].name; if (info[0 ].code == " change" ) { var updatedRecord_obj = contact_recordSet_so.getProperty(slotToChange);

// Check the Locki ng Val ue for Status messages

switch (updatedRecord_obj.isLocked) { case " save" :

// change the state of the i sLocked val ue

updatedRecord_obj.isLocked = false;

// wr i t e t he changed r ecor d back t

  • t

he Shar ed Obj ect

contact_recordSet_so.setProperty(slotToChange, updatedRecord_obj);

// the pr

  • per

ti es wi thi n the obj ect contai n the changed r ecor d

cf_service.doUpdate(updatedRecord_obj);

// now update al l pl ayer s

contact_r ecor dSet_so.send("SO_messages", "updateLocal", "Ser ver ");

break;

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

SO_messages = functi

  • n (command, sour

ce) { doSer ver Update = sour ce == "Ser ver "; if (doSer ver Update) { swi tch (command) { case "updateLocal" : cr eateLocalRecor dSet(); } } };

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100

Kevin Towes

ktowes@ PangaeaNewMedia.ca

TRAINING & CONSULTING: www.NewYYZ.com Code Samples & More: www.KevinTowes.ca Code Samples & More: www.KevinTowes.ca

100 / 100