Sam
Craig
cooking obsessively and often blogging about it here.

cooking is a passion. food is a way of life.
organic, artisan catering and private chef.
develpoment is a skill earned by experience.
PHP, .NET, SQL, and JavaScript, and the usual suspects;
a portfolio of expertise with everything from enterprise operationally-focused applications to social-scale ecommerce sites.

Consumer and social ecommerce sites.
Business data applications, transformations, and mining.
development leadership is an earned priveledge.

proven through deep hands-on experience;
honed through building enterprise-class teams; perfected by a unique combination of modern generational and new-age styles.

development changes your business. development leadership changes your developers.

  • .NET

    ASP.NET 3.5/4.0
    .NET Membership library
    Console applications
  • Motion-detection in a .NET C# surveillance console application
    (comments removed)

    if (iDifference > iMotionSimilarThreshold) { sFile = lblPath.Text + DateTime.Now.ToString("yyyy-MM-dd") + "\\motion"; if (!Directory.Exists(sFile)) Directory.CreateDirectory(sFile); sFile = lblPath.Text + DateTime.Now.ToString("yyyy-MM-dd") + "\\motion\\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + " " + aLstCameras[1, i] + ".jpg"; oAction = new Bitmap(_image_width * 2, _image_height); for (int x = 1; x < _image_width; x++) for (int y = 1; y < _image_height; y++) { //oAction.SetPixel(x,y,aImage[i].GetPixel(x,y)) ; oAction.SetPixel(x + _image_width, y, oImage.GetPixel(x, y)); } oAction.Save(sFile); oAction.Dispose(); lblMotionLastDetected.Text = "Motion Detected at " + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"); }
  • PHP

    eCommerce (OpenCart, WebBid)
    Content Management, etc. (Wordpress, Joomla, PivotX)
    Custom applications
  • Craigslist parsing API in a PHP utility web application
    (comments removed)

    function url_get_contents ($Url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $Url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($ch); curl_close($ch); return $output; } $html = url_get_contents($url); $items = array(); preg_match_all("'<p class=\"row\">(.*?)</p>'si", $html, $rows); foreach($rows[1] as $row) { preg_match("'(.*?)</span>(.*?) -'si", $row, $match); $date = trim($match[2]); preg_match("'<a href=\"(.*?)\">(.*?)</a>'si", $row, $match); $link = trim($match[1]); $title = trim($match[2]); $title = preg_replace('/ -$/','',$title); // .... // array_push($items, array('date' => $date, 'link' => $link, 'title' => $title,'price' => $price,'location' => $location)); } echo '{"items":' . json_encode($items) . '}' ;
  • JavaScript / jQuery

    Rich client front-ends
    Client-only web applications (dashboards, aggregators, etc.)
    Plugins (jQuery, jQuery UI)
  • An eBay client for a shopping aggregator
    (comments removed)

    function loadEbayCompleted(_div,_keywords, _progressbarcallback) { $.getJSON(getEbayAPIURL('findCompletedItems',100,'EndTimeSoonest',_keywords), function(data){ var _saleprice = 0; var _bids = 0; var _count = data.findCompletedItemsResponse[0].searchResult[0]['item'].length; var _soldcount = 0; var _bidcount = 0; $.each(data.findCompletedItemsResponse[0].searchResult[0]['item'], function(i, item) { _bid = (item.sellingStatus[0]['bidCount']) ? parseInt((item.sellingStatus[0].bidCount)) : 0; if (_bid > 0) { _bidcount++; _bids += _bid; } _sold = item.sellingStatus[0].sellingState[0]; if (_sold == 'EndedWithSales') { var _price = parseFloat(item.sellingStatus[0].convertedCurrentPrice[0]['__value__']); _soldcount++; _saleprice += _price; var _condition = (!item['condition']) ? 'Unknown' : item.condition[0].conditionDisplayName; if (_condition == 'New' || _condition == 'New other (see details)') { _salepricenew += _price; _soldcountnew++; } else if (_condition == 'Used') { _salepriceused += _price; _soldcountused++; } } $('.ebay-completed table.ebay',$(_div)).append(getTRForItem(item,true)); }); var _table = $('table.ebay',$(_div)).dataTable({ "bJQueryUI": true, "bFilter":true, "oLanguage": { "sSearch": "Search all columns:" }, "aoColumnDefs": [ { "bVisible": false, "aTargets": [ 9,0 ] }, { "sType": "title-date", "aTargets": [ 8 ] } ] }); if (_progressbarcallback) _progressbarcallback(); }); }
food
webdev & leadership
CV | cover letter
chef CV | cover letter