April 2004 - Posts - Jon Galloway

April 2004 - Posts

[Bookmark] Webref.info

Nice consolidated web development reference site: http://www.webref.info/

I've run across several web reference sites before, but I like this one because it brings everything together in a nice tabbed interface:

 

Posted by Jon Galloway | with no comments
Filed under:

XML gang sign catching on?

Sam just invented the XML Gang Sign this month:

Picture: Sam shows off the new XML sign.

Already it seems to be catching on worldwide:


ARIEL SCHALIT/AP
Mordechai Vanunu gestures while he speaks to
reporters following his release yesterday from
Israel's Shikma Prison, where he served 18 years
for spilling Israel's nuclear secrets. He said he
was proud of his actions, and claimed he was
treated cruelly in jail, but had used the time to
learn XML.

ExplorerBar Control

New cool control from Steve McMahon's vbAccelerator: ExplorerBar

Like all Steve's control's, this comes with really well commented source (browse it online) and demo programs.

And once again I must plug Steve's awesome site and free code. C# snobs (um, I guess that's me now) fear not, both VB and C# code are included.

vbAccelerator site also has three RSS article feeds.

Explorer Bar Control Demonstration

LazyWeb.org - too hard?

Stumbled across this: www.lazyweb.org.

It's a cool idea - blog about something you'd like (a.k.a. lazy web request), create a trackback to the super-secret address (http://mediacooperative.com.mn.sabren.com/mt-pi.cgi), and your idea goes into the page and an RSS feed so thousands of developers can hop to and get right on it.

Not quite as fun as the Half Bakery, but their thinking is that requiring folks to come to their site to post their ideas is not as likely to succeed as relying on bloggers to complain and be lazy.

The problem is, I couldn't seem to get it to work from a .Text post. I gave up after an hour - how wrong would it be to monkey with something called LazyWeb.org for more than an hour?

Posted by Jon Galloway | 1 comment(s)
Filed under:

Interesting discussion on outsourcing

Increasing the Value of the Domestic IT Worker? [Slashdot.org]

The focus of the discussion is how domestic (I guess they mean US or first world) IT workers can keep their jobs when the cost of living is so much lower in India, China, Mexico, etc. This is something I've been thinking about, as a few of my friends have been hit by this. They're talking about how many more years left we've got in this software development game, and usually their speculation's in the low single digits.

I disagree. I think the outsourcing trend will continue to have a big effect on jobs in established IT companies, but I don't think all of our jobs are going the way of the television factory.

Here's why:

1. There's a difference between coders and developers (nice post by Eli R. in that vein). By coders I'm talking about folks who:

  • hate meetings
  • will do whatever the spec says knowing that it won't work
  • wouldn't dream of reading a programming book, article, or blog on their own time
  • don't want to learn anything more than they need to in order to not be fired

Essentially, the coder wants to do and not think. Unfornately, doing without involvement is can easily be automated.

Contrast that with the developer, who:

  • fights gets involved in the design process
  • who raises issues and suggestions for improvement
  • works as part of a team (not just with other developers, but with PM's, QA, designers, and even... shudder... end users) to deliver the best possible product

So I guess what I'm saying here is that independent hacking at linked lists can - and probably should - be done by the lowest bidder wherever is cheapest. Professional collaboration with a team is not something that works well remotely, and that's the kind of job that will stay. Sure trade restrictions can (and likely will) attempt to stop the natural flow of cheap labor to companies, but the best defense we have is that frightening silence on a conference call as the business stakeholders wonder if those remote developers really get what they mean. What do we have to offer that a hard working, skilled, and motivated Indian developer doesn't? Proximity. Face time. Presence. Collaboration. Whiteboard redesigns. Day to day interaction. (Plug for extreme programming should go here)

2. The Pendulum Swing
Don't worry, short second point. I hear rumblings from friends at big companies that these big, multi-million dollar outsourcing projects aren't going well. Not necessarily either side's fault, just that remote development is tough. Imagine NASA outsourcing the space shuttle - it could happen, but would take some pretty sophisticated processes. These will develop, but will take time.

My more cynical friends speculate that outsourcing is also a good way to hide money - either illegal skimming, or just funny up the profit / loss numbers. Who's to say how much of that 2 million development budget was paid to developers? My response to that is that a company can't lose money forever ("a house divided..."). Hopefully that same competition that's got folks scared for their jobs will keep the companies honest as well.

So I'm envisioning a possible wave of bad news as companies discover their outsourcing efforts haven't saved them what they'd hoped.

Your thoughts?

[util] Download Express

Download Express goes on every computer I build. It's a download manager, similar to GetRight, but cheaper. As in free.

Download managers rock - you can resume a broken downloads, and get insane download speeds. With my cable modem, I'm usually in the mid-300K's with this. When I don't use it, I'm often at half that speed. Too bad MDSN downloads go through the Visual Studio 2005 CTP release would have come down a lot faster...

Anyhow, I've been using Download Express for several months and I highly recommend it.

Download

Screenshots: (more here)

Features:

  • HTTP, FTP, HTTPS protocol support
  • Cookies support
  • Very fast and reliable file retrieval from the Web and FTP sites
  • Maximum Internet connection bandwidth usage when loading several files parts simultaneously
  • HTTP and SOCKS Proxy support
  • Internet Explorer clicks interception
  • Check downloaded files for viruses
  • Very easy to use
  • Can operate in the background
  • The ability to resume broken downloads

Posted by Jon Galloway | 1 comment(s)
Filed under:

Outbound SMTP Proxy?

The company I'm working at is having to go through each application that sends e-mails and verify compliance with CAN SPAM. One of the requirements is a corporate opt out system that ensures once someone has opted out, they will never get an e-mail from you again.

That can be tricky - say someone opts out of a newsletter you send. A year later, an employee sees your message board post asking for help with something that your product happens to do. The employee sends them an e-mail from Outlook, and BLAMO, you've just violated CAN SPAM (I think - IANAL).

So, I was thinking some smart person should write an SMTP proxy that verifies the recipient is not on the opt out list before sending the e-mail. Then you'd just need to do a DNS swap (mail.corporation.com becomes filteredmail.corporation.com, and the SMTP proxy is the new mail.corporation.com) and all your e-mail would automatically be filtered. The SMTP proxy would just need to be able to relay messages to the real SMTP service and to be able to read a few common data / file formats (SQL Server, XML, CSV, etc.).

That's not what we're doing - we're going through each application. Argh.

(lazyweb.org trackback)

Posted by Jon Galloway | 1 comment(s)
Filed under:

[util] AutoBlog

Executive / ADHD Summary:
Schedule a .Text post with this console application that reads saved blog BJD (BlogJet Draft) format files and posts them to your .Text weblog. Can be scheduled in task scheduler to run at whatever interval you choose. Posts only the oldest file in the directory, so you can write multiple posts and have them go out once per day.

This was posted with a new utility I just wrote, AutoBlog. I got the idea from Raymond Chen's pre-recorded blogs while he was on vacation. Since I've got two kids under the age of 4, I don't always get consistent free time to blog regularly (blame it on the youngsters, they can't defend themselves). I often have to save blog fragments until I get time to flesh them out, which means I then have a pile of posts all at once. I'd rather spread them out a bit, hence this tool.

This is a simple console application, all configuration is in the AutoBlog.exe.config file. You configure your .Text username, password, url, and a directory to post from. The app finds the oldest BJD file, parses it, and posts it using the SimpleBlogService webservice interface to your .Text blog.

I chose to use BlogJet files rather than write my own because (1) it has nice HTML editing features (2) I use it for my "normal" posts already, and (3) it has nice support for categories - it retrieves your category list and saves them out with the post file. AutoBlog supports post categories.

I was thinking about adding an optional footer to the config that would get appended to all autoblogged posts [Autoblogged] or something (I manually typed it at the end of this post). If anyone wants that I'll add it in.

How to use:
1. Download it.
2. Unzip to the directory of your choice.
3. Configure AutoBlog.exe.config.
4. Set up a Scheduled Task that points to AutoBlog.exe. The account will have to run as a user that has write permissions on the posts directory so it can rename the BJD file.
5. Be sure to test it - right click on the scheduled task and click "Run".

Code:

using System;
using
System.Configuration;
using
System.IO;

namespace
AutoBlog
{
   
class
Console
    {
        [STAThread]
       
static void Main(string
[] args)
        {
           
string
username = ConfigurationSettings.AppSettings["Username"];
           
string
password = ConfigurationSettings.AppSettings["Password"];
            System.DateTime fileTimestamp = System.DateTime.MaxValue;
           
string
filename = "";
           
string
[] categoryArray;
           
string
title;
           
string
body;

            DirectoryInfo di =
new
DirectoryInfo(ConfigurationSettings.AppSettings["PostsDirectory"]);
            FileInfo[] files = di.GetFiles("*.bjd");

           
foreach(FileInfo fi in
files)
            {
               
if
(fi.LastWriteTime<fileTimestamp)
                {
                    fileTimestamp = fi.LastWriteTime;
                    filename = fi.FullName;
                }   
            }

           
if
(filename != "")
            {
               
using (StreamReader sr = new
StreamReader(filename))
                {
                    sr.ReadLine();
//**BLOGJET POST**

                    sr.ReadLine();
//Blog name

                    title = sr.ReadLine();
                    categoryArray = sr.ReadLine().Replace("\"","").Split(',');
                    sr.ReadLine();
// -

                    body = sr.ReadToEnd();
                }

                net.asp.weblogs.SBSSimpleBlogService webService =
new
AutoBlog.net.asp.weblogs.SBSSimpleBlogService();
                webService.Url = ConfigurationSettings.AppSettings["ServiceUrl"];

               
//Rename the file first, since this is most likely to fail as a scheduled task
                System.IO.File.Move(filename,filename + ".bak");

                try
                {
                    if (categoryArray.Length > 0)
                        webService.InsertCategoryPost(username,password,System.DateTime.Now,title,body,categoryArray);
                    else
                        webService.InsertPost(username,password,System.DateTime.Now,title,body);
                }
                catch
                {
                    //Post failed - rename back to BJD extension
                    System.IO.File.Move(filename + ".bak",filename);
                }
            }
        }
    }
}

UPDATE:
I've changed the order so the rename is done before the blog is posted. That's for two reasons: (1) it's more likely to fail when run as a scheduled task, and (2) if it fails, the same thing will get posted again and again. I figure it's better to have nothing posted than duplicate posts.

[Autoblogged] 

Posted by Jon Galloway | with no comments
Filed under:

Rebol

I was recently introduced to Rebol, an interesting programming language / framework. It's been around for a while, making some headlines a few years ago, but I just heard about recently. It's at least interesting to play with for several reasons:
  • It's very internet aware.
  • It's extremely terse - check out this page of one liners.
  • The runtime is tiny - the core is 280K, and the GUI layer is 327K.
  • It runs on 25 platforms, including Windows, *nix, and Mac. I think it runs on Palm OS, too.
  • An IE Plugin was just released (well, Beta 4, but it seems to work fine for me). I think a recent change to the IE Plugin architecture caused them to have to rewrite this; they had an IE Plugin a while ago.

Now, I'm no Rebol zealot, I've just played with it for a few hours. This is interesting stuff to play with from a developer point of view, though - it kind of challenges your ideas of what a modern development platform can and should do.

I'm sure there are business / political things involved with the business success of this technology, which I'm not at all interested in.

Some fun stuff:

1. IE Plugin Demos

Check out the Calculator. Now the crazy part - the entire source is less than 1K.

2. This one liner will e-mail the contents of a web page:

write you@email.com read http://www.rebol.com

3. The IOS (Internet Operating System) - http://www.rebol.com/reblets.html

Posted by Jon Galloway | with no comments

Atomic Clock Webservice?

There doesn't seem to be an "official" time webservice out there. There's a demo one hosted by Altova (makers of XML Spy) here that looks pretty good: http://www.nanonull.com/TimeService/TimeService.asmx. There are several other demo ones out there if you Google timeservice.asmx.
I couldn't build an enterprise production application that relies on a demo that Altova could take down at any time, though.

I know there are several official NTP servers out there time.nist.gov, time.microsoft.com (if you're not in the camp that believes Microsoft's time server is the first step in their attempt to control the very fabric of spacetime). I could implement or use an existing NTP client (this one looks good), but it's not a simple HTTP webrequest - it takes a TCP request and parsing the NTP time format. Since Microsoft.NET is all about XML web services, I shouldn't have to, should I?

Posted by Jon Galloway | with no comments
Filed under:
More Posts Next page »