Atclub_256_normalscottymac

http://twitter.com/scottymac

Simulate NavController push/pop Animation

//http://groups.google.com/group/cocoa-unbound/msg/78d646715a407466

@implementation UIView(MCAnimations) 
- (void)simulateNavControllerAnimateOn 
{ 
    self.alpha = 0.0f; 
    [UIView beginAnimations:@"Nav Bar Simulate On" context:nil]; 
    [UIView setAnimationDuration:0.5f]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    self.alpha = 1.0f; 
    [UIView commitAnimations]; 
} 

- (void)simulateNavControllerAnimateOff 
{ 
    [UIView beginAnimations:@"Nav Bar Simulate Off" context:nil]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    self.transform = CGAffineTransformTranslate(self.transform, +[UIScreen mainScreen].applicationFrame.size.width, 0.f); 
    [UIView commitAnimations]; 
    [self performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.6]; 
} 

@end
Reveal More
Added about 1 year ago

Scraping a page with node.js

// Setup here: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

var request = require('request'),
    jsdom = require('jsdom'),
    sys = require('sys'),
    fs = require('fs'); // for eventually just writing out a file

var uri = 'http://domain.com';

request({uri:uri}, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var window = jsdom.jsdom(body).createWindow();
    jsdom.jQueryify(window, 'jquery-1.4.2.js', function (window, jquery) {
      var jq = window.jQuery;
      var events = [];

      var year = "2004";
      var $tables = jq("table");
      $tables.each(function () {


        var month = "";
        jq(this).find('tr').each( function() {
          if (jq(this).prev('a').length) {
            month = jq(this).prev('a').attr('name');
          }
          var $tds = jq(this).find("td");
          var event = {};
          event.date = jq($tds[0]).text().replace(/\D+/,"");
          if(event.date != "") {
            event.date = year + " " + month + ' ' + event.date;
            event.location = jq($tds[2]).text() + ', ' + jq($tds[1]).text();
            events.push(event);
            sys.puts(event.date + ":" + event.location);  // just outputs to console for now
          }
        });


      });

      // TODO: write out entire events array to file

    });
  }
});
Reveal More
Added over 1 year ago

Markhov Chain Random Name Generator

PLACES=['Afghanistan','Albania','Algeria','Samoa','Andorra','Angola','Anguilla','Antarctica','Antigua','Barbuda','Argentina','Armenia','Aruba','Australia','Austria','Azerbaijan','Bahamas','Bahrain','Bangladesh','Barbados','Belarus','Belgium','Belize','Benin','Bermuda','Bhutan','Bolivia','Bosnia','Herzegovina','Botswana','Bouvet','Brazil','Brunei','Darussalam','Bulgaria','Burkina','Faso','Burundi','Cambodia','Cameroon','Canada','Verde','Cayman','Chad','Chile','China','Colombia','Comoros','Congo','Costa','Rica','Croatia','Cuba','Cyprus','Czech','Denmark','Djibouti','Dominica','Ecuador','Egypt','Salvador','Guinea','Eritrea','Estonia','Ethiopia','Falklands','Faroe','Fiji','Finland','France','Guiana','Polynesia','Gabon','Gambia','Georgia','Germany','Ghana','Gibraltar','Greece','Greenland','Grenada','Guadeloupe','Guam','Guatemala','Guinea','Bissau','Guyana','Haiti','Honduras','Hungary','Iceland','India','Indonesia','Iran','Iraq','Ireland','Israel','Italy','Jamaica','Japan','Jordan','Kazakhstan','Kenya','Kiribati','Kuwait','Kyrgyzstan','Laos','Latvia','Lebanon','Lesotho','Liberia','Libya','Liechtenstein','Lithuania','Luxembourg','Macau','Macedonia','Madagascar','Malawi','Malaysia','Maldives','Mali','Malta','Martinique','Mauritania','Mauritius','Mayotte','Mexico','Moldova','Monaco','Mongolia','Montserrat','Morocco','Mozambique','Myanmar','Namibia','Nauru','Nepal','Netherlands','Caledonia','Zealand','Nicaragua','Niger','Nigeria','Niue','Korea','Mariana','Norway','Oman','Pakistan','Palau','Palestine','Panama','Papua','Paraguay','Peru','Philippines','Pitcairn','Poland','Portugal','Puerto','Rico','Qatar','Reunion','Romania','Russia','Rwanda','Samoa','Marino','Saudi','Arabia','Senegal','Seychelles','Sierra','Leone','Singapore','Slovakia','Slovenia','Somalia','Spain','Sudan','Suriname','Swaziland','Sweden','Switzerland','Syria','Taiwan','Tajikistan','Tanzania','Thailand','Togo','Tokelau','Tonga','Trinidad','Tobago','Tunisia','Turkey','Turkmenistan','Tuvalu','Uganda','Ukraine','Britain','England','Scotland','Wales','America','Uruguay','Uzbekistan','Vanuatu','Vatican','Venezuela','Vietnam','Wallis','Futuna','Sahara','Yemen','Yugoslavia','Zambia','Zimbabwe']

import random

class Mdict:
    def __init__(self):
        self.d = {}
    def __getitem__(self, key):
        if key in self.d:
            return self.d[key]
        else:
            raise KeyError(key)
    def add_key(self, prefix, suffix):
        if prefix in self.d:
            self.d[prefix].append(suffix)
        else:
            self.d[prefix] = [suffix]
    def get_suffix(self,prefix):
        l = self[prefix]
        return random.choice(l)

class MName:
    # A name from a Markov chain
    def __init__(self, chainlen = 2):
        # Building the dictionary
        if chainlen > 10 or chainlen < 1:
            print "Chain length must be between 1 and 10, inclusive"
            sys.exit(0)

        self.mcd = Mdict()
        oldnames = []
        self.chainlen = chainlen

        for l in PLACES:
            l = l.strip()
            oldnames.append(l)
            s = " " * chainlen + l
            for n in range(0,len(l)):
                self.mcd.add_key(s[n:n+chainlen], s[n+chainlen])
            self.mcd.add_key(s[len(l):len(l)+chainlen], "\n")

    def New(self):
        # New name from the Markov chain
        prefix = " " * self.chainlen
        name = ""
        suffix = ""
        while True:
            suffix = self.mcd.get_suffix(prefix)
            if suffix == "\n" or len(name) > 9:
                break
            else:
                name = name + suffix
                prefix = prefix[1:] + suffix
        return name.capitalize()

for i in range(100):
    print MName().New()
Reveal More
Added over 1 year ago

jQuery Plugin: Excerpt Text + Show More

(function($) {

  $.fn.textExcerpt = function(options) {
    var settings = $.extend({}, $.fn.textExcerpt.defaults, options);

    return this.each(function() {

      var $container = $(this);
      var fullText = $container.text();
      var fullTextLength = fullText.length;
      var excerpt = fullText.substring(0, settings.excerptLength);
      var showMoreText = fullText.substring(settings.excerptLength);

      if (fullTextLength > (settings.excerptLength + settings.fudge)) {

        $container.html(excerpt + ('<span class="tl_show_more_text">' + showMoreText + '</span>'));

        $('<a id="tl_show_more">' + settings.revealLabel + '</a>')
          .appendTo($container)
          .toggle(function() {
            $container.find('span.tl_show_more_text').slideDown();
            $(this).text(settings.hideLabel);
          }, function() {
            $container.find('span.tl_show_more_text').slideUp();
            $(this).text(settings.revealLabel);
          });

        $container.find('span.tl_show_more_text').hide();

      }

    });

  };

  $.fn.textExcerpt.defaults = {
    excerptLength: 700,
    fudge: 100,
    revealLabel: "Show More",
    hideLabel: "Show Less"
  };

})( jQuery );
Reveal More
Added almost 2 years ago

jQuery Plugin Template

(function($) {
  
  $.fn.pluginName = function(options) {
    var settings = $.extend({}, $.fn.pluginName.defaults, options);

    return this.each(function() {
      //code
    });

  };

  $.fn.pluginName.defaults = {
    defaultName: "default"
  };

})(jQuery);
Reveal More
Added almost 2 years ago

Re: Support Touch Events?

// Support for touch events?
// This current fails under Chrome 5 because the Chrome team has enabled TouchEvents in the broswer for all devices
// Added check for Chrome; no touch events for you!
// More here: http://groups.google.com/a/chromium.org/group/chromium-html5/browse_thread/thread/b20fb37936ea9196
// And here: http://code.google.com/p/chromium/issues/detail?id=36415#c11

function suportsTouchEvents(){
  if(/chrome/.test(navigator.userAgent.toLowerCase())) {
    return false;
  }
  if("createTouch" in document) {
    return true;
  }
  try{
    var event = document.createEvent("TouchEvent");
    return !!event.initTouchEvent;
  }catch(error){
    return false;
  }
}
Reveal More
Added about 2 years ago

Support Touch Events?

// Support for touch events?
// This current fails under Chrome 5 because the Chrome team has enabled TouchEvents in the broswer for all devices
// More here: http://groups.google.com/a/chromium.org/group/chromium-html5/browse_thread/thread/b20fb37936ea9196
// And here: http://code.google.com/p/chromium/issues/detail?id=36415#c11

function suportsTouchEvents(){
  if("createTouch" in document) {
    return true;
  }
  try{
    var event = document.createEvent("TouchEvent");
    return !!event.initTouchEvent;
  }catch(error){
    return false;
  }
}
Reveal More
Added about 2 years ago

Duplicate MySQL DB directly to another

mysqldump --opt --compress --user=USERHERE --password=PWHERE --host=SOURCE.HOST.HERE SOURCE_DB_NAME | 
mysql --user=USERHERE --password=PWHERE --host=TARGET.HOST.HERE -D TARGET_DB_NAME -C TARGET_DB_NAME
Reveal More
Added about 2 years ago

jQuery :above-the-fold Selector

// This is currently not playing nice in IE7 -- working on a fix


// $('div:above-the-fold') checks to see if the div is above the fold (of the window)
// $('li:last:above-the-fold(div)') checks to see if the last li is above the fold of the div

$.extend($.expr[':'], {
  "above-the-fold": function(a, i, m) {
    var container = m[3];
    var fold;
    if (typeof container === "undefined") {
      fold = $(window).height() + $(window).scrollTop();
    } else {
      if ($(container).length == 0 || $(container).offset().top == null) return false;
      fold = $(container).offset().top + $(container).height();
    }
    return fold >= $(a).offset().top;
  } 
});
Reveal More
Added about 2 years ago

Disallow Text Selection

/* IE, FF/Moz, WebKit, CSS3 */
element.onselectstart = function() { return false; };
element.style.MozUserSelect = 'none';
element.style.WebkitUserSelect = 'none';
element.style.UserSelect = 'none';
Reveal More
Added over 2 years ago

CSS Rotation Transform in Webkit

/* Nice little effect (webkit-only) from butterlabel.com */

#box {
  -webkit-box-shadow: 20px 20px 8px rgba(0,0,0,0.2);  
  -webkit-transform: rotate(-2deg);
  -webkit-transition: -webkit-transform 0.3s ease, -webkit-box-shadow 0.3s ease;
}

#box:hover {
  -webkit-transform: rotate(0deg);
  -webkit-box-shadow: 1px 1px 1px rgba(0,0,0,0.8);
}
Reveal More
Added over 2 years ago

Re: Re: nginx launchd item for mac os x

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>nginx</string>
<key>Program</key>
<string>/opt/nginx/sbin/nginx</string>
<key>KeepAlive</key>
<true/>
<key>StandardErrorPath</key>
<string>/opt/nginx/logs/error.log</string>
<key>LaunchOnlyOnce</key>
<true/>
</dict>
</plist>
Reveal More
Added over 2 years ago

Asynchronous jQuery Image Loader Plugin

(function($) {
  
  $.fn.imageAsync = function(options) {
      var settings = $.extend({}, $.fn.imageAsync.defaults, options);

      return this.each(function() {
        
        if( $(this).attr('src') ) {
          
          var originalImageSrc = $(this).attr('src');
          var imgHeight = $(this + '[height]').attr('height') || settings.h; // bug in firefox: even if img has no height attr, it will come back as 16
          var imgWidth = $(this + '[width]').attr('width') || settings.w;

// bug in Firefox when setting src='' OR removing src attribute which causes a double request for an image
// A better idea would be to set source to a very small, 1x1 gif
                  
          var originalImage = $(this)
            .attr('src','dot-clear-1x1.gif') 
            .wrap('<span class="' + settings.progressClassName + '"></span>')
            .parent('span')
            .css('display','inline-block')
            .width(imgWidth)
            .height(imgHeight);

          var img = new Image();
          $(img)  
            .load(function() { originalImage.replaceWith(this); })
            .error(function() { })
            .attr('src', originalImageSrc)
            .attr('width', imgWidth)
            .attr('height', imgHeight);            
        
        }

     });

  }

  $.fn.imageAsync.defaults = {
		progressClassName: "progress"
	};

})(jQuery);
Reveal More
Added over 2 years ago
Post Code