Thanks to everyone who attended my talk on Production Debugging. You can now download my slides and code samples from the talk. I have listed some questions and answers from the talk at the bottom.
Where can I get Reflector?
It is a free download on Red Gate's site. You don't have to buy the Visual Studio integration. When it starts up you are asked for the version of .NET to use. I always select the latest version as .NET backwards compatibility is good. Of course this can be changed later.
How do you stop someone from decompiling your code with Reflector?
You should be aware that obfuscators can make your life more difficult. One way they make code harder to read in Reflector is through method renaming. This can result in the stack traces from the obfuscated code being out of sync with your code.
Can I use ELMAH with Windows apps?
Not easily. ELMAH relies on various features of ASP.NET to do a lot of it's work. Some people have make their own modifications, but it not something that a beginning developer might want to attempt.
I wrote a sample ages ago called BugBack that works for WinForms. It is old and in need of some love but it is a starting point. If you want an off the shelf solution you should look at Red Gate SmartAssembly.
Microsoft made it very simple to get information about the displays available to Windows with the Screen class in Windows Forms. Using this class you can identify the primary screen, and get properties like size from any display device.
For anyone developing an application which supports multiple monitors the Screen.Bounds property may be useful in finding screen offsets. If you have multiple monitors attached try the Get Current Screen Info button on your secondary display.
Download the C# sample code and binaries to explore further. Like all good API examples I have omitted error handling ;)
On Thursday I'm making the yearly pilgrimage to PyCon in Atlanta. This will be my third year and I'm sure it'll be better than ever.
For me the real highlights of this conference are the legendary open space sessions. The level of interaction and learning at these really sets it apart from other conferences. Last year I attended a number of crackers including one on Cassandra and big data scalability with Jonathan Ellis. It's great to see that Jonathan is delivering a scheduled talk on database scalability, and I'm sure there will be a fair number of open space sessions dedicated to NoSQL databases.
Looking at the 2010 schedule these are my other top picks:
Based on an example provided with the Twitter library for Python I cobbled together the following script to add my latest tweets to this site. It's called from a cron job that I run on an occasional basis. My script linkifies hashtags and @username tokens in tweets so that you can see search results or user information.
Why did I not use one of the WordPress widgets? Well writing scripts like this is fun, and some widgets don't seem to play too well with my Thesis theme. One thing to note is that getting the shell script setup under some cron configurations can take a while if you aren't using it on a regular basis. It's operation is also different between Ubuntu Server and Joyent's Accelerator platform.
Up next: a similar script to process my latest bookmarks on Delicious.com.
Main script (tweets.py)
#!/usr/bin/python
import codecs, re, getopt, sys, twitter
TEMPLATE = """
<li>
<span class="twitter-text">%s</span>
<span class="twitter-relative-created-at"><a href="http://twitter.com/%s/statuses/%s">Posted %s</a></span>
</li>
"""
def Usage():
print 'Usage: %s [options] twitterid' % __file__
print
print ' This script fetches a users latest twitter update and stores'
print ' the result in a file as an XHTML fragment'
print
print ' Options:'
print ' --help -h : print this help'
print ' --output : the output file [default: stdout]'
def FetchTwitter(user, output):
assert user
statuses = twitter.Api().GetUserTimeline(user=user, count=7)
xhtml = []
for status in statuses:
status.text = Linkify(status.text)
xhtml.append(TEMPLATE % (status.text, status.user.screen_name, status.id, status.relative_created_at))
if output:
Save(''.join(xhtml), output)
else:
print ''.join(xhtml)
def Linkify(tweet):
tweet = re.sub(r'(\A|\s)@(\w+)', r'\1@\2', tweet)
return re.sub(r'(\A|\s)#(\w+)', r'\1#\2', tweet)
def Save(xhtml, output):
out = codecs.open(output, mode='w', encoding='utf-8',
errors='xmlcharrefreplace')
out.write(xhtml)
out.close()
def main():
try:
opts, args = getopt.gnu_getopt(sys.argv[1:], 'ho', ['help', 'output='])
except getopt.GetoptError:
Usage()
sys.exit(2)
try:
user = args[0]
except:
Usage()
sys.exit(2)
output = None
for o, a in opts:
if o in ("-h", "--help"):
Usage()
sys.exit(2)
if o in ("-o", "--output"):
output = a
FetchTwitter(user, output)
if __name__ == "__main__":
main()