<div>Thanx, :)</div><div><br></div><div>Meanwhile i was looking at sandbox environments in .NET via AppDomain&#39;s. It is used here <a href="http://www.finalbot.com/" target="_blank">http://www.finalbot.com</a>. From reading their FAQ they battle the exact same issues I do, and solve them by passing them to the player. :( <a href="http://www.finalbot.com/faq.aspx" target="_blank">http://www.finalbot.com/faq.aspx</a></div>



<div><br></div><div>To better understand what I want I have listed my priorities (highest first):</div><div><br></div><div>1) Completely seperate execution of avatar code.</div><div>No limitations on what code can be run. (Infinite loops, division by zero, memory leaks) </div>


<div><br></div><div>Code will be hostile and must support syntax like this without hanging the game (its ok for the avatar to crash as that is the game):</div>
<div><br></div><div>while True:</div><div>   format_harddisk()</div><div>   while sense1==False:</div><div>      action_1=True</div><div><div>      action_2=False</div><div>   while sense2==True:</div><div>      action_1=False</div>

<div>      action_2=True</div><div>   a = 99.0 / 0</div>
</div><div><br></div><div>Note: My goal code-form is actually quite similar to the types of programs you write on the Arduino platform where you basically just write a main loop. (I am ignoring interrupts, even though they could be cool to have available)</div>

<div><br></div><div>2) Fair sharing of memory and CPU cycles.</div><div>3) Ability to communicate with game engine to exchange actions and senses.  </div>
<div>4) Deterministic outcome.</div><div>5) It must be based on a higher level language that can send players into other fields of programming. (Python is my first choice)</div>
<div>6) A prototype must be below  100 hours of development time. () </div><div><br></div><div><br></div><div>So it looks I am on the market for an Abstract machine (<span style="color:rgb(31,73,125);font-size:14.399999618530273px;font-family:Calibri,sans-serif">execution environment</span>). Do you know any implemented in .Net? There seem to be a java one <a href="http://www.ikvm.net/" target="_blank">http://www.ikvm.net/</a>, but its too early to say if it will work for me.</div>



<div><br></div><div>Unless I can prepare the python environment with some hook into settrace as was suggested earlier. I think this wilkl be my next research vector.  </div><div><br></div><div>Alternatively I could build my own Turing machine. But that would miss my target audience by 15+ years. :)</div>

<div><br></div><div>I know my statemachines. I am already using them in the demo as I have cooldown on the firing mechanism and the physics engine sets limitations on how long driving the wheels take. </div><div><br></div>

<div><br></div>
<div><br></div>
<div>Tax</div><div><br></div><div>P.S:</div><div>To give some insight to my setup I have attached the avatar script I am using. The interresting part is kickstarted from SetCode(). </div><div><br></div><div><br></div><div>



using UnityEngine;</div><div>using System.Collections;</div><div>using System.Collections.Generic;</div><div>using System;</div><div>using IronPython;</div><div>using IronPython.Hosting;</div><div>using Microsoft.Scripting;</div>



<div>using Microsoft.Scripting.Hosting;</div><div><br></div><div>using System.Threading;</div><div><br></div><div><br></div><div>public class Tank : MonoBehaviour</div><div>{</div><div><span style="white-space:pre-wrap">        </span>Transform body;</div>



<div><span style="white-space:pre-wrap">        </span>Transform lf, rf, lb, rb;<span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>Transform cannon;</div>
<div><span style="white-space:pre-wrap">        </span>ScriptEngine engine;</div><div><span style="white-space:pre-wrap">        </span>ScriptScope scope;</div><div><span style="white-space:pre-wrap">        </span></div>
<div><span style="white-space:pre-wrap">        </span>Thread PythonThread;</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>string code = &quot;&quot;;</div>
<div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>float right = 0.0f;</div><div><span style="white-space:pre-wrap">        </span>float left = 0.0f;</div>
<div><span style="white-space:pre-wrap">        </span>bool fire = false;</div><div><span style="white-space:pre-wrap">        </span>float fireinterval = 1.0f;</div><div><span style="white-space:pre-wrap">        </span>float lastfire = -1.0f;</div>



<div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>//Senses </div><div><span style="white-space:pre-wrap">        </span>float distance = 100.0f;</div>
<div><span style="white-space:pre-wrap">        </span>Vector3 nearest_enemy = new Vector3();</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>bool destroyme = false;</div>



<div><span style="white-space:pre-wrap">        </span>object result = null;</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>void Awake()</div>
<div><span style="white-space:pre-wrap">        </span>{</div><div><span style="white-space:pre-wrap">                </span>GameManager.Instance.tanks.Add(this);</div><div><span style="white-space:pre-wrap">                </span></div>
<div><span style="white-space:pre-wrap">                </span>body = transform.FindChild(&quot;Body&quot;);</div><div><span style="white-space:pre-wrap">                </span>cannon = transform.FindChild(&quot;Cannon&quot;);</div>
<div><span style="white-space:pre-wrap">                </span>lf = transform.FindChild(&quot;LF&quot;);</div><div><span style="white-space:pre-wrap">                </span>lb = transform.FindChild(&quot;LB&quot;);</div>
<div><span style="white-space:pre-wrap">                </span>rf = transform.FindChild(&quot;RF&quot;);</div><div><span style="white-space:pre-wrap">                </span>rb = transform.FindChild(&quot;RB&quot;);</div>
<div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lf.collider, body.collider);</div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lb.collider, body.collider);</div>



<div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rf.collider, body.collider);</div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rb.collider, body.collider);</div>
<div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(cannon.collider, body.collider);</div><div><span style="white-space:pre-wrap">        </span></div>
<div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rf.collider, rb.collider);</div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lf.collider, lb.collider);</div>
<div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lf.collider, GameObject.Find(&quot;/World/maze1&quot;).collider);</div>
<div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lf.collider, GameObject.Find(&quot;/World/maze2&quot;).collider);</div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lf.collider, GameObject.Find(&quot;/World/maze3&quot;).collider);</div>



<div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lf.collider, GameObject.Find(&quot;/World/maze4&quot;).collider);</div><div><span style="white-space:pre-wrap">                </span></div>
<div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lb.collider, GameObject.Find(&quot;/World/maze1&quot;).collider);</div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lb.collider, GameObject.Find(&quot;/World/maze2&quot;).collider);</div>



<div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lb.collider, GameObject.Find(&quot;/World/maze3&quot;).collider);</div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(lb.collider, GameObject.Find(&quot;/World/maze4&quot;).collider);</div>



<div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rf.collider, GameObject.Find(&quot;/World/maze1&quot;).collider);</div>
<div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rf.collider, GameObject.Find(&quot;/World/maze2&quot;).collider);</div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rf.collider, GameObject.Find(&quot;/World/maze3&quot;).collider);</div>



<div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rf.collider, GameObject.Find(&quot;/World/maze4&quot;).collider);</div><div><span style="white-space:pre-wrap">                </span></div>
<div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rb.collider, GameObject.Find(&quot;/World/maze1&quot;).collider);</div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rb.collider, GameObject.Find(&quot;/World/maze2&quot;).collider);</div>



<div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rb.collider, GameObject.Find(&quot;/World/maze3&quot;).collider);</div><div><span style="white-space:pre-wrap">                </span>Physics.IgnoreCollision(rb.collider, GameObject.Find(&quot;/World/maze4&quot;).collider);</div>



<div><span style="white-space:pre-wrap">        </span>}</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">                </span></div><div>
<span style="white-space:pre-wrap">        </span>public void PythonThreadFunction()</div><div>    {</div><div><span style="white-space:pre-wrap">                </span>Dictionary&lt;String,System.Object&gt; options = new Dictionary&lt;string,System.Object&gt;();</div>



<div><span style="white-space:pre-wrap">        </span>    options[&quot;DivisionOptions&quot;] = PythonDivisionOptions.New;</div><div><span style="white-space:pre-wrap">        </span>    engine = Python.CreateEngine(options);</div>
<div><span style="white-space:pre-wrap">        </span>    scope = engine.CreateScope();</div><div><span style="white-space:pre-wrap">        </span>    ScriptSource source = engine.CreateScriptSourceFromString(code, SourceCodeKind.Statements);</div>



<div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>//Set senses</div><div><span style="white-space:pre-wrap">                </span>scope.SetVariable(&quot;distance&quot;, distance);</div>



<div><span style="white-space:pre-wrap">                </span>float f = nearest_enemy.x;</div><div><span style="white-space:pre-wrap">                </span>scope.SetVariable(&quot;nex&quot;, (double)f);</div><div>
<span style="white-space:pre-wrap">                </span>f = nearest_enemy.y;</div><div><span style="white-space:pre-wrap">                </span>scope.SetVariable(&quot;ney&quot;, (double)f);</div><div><span style="white-space:pre-wrap">                </span>f = nearest_enemy.z;</div>



<div><span style="white-space:pre-wrap">                </span>scope.SetVariable(&quot;nez&quot;, (double)f);</div><div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>//Also declare action variables</div>



<div><span style="white-space:pre-wrap">                </span>scope.SetVariable(&quot;left&quot;, left);</div><div><span style="white-space:pre-wrap">                </span>scope.SetVariable(&quot;right&quot;, right);</div>
<div><span style="white-space:pre-wrap">                </span>scope.SetVariable(&quot;fire&quot;, fire);</div><div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>try{</div>
<div><span style="white-space:pre-wrap">                    //Wish I had a source.Execute(scope, [number of IL instructions to execute])        </span></div><div>                    result = source.Execute(scope);</div><div><span style="white-space:pre-wrap">                </span>}</div>


<div><span style="white-space:pre-wrap">                </span>catch (Exception e)</div>
<div><span style="white-space:pre-wrap">                </span>{</div><div><span style="white-space:pre-wrap">                        </span>Debug.Log (&quot;Execution error&quot; + e.ToString());<span style="white-space:pre-wrap">        </span></div>
<div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">                </span>destroyme = true;</div><div>    }</div><div><span style="white-space:pre-wrap">        </span></div>
<div><span style="white-space:pre-wrap">        </span>public void SetCode(string c)</div><div><span style="white-space:pre-wrap">        </span>{</div><div><span style="white-space:pre-wrap">                </span>code = c;</div>
<div><span style="white-space:pre-wrap">                </span>PythonThread = new Thread(new ThreadStart(PythonThreadFunction));</div><div><span style="white-space:pre-wrap">                </span>PythonThread.IsBackground = true;</div>
<div><span style="white-space:pre-wrap">                </span>PythonThread.Priority = System.Threading.ThreadPriority.Lowest;</div><div>        PythonThread.Start();</div><div><span style="white-space:pre-wrap">        </span>}</div>
<div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>// Update is called once per frame</div><div><span style="white-space:pre-wrap">        </span>void Update ()</div>
<div><span style="white-space:pre-wrap">        </span>{</div><div><span style="white-space:pre-wrap">                </span>JointMotor jm = new JointMotor();</div><div><span style="white-space:pre-wrap">                </span>jm.force = 100;</div>
<div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>//Probe senses</div><div><span style="white-space:pre-wrap">                </span>RaycastHit hit = new RaycastHit();</div>
<div><span style="white-space:pre-wrap">                </span>if(Physics.Raycast(new Ray(body.position, body.rotation * Vector3.forward), out hit, 100.0f))</div><div><span style="white-space:pre-wrap">                </span>{</div>
<div><span style="white-space:pre-wrap">                        </span>distance = hit.distance;<span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">                </span>}</div>
<div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>nearest_enemy = body.position;</div><div><span style="white-space:pre-wrap">                </span>foreach(Tank t in GameManager.Instance.tanks)</div>



<div><span style="white-space:pre-wrap">                </span>{</div><div><span style="white-space:pre-wrap">                        </span>if(t != this)</div><div><span style="white-space:pre-wrap">                        </span>{</div>
<div><span style="white-space:pre-wrap">                                </span>if(nearest_enemy == body.position || (t.body.position - body.position).magnitude &lt; (nearest_enemy - body.position).magnitude)</div><div><span style="white-space:pre-wrap">                                </span>{</div>



<div><span style="white-space:pre-wrap">                                        </span>nearest_enemy = t.body.position;</div><div><span style="white-space:pre-wrap">                                </span>}</div><div><span style="white-space:pre-wrap">                        </span>}</div>
<div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">                </span>nearest_enemy = body.InverseTransformPoint(nearest_enemy);</div><div><span style="white-space:pre-wrap">                </span></div>



<div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>//Fetch output </div><div><span style="white-space:pre-wrap">                </span>if(code != &quot;&quot;)</div>
<div><span style="white-space:pre-wrap">                </span>{</div><div><span style="white-space:pre-wrap">                        </span>try{left = Mathf.Clamp(scope.GetVariable&lt;float&gt;(&quot;left&quot;), -1.0f, 1.0f);}catch{left = 0.0f;}</div>
<div><span style="white-space:pre-wrap">                        </span>try{right = Mathf.Clamp(scope.GetVariable&lt;float&gt;(&quot;right&quot;), -1.0f, 1.0f);}catch{right = 0.0f;}</div><div><span style="white-space:pre-wrap">                        </span>try{fire = scope.GetVariable&lt;bool&gt;(&quot;fire&quot;);}catch{fire = false;}</div>



<div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>jm.targetVelocity = right * 400.0f; //rs * s;</div>
<div><span style="white-space:pre-wrap">                </span>rf.hingeJoint.motor = jm;</div><div><span style="white-space:pre-wrap">                </span>rb.hingeJoint.motor = jm;</div><div><span style="white-space:pre-wrap">                </span></div>
<div><span style="white-space:pre-wrap">                </span>jm.targetVelocity = left * 400.0f; //ls * s;</div><div><span style="white-space:pre-wrap">                </span>lf.hingeJoint.motor = jm;</div><div><span style="white-space:pre-wrap">                </span>lb.hingeJoint.motor = jm;</div>



<div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>if(Input.GetKeyDown(KeyCode.Space))</div><div><span style="white-space:pre-wrap">                </span>{</div>
<div><span style="white-space:pre-wrap">                        </span>fire = true;</div><div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">                </span></div>
<div><span style="white-space:pre-wrap">                </span>//Tick</div><div><span style="white-space:pre-wrap">                </span>if(fire &amp;&amp; Time.time &gt; lastfire + fireinterval)</div><div><span style="white-space:pre-wrap">                </span>{</div>



<div><span style="white-space:pre-wrap">                        </span>lastfire = Time.time;</div><div><span style="white-space:pre-wrap">                        </span>fire = false;</div><div><span style="white-space:pre-wrap">                        </span>float force = 10.0f;</div>



<div><span style="white-space:pre-wrap">                        </span>GameObject go = (GameObject)GameObject.Instantiate((GameObject)Resources.Load(&quot;prefabs/Projectile&quot;), cannon.position + cannon.rotation* (Vector3.up * 0.055f +  Vector3.forward * 0.4f), cannon.rotation);</div>



<div><span style="white-space:pre-wrap">                        </span>go.rigidbody.AddForce(cannon.rotation * Vector3.forward * force, ForceMode.Impulse);</div><div><span style="white-space:pre-wrap">                        </span>cannon.rigidbody.AddForce(cannon.rotation * Vector3.forward * -force, ForceMode.Impulse);</div>



<div><span style="white-space:pre-wrap">                        </span>Physics.IgnoreCollision(go.collider, cannon.collider);</div><div><span style="white-space:pre-wrap">                        </span>Physics.IgnoreCollision(go.collider, body.collider);</div>
<div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap">                </span>if(destroyme)</div>
<div><span style="white-space:pre-wrap">                </span>{</div><div><span style="white-space:pre-wrap">                        </span>Destroy(transform.gameObject);</div><div><span style="white-space:pre-wrap">                </span>}</div>
<div><span style="white-space:pre-wrap">        </span>}</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>public void hit()</div>
<div><span style="white-space:pre-wrap">        </span>{</div><div><span style="white-space:pre-wrap">                </span>Destroy (transform.gameObject);</div><div><span style="white-space:pre-wrap">        </span>}</div>
<div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>void OnGUI()</div><div><span style="white-space:pre-wrap">        </span>{</div>
<div><span style="white-space:pre-wrap">                </span>Vector3 p = Camera.mainCamera.WorldToScreenPoint(body.position);</div><div><span style="white-space:pre-wrap">                </span>GUI.Label(new Rect(p.x,Screen.height - p.y,      100,100), string.Format(&quot;left {0:0.00}&quot;, left));</div>



<div><span style="white-space:pre-wrap">                </span>GUI.Label(new Rect(p.x,Screen.height - p.y + 20, 100,100), string.Format(&quot;right {0:0.00}&quot;, right));</div><div><span style="white-space:pre-wrap">                </span>GUI.Label(new Rect(p.x,Screen.height - p.y + 40, 100,100), string.Format(&quot;distance {0:0.00}&quot;, distance));</div>



<div><span style="white-space:pre-wrap">                </span>GUI.Label(new Rect(p.x,Screen.height - p.y + 60, 100,100), string.Format(&quot;nearest_enemy {0:0.00} {1:0.00} {2:0.00} &quot;, nearest_enemy.x, nearest_enemy.y, nearest_enemy.z));</div>



<div><span style="white-space:pre-wrap">        </span>}</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>void OnDestroy()</div>
<div><span style="white-space:pre-wrap">        </span>{</div><div><span style="white-space:pre-wrap">                </span>GameManager.Instance.tanks.Remove(this);</div><div><span style="white-space:pre-wrap">                </span></div>
<div><span style="white-space:pre-wrap">                </span>if(PythonThread != null)</div><div><span style="white-space:pre-wrap">                </span>{</div><div><span style="white-space:pre-wrap">                        </span>PythonThread.Abort();</div>
<div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">        </span>}</div><div>}</div><div><br></div><br><div class="gmail_quote">2012/7/24 Keith Rome <span dir="ltr">&lt;<a href="mailto:rome@wintellect.com" target="_blank">rome@wintellect.com</a>&gt;</span><br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">That is a pretty cool demo already
</span><span style="font-size:11.0pt;font-family:Wingdings;color:#1f497d">J</span><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">The term “abstract machine” used by PAWN on that page you have linked is a reference to the execution environment of that language. The “abstract machine” (more
 often referred to as a “virtual machine”) in that sense is roughly equivalent to the .NET Runtime. You can also view the IronPython engine similarly as a virtual machine – think of it as a runtime within a runtime.<u></u><u></u></span></p>




<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">What you have described as “ticks” of the AI runtime sounds roughly equivalent to what I described as “turns”. Either way, the idea is to break up actions into
 a series of discrete steps, each step with an associated unit of cost. For example, the “shoot” action might have a cost of 5, which means it can only be activated once every 5 turns (or ticks).<u></u><u></u></span></p>




<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">I am pretty sure that this is what Kevin is referring to when he says “state machine”:
</span><a href="http://en.wikipedia.org/wiki/Finite-state_machine" target="_blank">http://en.wikipedia.org/wiki/Finite-state_machine</a>.
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">It can be a little confusing because these are also sometimes called “abstract machines” – but these are an entirely unrelated concept from the virtual machine environment I describe
 above.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Essentially, a state machine is a way to describe the various viable “states” something can be in, and the allowable transitions that can occur to move from
 one state to another. For example, your robots could have states for rotation speed of each wheel that can only be changed by 0.1 at a time, up to a maximum speed of
</span><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">±</span><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">1.0. Or, your robots might have a “gun cooldown” state that lasts for 5 turns/ticks,
 and the “shoot” action is only usable while not in a “gun cooldown” state (and using the “shoot” action will trigger the 5-turn “gun cooldown”). And you can imagine numerous additional mechanics that build on the general principle… but the main idea is that
 you have one model (the “state machine”) that ensures that the AI must adhere to the rules of your game. In other words, making sure a robot is not able to “shoot” again until it’s gun cools down.<u></u><u></u></span></p>



<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><b><span style="font-size:14.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Keith Rome<u></u><u></u></span></b></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Senior Consultant and Architect<u></u><u></u></span></b></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">MCPD-EAD, MCSD, MCDBA, MCTS-WPF, MCTS-TFS, MCTS-WSS<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Wintellect | <a href="tel:770.617.4016" value="+17706174016" target="_blank">770.617.4016</a> |
<a href="mailto:rome@wintellect.com" target="_blank">krome@wintellect.com</a><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><a href="http://www.wintellect.com/" target="_blank">www.wintellect.com</a><u></u><u></u></span></p>




<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
</div><p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">From:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> Jesper Taxbřl [mailto:<a href="mailto:jesper@taxboel.dk" target="_blank">jesper@taxboel.dk</a>]
<br>
<b>Sent:</b> Monday, July 23, 2012 6:18 PM<br>
<b>To:</b> Kevin Hazzard<br>
<b>Cc:</b> Keith Rome; <a href="mailto:ironpython-users@python.org" target="_blank">ironpython-users@python.org</a></span></p><div><div><br>
<b>Subject:</b> Re: [Ironpython-users] Gradually executing a python script<u></u><u></u></div></div><p></p><div><div>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">First of all, thank you for your time.  I am not that experienced when it comes to all the terms used in this area of software, so please be patient with me.   <u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">To give you a more clear idea of what I am doing I have posted a video of the current progress here <a href="http://www.youtube.com/watch?v=HER6WSIwSBQ&amp;feature=youtu.be" target="_blank">http://www.youtube.com/watch?v=HER6WSIwSBQ&amp;feature=youtu.be</a> .
 This is a simple gameengine, with a physics based robot. It has simple senes (A vector to the nearest bot and the length of a raycast in front of the robot) and three actions (left_wheel_speed, right_wheel_speed and fire). IronPython is embeeded inside the
 Unity3D game engine which runs on .NET 2.0. I am using the dll version of ironpython in the project. (I could not figure out how to integrate the source into my game project.) <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">The whole prototype was made at  48 hour game jam called &quot;No More Sweden&quot; in Malmö the past weekend. <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">I did not know that the python code is compiled in IronPython before it is executed, and therefore will catch syntax errors before execution. That will be very usefull. :)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I will need to look into the settrace advice, but my gut feeling is that it is not the direction I want to be going in. It might be later during work on the GUI / programming interface. <u></u><u></u></p>




</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I agree that I should have a simple singlethreaded, turn based solution, as that can be made deterministic and its far easier to implement. That is definitely the way I want to go. The threading was only used in the prototype because I
 could not execute my script gradually. I saw the execute command as the only way to have Ironpython run my script, and saw a thread as the only way out. (at 3 am in the morning) <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">The reason I keep mentioning gradually execution requires some backstory: The reference project I have been inspired by is an old game called GunTactyx (<a href="http://www.youtube.com/watch?v=vT8PYETav7A&amp;feature=relmfu" target="_blank">http://www.youtube.com/watch?v=vT8PYETav7A&amp;feature=relmfu</a>),
 where you program robots to hunt down other robots. It uses an old version of the PAWN Language/abstract machine (<a href="http://www.compuphase.com/pawn/pawn.htm" target="_blank">http://www.compuphase.com/pawn/pawn.htm</a>). As far as I understand each robot there has an
 isolated abstract machine with limited memory and it is ticked gradually, like you control the clock on its CPU. If a robot crashes, has an infinite loop or a memory leak it does not affect the cpu in the other robots. The reason I am not using PAWN is that
 it is C++ based and my target platform runs .NET 2.0. Besides that I prefer Python over the PAWN language.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Kevin: When you say statemachine, I imagined Ironpython had something of that sort inside its belly? That might be where I am wrong. Is a statemachine and an abstract machine the same thing in this context?<u></u><u></u></p>




</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">With regard to the dostuff() functions, I dont mind the robots firing many instructions at a time. I just need to be able to let the robots run the same number of &quot;ticks&quot; between each game cycle. I imagine assigning a tick cost to the dostuff()
 functions, as they probably will do stuff inside the game world. <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I have been looking at other solutions to allow me to make a programming game. During the 48 hours I briefly used the AluminumLua project which I was able to tick, but it lacked debelopment on the language side. (for loops was not implemented)
 I would prefer to stick to Pythoon as I love the language and I feel it contains the elements needed to write an interristing AI. <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I need to read up on the IronPython  system and have therefore just ordered &quot;Ironpython in action&quot; book, I hope it will give me a better understanding. Other recommendations are welcome.<u></u><u></u></p>




</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Kind regards and thank you again for your feedback.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Tax<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">  <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">2012/7/23 Kevin Hazzard &lt;<a href="mailto:wkhazzard@gmail.com" target="_blank">wkhazzard@gmail.com</a>&gt;<u></u><u></u></p>
<div>
<p class="MsoNormal">What you&#39;re describing is a state machine. There are many ways to build such a thing and honestly, I&#39;ve never thought of single-stepping through code as a way to do that. It&#39;s actually quite an intriguing idea, if not inefficient. But efficiency
 isn&#39;t always measured with elegance (and vice versa). Keith&#39;s settrace idea is good, too. You should check that out.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">What it really comes down to is this: do you want the controller to also define the code or merely to drive it? For the example you posted, do you want the while loops implemented in Python to execute your dostuff() and dootherstuff() methods?
 Or do you want the controller that authorizes a &quot;step&quot; to do that? In that context, you could write the controller in Python, too, but the design of your code would look very different than what you proposed.<u></u><u></u></p>




</div>
<div>
<p class="MsoNormal"><span style="color:#888888"> <u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span style="color:#888888">Kevin<u></u><u></u></span></p>
</div>
<div>
<div>
<div>
<p class="MsoNormal">On Mon, Jul 23, 2012 at 1:48 PM, Jesper Taxbřl &lt;<a href="mailto:jesper@taxboel.dk" target="_blank">jesper@taxboel.dk</a>&gt; wrote:<u></u><u></u></p>
<p class="MsoNormal">The reason I want to do it gradually is that I cant be sure that the script ever terminates or has syntax errors. Would that not be a problem in a turn based setup?
<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p>
<div>
<p class="MsoNormal">2012/7/23 Keith Rome &lt;<a href="mailto:rome@wintellect.com" target="_blank">rome@wintellect.com</a>&gt;<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">You may want to look into leveraging the sys.settrace() feature of Python for controlling line-by-line
 execution. This API allows you to install a profiling function that gets invoked for every frame of script code that is executed. In your profiling function, you could compute the amount of memory being used by variables within the ScriptScope, and halt execution
 if you need to. Just be careful about what you do in your profiling function, as it will be called extremely often by the runtime.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><a href="http://docs.python.org/library/sys.html#sys.settrace" target="_blank">http://docs.python.org/library/sys.html#sys.settrace</a><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">The reason you are seeing variant results is probably due to how you have implemented multithreading.
 The IronPython runtime is mostly thread-safe (as long as you don’t use libraries that make use of mutable objects, and as long as you import all libraries used at least once prior to forking threads). But your code must also be thread-safe as well. From your
 descriptions of your game engine, it sounds like your game engine is not designed to be thread-safe so I would strongly recommend avoiding multithreading as a means of providing resource sharing. It is very difficult to write 100% thread-safe code, and nothing
 will stop people from writing unsafe scripts in your game.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Instead, I would suggest implementing your game engine as a turn-based system. For each turn, the
 script for each character is executed completely. This will allow you to cycle through all characters one turn at a time, equally, and will also eliminate the problem of having variant outcomes since the program will become deterministic.</span><u></u><u></u></p>




<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><b><span style="font-size:14.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Keith Rome</span></b><u></u><u></u></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Senior Consultant and Architect</span></b><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">MCPD-EAD, MCSD, MCDBA, MCTS-WPF, MCTS-TFS, MCTS-WSS</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Wintellect |
<a href="tel:770.617.4016" target="_blank">770.617.4016</a> | <a href="mailto:rome@wintellect.com" target="_blank">
krome@wintellect.com</a></span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><a href="http://www.wintellect.com/" target="_blank">www.wintellect.com</a></span><u></u><u></u></p>




<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">From:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> ironpython-users-bounces+rome=<a href="mailto:wintellect.com@python.org" target="_blank">wintellect.com@python.org</a>
 [mailto:<a href="mailto:ironpython-users-bounces%2Brome" target="_blank">ironpython-users-bounces+rome</a>=<a href="mailto:wintellect.com@python.org" target="_blank">wintellect.com@python.org</a>]
<b>On Behalf Of </b>Jesper Taxbřl<br>
<b>Sent:</b> Monday, July 23, 2012 11:05 AM<br>
<b>To:</b> Kevin Hazzard<br>
<b>Cc:</b> <a href="mailto:ironpython-users@python.org" target="_blank">ironpython-users@python.org</a><br>
<b>Subject:</b> Re: [Ironpython-users] Gradually executing a python script</span><u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Would that allow me to step gradually through a loop?<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">like:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">x = 0<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">while x &lt; 10:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">   dostuff()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">   x=x+1<u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">while x &gt; 0:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">   dootherstuff()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">   x=x-1<u></u><u></u></p>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"> <u></u><u></u></p>
<div>
<p class="MsoNormal">2012/7/23 Kevin Hazzard &lt;<a href="mailto:wkhazzard@gmail.com" target="_blank">wkhazzard@gmail.com</a>&gt;<u></u><u></u></p>
<div>
<p class="MsoNormal">Why don&#39;t you use a scripting host and inject commands into a ScriptEngine reusing a ScriptScope as you need to execute them?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">Kevin<u></u><u></u></p>
</div>
<div>
<div>
<div>
<p class="MsoNormal">On Mon, Jul 23, 2012 at 5:31 AM, Jesper Taxbřl &lt;<a href="mailto:jesper@taxboel.dk" target="_blank">jesper@taxboel.dk</a>&gt; wrote:<u></u><u></u></p>
</div>
</div>
<blockquote style="border:none;border-left:solid windowtext 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt;border-color:currentColor currentColor currentColor rgb(204,204,204)">




<div>
<div>
<p class="MsoNormal"><span style="color:#222222">Hi,</span><u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">I am not that familiar with Ironpython yet, but I have a question that I hope you can help me answer.</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">I am working on a programming-game where I will allow users to do some simple python scripting against a simple API that I will control a game character.
 Instructions like move and shoot etc, alongside some simple sense functions that return info on the game world. </span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">My current prototype creates an ironpython engine for each game character and executes the script in a thread by itself, which sort of works. But I have
 the problem that the outcome of executing the game gives different results every time. Therefore I would like to ask the question:</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">Is it possible to execute a script inside the Ironpython engine gradually?</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">I imagine that I could update a list of engines with a tick(int cycles) and get a fair sharing of resources between engines and ensure the same result
 every time.</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">Kind regards </span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">Tax</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">P.S:</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">As this is a programming game I would also like to be able to limit the available memory each script is using. Is there a way to limit this, so a script
 like this would be killed.</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">x = 0</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">v = {}</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">while True:</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">   v[x]=x</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="color:#222222">   x= x + 1</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt">_______________________________________________<br>
Ironpython-users mailing list<br>
<a href="mailto:Ironpython-users@python.org" target="_blank">Ironpython-users@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/ironpython-users" target="_blank">http://mail.python.org/mailman/listinfo/ironpython-users</a><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal"><span style="color:#888888"><br>
<br clear="all">
<br>
-- <br>
</span><b><span style="font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#888888">W. Kevin Hazzard</span></b><u></u><u></u></p>
<div>
<p class="MsoNormal"><span style="font-size:8.0pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#888888">Consultant, Author, Teacher, Microsoft MVP</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:8.0pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#888888"><a href="tel:%28804%29%20928-3444" target="_blank">(804) 928-3444</a></span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:8.0pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#888888"><a href="http://manning.com/hazzard" target="_blank">book</a> |
<a href="https://mvp.support.microsoft.com/profile/Kevin.Hazzard" target="_blank">
mvp</a> | <a href="http://twitter.com/#%21/KevinHazzard" target="_blank">twitter</a> |
<a href="http://www.facebook.com/wkhazzard" target="_blank">facebook</a> | <a href="http://www.linkedin.com/in/kevinhazzard" target="_blank">
linkedin</a> | <a href="http://captechconsulting.com" target="_blank">captech</a></span><u></u><u></u></p>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
<p class="MsoNormal"><br>
<br clear="all">
<br>
-- <br>
<strong><span style="font-family:&quot;Garamond&quot;,&quot;serif&quot;">W. Kevin Hazzard</span></strong><u></u><u></u></p>
<div>
<p class="MsoNormal"><span style="font-size:8.0pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;">Consultant, Author, Teacher, Microsoft MVP</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:8.0pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;"><a href="tel:%28804%29%20928-3444" target="_blank">(804) 928-3444</a></span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:8.0pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;"><a href="http://manning.com/hazzard" target="_blank">book</a> |
<a href="https://mvp.support.microsoft.com/profile/Kevin.Hazzard" target="_blank">
mvp</a> | <a href="http://twitter.com/#!/KevinHazzard" target="_blank">twitter</a> |
<a href="http://www.facebook.com/wkhazzard" target="_blank">facebook</a> | <a href="http://www.linkedin.com/in/kevinhazzard" target="_blank">
linkedin</a> | <a href="http://captechconsulting.com" target="_blank">captech</a></span><u></u><u></u></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div></div></div>
</div>

</blockquote></div><br>