Blog

  • Viva La Resi-staunch: French Canadians (?) Help Fight Blogspam

    Andy Makely sends me a translated link to gotoandplay.ca‘s Flash Form, created to replace MoveableType blogs commenting form in an effort to prevent blog spam. The only thing it does is prevent form auto-fill scripts from spamming your blog, and the instructions mention to rename your mt-comments.cgi file which the SWF reads from an XML config file.

    “Dude, this is worthless… the spammers can find the CGI file via google, and they hit the cgi directly, NOT my web page…”.

    To accentuate my point, 7 minutes after re-activating my mt-comments.cgi after installation of the Flash comments, I got a new blogspam.

    Then I got an idea. Some dude had written me in an email, talking about his solution. He basically added an extra form field for the user to type in a value, and have perl check to see if that value exists when the form data hits it.

    The flaw in that theory is that the blog spammer can read your comment page, see the new variable Perl is expecting, and modify his/her script as need be.

    …you can’t do that with Flash. You can decompile the script, but I don’t think most blog spammers know how to do that. Hidden form fields on HTML pages are easily spotted via View Source, but doing that in Flash requires a SWF decompiler… and I’ll have to test to see if they can spot the variable name when I get home to check via ActionScript Viewer.

    SO, I added the variable with a whack value:

    specialVar = “some whack string”;

    To the “MTgotoAndComment.fla” file, and recompile to the form.swf, and replace the one they give you.

    In Perl, I check for the value, and if it’s not there, I throw an exception… at least, that’s what the code looks like its doing, I don’t know Perl.

    After some tests, it appears to be working. IF this solution does work after this weekend, I’ll delve into further detail of how I got it to work, and then I’ll rewrite this form for AS2.

    …and to the blogspammers, I say…

  • Call a Woman a Dude

    This goes out to the Canuck last week, the cool mom in QA at BellSouth, and the cool mom in QA at Surgical Information Systems.

    SEE!? I was being politically correct!

    “Men report that they use dude with women with whom they are close friends, but not with women with whom they are intimate,” according to the study.

    CNN Article

    Via her majesty… who isn’t a dude.

  • Flash Remoting in AS2: RelayResponder2

    Flash MX 2004 with ActionScript v2.0 introduced enhanced syntax checking. For example, if you have a function in your class, and you mispell it, the compiler will throw an error, helping you easily find and correct the answer so your code will run as expected.

    The AS2 classes for Flash Remoting do not take advantage of this fact for RelayResponders. I fixed that. Instead of passing in strings for your result and fault functions, you can pass in the functions themselves, much like you do for the first format setInterval, or when utilizing the Delegate class.

    What’s different from the original (mx.rpc.RelayResponder)? Only that the __onResult and __onFault functions are now datatyped as Function vs. String, and called via Function.call(scope, param) vs. scope[string](param).

    import mx.rpc.Responder;

    class mx.rpc.RelayResponder2 extends Object implements Responder {

    private var __obj:Object;
    private var __onFault:Function; private var __onResult:Function;

    function RelayResponder2( resp:Object, resultFunc:Function, faultFunc:Function ) {
    super();
    __obj = resp;
    __onFault = faultFunc;
    __onResult = resultFunc;
    }

    function onFault( fault:mx.rpc.FaultEvent ):Void{
    __onFault.call(__obj, fault);
    }

    function onResult( result:mx.rpc.ResultEvent ):Void {
    __onResult.call(__obj, result);
    }
    }
  • Flash Date to MySQL Date String

    Was doing some AMFPHP work with Flash & MySQL Saturday, and doing your typical data massaging/conversion that one does in the imperfect world of webservices. I needed to have a Flash Date object stored in MySQL and have it come back out again to be usable for the DateField component in Flash. Since the MySQL Date colum type is easily created as a String, it was only a matter of going back to a Flash Date.

    Maybe if someone’s bored, they can add the mask required to have this functionality in Darron’s DateFormat class.

    GOTCHA: The Date object in Flash returns a 0 based month value. So, December is 11, not 12.

    Example:

    a = new Date();
    trace(a); // Tue Dec 7 07:33:08 GMT-0500 2004
    s = getFormatFromDate(a);
    trace(s); // 2004-11-07 07:33:08
    d = getDateFromFormat(s);
    trace(d); // Tue Dec 7 07:33:08 GMT-0500 2004
    
    function getFormatFromDate(d:Date):String
    {
    var year:Number = d.getFullYear();
    var month:Number = d.getMonth();
    var day:Number = d.getDate();
    var hour:Number = d.getHours();
    var minutes:Number = d.getMinutes();
    var seconds:Number = d.getSeconds();

    var s:String = "";
    if(year < 1000)
    {
    if(year < 100)
    {
    if(year < 10)
    {
    if(year < 1)
    {
    s += "0000-";
    }
    else
    {
    s += "000" + year.toString() + "-";
    }
    }
    else
    {
    s += "00" + year.toString() + "-";
    }
    }
    else
    {
    s += "0" + year.toString() + "-";
    }
    }
    else
    {
    s += year.toString() + "-";
    }

    if(month < 10)
    {
    s += "0" + month.toString() + "-";
    }
    else
    {
    s += month.toString() + "-";
    }

    if(day < 10)
    {
    s += "0" + day.toString() + " ";
    }
    else
    {
    s += day.toString() + " ";
    }

    if(hour < 10)
    {
    s += "0" + hour.toString() + ":";
    }
    else
    {
    s += hour.toString() + ":";
    }

    if(minutes < 10)
    {
    s += "0" + minutes.toString() + ":"
    }
    else
    {
    s += minutes.toString() + ":";
    }

    if(seconds < 10)
    {
    s += "0" + seconds.toString();
    }
    else
    {
    s += seconds.toString();
    }

    return s;
    }

    function getDateFromFormat(s:String):Date
    {
    var a:Array = s.split(" ");
    var theDate:String = a[0];
    var theTime:String = a[1];

    var dateArray:Array = theDate.split("-");
    var year:Number = parseInt(dateArray[0]);
    var month:Number = parseInt(dateArray[1]);
    var day:Number = parseInt(dateArray[2]);

    var timeArray:Array = theTime.split(":");
    var hour:Number = parseInt(timeArray[0]);
    var minutes:Number = parseInt(timeArray[1]);
    var seconds:Number = parseInt(timeArray[2]);

    var d:Date = new Date(year, month, day, hour, minutes, seconds);
    return d;
    }