A web developer, architect, & aspiring RESTafarian's thoughts on software, web tech, entrepreneurial endeavors and some creative ideas. Mark's current focus is on developing elastic & RESTful Ajax applications on the Cloud with the following technologies: OO and unobtrusive JavaScript using the Prototype JS library, jQuery, and on the server side prefers to write OO code in Ruby, Rails; Amazon EC2 AS3 SimpleDB; mySQL; -- currently learning a new language each year and groking Unix
Friday, December 25, 2009
home network and backups: NAS convenience & simplicity
Friday, December 18, 2009
DNS hijack - high level explanation
A bunch of servers exist throughout the internet which map friendly human readable names (twitter.com, eyeonmajors.com) to IP addresses. These are DNS servers (Domain Name System servers) -- phonebook for the internet. When you type in "tigerwoods.com" to see his latest transgression admission, along the way DNS is queried and you are directed to the mapping to that IP address which presents the html and images of Tiger's statement.
A DNS hijack... is when the evil doers redirect the mapping, to a mapping of their own choosing. E.g. instead of twitter.com pointing to twitter's actual IP address, they point it to the IP of their own website where they can display whatever they want. (hey, maybe Tiger never admitted anything, and it is an ongoing DNS hijack?)
Once they have accomplished the hard part of hijacking DNS... it's very easy to create a landing page that looks identical in every way to the real site, but is in fact run by someone else. Look, Virginia, it even has the same URL. Looks legit, but is not. When people try to log in, the criminals setting up these sites can simply grab and store the username and password of the person attempting to login (phishing) for malicious uses.
So when/how can you be sure? HTTPS and SSL certificates can ensure that the site you are attempting to reach is the actual site. The site has been "notarized" in effect by an SSL cert, and while the evil doers can fake the look of a site and in some cases can even hijack the domain name (as they did with Twitter), they can't fake an SSL cert** -- it is bound to the domain name itself. (Not all sites use https and ssl certs)
...
http://twitter.com/coda/status/6789759675
Holts
** can't fake an SSL cert... unless the cert was encrypted using an MD5 hash, and the hacker had access to one or more PlayStation3's. ;)
Sunday, August 09, 2009
lawn improvement
Better improvement in ~4-5 days than expected, it's filling in nicely. The 16 point sprinkler ($14.95) in the last two!
Wednesday, August 05, 2009
microformats ftw

Maybe not "cool" to say so, but MySpace++. Love the initiative to push forward with Microformats. µFormats ftw
Here's how MySpace's plan is unlike what Facebook is doing. The updates will be marked up for the types of activities they represent with standardized microformat code, beginning with the events format hCal and soon to include the book, movie or other review format hReview. Those little bits of code that will be added could have big consequences.
Keller says the company acknowledges that this won't be a small task for third-party developers, so in the meantime she is working on automated methods of pulling user data in from other sites' Application Programming Interfaces (APIs) and marking them up automatically, with the microformat code communicating what kind of updates they are (events, reviews, etc.)
programmable sprinkler
http://www99.epinions.com/
grok-ing POSH
http://www.w3.org/QA/Tips/
http://www.w3.org/2001/tag/
Google acquires On2 (video compression)
App Store censors a dictionary?
In other words, not only must the dictionary be censored — a dictionary — but even after being purged of “objectionable” words it would only be considered with a 17+ rating. Even after agreeing to these terms, it took another two weeks for Ninjawords to appear in the App Store. According to Crosby, “We gave in and said fine, hoping that we could get on the App Store immediately since the solution to their rejection was a simple metadata change. However, the App Store reviewer would have none of that. We would have to resubmit an entirely new binary and get to the back of the queue before they would look at it again.”
Ajax API team leaves Google for VMWare
Monday, May 25, 2009
Erlang -- let's get it on!
So I'm working my way through this book: Programming Erlang: Software for a Concurrent World http://pragprog.com/titles/jaerlang/programming-erlang
mark_holton ~$ sudo port install erlang
---> Fetching gawk
---> Attempting to fetch gawk-3.1.6.tar.bz2 from http://mirrors.kernel.org/gnu/gawk
---> Verifying checksum(s) for gawk
---> Extracting gawk
---> Configuring gawk
---> Building gawk
---> Staging gawk into destroot
---> Installing gawk @3.1.6_0
---> Activating gawk @3.1.6_0
---> Cleaning gawk
---> Fetching tcl
---> Attempting to fetch tcl8.5.6-src.tar.gz from http://superb-west.dl.sourceforge.net/tcl
---> Verifying checksum(s) for tcl
---> Extracting tcl
---> Configuring tcl
---> Building tcl
---> Staging tcl into destroot
---> Installing tcl @8.5.6_0
---> Activating tcl @8.5.6_0
---> Cleaning tcl
---> Fetching tk
---> Attempting to fetch tk8.5.6-src.tar.gz from http://superb-west.dl.sourceforge.net/tcl
---> Verifying checksum(s) for tk
---> Extracting tk
---> Configuring tk
---> Building tk
---> Staging tk into destroot
---> Installing tk @8.5.6_0
---> Activating tk @8.5.6_0
---> Cleaning tk
---> Fetching erlang
---> Attempting to fetch otp_src_R12B-5.tar.gz from http://distfiles.macports.org/erlang
---> Attempting to fetch otp_doc_man_R12B-5.tar.gz from http://distfiles.macports.org/erlang
---> Attempting to fetch otp_doc_html_R12B-5.tar.gz from http://distfiles.macports.org/erlang
---> Verifying checksum(s) for erlang
---> Extracting erlang
---> Applying patches to erlang
---> Configuring erlang
---> Building erlang
Wednesday, February 18, 2009
internationalization

...since I'm going to have to speak Spanish in Alhambra, CA during the AT&T work stoppage... I might as well incorporate that into my web applications and "make lemonade" as the saying goes.
That's just a positive spin on having to go there. We coincidentally have homework due next week related to internationalization.
Been writing the Depot app via the PragProg book in Rails, but am doing so via Test Driven Development (slightly different from the book, per the awesome teaching of @tenderlove in the UWRails class -- this is the 2nd time I've taken this 3 month Rails class, and learning a ton more about Rails 2.2 and especially TDD)... am getting to the part where I'm incorporating internationalization.
I like this i18n features built into Rails, so I figured I'd blog about it, in case anyone else was interested: so certain items have translations. E.g. headers, titles, shopping carts, buttons, links -- not the data in the database, but all the labels and text that would help a user navigate through the application.
The translations are handled in a YAML file, which lets you call out the translation that matches it's hierarchy -- as shown below (Spanish, "es" shown here, there is an accompanying translation file for English, or "en"... could continue on as many languages as you wanted):
http://gist.github.com/66782
So the user sets their language preference via the dropdown (English is default, but they can choose whatever they want), then voila all labels that have a translation appear in that language selected! How does that work? Inside the code for all the pages, it just effectively says "give me whatever language is selected for layout.side.home, etc., and looks it up in the YAML file for that language above, grabs the matching value in that hierarchy, and out pops the word or phrase. For example, the markup for the sidebar links for "store", "questions", "news", "contact" look like this:
http://gist.github.com/66788
This is a common example, and almost identical to the example in the PragProg Agile Rails version 3 book -- maybe armed with this knowledge, I'll internationalize EyeOnMajors and Golfap as soon as it is riding on the Rails... :)
Giddyup.
Holts
Sunday, February 08, 2009
Get Satisfaction -- customer dialogue
http://getsatisfaction.com/eyeonmajors
Tuesday, February 03, 2009
forcing repaint DOM in IE6 and IE7?
I have tried IE hacks such as adding a class to the div, and dropping a class from the div, adding and dropping child nodes from the div, etc -- to attempt to force IE to repaint, I have tried waiting a small interval, to no avail. If you pop up an alert("hai"); at the end of the iteration, the the IE6 and IE7 DOM will repaint with the updated values. (btw, how dumb is that?)
Does anybody have any tried and true ways to make IE6 or IE7 repaint a particular DOM element in these cases (without obviously popping an alert)? It works flawlessly in Firefox. I know IE is a steaming pile, but just wondering if anyone has had any success with a hack that works here.
Wednesday, January 28, 2009
Recommended Ruby, Rails, REST books!
:Mark
RESTful Web Services
The Ruby Way, Second Edition: Solutions and Techniques in Ruby Programming (2nd Edition) (Addison-Wesley Professional Ruby Series)
The Rails Way (Addison-Wesley Professional Ruby Series)
Design Patterns in Ruby (Addison-Wesley Professional Ruby Series)
Ruby for Rails: Ruby Techniques for Rails Developers
Prototype and Scriptaculous in Action [Ajax]
Advanced Rails Recipes
Developing Facebook Platform Applications with Rails (Pragmatic Programmers)
Agile Web Development with Rails, 2nd Edition
Thursday, January 22, 2009
'Daemon' by Daniel Suarez
Friday, January 16, 2009
'carl_spackler' about to get ORM-ified
...this weekend...going to convert any [current 'carl_spackler'] database queries that are mysql-specific, into ActiveRecord calls. This way, someone is just one adapter change away from using their database, any db they want that ActiveRecord supports, with Spackler. ...but really, it will make things easy for me to write to my db using the ActiveRecord syntactical sugar. Laziness... a virtue!
ActiveRecord::Base.establish_connection({
:adapter => "sqlite",
:dbfile => "db/mygolfdb.sqlite"
})
Sunday, January 11, 2009
normalizing up 3 part names -- initial stake in ground
There are ZERO orphans in the 2008 PGATour data right now. Have collected each and every player's data for 36 tournaments in 2008. Including any other 3 part names.
The Player class is not in its ultimate form, but it is there and it splits names appropriately... still doesn't flatten special wacky characters and I'm not using any Bayesian techniques yet, but takes care of the 3 part names accurately: Jose Maria Olazabal, David Berganio Jr., Davis Love III, etc, etc.... also had to RegEx out of things like "Davis Love III (PB)"... the (PB) indicating the course name.
re = /\(\w{2}\)/...re-scraping about 75 tournaments for PGA and Euro Tour with new names in the next 15 mins... pushed the new code to the carl_spackler GitHub repo .
processed = name.gsub(re, "")
CARL_SPACKLER::Player class:
Friday, January 02, 2009
vote for GitHub
http://crunchies2008.techcrunch.com/votes/?nominee_id=8&category_id=2