<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ref="http://purl.org/rss/1.0/modules/reference/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/">
	<channel rdf:about="http://personal.oatmealandcoffee.com/blog/rss.rdf">
		<title>Oatmeal &amp; Coffee by Philip Regan</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php</link>
		<description><![CDATA[Oatmeal &amp; Coffee © Philip Regan. All Rights Reserved<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-3996440-1");
pageTracker._initData();
pageTracker._trackPageview();
</script>]]></description>
		<items>
			<rdf:Seq>
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100717-195624" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100715-212803" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100715-183938" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100627-070255" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100621-211632" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100621-210322" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100616-060113" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100614-181504" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100609-210745" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100608-213343" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100606-204209" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100603-203617" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100520-184755" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100510-202844" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100510-202025" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100504-020922" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100430-062636" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100429-034153" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100428-063042" />
				<rdf:li resource="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100425-113103" />
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100717-195624">
		<title>Can we all stop talking about the iPhone 4 now and get on with our lives?</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100717-195624</link>
		<description><![CDATA[From <a href="http://iphonedevelopment.blogspot.com/2010/07/on-swords-perspective-and-spin.html" target="_blank" >Jeff LaMarche&#039;s excellent review of the iPhone 4 antenna issue post-press conference...</a><br /><blockquote><br />Although I thought Apple started off a little too defensive yesterday, when you boil it down, I thought they did the right thing. If you&#039;re having a problem and a case can fix it, here, have a free case. If you already bought a case, they&#039;ll refund the money you paid for that case. If you bought an iPhone 4 and the problem keeps you from being able to use or enjoy your phone, they&#039;ll take it back, no restocking fee, no questions asked...<br /><br />The iPhone is a consumer product. It&#039;s like off-the-rack clothing. It&#039;s not custom tailored to any one individual. It&#039;s the product of a long series of design decisions trying to make the best product for the largest section of the population. If you&#039;re an outlier - if you&#039;re one of those people for whom the issue is preventing you from using the phone, put it in a free case, or bring it back. Apple will give you your money back, AT&amp;T will let you out of your contract. No questions asked, no restocking fee. You&#039;re then free to go find a phone that works better for you.<br /><br />If you want or expect more than that, you&#039;ve got pretty serious entitlement issues. If you don&#039;t want to do that because you think you can&#039;t find a better phone, then maybe you need to re-assess your own perspective.<br /></blockquote><br /><br />That&#039;s exactly how I felt after the whole presentation. This is now done as far as I&#039;m concerned. Maybe everyone, especially a certain grandstanding senator from NY running for re-election should get back to putting the heat on <a href="http://www.bp.com/" target="_blank" >those jerks over at BP</a>, you know something actually more important than a phone, no matter how good it is.<br /><br />Man, I really loathe the press these days.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100715-212803">
		<title>Typesetting</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100715-212803</link>
		<description><![CDATA[I&#039;ve started paying attention to the conversations on LinkedIn related to my industry. A lot of link bait from consultants, but sometimes good questions come up, and sometimes I see one that blurs the line a bit. At least it isn&#039;t a shouting match like most other forums I used to frequent.<br /><br /><b>Is it time to ditch high cost “Typesetting” or “Page layout” tools?</b><br />My response:<br /><br /><blockquote>As displays and content display engines get more complex on mobile devices, so will the need for more complex layout. While there is only so much screen real estate on an app phone, going from an app phone to a larger device will mean readers will have higher expectations on presentation of content. Remember, just because there is higher resolution on the iPhone&#039;s retina display, it doesn&#039;t mean that you can fit more content on the screen, it means it just looks nicer. Adobe has begun to figure this out with the recent Wired application, though that clearly still needs work before releasing it to the mainstream. <br /><br />Most terms and concepts that we use to create layouts for print apply in the digital realm; fonts and point sizes are still the same, and typesetting is still a synonym for composition, but finding a suitable replacement for pasteboard is going to be tough. <br /><br />What really needs to happen is the technologies (e.g., schemas and languages) used to create and view our digitally-viewed content need to evolve to better manage dynamic layouts that adapt to the variety of screen sizes users will expect the content to present nicely within them. That&#039;s worth a lot of money to the people that care about a good user experience.</blockquote>]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100715-183938">
		<title>A dictionary class for Applescript</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100715-183938</link>
		<description><![CDATA[I&#039;ve been clocking a lot of hours in Applescript lately. The company I work for is making the push to CS4 and Snow Leopard, and by result a whole host of crucial scripts need to be upgraded. After having spent some time in other, more robust, technically-oriented languages, I&#039;ve been frustrated by Applescript&#039;s lack of various classes and data types easily found on REALbasic and Cocoa. In particular, I&#039;ve been missing dictionaries.<br /><br />The problem I am currently trying to solve is that I am, more or less, combining the functionality of two monolithic scripts that weigh in at about 2000+ lines each. Their core functionality is different—they create different layouts in different applications—but the content model and the surrounding subroutines that handle files, data manipulation are pretty much the same. So, the idea is to merge the duplicate code and route accordingly. There are differences between the two, and that is where the dictionary came in: a place to put the content as needed for a particular product and send it to the script that needs that content.<br /><br />The record class in Applescript does a lot of the same work as a dictionary, but it isn&#039;t dynamic in any way other than changing values for keys. Keys for key-value pairs are hard-coded, keys can only be strings (because they are hard-coded), and there is no way to iterate through the keys (and thus the values) once a record is created. But in my current problem, if I used the native record class, I would have a lot of key-value pairs that would hang out empty, and that would cause more error-handling than I would care for. This simple class gives all of the core functionality of a dictionary in native Applescript form. The code at the bottom of the page is copy-and-paste ready into your own scripts.<br /><br /><h1> Documentation </h1><br /><br /><h2> Introduction </h2><br /><br />Essentially, the class is a wrapper for a private list of records with the format <code>{key:data, value:data}</code>. When a key is accessed, it is essentially going down the list looking for the first record with the given key and acting accordingly based on whether it finds one or not. <br /><br />Because it is iterating through a list, using this class can get expensive with large amounts of data. There is some data checking that can be toggled on and off, but Applescript is generally slow to begin with so there isn&#039;t too much that can be done about it. But, as I see it, the benefits in functionality outweigh any speed issues. Otherwise, this is light, flexible, and designed to be extensible when need be.<br /><br />Applescript does a lot heavy-lifting for you; you don&#039;t get access to specific data comparison methods (either something equals something else or it doesn&#039;t), data is loosely-typed (almost too much), and coersion is done for you for the most part. By result, there aren&#039;t a lot of tools at our disposal for creating something like this, but there is enough to create a modest yet functioning dictionary.<br /><br />Also, convenience methods are easy to create as well:<br /><br /><pre>
on MakeDictionaryWithValuesAndKeys(someValues, someKeys) -- (list, list) as OCDictionary
	set newDictionary to MakeDictionary() of me
	tell newDictionary
		set valuesAdded to addValuesForKeys(someValues, someKeys)
	end tell
	return newDictionary
end MakeDictionaryWithValuesAndKeys

-- simply call with:
-- set newDictionary to MakeDictionaryWithValuesAndKeys({"ack", "greeble", "ponies"}, {"ACK", "GREEBLE", "PONIES"}) of me
</pre><br /><br />This class uses the Script Object features of Applescript, which is essentially allowing custom OOP-style objects in Applescript complete with inheritance. The caveat is that doing this can be &#039;&#039;very&#039;&#039; resource and memory intensive (but, then, what <i>isn&#039;t</i> in Applescript). If you aren&#039;t familiar with Script Objects, then I highly suggest you read the Applescript Language Guide, but essentially all of the action, the class in of itself, is held within the <code>script OCDictionary...end script</code> block within the <code>MakeDictionary()</code> subroutine.<br /><br /><h2> <code>run{}</code> </h2><br />This subroutine offers examples of syntax and functionality. This combined with the <code>MakeDictionary()</code> subroutine makes for a fully working script.<br /><br /><h2> <code>MakeDictionary() -- as OCDictionary</code></h2><br />If Script Objects are to be used, they need to be declared and returned, and that is all this subroutine does. This contains the entire OCDictionary declaration, so just copy and paste into your script and call with the simple<br /><br /><code><br />set testDictionary to MakeDictionary() of me<br /></code><br /><br /><h2> <code>hasKey(aKey) -- (object) as boolean</code></h2><br />Simple function that will return whether a key exists or not.<br /><br /><h2> <code>toggleDataIntegrityChecks() -- as boolean</code></h2><br />This toggles the data integrity checks. Data integrity is checked on keys and values being sent to the class. That check is very simple—only checking for null or empty list values—so it&#039;s very fast, but when compiled over time, it can add up.<br /><br /><h2> <code>getKeys() -- as list</code></h2><br />Returns a list of all the keys found in all the records. If there are no records, it will return an empty list<br /><br /><h2> <code>setValueForKey(aValue, aKey) -- (object, object) as boolean</code></h2><br />False can be returned if data integrity checking is enabled and either the key or the value is invalid. Otherwise, this always returns true because of a key doesn&#039;t exist, it will create a new key-value pair.<br /><br /><h2> <code>valueForKey(aKey) -- (object) as object or (kOCDictionary_ValueNotFound as string)</code></h2><br />This returns the given value for a key, regardless if that value is null or not. If it cannot find a value for that key because the key does not exist, it returns the internal error <code>&quot;kOCDictionary_ValueNotFound&quot;</code>.<br /><br /><h2> <code>addValuesForKeys(someValues, someKeys) -- (list, list) -- as boolean</code></h2><br />This allows the addition of multiple keys and values as lists. If data integrity checking is on, then the subroutine checks to make sure there are no empty lists and that they have a one-to-one relationship with each other (i.e., both list lengths are the same. The order of both is entirely up to you). Any error along those lines returns false and nothing is added to the dictionary. If data integrity is off, the lists are added &quot;as is&quot; and can result in null values in the dictionary.<br /><br /><h2> <code>dictionaryIntegrityCheck(verboseFlag) -- (boolean) as boolean</code></h2><br />This is added as a convenience method to check is any values are either null or have empty lists. The verbose flag will send basic information about key-value pairs to the Applescript log when errors are found.<br /><br /><h1> The Code </h1><br /><br /><pre>
on run {}
	
	set testDictionary to MakeDictionary() of me
	
	tell testDictionary
		
		(* Basic Operations *)
		
		(* Add a value and Key *)
		
		log "setValueForKey(oop, OOP)"
		set valueForKeySet to setValueForKey("oop", "OOP")
		log valueForKeySet
		
		(* Add a list of values and keys *)
		
		log "addValuesForKeys({ack, greeble, ponies}, {ACK, GREEBLE, PONIES})"
		set valuesAddedForKeys to addValuesForKeys({"ack", "greeble", "ponies"}, {"ACK", "GREEBLE", "PONIES"})
		log valuesAddedForKeys
		
		(* Get and set values for keys *)
		
		log "setValueForKey(\"Luc Teyssier\", OOP)"
		set valueSetForKey to setValueForKey("Luc Teyssier", "OOP")
		log valueSetForKey
		
		log "set myValueForKey to valueForKey(OOP)"
		set myValueForKey to valueForKey("OOP")
		log myValueForKey
		
		(* Get all of the keys and iterate through the pairs *)
		
		log "set theKeys to getKeys()"
		set theKeys to getKeys()
		log theKeys
		
		log "iterate through all keys"
		set lastKey to (count theKeys)
		repeat with k from 1 to lastKey
			set theKey to item k of theKeys
			set theValue to valueForKey(theKey)
			log {theKey, theValue}
		end repeat
		
		(* Operations That Will Cause Errors *)
		
		log "toggleDataIntegrityChecks()"
		log toggleDataIntegrityChecks()
		
		log "setValueForKey(emptyValueList, emptyKeyList)"
		log setValueForKey({}, {})
		-- nothing should be added to keys or values, 
		-- but since we turned off data integrity checks, 
		-- we get it added but the report catches it
		
		log "addValuesForKeys(unmatchedValueList, unmatchedKeyList)"
		log addValuesForKeys({"Kate", "Charlie"}, {"Jean-Paul Cardon", "Bob", "Juliette", "Concierge"})
		-- we should see errors in the log and nothing added
		
		log "keyFound to hasKey(supercalifrajilisticexpialidocious)"
		set keyFound to hasKey("supercalifrajilisticexpialidocious")
		log keyFound
		-- we should get back a false here
		
		log "set theValueForKey to valueForKey(supercalifrajilisticexpialidocious)"
		set theValueForKey to valueForKey("supercalifrajilisticexpialidocious")
		log theValueForKey
		-- we should get back the kOCDictionary_ValueNotFound error message here
		
		(* Check to make sure our data is clean so we don't mess up operations later *)
		
		log "set dictionaryIsSafe to dictionaryIntegrityCheck(true)"
		set dictionaryIsSafe to dictionaryIntegrityCheck(true)
		log dictionaryIsSafe
		
	end tell
	
end run

on MakeDictionary() -- as OCDictionary
	
	script OCDictionary
		
		(* Public properties *)
		
		property kOCDictionary_ValueNotFound : "kOCDictionary_ValueNotFound"
		
		(* Private properties *)
		
		property __keyValuePairs : {}
		
		property __kOCDictionary_NoStoredKeys : -1
		property __kOCDictionary_KeyNotFound : -2
		property __kOCDictionary_InvalidKey : -3
		
		property __kKeyIndexErrors : {__kOCDictionary_NoStoredKeys, __kOCDictionary_KeyNotFound, __kOCDictionary_InvalidKey}
		
		property __checkDataIntegrity : true
		
		(* Public SubRoutines *)
		
		to hasKey(aKey) -- (object) as boolean
			
			set keyValueIndex to __indexOfKey(aKey) of me
			
			if keyValueIndex is in __kKeyIndexErrors then
				return false
			end if
			
			return true
		end hasKey
		
		to toggleDataIntegrityChecks() -- as boolean
			if __checkDataIntegrity = true then
				set __checkDataIntegrity to false
			else
				set __checkDataIntegrity to true
			end if
			return __checkDataIntegrity
		end toggleDataIntegrityChecks
		
		to getKeys() -- as list
			set keyList to {}
			
			set keyValuePairCount to (count __keyValuePairs)
			
			if keyValuePairCount = 0 then
				return keyList
			end if
			
			repeat with thisKeyValuePair from 1 to keyValuePairCount
				set theKeyValuePair to item thisKeyValuePair of __keyValuePairs
				set theKey to key of theKeyValuePair
				set end of keyList to theKey
			end repeat
			
			return keyList
		end getKeys
		
		to setValueForKey(aValue, aKey) -- (object, object) as boolean
			
			if __checkDataIntegrity then
				set aValuePassed to __dataIntegrityCheck(aValue)
				set aKeyPassed to __dataIntegrityCheck(aKey)
				if not (aValuePassed) or not aKeyPassed then return false
			end if
			
			set keyValueIndex to __indexOfKey(aKey) of me
			
			if keyValueIndex is in {__kOCDictionary_NoStoredKeys, __kOCDictionary_KeyNotFound} then
				set newKeyValuePair to __makeKeyValuePairWithKeyAndValue(aKey, aValue) of me
				set end of __keyValuePairs to newKeyValuePair
			else
				set theKeyValuePair to item keyValueIndex of __keyValuePairs
				set value of theKeyValuePair to aValue
			end if
			
			return true
			
		end setValueForKey
		
		to valueForKey(aKey) -- (object) as object or (kOCDictionary_ValueNotFound as string)
			set keyValueIndex to __indexOfKey(aKey) of me
			
			if keyValueIndex is in __kKeyIndexErrors then
				return kOCDictionary_ValueNotFound
			end if
			
			set theKeyValuePair to item keyValueIndex of __keyValuePairs
			set theValue to value of theKeyValuePair
			
			return theValue
		end valueForKey
		
		to addValuesForKeys(someValues, someKeys) -- (list, list) -- as boolean
			
			set keysCount to (count someKeys)
			set valuesCount to (count someValues)
			
			if __checkDataIntegrity then
				
				if keysCount &#8800; valuesCount then return false
				if keysCount = 0 and valuesCount &#8800; 0 then return false
				if keysCount &#8800; 0 and valuesCount = 0 then return false
				
			end if
			
			set keysCount to (count someKeys)
			repeat with thisKey from 1 to keysCount
				try
					set theKey to item thisKey of someKeys
					set theValue to item thisKey of someValues
					set newKeyValuePair to __makeKeyValuePairWithKeyAndValue(theKey, theValue) of me
					set end of __keyValuePairs to newKeyValuePair
				on error
					-- fail silently
				end try
			end repeat
			
			return true
		end addValuesForKeys
		
		to dictionaryIntegrityCheck(verboseFlag) -- (boolean) as boolean
			
			set dictionaryIsClean to true
			
			set keyValuePairCount to (count __keyValuePairs)
			if keyValuePairCount = 0 then return (dictionaryIsClean = true)
			
			
			repeat with thisKeyValuePair from 1 to keyValuePairCount
				set theKeyValuePair to item thisKeyValuePair of __keyValuePairs
				
				set theKey to key of theKeyValuePair
				set theValue to value of theKeyValuePair
				
				set theKeyPassed to __dataIntegrityCheck(theKey)
				set theValuePassed to __dataIntegrityCheck(theValue)
				
				if not theKeyPassed or not theValuePassed then
					set dictionaryIsClean to false
					
					if verboseFlag then
						set recordErrors to {}
						
						set end of recordErrors to "__keyValuePair(" & thisKeyValuePair & ")"
						set end of recordErrors to theKeyValuePair
						
						if not theKeyPassed then
							set end of recordErrors to "key is null or is an empty list"
						end if
						
						if not theValuePassed then
							set end of recordErrors to "value is null or is an empty list"
						end if
						
						log recordErrors
						
					end if
				end if
			end repeat
			
			return dictionaryIsClean
		end dictionaryIntegrityCheck
		
		(* 
		Private Subroutines
		All error checking is done before we get to these methods, so these should not be called directly.
		*)
		
		to __makeKeyValuePairWithKeyAndValue(aKey, aValue) -- (object, object) as record
			(* Factory method for key-value pair records *)
			set keyValuePair to {key:aKey, value:aValue}
			return keyValuePair
		end __makeKeyValuePairWithKeyAndValue
		
		to __indexOfKey(aKey) -- (object) as integer
			(* This subroutine combined with the __keyValuePairs property is really the crux of the whole class *)
			
			if aKey = null then return __kOCDictionary_InvalidKey
			
			set keyValuePairCount to (count __keyValuePairs)
			
			if keyValuePairCount = 0 then
				return __kOCDictionary_NoStoredKeys
			else
				repeat with thisKeyValuePair from 1 to keyValuePairCount
					set theKeyValuePair to item thisKeyValuePair of __keyValuePairs
					set theKey to key of theKeyValuePair
					if aKey = theKey then
						return thisKeyValuePair
					end if
				end repeat
			end if
			
			return __kOCDictionary_KeyNotFound
		end __indexOfKey
		
		to __dataIntegrityCheck(newData) -- (object) as boolean
			(* This offers only very basic checks: null or empty lists *)
			
			if newData = null then
				return false
			end if
			
			try
				set itemCount to (count newData)
				if itemCount = 0 then
					return false
				end if
			on error
				-- fail silently
			end try
			
			return true
		end __dataIntegrityCheck
		
	end script
	
	return OCDictionary
	
end MakeDictionary
</pre>]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100627-070255">
		<title>1 in 600,000</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100627-070255</link>
		<description><![CDATA[Yesterday morning, I went to the Natick Apple store to see if I could pick up a new iPhone 4 for Renée (AT&amp;T is still not giving the phone as an option to upgrade her line), but I walked away empty-handed. Thinking that since it was the first weekend day the iPhone was available, I got to the mall an hour before opening in the hopes of beating some of the crowds. Only there was no crowd; there was only the usual gaggle of people waiting in line with their Apple products for their Genius Bar appointments, and then they didn&#039;t show up until ten minutes before the store opened.<br /><br />Long story short (too late), they had no phones in stock and I was only able to place a reservation <i>a la</i> the iPad. The AT&amp;T stores were in the same situation. The time frame is mid-July if all goes right.<br /><br />So, that makes it official: I&#039;m the only one in my circle of Mac-using friends and colleagues that is one of the reported 600,000 to snag an iPhone 4 on opening day. I&#039;d like to thank the Academy and my agent.<br /><br />Maybe I should go buy a lottery ticket now.<br />]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100621-211632">
		<title>Bits and Bobs (The Child-Rearing Edition)</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100621-211632</link>
		<description><![CDATA[Crawling is a fundamental game-changer, and a highly dynamic, ever-escalating one, too.<br /><hr><br />Baby food can be both delicious and disgusting. I&#039;m constantly amazed at the things Amelia happily eats and surprised at the things she doesn&#039;t.<br /><hr><br />Seven-plus months into fatherhood on Father&#039;s Day (American), and I keep going back to the words my brother-in-law said to me early on: &quot;It doesn&#039;t get easier, but it does get better&quot;. Truer words have never been spoken, and that still remains the single best piece of advice I have been given so far. It&#039;s a lot of hard work, especially at the beginning, but we&#039;re having a blast now.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100621-210322">
		<title>Facebook</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100621-210322</link>
		<description><![CDATA[Trying to get Facebook to change their privacy policy so that it is tipped to the users is a losing battle. Facebook&#039;s entire business model is based on having the largest marketing database on an active user base possible, and it always has been. It&#039;s AOL: The Next Generation. The more you tell, the more you are worth to them, and the more they will open up your information without asking. Until a double-digit percentage users up and leave Facebook in one fell swoop, there is nothing that is going to change Facebook&#039;s attitude towards your content. Facebook has been so consistent in their policy-making, that I&#039;m no longer surprised at anything they do, but I find it almost laughable now when the users are surprised at Facebook&#039;s ham-handed changes in either direction. Users need to stop acting like the own the place, because they don&#039;t. Don&#039;t like it? Leave Facebook. It&#039;s that simple. Really. Whatever you were doing for entertainment before 2004 you could probably go right back to it again. I did and I have had <i>zero</i> regrets. ]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100616-060113">
		<title>iPhone</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100616-060113</link>
		<description><![CDATA[I need to buy two new iPhones—one for me and one for Renée who will be upgrading from this crummy little Samsung she has—and while Apple&#039;s site hasn&#039;t shown any signs of slowing down since yesterday morning, <i>anything</i> having to do with AT&amp;T&#039;s site is like pulling teeth. It&#039;s almost as if AT&amp;T doesn&#039;t want to sell me two phones. I eventually succeeded in getting mine yesterday late afternoon after trying all day. My impression from reading various websites is that access was a crap shoot at best, and with it being after 5:00p at the time I confirmed my order, I think I was treading into rush hour time when people were away from their computers while commuting so I was able to sneak in. I tried a couple more times before heading home to get Renée&#039;s, but to no avail. But once I got another chance at home after Amelia went to bed, AT&amp;T was all haywire again. Now here&#039;s the problem: I tried yet again this morning at around 5:30a to get my wife&#039;s iPhone and it&#039;s no longer featured on AT&amp;T&#039;s site, and is no longer a selection as on upgrade for her Samsung. So...does this mean I have to face the crowds at a store? Buying these phones has been nothing but a hassle.<br /><br /><b>UPDATE:</b> 24 hours and one AT&amp;T-declared system upgrade later, and I still can&#039;t order an iPhone for Renée. Apple&#039;s site is consistently telling me that I need to go to an Apple store to get set up, and AT&amp;T is still not even showing me the new iPhone as an option when I go to upgrade her phone. So, either there&#039;s something funky with my account (which wouldn&#039;t surprise me knowing AT&amp;T), or there is some not-clearly-enough stated rule about the number of phones I could by online (which wouldn&#039;t surprise me about either Apple or AT&amp;T). Frankly, I&#039;m not entirely sure why they should care on a clear upgrade. New lines, yes, but an upgrade? Lame.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100614-181504">
		<title>Bad Press</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100614-181504</link>
		<description><![CDATA[I read a fair bit of Mac-related press, mainly Mac-centric aggregators, but a few direct sources as well (e.g., Daring Fireball vs. MacWorld). Microsoft really doesn&#039;t enter my day too much, and even then only at work when some update to Office gets pushed out or I use Excel for a variety of unintended purposes. I don&#039;t get much Microsoft news unless it bubbles up to the mainstream press or the Mac press feels it is Mac-newsworthy, like updates to Microsoft software for the Mac or some comment by Steve Ballmer, an analyst, or crass columnist.<br /><br />Lately, it seems there hasn&#039;t been a week that goes by where some Mac site re-links to a PC World, eWeek, stock analyst article that bashes Apple in some way, usually uninformed, incorrect, and possibly even delusional. Lately this stuff has seemed to be particularly disparaging, more so than normal, and smelled a lot of link-bait as much as anything. Casual observation of my RSS collection shows I see a lot of this stuff via Daring Fireball (e.g., the always fun &quot;claim chowder&quot;) and the Macelope in Macworld. Most days I find it amusing, some days exhausting, other days annoyingly distracting, but interesting in the end to see just how wrong most non-Mac-using press is (whereupon I then wonder why they keep wasting their time). Also lately, I&#039;ve been annoyed that the Mac press has been filling my RSS feeds with such dreck; why link to articles that are clearly designed to simply generate page views and juicy ad clicks? Isn&#039;t it the axiom that the best way to defeat a taunter is to simply ignore them?<br /><br />But, despite my clear biases and after thinking about the current climate a bit, I feel I&#039;m detecting a bit of jealousy, if not outright anger, lately from the Microsoft-centric press towards Apple. And I don&#039;t think it&#039;s really about Apple, but more about Microsoft&#039;s recent inability to get anything done. It used to be that an Apple-bashing article by the Microsoft-centric press would be full of arguments that Mac users really wouldn&#039;t have much defense against—not widely accepted in corporate environments, Macs are mainly for designers, not enough software available—and they weren&#039;t entirely wrong (though not entirely right either).<br /><br />Tthings have changed considerably over the past several years. Apple has pushed out one compelling product after another, and by result gaining massive traction in all the areas where it was considered a problem. On the flip side, Microsoft has not put out a compelling product in what seems like ages (and one could argue since the debut of Steve Ballmer as CEO). Microsoft had a compelling product—that HP tablet which I was actually interested in—and it got quickly canned for no obvious reason. But upon further reflection, maybe the Microsoft-centric press is simply bored. Microsoft isn&#039;t really giving their press anything to talk about, and they need to fill in the space between the ads with something, so they need to go elsewhere for content and Apple will always be an easy target in their eyes.<br /><br />Now, Microsoft is a massive company and that is simply not going to change anytime soon. They have Windows and Office, and those are clearly the bread and butter for them because they have (seemingly) unbeatable market share. But bread and butter is boring. B-O-R-I-N-G. In talking with people over the years, I&#039;ve found that the only people who really care about Windows and Office updates are those in IT and the ones who have to read Microsoft&#039;s press releases for a living. The &quot;average user&quot; (e.g., my mother-in-law) doesn&#039;t know or even care about what version of Windows they have, and most people I know only get whole version upgrades when they get a new PC. I know a lot of very smart people who don&#039;t know the difference between a Word document and text file, much less the operating system they&#039;re running.<br /><br />So, looking at recent events—that tablet, Windows 7—what is Microsoft going to release next? A new version of Office? What could they possibly add or do to a long-established flagship product which has long been accused of being bloated already? Last time it was a ribbon control and an XML format that should have happened a long time ago. To which I respond, &quot;Yeah, and...?&quot; Honestly, if this were the behavior of my favorite company, I&#039;d be angry and jealous from being so thouroughly bored, too. I can&#039;t say as that I really blame the Microsoft-oriented press. But, reading all of this needless and often incorrect Apple-bashing is exhausting and just as boring as a Microsoft update.<br /><br />What really needs to happen is for the next writer who decides to downplay an Apple product is to immediately turn around to Microsoft and ask the question &quot;What, exactly, do you have to offer that&#039;s better than this?&quot; Microsoft chatter might actually be worth reading, then, but only if Microsoft deigns to respond. Until then, reading any Microsoft-related news these days is a huge waste of my time, and I&#039;m thankful there are other people who do this for me. I just wish they would be a bit more judicious about they hook themselves onto.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100609-210745">
		<title>Lightning</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100609-210745</link>
		<description><![CDATA[A few weeks ago, a big ol&#039; thundercloud just packed to the gills with lightning drifted along the coast of Massachusetts. It had been ages since I had taken a long exposure night shot, and I&#039;ve always wanted to get lightning in action. By a series of fortunate events, both happened...<br /><br /><img src="http://www.oatmealandcoffee.com/external/IMG_1601.jpg" width="450" height="338" border="0" alt="" /><br /><img src="http://www.oatmealandcoffee.com/external/IMG_1602.jpg" width="450" height="338" border="0" alt="" /><br /><br />Canon PowerShot G11 (possibly the best PowerShot <i>ever</i>), 15 second exposure time, no other special settings were used with the camera. Not exactly newspaper-worthy, but still neat to see, nonetheless.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100608-213343">
		<title>Open Letter to Franklin, MA Town Government</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100608-213343</link>
		<description><![CDATA[I would like to personally thank <a href="http://franklinma.virtualtownhall.net/Pages/FranklinMA_Planning/index" target="_blank" >the Planning Board</a> for <a href="http://www.milforddailynews.com/topstories/x682904075/Franklin-planners-OK-Big-Y" target="_blank" >giving the citizens of Franklin yet another opportunity to buy even more smooth, creamy Kraft mayonnaise</a>. The trappings of traffic will be of minimal concern when we will have the lovely aesthetic qualities of yet another grocery store to gaze out our car windows. Other towns should be so lucky to have as many grocery stores as we will. What&#039;s really great is now that we will have all of that juicy tax revenue coming in, we can ignore any future tax overrides.<br /><br />I could go on but, really, I am beyond words here. Good luck to the Planning Board on their re-election.<br /><br />Philip Regan<br /><a href="http://www.actionforfranklin.com/" target="_blank" >http://www.actionforfranklin.com/</a><br /><br /><b>UPDATE:</b> <a href="http://www.actionforfranklin.com/2010/06/08/the-big-why-revisited/" target="_blank" >All snarkiness aside from the follow-up article...</a> The core issue at play here, what all of those questions and issues really come down to, the one that everyone from those in charge to those that vote should be excruciatingly pondering now, is about asking and answering the question: “What kind of town do <i>we</i> want to live in?” The commercial ventures we bring into Franklin become part of the community, whether we like it or not. The businesses we allow to line our streets become the landscape upon which we must gaze every day as we drive to and from work. Every. Day. The visible retail makes up the fabric of the town as much as the people that patronize them. For people coming to Franklin for the first time, that landscape will make more of an impression than anything else. Is a heavy retail presence really want we want to show Franklin as being about?<br /><br />Honestly, I don&#039;t have time for this nonsense, and I missed the votes, but I can&#039;t let this stuff just slide.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100606-204209">
		<title>Everything We Asked For</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100606-204209</link>
		<description><![CDATA[<blockquote>This is everything we asked for but not what we wanted.</blockquote> <br />— Anonymous via <a href="http://clientsfromhell.net/post/663314349/this-is-everything-we-asked-for-but-not-what-w" target="_blank" >Clients From Hell</a><br /><br />I wish all of my customers were that succinct in their feedback. The more I think of it, however, the more I&#039;m amazed by how many things where this reaction is actually appropriate. Be careful what you wish for because you just might get it and all that.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100603-203617">
		<title>Xcode</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100603-203617</link>
		<description><![CDATA[I&#039;ve been spending a lot of time in <a href="http://developer.apple.com/technologies/tools/xcode.html" target="_blank" >Xcode</a> lately, for a variety of reasons I won&#039;t get into just yet. But I can at least vent a bit. So, from a <a href="http://www.realsoftware.com/realbasic/" target="_blank" >REALbasic</a> developer&#039;s perspective...<br /><br /><b>What I like in Xcode...</b> <br /><ul>
	<li>NSLog and the requisite formatted string. The formatting tags took some getting use to, but now I find I really miss NSLog when I go back into REALbasic. Logging to the Console just doesn't cut it, and having to cook up my own NSLog-like system is a drag for the quick projects.</li>
	<li>Cocoa. Totally rocks once I learned to work with the framework.</li>
	<li>How methods and functions with multiple arguments are handled in Objective-C, and how Xcode handles the auto-completion when I accept it.</li>
</ul>
<br /><br /><b>What I don&#039;t like in Xcode...</b> <br /><ul>
	<li>The syntactical burden of asterisks, ampersands, and semi-colons. I understand their importance but, man, what a hassle. Heaven forbid I should forget any one of those things.</li>
	<li>Retain and Release counts. Ugh.</li>
	<li>All of the places where I have to manage a single property. One to two times in the header files, and two to three times in the implementation file.</li>
	<li>Seperate header and implementation files, and @class vs #import. It's the 21st century. There has to be a better way to manage this.</li>
</ul>
<br /><br /><b>What wasn&#039;t a big deal coming from REALbasic...</b> <br /><ul>
	<li>Loops and conditionals. They're no more complicated than REALbasic's; the format is just different (I have no opinion either way as to which is better). There are the braces to manage, but...meh.</li>
	<li>The bracketed notation of Objective-C.</li>
</ul>
<br /><br /><b>What I miss from REALbasic...</b> <br /><ul>
	<li>Easy to create interfaces.</li>
	<li>Easy drawing.</li>
	<li>Easy project settings (e.g., application name, version).</li>
	<li>The code hints at the bottom of the IDE window. </li>
	<li>Easy debugging. That one most of all.</li>
</ul>
]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100520-184755">
		<title>Seth Godin: Hardly Worth The Effort</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100520-184755</link>
		<description><![CDATA[I am a big fan of <a href="http://sethgodin.typepad.com/" target="_blank" >Seth Godin&#039;s blog</a>, and <a href="http://sethgodin.typepad.com/seths_blog/2010/05/hardly-worth-the-effort.html" target="_blank" >the recent entry titled Hardly Worth the Effort</a>\ just reinforced my appreciation of his writing. Everyone really ought to read this. If this doesn&#039;t make you think twice about what you do for a living, I don&#039;t know what will. My favorite bits:<br /><blockquote>The hard part is the last ten percent, sure, or even the last one percent, but it&#039;s the hard part because everyone is busy doing the easy part already....The secret is to seek out the work that most people believe isn&#039;t worth the effort. That&#039;s what you get paid for.</blockquote><br />Exactly. Otherwise, why bother showing up?<br /><br />]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100510-202844">
		<title>Another one bites iPhone&#039;s dust</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100510-202844</link>
		<description><![CDATA[<a href="http://www.runrev.com/company/runrev-blog/revmobile-and-apples-iphone-sdk-agreement/" target="_blank" >Runtime Revolution&#039;s revMobile tool has been rejected by Apple as a development platform.</a><br /><br /><blockquote>We submitted an in-depth proposal to Apple that we create an iPhone-only product that uses native Cocoa objects, supports 100% of their API, works perfectly with multitasking and battery life, but uses a variant of the revTalk language to use these objects and APIs, and then translates those into native code. While a significant engineering departure for us from the current revMobile path, this solution would have resulted in perfect-quality iPhone-only applications impossible to distinguish from native applications...Steve Jobs has now rejected our proposal and made it clear that he has no interest in having revMobile available on the iPhone or iPad in any form...The analysis we read both on Apple.com and on many blogs suggest that their main target might be Flash. Clearly this is not the case.</blockquote><br /><br />There are a lot of users in the RB community who have been begging for Real Software to come up with an iPhone solution, especially after RunRev released their product. I&#039;ve always thought the whole idea was half-baked because Real can&#039;t get a fully-working Cocoa solution out the door for desktop applications, much less the iPhone. Real is on their second attempt (starting from scratch as well), and I think the beta phase is lasting twice as long as intended. It proves several of Apple&#039;s points to a tee. <br /><br />Frankly, I think anyone who is waiting for an easy-to-use tool to come along is just wasting their time on the sidelines, and needs to just &quot;cowboy up&quot; and learn Xcode/Cocoa Touch/Obj-C. I did, and now my friend and I are full steam ahead on an app for later this year. Best thing I ever did rather than waiting for someone else. There are so many resources out there now that any developer with half an ounce of determination can get an app out the door.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100510-202025">
		<title>Changing Clothes</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100510-202025</link>
		<description><![CDATA[I could go on a whole diatribe about changing Amelia&#039;s clothes, but I won&#039;t. For parents, they&#039;ve seen it all (and most have seen more than me so I would be speaking on relatively little experience). For non- or not-yet-parents, I think it&#039;s suffice to say changing the clothes of a six month old is one of those hopelessly difficult yet endearing tasks of being a parent. Except when it is in the middle of the night. I&#039;m not saying anything happened (this time, at least), but just that a lot of things that you think are problems pretty much disappear when you come to the realization that you should never, ever underestimate the power of squirming.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100504-020922">
		<title>02:19</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100504-020922</link>
		<description><![CDATA[<blockquote><i>People who say they sleep like a baby usually don&#039;t have one.</i></blockquote><br />— Leo J. Burke<br /><br />Amelia will not sleep for reasons unbeknownst to this universe. I could have a small team of experts here, and I just know they&#039;ll look at her and say &quot;Well, it&#039;s a mystery.&quot; Looks like I&#039;ll be artificially awake tomorrow. Again. But I&#039;ll also get that smile that makes everything simply go away.<br /><br /><img src="http://www.oatmealandcoffee.com/external/MeAndAmelia050110.jpeg" width="250" height="333" border="0" alt="" /><br /><br />Again.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100430-062636">
		<title>File Photo</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100430-062636</link>
		<description><![CDATA[By now, everyone who reads this blog has seen the <a href="http://www.apple.com/hotnews/thoughts-on-flash/" target="_blank" >open letter about Flash</a> from <a href="http://www.apple.com/pr/bios/jobs.html" target="_blank" >Steve Jobs</a>. I&#039;m not going to write about that. People much smarter than me have, and are, writing about it, and I won&#039;t have much more to add to it than &quot;Yeah. Forget Flash. You tell &#039;em, Steve. Flash is whack, man&quot;.<br /><br />What I am going to talk about is the file photo that has been accompanying all of the news articles being circulated by the AP and Bloomberg:<br /><br /><img src="http://www.oatmealandcoffee.com/external/JobsBadPhoto.jpg" width="150" height="188" border="0" alt="" /><br /><br />Can they find a <i>worse</i> photo of Steve Jobs? Is that even possible? He looks like an angry, starving, pufferfish in this photo. Granted, <a href="http://www.apple.com/pr/photos/execs/jobsphotos.html" target="_blank" >the official corporate photo</a> is a bit outdated (and a bit cheesy) and I think the above photo was during that brief period when his health was visibly, adversely affecting him. <a href="http://images.google.com/images?client=safari&amp;rls=en&amp;q=Steve%20Jobs%20photo%20academy%20awards&amp;oe=UTF-8&amp;um=1&amp;ie=UTF-8&amp;source=og&amp;sa=N&amp;hl=en&amp;tab=wi" target="_blank" >There are other, better photos out there</a> but I&#039;m sure copyrights get in the way of using them, and if anyone is going to respect that, it&#039;s Apple.<br /><br />So, Steve, dude, you need to update your official photo to give the news editors something more to work with. I know it&#039;s not my place, but I feel overwhelmingly compelled to add a &quot;Pronto, amigo&quot;.<br /><br />Namaste and all that.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100429-034153">
		<title>03:45</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100429-034153</link>
		<description><![CDATA[<i>Note to self</i>: Washing and sterilizing of <i>all</i> pacifiers <i>must</i> be done before going to bed in light of Amelia&#039;s going through them like so many rounds of ammunition over the course of the night.<br /><br />Reveille is at 05:00, but I am awake—and I mean <i>awake</i>—now.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100428-063042">
		<title>A4F</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100428-063042</link>
		<description><![CDATA[Every once in a while, an issue gets me riled up enough that I feel the need to really do something about it. I pick my public battles carefully these days, and I&#039;m not a fan of politics, but I just can&#039;t let this one slide.<br /><br />I recently started a website called <a href="http://www.actionforfranklin.com/" target="_blank" >Action For Franklin</a> in response to what I feel is bad policy in the town I live in. I won&#039;t go into the gory details here; there is a 1200+ word article (<a href="http://www.actionforfranklin.com/2010/04/27/the-big-why/" target="_blank" >The Big Why</a>) on that site that explains in detail what&#039;s happening.<br /><br />This is going to be interesting.]]></description>
	</item>
	<item rdf:about="http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100425-113103">
		<title>Privacy</title>
		<link>http://personal.oatmealandcoffee.com/blog/index.php?entry=entry100425-113103</link>
		<description><![CDATA[<blockquote>Imagine that you were walking through a shopping mall and there was someone walking behind you taking notes on everywhere you went and sending it off to anyone who was interested for a small fee. That would be very disturbing to most people. To some extent, we see a version of that on the Internet, because information is taken from consumers. For the most part that information is anonymized, which is good ... but not every company has great data security, and beyond that, consumers ought to be informed in a clear way about the choices they make.</blockquote> <br />--Federal Trade Commission Chairman Jon Leibowitz (<a href="http://consumerist.com/2010/04/ftc-protects-your-privacy-but-fcc-rules-at-hoops.html" target="_blank" >via The Consumerist</a>)]]></description>
	</item>
</rdf:RDF>
