{
Code Climber has this great list of what you need to download and the order in which you must install it. I just completed my installation and have begun to poke around.
Code Climber has this great list of what you need to download and the order in which you must install it. I just completed my installation and have begun to poke around.
There's a lot to learn these days (whenever isn't there a lot?) and one thing I will do for 2008 is make a list of technologies I'd like to dive into with some sense of priorities.
Among the ASP.NET MVC, Powershell 2.0, and Iron Python (for starters) I've been interested in F#. First as a topic on Hanselminutes but I lurk on Harry Pierson's blog and he's been posting about it quite a bit. Here are some links:
1. F# Overview on hubFS
2. From DevHawk:
Someday it is.
Mads Kristensen has a listing of his code samples. One thing I like about Mads' samples is that they are all very straightforward without unnecessary layers of abstraction.
Once or twice people have confused what I'm doing with sales. Some time back I met with a prospective client and kept having to explain that I actually do write code and would probably be a lead developer on any work they gave us. The reaction I had for even the mere perception that I was "sales" was a little surprising to myself although with some reflection I realized it was because I conflated most of what I disliked about salesmen into an image I couldn't deal with for myself:
But once in my life I was a happy salesman. Some time back I pushed the company I worked for into adopting FogBugz and really building a large part of our lifecycle around it. I did so enthusiastically after reading Joel's early essays on bug tracking and seeing how well it applied to our situation.
I've seen other bug tracking software since but still think the FogBugz experience was best. It seems simple, but because of how much thought has gone into the product, I gather a lot of work has gone into keeping it stripped from unnecessary features.
To be clear, I don't work as a bona fide "in house" developer. But as a consulting company, I spend a lot of time playing that role or working with people in it. It's therefore conflicting when I read his understanding of what it means to work in house. Phil Haack had it right in the middle of 2005 when he wrote of the irony of this disdain towards the people that would be excited to use his software in the first place.
I wonder what kind of conditioning it is - maybe that I've liked musical artists who are fairly open about loathing their fanbase - but I still miss the simplicity and elegance of FogBugz.
What's sad these days is that as much as I'd like to slip on the poorly fitting suit and do my sales routine, we get Sharepoint for free (okay, not free but let's just say Microsoft does an excellent job making it seem so) and it's the environment in which we track what I'd gotten my previous company to use FogBugz for so effectively. I'm not a big Sharepoint fan (that's an understatement) so I'd even be tempted to go The Powers That Be and ask for FogBugz if I couldn't predict the answer right away.
Tomorrow I'll be unflustered but I've got a few comments on what it's like to be in house:
1. In a small enough company, it's great to have decision making power. I've used technologies like Ajax and Perl where a larger environment would have involved committee meetings with some manager shooting me down for doing things differently. You don't have to be a renegade to do this, just document what you do well and communicate with anyone you're working with that may have to look at it on your behalf.
2. In consulting it helps a lot to condition your client. First build confidence with a track record of success, after which the client is usually willing to listen to you when you'd like to do things "right" or improve a piece of software even if it's getting by functionally. After a while, depending on the client, they will usually just trust your judgement and stay away from technical arguments unless there's some disproportionate cost.
3. Software is never finished. This is true even for what is developed in house. As a result the process of continual improvement still exists. It takes a tremendous amount of discipline to try to develop things right when there's a small budget or a tight deadline but I always think of those moments I've spent late at night hacking the ugliest workarounds because of a bad initial effort. Most of the time finishing when it's "good enough" is about the taste and craftsmanship of the person who writes the software; whether they tried to think of the future or not.
4. From working in both a "software company" and a "consulting company" I understand that software development is always a process of coming to terms with friction - all the unexpected realities and circumstances of real life and real users. Different places will have different kinds of friction; where an in house developer may have to deal with the kind of discipline it takes to write unit tests on a deadline a programmer at a software company may have the dilemma of trying to be all things to all people.
I maintain a few personal websites, one of the closest to my heart is phoDak, a photoblog. I wrote the site using ASP.NET about two years ago and intended it to be a low key, personal area to post pictures. I had absolutely no validation on comments and my "what will be" attitude worked for a long time until about a week ago when I saw a comment spam link to porn right off the most recent picture. No longer avoidable, I looked into a few ways to block unwanted comments and came up with a hybrid approach:
1. Use a photo/word as validation for a human user, just like Jeff Atwood's blog.
2. I heard about Akismet from Phil Haack who mentioned it in passing on a Dot Net Rocks episode. I found a free library and wrote about 10 lines of code:
AkismetManager akismetManager =
new AkismetManager("my key", "my site");
string ip =
Request.ServerVariables["REMOTE_ADDR"].ToString();
if(akismetManager.IsValidKey()){
AkismetItem item =
new AkismetItem(ip, Request.UserAgent.ToString());
item.AuthorName =
CommentOwnerTextbox.Text;
item.AuthorUrl =
CommentURLTextbox.Text;
item.Content =
CommentTextbox.Text;
if(akismetManager.IsSpam(item)){
akismetManager.SubmitSpam(item);
return;
}
}
Q.E.D., really. Somewhat Mort-ish for me to lean solely on the library but it works beautifully: my spam comments since implementation remain at absolute zero.
On a whim I've signed up to be at CodeMash 2008. After learning about the conference when Hanselman posted he'd keynote, I mapped out that Sandusky, OH (Whiskey, Tango, Foxtrot!) is none too far (an audio book's worth of distance).
I'm really looking forward to the opportunity to walk among Elvis and Einstein, hopefully gleaning some direction along the way. The session list is impressive, I'm thinking it will be hard to choose a particular direction.
I've been studying Python of late, so I'm really looking forward to Bruce Eckel's Why I Love Python. Another interestingly titled Python presentation Crash, Smash, Kaboom Course in Python will be run by MIT alum Catherine Devlin. Finally on the Python front, I'll try to squeeze into the Getting Started with Django session.
On the "indy" .NET programming, I'm interested in the Introducing Castle session from Jay R. Wren. Because Hanselman is going to be there I can't imagine no mention of ASP.NET MVC stuff, so hopefully it will somehow be mentioned at least comparatively.
Jesse Liberty is going to present on Silverlight, so that's something I won't miss either. There are other Microsoft technology presentations I should see but it would be hard to sit in on a Sharepoint session when I could be learning Python design patterns.
The other area of interest I'll have is the Dojo stuff, two sessions in particular: Overview of the Dojo JavaScript Toolkit and Working Offline with Dojo+Google Gears, both by Kevin Dangoor.
Well, it should be interesting from start to finish, I'll be working on my note taking skills so that I can share what I do learn.
Don't get me wrong, I love Christmas too, but I really like the Advent Calendars that wind up the year.
24 ways
Drew McLellan and his crew have been putting together web development tricks to round out the year for the last few years.
Perl Advent Calendar
None too late and looking like it was designed by a Perl programmer.
Two advent calendars I'd love to see:
1. Microsoft .NET
2. [Iron] Python
LifeHacker has a first look at the forthcoming Firefox 3. It's interesting to see lots of improvements to the storage and management of places visited online - I'm sure this will provide inspiration for the Internet Explorer team at Microsoft to implement cool new features too.
A feature I asked for (and got a skeptical response) was the ability to do what Firefox seems to aim for but in a Google-ish way. That is to say that it would be nice to have a browser history management/search capability that precluded real effort in organization. In simpler terms, the whole "search, don't sort" experience one has with Gmail, except with browsing history and favorites.
I've been experimenting with IronPython of late trying to get the gestalt of Python as a language. It occurred to me that something I had been thinking about for a while as a web project would make sense as an Iron Python project so I dabbled a bit.
The idea I had was a command line type application that approximated commands going to a windows shell and sent the results back to the user. It's a part of a larger suspicion that I've had: that command lines are crisp, efficient user interfaces that are easy to lose sight of because it's not a natural way of thinking on the web.
The screen shots tell you the basic story: you open your browser to nothing but an underlined textbox after which you type your command and press the enter key.
The client code is pretty straight forward - I've become disillusioned with YUI and moved back to using Prototype:
function runCommand(cmd){
var request = new Ajax.Request(
'eruServer.aspx',
{
parameters:'cmd=' + cmd,
onComplete: handleResult
}
);
}
function handleResult(response){
$('loaderImage').style.visibility = 'hidden';
var cmdResult = response.responseText;
$('stdoutDiv').innerHTML = '<pre>' + cmdResult + '</pre>';
}
So that's all pretty simple, on the server processing the request is equally simple in IronPython.
from System.Diagnostics import *
from System.IO import *
def Page_Load(sender, e):
cmd = Request.cmd
p = Process()
p.StartInfo.FileName = "cmd.exe"
p.StartInfo.UseShellExecute = 0
p.StartInfo.CreateNoWindow = 1
p.StartInfo.RedirectStandardInput = 1
p.StartInfo.RedirectStandardOutput = 1
p.Start()
myOut = p.StandardInput
myIn = p.StandardOutput
myOut.WriteLine(cmd)
p.StandardInput.Flush()
p.StandardInput.Close()
output = myIn.ReadToEnd()
p.StandardOutput.Close()
p.Dispose()
Response.Write(Server.HtmlEncode(output))
The web project is fairly small - go ahead and download it here. If you have any improvement, let me know - I'm not sure how to start this as an "open source" affair but it would be a great solution as a light weight tool for remotely operating on a server.
Oh yeah, security: I was thinking of simple NTFS permissions on the files along with Windows Security on the website. Should do the trick...
{
There are some great videos at the Business Innovation Factory -
Jason Freid (37 Signals) -
I've been watching these guys for a long time. Although I'm a little resistant to some of the accolades associated with them, the 37 Signals crew thinks clearly and has a clear identity with which they seem overwhelmingly successful.
My favorite comment is Jason saying that they (37 Signals) want to be "enemies of mediocrity."
Richard Saul Wurman -
I first learned about Wurman from TechTV's "Big Thinker" series - although he is trained as an architect his career spans the sort of multidisciplinary mix that makes him special. He originated the TED conferences which have become quite popular of late. He's got an interesting new project called 19:20:21, be sure to check out the information graphics.
Clay Christensen -
One of the most interesting thinkers in the theory of business at present. I wonder if Clay is more an economist than what one would consider a conventional "business" person. His gifts as a teacher shine through in this particular presentation.
}
A few projects ago a control was created (who exactly did it I'm not sure) for displaying dialog "popups" without new browser windows. The technique was fairly straightforward: an IFRAME with an opacity filter and a div with the popup values.
I wasn't a huge fan of the infamous "popup" which managed to come up in project after project, but the idea of using opacity on an IFRAME for an overlay of helpful information struck me about a week ago.
The nRegex interface, which is quite straightforward to me, still seems to pose some confusion to new users and so I thought I'd use it might be suitable for a virgin implementation of the idea. It's a little crude* but the idea should come across: use the 'How to use Nregex' button to display the overlay and it seeks to explain the various pieces of the interface.
The implementation is quite simple. There's an IFRAME with the following attributes:
frameBorder="0"
scrolling="no"
style="z-index:1000;position:absolute;
top:0;left:0;width:2000px;height:2000px;
FILTER:alpha(opacity=80);-moz-opacity:.80;opacity:.80;
display:none;"
src="infoFrame.htm"
Within the frame, a button hides the IFRAME calling a javascript function from the parent window.
The easiest way to implement this is to use the skeleton of the interface in the *original* design. I'm interested in comments on this approach - would it be feasible as a way to document an interface's functionality?
I remember my first conference well: I was 24, it was February of the year 2000 and I was in San Francisco. I'd bartered my way there: I turned down a raise from my employer and instead asked for a "personal budget" for professional development. In a bookstore I'd seen an ad in the Visual Basic Programmer's Journal and thought it was an opportunity to develop skills and visit my favorite city at the time.
One keynote that week was delivered by the futurist Paul Saffo. He spoke about observing trends and thinking past the day to day problem solving we experienced in our lives as programmers. I remember his anecdotal story: an engineer working in telecom had purchased land on hilltops knowing there would be a demand for communication towers on top.
It's been nearly a decade but with Saffo in mind I still try to get out of the "technical" and think on a higher order. With that in mind here are a few podcasts from last week I enjoyed:
1. Scott Berkun - The Myths of Innovation
Scott was a developer and manager at Microsoft but broke away to write and mentor. Key takeaway on innovation: breakthroughs are less about epiphany and more about consistent effort and dedication. Scott's blog is here.
2. Guy Kawasaki - The Art of Innovation
I've been wary of Guy to this point; marketing guy, and Apple obsessed. I like Apple too but not enough to start to ignore the outside world. But not only did I laugh and get entertained, I learned a few things. Guy recommends companies (and I'll extend that to people too) need a mantra, not a mission statement. He also has great ideas about releasing early and often. Good stuff.
Guy blogs here.
3. Ned Gulley - MATLAB Programming Contest
John Udell interviews Ned on an interesting collaborative contest Mathworks puts on. I always like hearing a John Udell interview since he probes with more than the passive interest than most people in conversation. Someday when I'm not bleeding a lack of time I'll check in on the problems although I think my math skills are suspect (and rusty) enough to render it more fascination than practical utility.
Ned's "starchamber" is here. (I learned the meaning of that word from the Merriam-Webster Word of the Day podcast by the way)
A new boast puts perspective on the original New York Times tagline: "All the News That's Fit to Print."
Now we have "All the Code That's Fit to printf()".
On a serious note, OPEN is a new blog written by and for developers. I'll subscribe for the moment even if all the code I'm interested in is usually in a language that doesn't support printf natively.
Courtesy of Aaron.
I hope I can call him a friend - I was fortunate enough to sit a class with him and then ran into him at TechEd - but Tim Rayburn has an excellent screencast overview of C# 3.0 new language features. For 46 minutes of your time, you'll not only be up to speed, but hopefully a little excited at the future.
The first few items have more to do with improving the syntactial approach to things we're already familiar with:
1. Automatic Properties
public string Foo{get;set;}
2. Implicitly Typed Variables
var o = new SpecificType();
3. Object Initializers
class Test{
public string Foo{get;set;}
public string Bar{get;set}
}
var p = new Test(){Foo = "shaz", Bar = "bot"};
4. Collection Initializers
List<string> myList = new List<string>(){"foo", 'bar"};
List<Test> myList2 = new List<Test>(){
new Test(){Foo="foo", Bar="bar"},
new Test(){Foo = "blam", Bar="biff"}
}
The remaining items are better explained rather than just shown - I suggest you pay closer attention to the screencast:
5. LINQ & Anonymous Types
6. Lambda Expressions
7. Extension Methods
(This was, as Tim assumed, my favorite piece)
Although Partial Methods were noted on the list, time seemed to run out on Tim. Stay tuned; it appears he is planning to continue doing screencasts.
Although it seems to be a little disagreement over the existence of beautiful code, a refactor I did today was pleasant to my eye.
Starting with:
string result;
if (parameterLessCommands.Contains(commandName))
{
result = RunArglessCommand(user, commandName);
}
else {
string commandArg = RetrievePairCommandArg(commandData);
result = RunArgCommand(user, commandName, commandArg);
}
return result;
Ending with:
return
(parameterLessCommands.Contains(commandName)) ?
RunArglessCommand(user, commandName) :
RunArgCommand(user, commandName,
RetrievePairCommandArg(commandName));
I'll take it. ()?: is your friend!
I've always wanted to work for Microsoft. My first chance was right out of college when a professor of mine passed my resume to his friend up there. I had some embarrasing crap about how I'd always wanted to work for "the company." It was all true but I can imagine the HR person directing anything that sappy to the trash. Instantly.
But it's just as well - Steve McConnell has an interesting comment about how much time at Microsoft may be spent in meetings - for developers:
When I was at Microsoft in 1990-91 I probably spent less than 5 hours a week in meetings. In contrast, I had a former Microsoft employee tell me earlier this year that on the team he was on he was booked in meetings from 10:00-4:00 5 days a week. Lots of managers at other companies have told me that they're in meetings all day every day and get most of their "real work" done during evenings and weekends, so obviously there's a big difference between Microsoft 1990 and Microsoft 2007, and among different companies.
As I hit "publish" from my previous post on pivot tables, a thought struck me on another most excellent use for them. No, really - for the next job interview:
SELECT
CASE
WHEN I % 5 = 0 AND I % 3 = 0 THEN 'FizzBuzz'
WHEN I % 3 = 0 THEN 'Fizz'
WHEN I % 5 = 0 THEN 'Buzz'
ELSE CONVERT(VARCHAR(2), I)
END
FROM dbo.fnPivot(100)
I taught a T-SQL Programming class this week and in the process looked over some old books on the subject. One in particular I've enjoyed was the Transact-SQL Cookbook from O'Reilly - I have yet to find as novel an approach to SQL, coming from the ideas of set theory rather than tutorials on querying. I'm biased too, my best friend in highschool was Slovenian and one of the authors, Aleš Špetič, hails from that fine country.
A cool idea from the very first chapter is the pivot table, a numeric range that can come in handy for many different types of operations. The book, which is probably circa Microsoft SQL Server 7, demonstrates the building of a pivot table using some hardcoded insert statements followed with a cartesian join that generates the range.
It occured to me in SQL 2000 and higher one can use a User Defined Function and get all the benefits with a little bit more flexibility. Here is a simple approach to the same concept:
CREATE FUNCTION fnPivot(@BOUND INT)
RETURNS @Pivot TABLE(I INT)
AS
BEGIN
DECLARE @I INT
SET @I = 1
WHILE @I <= @BOUND BEGIN
INSERT INTO @Pivot VALUES(@I)
SET @I = @I + 1
END
RETURN
END
GO
The approach is different but the benefits are similar. A simple one from the first chapter is building a calendar of a given range of days. I've adapted it to use the function above:
SELECT
CONVERT(CHAR(10), DATEADD(d, i, CURRENT_TIMESTAMP), 121) [date],
DATENAME(dw, DATEADD(d, i, CURRENT_TIMESTAMP)) [day]
FROM
dbo.fnPivot(7)
date day
---------- ------------------------------
2007-09-13 Thursday
2007-09-14 Friday
2007-09-15 Saturday
2007-09-16 Sunday
2007-09-17 Monday
2007-09-18 Tuesday
2007-09-19 Wednesday
Kaizen is all about small improvements that never stop coming. With respect to Nregex, I plan to keep it moving as a project by spending small amounts of time on new features that will hopefully make it more useful.
Tonight's new feature, though it was really something I did on Saturday morning, is a bookmarklet that should make it a little easier to get into the site from elsewhere (like your favorite IDE).
A few weeks ago my boss noticed some latency issues, especially with larger documents. I've added a "manual" mode that will let you press a button or just hit your enter key to evaluate a regex, rather than it being processed as you type. Animated gifs give a little feedback on wait time.
If you have a request for a feature, please submit it here. If you have a handy regex you solved some problems with, please submit it too. I'm currently at work on a "library" that I hope to cover some basic regular expressions (phone, zip, ssn, and so on) with.