<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Buu Nguyen's Blog</title>
	
	<link>http://www.buunguyen.net/blog</link>
	<description>Coding and Software Development</description>
	<lastBuildDate>Thu, 16 May 2013 01:22:21 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BuuNguyensBlog" /><feedburner:info uri="buunguyensblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>BuuNguyensBlog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>yajc.js</title>
		<link>http://feedproxy.google.com/~r/BuuNguyensBlog/~3/725MxesDKtY/yajc-js.html</link>
		<comments>http://www.buunguyen.net/blog/yajc-js.html#comments</comments>
		<pubDate>Mon, 03 Dec 2012 03:09:02 +0000</pubDate>
		<dc:creator>Buu Nguyen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[yajc.js]]></category>

		<guid isPermaLink="false">http://www.buunguyen.net/blog/?p=752</guid>
		<description><![CDATA[Just released yajc.js, a jQuery carousel.]]></description>
				<content:encoded><![CDATA[<p>Just released <a href="http://buunguyen.github.com/yajc/">yajc.js</a>, a jQuery carousel.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=725MxesDKtY:eJo8nvFpMRw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=725MxesDKtY:eJo8nvFpMRw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=725MxesDKtY:eJo8nvFpMRw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=725MxesDKtY:eJo8nvFpMRw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=725MxesDKtY:eJo8nvFpMRw:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BuuNguyensBlog/~4/725MxesDKtY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.buunguyen.net/blog/yajc-js.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.buunguyen.net/blog/yajc-js.html</feedburner:origLink></item>
		<item>
		<title>Y Combinator Function in Bike</title>
		<link>http://feedproxy.google.com/~r/BuuNguyensBlog/~3/MXVikKTUwlk/y-combinator-function-in-bike.html</link>
		<comments>http://www.buunguyen.net/blog/y-combinator-function-in-bike.html#comments</comments>
		<pubDate>Fri, 21 Sep 2012 01:34:01 +0000</pubDate>
		<dc:creator>Buu Nguyen</dc:creator>
				<category><![CDATA[bike]]></category>

		<guid isPermaLink="false">http://www.buunguyen.net/blog/?p=746</guid>
		<description />
				<content:encoded><![CDATA[<script src="https://gist.github.com/3759287.js"></script><noscript><pre><code class="language- ">var Y = func(h) {
    return func(f) {
        f(f)
    }(func(f) {
        h(func(n) { f(f)(n) })
    });
};

var fact = Y(func(recur) {
    return func(n) {
        n == 1 ? 1 : n * recur(n-1)
    };
});

println(fact(5));</code></pre></noscript>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=MXVikKTUwlk:gHkM3NQgSoc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=MXVikKTUwlk:gHkM3NQgSoc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=MXVikKTUwlk:gHkM3NQgSoc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=MXVikKTUwlk:gHkM3NQgSoc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=MXVikKTUwlk:gHkM3NQgSoc:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BuuNguyensBlog/~4/MXVikKTUwlk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.buunguyen.net/blog/y-combinator-function-in-bike.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.buunguyen.net/blog/y-combinator-function-in-bike.html</feedburner:origLink></item>
		<item>
		<title>Notify and Memento</title>
		<link>http://feedproxy.google.com/~r/BuuNguyensBlog/~3/pmNo1bVcijE/inotify-change-tracking-library-for-net.html</link>
		<comments>http://www.buunguyen.net/blog/inotify-change-tracking-library-for-net.html#comments</comments>
		<pubDate>Sat, 14 Jul 2012 02:31:55 +0000</pubDate>
		<dc:creator>Buu Nguyen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[data-binding]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[winforms]]></category>
		<category><![CDATA[wpf]]></category>

		<guid isPermaLink="false">http://www.buunguyen.net/blog/?p=720</guid>
		<description><![CDATA[Announcing my 2 new open-source .NET projects: Notify: data-binding change tracking library Memento: lightweight undo framework I still work on Bike, Combres, and Fasterflect although very limited (mostly fix bugs and support). So far all of my major open-source projects are .NET based. While I do contribute a little bit here and there to non-.NET [...]]]></description>
				<content:encoded><![CDATA[<p>Announcing my 2 new open-source .NET projects:</p>
<ul>
<li><a href="http://buunguyen.github.com/notify/">Notify</a>: data-binding change tracking library</li>
<li><a href="http://buunguyen.github.com/memento/">Memento</a>: lightweight undo framework</li>
</ul>
<p>I still work on <a href="http://buunguyen.github.com/Bike/">Bike</a>, <a href="http://combres.codeplex.com/">Combres</a>, and <a href="http://fasterflect.codeplex.com/">Fasterflect</a> although very limited (mostly fix bugs and support).</p>
<p>So far all of my major open-source projects are .NET based. While I do contribute a little bit here and there to non-.NET projects, it&#8217;s not as much as I want to. My open-source focus in the upcoming period therefore will be around JavaScript and Objective-C.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=pmNo1bVcijE:LOCnruk50hM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=pmNo1bVcijE:LOCnruk50hM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=pmNo1bVcijE:LOCnruk50hM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=pmNo1bVcijE:LOCnruk50hM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=pmNo1bVcijE:LOCnruk50hM:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BuuNguyensBlog/~4/pmNo1bVcijE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.buunguyen.net/blog/inotify-change-tracking-library-for-net.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.buunguyen.net/blog/inotify-change-tracking-library-for-net.html</feedburner:origLink></item>
		<item>
		<title>Revisit Dynamic Event Handler in .NET</title>
		<link>http://feedproxy.google.com/~r/BuuNguyensBlog/~3/yueZJJmjEzY/revisit-dynamic-event-handler-in-net.html</link>
		<comments>http://www.buunguyen.net/blog/revisit-dynamic-event-handler-in-net.html#comments</comments>
		<pubDate>Tue, 10 Jul 2012 19:34:33 +0000</pubDate>
		<dc:creator>Buu Nguyen</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[cil]]></category>
		<category><![CDATA[expression-trees]]></category>
		<category><![CDATA[fasterflect]]></category>
		<category><![CDATA[reflectionf]]></category>

		<guid isPermaLink="false">http://www.buunguyen.net/blog/?p=715</guid>
		<description><![CDATA[A while ago I blogged about how to build a catch-all handler for .NET events and delegates. That solution uses LCG to generate CIL for the dynamic delegate. The latest version of Fasterflect however uses Expression Trees to generate the dynamic delegate. So I thought I would post the new solution here for completeness.]]></description>
				<content:encoded><![CDATA[<p>A while ago I blogged about how to build a <a href="http://www.buunguyen.net/blog/a-catch-all-net-delegate-and-event-handler.html">catch-all handler</a> for .NET events and delegates. That solution uses LCG to generate CIL for the dynamic delegate. The latest version of <a href="http://fasterflect.codeplex.com/">Fasterflect</a> however uses Expression Trees to generate the dynamic delegate. So I thought I would post the new solution here for completeness.</p>
<script src="https://gist.github.com/3085691.js"></script><noscript><pre><code class="language-c# c#">#region License
// Copyright 2010 Buu Nguyen, Morten Mertner
// 
// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); 
// you may not use this file except in compliance with the License. 
// You may obtain a copy of the License at 
// 
// http://www.apache.org/licenses/LICENSE-2.0 
// 
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an &quot;AS IS&quot; BASIS, 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
// See the License for the specific language governing permissions and 
// limitations under the License.
// 
// The latest version of this file can be found at http://fasterflect.codeplex.com/
#endregion

namespace Fasterflect
{
    using System;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Reflection;

    public static class DynamicHandler
    {
        /// &lt;summary&gt;
        /// Invokes a static delegate using supplied parameters.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;targetType&quot;&gt;The type where the delegate belongs to.&lt;/param&gt;
        /// &lt;param name=&quot;delegateName&quot;&gt;The field name of the delegate.&lt;/param&gt;
        /// &lt;param name=&quot;parameters&quot;&gt;The parameters used to invoke the delegate.&lt;/param&gt;
        /// &lt;returns&gt;The return value of the invocation.&lt;/returns&gt;
        public static object InvokeDelegate(this Type targetType, string delegateName, params object[] parameters)
        {
            return ((Delegate)targetType.GetFieldValue(delegateName)).DynamicInvoke(parameters);
        }

        /// &lt;summary&gt;
        /// Invokes an instance delegate using supplied parameters.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;target&quot;&gt;The object where the delegate belongs to.&lt;/param&gt;
        /// &lt;param name=&quot;delegateName&quot;&gt;The field name of the delegate.&lt;/param&gt;
        /// &lt;param name=&quot;parameters&quot;&gt;The parameters used to invoke the delegate.&lt;/param&gt;
        /// &lt;returns&gt;The return value of the invocation.&lt;/returns&gt;
        public static object InvokeDelegate(this object target, string delegateName, params object[] parameters)
        {
            return ((Delegate)target.GetFieldValue(delegateName)).DynamicInvoke(parameters);
        }

        /// &lt;summary&gt;
        /// Adds a dynamic handler for a static delegate.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;targetType&quot;&gt;The type where the delegate belongs to.&lt;/param&gt;
        /// &lt;param name=&quot;fieldName&quot;&gt;The field name of the delegate.&lt;/param&gt;
        /// &lt;param name=&quot;func&quot;&gt;The function which will be invoked whenever the delegate is invoked.&lt;/param&gt;
        /// &lt;returns&gt;The return value of the invocation.&lt;/returns&gt;
        public static Type AddHandler(this Type targetType, string fieldName,
            Func&lt;object[], object&gt; func)
        {
            return InternalAddHandler(targetType, fieldName, func, null, false);
        }

        /// &lt;summary&gt;
        /// Adds a dynamic handler for an instance delegate.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;target&quot;&gt;The object where the delegate belongs to.&lt;/param&gt;
        /// &lt;param name=&quot;fieldName&quot;&gt;The field name of the delegate.&lt;/param&gt;
        /// &lt;param name=&quot;func&quot;&gt;The function which will be invoked whenever the delegate is invoked.&lt;/param&gt;
        /// &lt;returns&gt;The return value of the invocation.&lt;/returns&gt;
        public static Type AddHandler(this object target, string fieldName,
            Func&lt;object[], object&gt; func)
        {
            return InternalAddHandler(target.GetType(), fieldName, func, target, false);
        }

        /// &lt;summary&gt;
        /// Assigns a dynamic handler for a static delegate or event.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;targetType&quot;&gt;The type where the delegate or event belongs to.&lt;/param&gt;
        /// &lt;param name=&quot;fieldName&quot;&gt;The field name of the delegate or event.&lt;/param&gt;
        /// &lt;param name=&quot;func&quot;&gt;The function which will be invoked whenever the delegate or event is fired.&lt;/param&gt;
        /// &lt;returns&gt;The return value of the invocation.&lt;/returns&gt;
        public static Type AssignHandler(this Type targetType, string fieldName,
            Func&lt;object[], object&gt; func)
        {
            return InternalAddHandler(targetType, fieldName, func, null, true);
        }

        /// &lt;summary&gt;
        /// Assigns a dynamic handler for a static delegate or event.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;target&quot;&gt;The object where the delegate or event belongs to.&lt;/param&gt;
        /// &lt;param name=&quot;fieldName&quot;&gt;The field name of the delegate or event.&lt;/param&gt;
        /// &lt;param name=&quot;func&quot;&gt;The function which will be invoked whenever the delegate or event is fired.&lt;/param&gt;
        /// &lt;returns&gt;The return value of the invocation.&lt;/returns&gt;
        public static Type AssignHandler(this object target, string fieldName,
            Func&lt;object[], object&gt; func)
        {
            return InternalAddHandler(target.GetType(), fieldName, func, target, true);
        }

        private static Type InternalAddHandler(Type targetType, string fieldName,
            Func&lt;object[], object&gt; func, object target, bool assignHandler)
        {
            Type delegateType;
            var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic |
                               (target == null ? BindingFlags.Static : BindingFlags.Instance);
            var eventInfo = targetType.GetEvent(fieldName, bindingFlags);
            if (eventInfo != null &amp;&amp; assignHandler)
                throw new ArgumentException(&quot;Event can be assigned.  Use AddHandler() overloads instead.&quot;);

            if (eventInfo != null)
            {
                delegateType = eventInfo.EventHandlerType;
                var dynamicHandler = BuildDynamicHandler(delegateType, func);
                eventInfo.GetAddMethod(true).Invoke(target, new Object[] { dynamicHandler });
            }
            else
            {
                var fieldInfo = targetType.Field(fieldName,
                                                    target == null
                                                        ? Flags.StaticAnyVisibility
                                                        : Flags.InstanceAnyVisibility);
                delegateType = fieldInfo.FieldType;
                var dynamicHandler = BuildDynamicHandler(delegateType, func);
                var field = assignHandler ? null : target == null
                                ? (Delegate)fieldInfo.Get()
                                : (Delegate)fieldInfo.Get(target);
                field = field == null
                            ? dynamicHandler
                            : Delegate.Combine(field, dynamicHandler);
                (target ?? targetType).SetFieldValue(fieldName, field);
            }
            return delegateType;
        }

        /// &lt;summary&gt;
        /// Dynamically generates code for a method whose can be used to handle a delegate of type 
        /// &lt;paramref name=&quot;delegateType&quot;/&gt;.  The generated method will forward the call to the
        /// supplied &lt;paramref name=&quot;func&quot;/&gt;.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;delegateType&quot;&gt;The delegate type whose dynamic handler is to be built.&lt;/param&gt;
        /// &lt;param name=&quot;func&quot;&gt;The function which will be forwarded the call whenever the generated
        /// handler is invoked.&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static Delegate BuildDynamicHandler(this Type delegateType, Func&lt;object[], object&gt; func)
        {
            var invokeMethod = delegateType.GetMethod(&quot;Invoke&quot;);
            var parameters = invokeMethod.GetParameters().Select(parm =&gt;
                Expression.Parameter(parm.ParameterType, parm.Name)).ToArray();
            var instance = func.Target == null ? null : Expression.Constant(func.Target);
            var convertedParameters = parameters.Select(parm =&gt; Expression.Convert(parm, typeof(object))).Cast&lt;Expression&gt;().ToArray();
            var call = Expression.Call(instance, func.Method, Expression.NewArrayInit(typeof(object), convertedParameters));
            var body = invokeMethod.ReturnType == typeof(void)
                ? (Expression)call
                : Expression.Convert(call, invokeMethod.ReturnType);
            var expr = Expression.Lambda(delegateType, body, parameters);
            return expr.Compile();
        }
    }
}</code></pre></noscript>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=yueZJJmjEzY:bpav3FahBEY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=yueZJJmjEzY:bpav3FahBEY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=yueZJJmjEzY:bpav3FahBEY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=yueZJJmjEzY:bpav3FahBEY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=yueZJJmjEzY:bpav3FahBEY:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BuuNguyensBlog/~4/yueZJJmjEzY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.buunguyen.net/blog/revisit-dynamic-event-handler-in-net.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.buunguyen.net/blog/revisit-dynamic-event-handler-in-net.html</feedburner:origLink></item>
		<item>
		<title>defaultdict() and memoization</title>
		<link>http://feedproxy.google.com/~r/BuuNguyensBlog/~3/vscrpMGKqZo/defaultdict-and-memoization.html</link>
		<comments>http://www.buunguyen.net/blog/defaultdict-and-memoization.html#comments</comments>
		<pubDate>Sun, 10 Jun 2012 19:56:01 +0000</pubDate>
		<dc:creator>Buu Nguyen</dc:creator>
				<category><![CDATA[bike]]></category>
		<category><![CDATA[memoization]]></category>
		<category><![CDATA[metaprogramming]]></category>
		<category><![CDATA[Programming Languages]]></category>

		<guid isPermaLink="false">http://www.buunguyen.net/blog/?p=688</guid>
		<description><![CDATA[After the previous post, it came across me that member_missing can be used to implement something like Python&#8217;s defaultdict. So I thought it&#8217;s interesting to code up an example leveraging this ability. You know the fibonacci calculating algorithm right? This is the fibonacci code (except written in Bike, not Java) that I use to teach [...]]]></description>
				<content:encoded><![CDATA[<p>After the <a href="http://www.buunguyen.net/blog/new-feature-in-bike-membermissing.html">previous post</a>, it came across me that <code>member_missing</code> can be used to implement something like Python&#8217;s <a href="http://docs.python.org/library/collections.html#collections.defaultdict">defaultdict</a>. So I thought it&#8217;s interesting to code up an example leveraging this ability. </p>
<p>You know the fibonacci calculating algorithm right? This is the fibonacci code (except written in Bike, not Java) that I use to teach my students about recursion in an entry Java programming course:</p>
<pre class="brush:javascript">
var fib = func(n) {
  n < 2 ? 1 : fib(n-1) + fib(n-2)
};
</pre>
<p>Clean and simple! A base case on the left expression of the ternary and a recursive case on the right. Probably among the best to introduce people to the concept of recursion. What I didn't tell my students is that this is extremely inefficient. Pick <code>fib(30)</code> for example. It will invoke <code>fib(29) + fib(28)</code>. <code>fib(29)</code> in turn invokes <code>fib(28) + fib(27)</code>. Notice something? No? Read again? Still no? <code>fib(28)</code> is executed twice. And this is just the top part of the call tree. As you go down further, this phenomena is phenomenal, i.e. <code>fib(27)</code> is invoked tree times, <code>fib(26)</code> four times and so on! Needless to say, your CPU won't be very happy. Enter <a href="http://en.wikipedia.org/wiki/Memoization">memoization</a>. </p>
<p>In a nutshell, we use memoization as a technique to cache result of previous invocations. Assume the function has no side effect (i.e. being <a href="http://en.wikipedia.org/wiki/Idempotence">idempotent</a>), which should generally be the case in a functional language, we can later reuse the cached result should the function is invoked again with the same arguments. Here's the code to compute fibonacci making use of memoization technique (and <code>member_missing</code>, as <code>defaultdict</code>).</p>
<pre class="brush:javascript">func memoize(f) {
  var cache = {
    member_missing: func() { null }
  };
  return func recur(n) {
    cache[n] || (cache[n] = f(recur, n));
  };
}

var fib = func(n) {
  n < 2 ? 1 : fib(n-1) + fib(n-2)
};

var m_fib = memoize(func(recur, n) {
  n < 2 ? 1 : recur(n-1) + recur(n-2);
});

load 'stopwatch.bk';
var watch = Bike.Stopwatch.create( ).start( );
println('fib(20) = {0} (elapsed: {1}ms)', fib(20), watch.stop());

watch.reset().start();
println('m_fib(20) = {0} (elapsed: {1}ms)', m_fib(20), watch.stop()); 
</pre>
<p>Run the code and you should notice a significant difference between the run time of the normal fibonacci and one with memoization.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=vscrpMGKqZo:HNQPoqfB9v8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=vscrpMGKqZo:HNQPoqfB9v8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=vscrpMGKqZo:HNQPoqfB9v8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=vscrpMGKqZo:HNQPoqfB9v8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=vscrpMGKqZo:HNQPoqfB9v8:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BuuNguyensBlog/~4/vscrpMGKqZo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.buunguyen.net/blog/defaultdict-and-memoization.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.buunguyen.net/blog/defaultdict-and-memoization.html</feedburner:origLink></item>
		<item>
		<title>New feature in Bike: member_missing</title>
		<link>http://feedproxy.google.com/~r/BuuNguyensBlog/~3/FABK93ffwr0/new-feature-in-bike-membermissing.html</link>
		<comments>http://www.buunguyen.net/blog/new-feature-in-bike-membermissing.html#comments</comments>
		<pubDate>Sun, 10 Jun 2012 18:31:54 +0000</pubDate>
		<dc:creator>Buu Nguyen</dc:creator>
				<category><![CDATA[bike]]></category>
		<category><![CDATA[Programming Languages]]></category>
		<category><![CDATA[metaprogramming]]></category>

		<guid isPermaLink="false">http://www.buunguyen.net/blog/?p=680</guid>
		<description><![CDATA[I always like the ability of objects to dynamically respond to a message without having an explicit binding. Something like method_missing in Ruby or DynamicObject in .NET. It would be great for Bike to have that capability. Fortunately, adding this feature was much easier than I thought, thanks to how the interpreter code was already [...]]]></description>
				<content:encoded><![CDATA[<p>I always like the ability of objects to dynamically respond to a message without having an explicit binding. Something like <code>method_missing</code> in Ruby or <code>DynamicObject</code> in .NET. It would be great for <a href="http://buunguyen.github.com/Bike/">Bike</a> to have that capability. Fortunately, adding this feature was much easier than I thought, thanks to how the interpreter code was already laid out. Please join me welcoming <code>member_missing</code> in Bike! Let&#8217;s examine this feature more closely, shall we?</p>
<pre class="brush:javascript">var obj = {
  member_missing: func(name) {
    return "Member: {0}".with(name);
  }
};

println(obj.notExist); # Member: notExist
println(obj.has_member('notExist')); # False</pre>
<p>The code above creates an object and defines the special <code>member_missing</code> method, which will be invoked by the runtime whenever it can&#8217;t resolve a member. Therefore, when trying to access <code>notExist</code>, <code>methodMissing</code> is invoked with the member name as its only argument and has a chance to decide what to return. In this case, it returns a string showing what member was being accessed.</p>
<p>This works for method invocation as well. When the interpreter attempts to invoke a method, the first thing it does is resolving the method object (<code>Bike.Function</code>) before invoking it. Therefore, <code>member_missing</code> can also do its magic here by returning a method that the runtime will instead invoke.</p>
<pre class="brush:javascript">obj = {
  member_missing: func(name) {
    if (name == "add") {
      return func(a, b) { a + b };
    }
  }
};

println(obj.add(1, 2)); # 3</pre>
<p>You see, Bike&#8217;s <code>member_missing</code> doesn&#8217;t behave exactly like Ruby&#8217;s <code>method_missing</code>. I could modify the runtime to instead of invoking the function returned by <code>member_missing</code>, it will invoke something like <code>method_missing</code> (Bike edition!) and pass in the call information (e.g. name, arguments). Maybe that what I should have done for efficiency sake (i.e. avoid creating a function every time!). Then again, maybe later, one thing at a time, eh. For now, those who care about a bit of efficiency here and there, you can cache the generated method, as follow.</p>
<pre class="brush:javascript">obj = {
  member_missing: func(name) {
    if (name == "cache") {
      return this.cache = func() {};
    }
  }
};

obj.cache();
println(obj.has_member('cache')); # True</pre>
<p>The next time obj.cache() is invoked, member_missing() isn&#8217;t invoke anymore because an explicit binding already exists.</p>
<p>Now, a more interesting example demonstrating the power of <code>member_missing</code>. If this somehow reminds you of <code>Rails</code>&#8216; <code>ActiveRecord</code>, you&#8217;re right.</p>
<pre class="brush:javascript">var db = {
  member_missing: func(name) {
    if (name.starts('find')) {
      return db[name] #! cache it !# = func(obj) {
        var sql = 'SELECT * FROM {0}'.with(name.sub(4).upper());
        obj.members(false, true).each_with_index(func(name, index) {
          sql += (index == 0 ? ' WHERE ' : ' AND ') +
                 name.upper() +
                 (obj[name] is Bike.String ? '' : '=') +
                 obj[name]
        });
        println('Executing...{0}{1}', NL, sql);
        return [#! Suppose I'm a product array, yay! !#];
      };
    }
  }
};

# SELECT * FROM PRODUCTS WHERE CATEGORYID=1 AND PRICE>1000
var products = db.findProducts({categoryId: 1, price: '&gt;1000'});</pre>
<p>Interested? Have Bike <a href="https://github.com/buunguyen/Bike#run-bike">up and running</a> and start hacking. The examples above can be found in <a href="https://github.com/buunguyen/Bike/blob/master/samples/missing.bk">GitHub</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=FABK93ffwr0:LamSKqJ8NCM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=FABK93ffwr0:LamSKqJ8NCM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=FABK93ffwr0:LamSKqJ8NCM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=FABK93ffwr0:LamSKqJ8NCM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=FABK93ffwr0:LamSKqJ8NCM:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BuuNguyensBlog/~4/FABK93ffwr0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.buunguyen.net/blog/new-feature-in-bike-membermissing.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.buunguyen.net/blog/new-feature-in-bike-membermissing.html</feedburner:origLink></item>
		<item>
		<title>Building a Custom Defect Submitter for qTrace</title>
		<link>http://feedproxy.google.com/~r/BuuNguyensBlog/~3/8KiaUpJtndU/building-a-custom-defect-submitter-for-qtrace.html</link>
		<comments>http://www.buunguyen.net/blog/building-a-custom-defect-submitter-for-qtrace.html#comments</comments>
		<pubDate>Thu, 10 May 2012 03:37:48 +0000</pubDate>
		<dc:creator>Buu Nguyen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[qtrace]]></category>

		<guid isPermaLink="false">http://www.buunguyen.net/blog/?p=673</guid>
		<description><![CDATA[Code for my new blog post in QASymphony&#8217;s Blog.]]></description>
				<content:encoded><![CDATA[<p>Code for <a href="http://www.qasymphony.com/building-a-custom-defect-submitter-for-qtrace.html">my new blog post</a> in <a href="http://qasymphony.com/blog">QASymphony&#8217;s Blog</a>.</p>
<script src="https://gist.github.com/2647100.js"></script><noscript><pre><code class="language-c# c#">namespace FtpSubmitter
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.Composition;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Input;
    using Iris.Trackers.Contracts;

    [Export(typeof(IBugTracker))]
    public class Ftp : IBugTracker
    {
        public string DisplayName
        {
            get { return &quot;FTP Submitter&quot;; }
        }

        public string IconUri
        {
            get { return &quot;/FtpSubmitter;component/ftp.png&quot;; }
        }

        public string Verify(BugTrackerAccount bugTrackerAccount,
                             int timeoutInMillis,
                             IDictionary&lt;string, string&gt; settings)
        {
            var ftpRequest = (FtpWebRequest)WebRequest.Create(bugTrackerAccount.Url);
            ftpRequest.Credentials = new NetworkCredential(bugTrackerAccount.UserName,
                                                           bugTrackerAccount.Password);
            ftpRequest.Timeout = timeoutInMillis;
            ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
            using (ftpRequest.GetResponse())
            {
                return &quot;Connected to FTP server successfully!&quot;;
            }
        }

        public SubmittedDefect Submit(Window owner,
                                      BugTrackerAccount bugTrackerAccount,
                                      int timeoutInMillis,
                                      Defect defect,
                                      Func&lt;IDictionary&lt;string, byte[]&gt;&gt; attachmentsFunc,
                                      IDictionary&lt;string, string&gt; settings)
        {
            Mouse.OverrideCursor = Cursors.Wait;
            try
            {
                var tasks = from attachment in attachmentsFunc()
                            select Task.Factory.StartNew(
                                () =&gt; Upload(bugTrackerAccount, timeoutInMillis,
                                             attachment.Key, attachment.Value));
                Task.WaitAll(tasks.ToArray());
                return null;
            }
            finally
            {
                Mouse.OverrideCursor = null;
            }
        }

        private void Upload(BugTrackerAccount bugTrackerAccount,
                            int timeoutInMillis,
                            string filePath,
                            byte[] fileContent)
        {
            var uri = bugTrackerAccount.Url +
                      (bugTrackerAccount.Url.EndsWith(&quot;/&quot;) ? string.Empty : &quot;/&quot;) +
                      Path.GetFileName(filePath);
            var ftpRequest = (FtpWebRequest)WebRequest.Create(uri);
            ftpRequest.Credentials = new NetworkCredential(bugTrackerAccount.UserName,
                                                           bugTrackerAccount.Password);
            ftpRequest.Timeout = timeoutInMillis;
            ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
            using (Stream writer = ftpRequest.GetRequestStream())
            {
                writer.Write(fileContent, 0, fileContent.Length);
            }
        }
    }
}</code></pre></noscript>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=8KiaUpJtndU:tPehz1LbqqI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=8KiaUpJtndU:tPehz1LbqqI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=8KiaUpJtndU:tPehz1LbqqI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=8KiaUpJtndU:tPehz1LbqqI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=8KiaUpJtndU:tPehz1LbqqI:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BuuNguyensBlog/~4/8KiaUpJtndU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.buunguyen.net/blog/building-a-custom-defect-submitter-for-qtrace.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.buunguyen.net/blog/building-a-custom-defect-submitter-for-qtrace.html</feedburner:origLink></item>
		<item>
		<title>Bike has a homepage!</title>
		<link>http://feedproxy.google.com/~r/BuuNguyensBlog/~3/Ftg_YtiP2-Y/bike-has-a-homepage.html</link>
		<comments>http://www.buunguyen.net/blog/bike-has-a-homepage.html#comments</comments>
		<pubDate>Thu, 03 May 2012 15:29:48 +0000</pubDate>
		<dc:creator>Buu Nguyen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bike]]></category>
		<category><![CDATA[Programming Languages]]></category>

		<guid isPermaLink="false">http://www.buunguyen.net/blog/?p=660</guid>
		<description><![CDATA[Bike has a new shiny homepage, thanks to GitHub Pages.]]></description>
				<content:encoded><![CDATA[<p><a href="https://github.com/buunguyen/Bike">Bike</a> has a <a href="http://buunguyen.github.com/Bike/">new shiny homepage</a>, thanks to <a href="http://pages.github.com/">GitHub Pages</a>.</p>
<p><img src="http://grab.by/ds6Q" alt="http://grab.by/ds6Q" /></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=Ftg_YtiP2-Y:AOH-uzkqbzU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=Ftg_YtiP2-Y:AOH-uzkqbzU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=Ftg_YtiP2-Y:AOH-uzkqbzU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=Ftg_YtiP2-Y:AOH-uzkqbzU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=Ftg_YtiP2-Y:AOH-uzkqbzU:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BuuNguyensBlog/~4/Ftg_YtiP2-Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.buunguyen.net/blog/bike-has-a-homepage.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.buunguyen.net/blog/bike-has-a-homepage.html</feedburner:origLink></item>
		<item>
		<title>Had some fun with Python</title>
		<link>http://feedproxy.google.com/~r/BuuNguyensBlog/~3/LNfwfRAVz7k/had-some-fun-with-python.html</link>
		<comments>http://www.buunguyen.net/blog/had-some-fun-with-python.html#comments</comments>
		<pubDate>Tue, 01 May 2012 06:16:12 +0000</pubDate>
		<dc:creator>Buu Nguyen</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Programming Languages]]></category>

		<guid isPermaLink="false">http://www.buunguyen.net/blog/?p=653</guid>
		<description><![CDATA[By now, you should have already known I love programming languages, to the extent that I even created one myself. One of the languages I want to learn this year is Python. My first Python program is a port for the Semicolon language. The code is also available in github with examples. # coding: utf-8 [...]]]></description>
				<content:encoded><![CDATA[<p>By now, you should have already known I love programming languages, to the extent that I even <a href="http://www.buunguyen.net/blog/the-bike-programming-language.html">created one myself</a>. One of the languages I want to learn this year is Python.  My first Python program is a port for the <a href="http://pksunkara.github.com/semicolon/">Semicolon language</a>. The code is also available in <a href="https://github.com/buunguyen/semicolon">github</a> with <a href="https://github.com/buunguyen/semicolon/tree/master/examples">examples</a>.  </p>
<pre class="brush:python"># coding: utf-8

def tokenize(code):
	import re
	ops = {
	  ';;;':  { 'code': 'push', 'arg': 'signed'},
	  ';;⁏':  { 'code': 'dup' },
	  ';⁏;':  { 'code': 'swap' },
	  ';⁏⁏':  { 'code': 'discard' },
	  '⁏;;':  { 'code': 'add' },
	  '⁏;⁏':  { 'code': 'sub' },
	  '⁏⁏;':  { 'code': 'mul' },
	  '⁏⁏⁏':  { 'code': 'div' },
	  '⁏  ':  { 'code': 'mod' },
	  '; ;':  { 'code': 'store' },
	  '; ⁏':  { 'code': 'retrieve' },
	  ' ;;':  { 'code': 'label', 'arg': 'unsigned' },
	  ' ;⁏':  { 'code': 'call', 'arg': 'unsigned' },
	  ' ; ':  { 'code': 'ret' },
	  ' ⁏ ':  { 'code': 'jump', 'arg': 'unsigned' },
	  ' ⁏;':  { 'code': 'jz', 'arg': 'unsigned' },
	  ' ⁏⁏':  { 'code': 'jn', 'arg': 'unsigned' },
	  '  ;':  { 'code': 'exit' },
	  '⁏ ;;': { 'code': 'outchar' },
	  '⁏ ;⁏': { 'code': 'outnum' },
	  '⁏ ⁏;': { 'code': 'readchar' },
	  '⁏ ⁏⁏': { 'code': 'readnum' },
	}
	
	make_int = lambda str:int(''.join('0' if c == ';' else '1' for c in str), 2)
	while code and code != '\n':
		has_match = False
		for key in ops:
			pattern = (key + (r'([;⁏]*)\n' if 'arg' in ops[key] else '()') + r'(.*)$').decode('utf8')
			match = re.match(pattern, code, re.S)
			if match:
				has_match = True
				code = match.group(2)
				if 'arg' in ops[key]:
					if ops[key]['arg'] == 'unsigned':
						tokens.append([ops[key]['code'], make_int(match.group(1))])
					elif ops[key]['arg'] == 'signed':
						tokens.append([ops[key]['code'], 
									   (1 if match.group(1)[0] == ';' else -1) * make_int(match.group(1)[1:])])
				else: tokens.append([ops[key]['code']])
		if not has_match: 
			raise Exception('Unknown command')

def step():	
	global pc
	op = tokens[pc][0]
	arg = None if len(tokens[pc]) == 1 else tokens[pc][1]
	pc += 1
	if op == 'push':
		stack.append(arg)
		step()
	elif op == 'dup':
		stack.append(stack[-1])
		step()
	elif op == 'swap':
		stack[-1], stack[-2] = stack[-2], stack[-1]
		step()
	elif op == 'discard':
		stack.pop()
		step()
	elif op == 'add' or op == 'sub' or op == 'mul' or op == 'div' or op == 'mod':
		bin_ops = { 'add': '+', 'sub': '-', 'mul': '*', 'div': '/', 'mod': '%' }
		stack.append(eval(str(stack.pop()) + bin_ops[op] + str(stack.pop())))
		step()
	elif op == 'store':
		heap[stack[-2]] = stack[-1]
		stack.pop(); stack.pop()
		step()
	elif op == 'retrieve':
		stack.append(heap[stack.pop()])
		step()
	elif op == 'label':
		step()
	elif op == 'call':	
		call_stack.append(pc)
		jump(arg)
	elif op == 'ret':
		pc = call_stack.pop()
		step()
	elif op == 'jump':	
		jump(arg)
	elif op == 'jz':
		if stack.pop() == 0: jump(arg)
	elif op == 'jn':		
		if stack.pop() &lt; 0: jump(arg)
	elif op == 'exit':
		sys.exit()
	elif op == 'outchar':
		print chr(stack.pop())
		step()
	elif op == 'outnum':
		print str(stack.pop())
		step()
	elif op == 'readchar':
		stack.append(ord(sys.stdin.read(1)))
		step()
	elif op == 'readnum':
		stack.append(int(sys.stdin.readline()))
		step()
	else: raise Exception('Unknown opcode')

def jump(label):
	global pc
	for index, token in enumerate(tokens):
		if token[0] == 'label' and token[1] == label:
			pc = index
			break
	step()
		
import sys
if len(sys.argv) == 2:
	tokens = []; pc = 0; heap = {}; stack = []; call_stack = []
	tokenize(open(sys.argv[1], 'r').read().decode('utf8'))
	step()
else: print 'Usage: python semicolon.py [file.sc]'</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=LNfwfRAVz7k:XCDqEpdSiNw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=LNfwfRAVz7k:XCDqEpdSiNw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=LNfwfRAVz7k:XCDqEpdSiNw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=LNfwfRAVz7k:XCDqEpdSiNw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=LNfwfRAVz7k:XCDqEpdSiNw:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BuuNguyensBlog/~4/LNfwfRAVz7k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.buunguyen.net/blog/had-some-fun-with-python.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.buunguyen.net/blog/had-some-fun-with-python.html</feedburner:origLink></item>
		<item>
		<title>Posts on software testing</title>
		<link>http://feedproxy.google.com/~r/BuuNguyensBlog/~3/Cfsrp82cjJs/posts-on-software-testing.html</link>
		<comments>http://www.buunguyen.net/blog/posts-on-software-testing.html#comments</comments>
		<pubDate>Fri, 02 Mar 2012 18:05:20 +0000</pubDate>
		<dc:creator>Buu Nguyen</dc:creator>
				<category><![CDATA[Software Testing]]></category>
		<category><![CDATA[QASymphony]]></category>
		<category><![CDATA[qtrace]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.buunguyen.net/blog/?p=640</guid>
		<description><![CDATA[I&#8217;ve written a series of blog posts in my company&#8217;s blog.  Links here for references: http://www.qasymphony.com/big-design-up-front-and-exploratory-test.html http://www.qasymphony.com/agile-testing-in-qtrace.html http://www.qasymphony.com/on-qtraces-output-file-size.html http://www.qasymphony.com/how-is-testing-like-snorkeling.html Any plugin to automatically synchronize posts between 2 blogs by same author?]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve written a series of blog posts in my company&#8217;s blog.  Links here for references:</p>
<ul>
<li><a href="http://www.qasymphony.com/big-design-up-front-and-exploratory-test.html">http://www.qasymphony.com/big-design-up-front-and-exploratory-test.html</a></li>
<li><a href="http://www.qasymphony.com/agile-testing-in-qtrace.html">http://www.qasymphony.com/agile-testing-in-qtrace.html</a></li>
<li><a href="http://www.qasymphony.com/on-qtraces-output-file-size.html">http://www.qasymphony.com/on-qtraces-output-file-size.html</a></li>
<li><a href="http://www.qasymphony.com/how-is-testing-like-snorkeling.html">http://www.qasymphony.com/how-is-testing-like-snorkeling.html</a></li>
</ul>
<p>Any plugin to automatically synchronize posts between 2 blogs by same author?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=Cfsrp82cjJs:TQcJal6c3H0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=Cfsrp82cjJs:TQcJal6c3H0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=Cfsrp82cjJs:TQcJal6c3H0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BuuNguyensBlog?a=Cfsrp82cjJs:TQcJal6c3H0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/BuuNguyensBlog?i=Cfsrp82cjJs:TQcJal6c3H0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BuuNguyensBlog/~4/Cfsrp82cjJs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.buunguyen.net/blog/posts-on-software-testing.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.buunguyen.net/blog/posts-on-software-testing.html</feedburner:origLink></item>
	</channel>
</rss>
