Rob Eberhardt

cleverness ensues

skip navigation

 Wednesday, May 30, 2007

In my quest to dejunkify my life, I'm trying to move this blog to someone else's server.  Here it is on my free Godaddy hosting (sweeet deal, btw), but does it actually work?  Only this post will tell...

5/30/2007 10:39 PM Eastern Daylight Time  #    Disclaimer  |  Comments [0]  | 

 Wednesday, August 23, 2006

It took ages, but I'm on dasBlog now.  Good riddance to dotText!  -- I bid it lovingly, though, since it served well for a 1st generation blog engine -- Somehow a couple hundred legitimate posts + comments garnered many thousands of comment spams.  I expect dasBlog will handle that all better; captchas are a tad annoying but effective, I hear.

That dasBlog is still under active development is a good sign.  I find that quality much more  important these days.  For reference, dotText was last updated almost 2yrs ago (and wasn't even really released).

So in other news (in the sense that no news is its own news), I haven't posted much of anything in a couple months, and even then there wasn't much meat.  I plan to start writing/posting with something like BlogJet.  (Yes, I actually used dotText's web-based editor, which was text-only in Firefox -- I'm entirely too comfortable with code for my own good).  Hopefully this ease will lubricate the writing process.

Regarding the transition: I used two great tools.  One was Aaron Junod's great dotText to dasBlog converter to migrate the content.  This would have done the trick many moons ago, except that I didn't want to orphan all my incoming links (a big no-no to a web dev like me).  Fortunately, Scott Hanselman published a Regex to remap URLs from dotText's format to dasBlog's (If only I hadn't fat-fingered that one the first time I tried it way back, it'd actually have worked). 

Finally, some outstanding meta-throbs junk:
  1. Comments were probably lost.  Sorry.  I noticed spammers were usually changing the subject from the default "re: whatever", so I killed most of the rest. 
  2. Search is gone for the moment.  I'll add it back in Real Soon Now.
  3. Images and other locally-hosted junk is probably all broken.  I'll fix that slightly sooner.
  4. Comments are screwy (dotText saved as HTML.  dasBlog doesn't.)
  5. Layout is messed in IE6.

8/23/2006 12:06 AM Eastern Daylight Time  #    Disclaimer  |  Comments [1]  | 

 Monday, May 29, 2006

5/29/2006 12:44 PM Eastern Daylight Time  #    Disclaimer  |  Comments [0]  | 

 Tuesday, April 04, 2006

Thanks to Clagnut, I'm observing CSS Naked Day on April 5th.

To know more about why styles are disabled on this website visit the Annual CSS Naked Day website for more information.

For the remaining dotText-ers out there who want this to automatically kick-in every April 5th, I just added this condition to DTP.aspx:

<%
// suspend styles on April 5 to observe CSS Naked Day - http://naked.dustindiaz.com/
DateTime dtNaked = DateTime.Today; 
if(!(dtNaked.Month==4 && dtNaked.Day==5)){
%>
		<link rel="stylesheet" type="text/css" href="/mystyles.css" />
<%
}
%>
4/4/2006 2:19 PM Eastern Daylight Time  #    Disclaimer  |  Comments [1]  | 

 Monday, March 20, 2006

In this blog's 1.25yrs alive: It's received 193 legit posts and comments, and 1388 comment spams. (And that's with a basic spam filter in place to catch the obvious 80%!)

It seems like the breeeport experiment might've accelerated it. It didn't seem to affect overall visits tho.

...Man, I gotta finish switching over to dasBlog soon.

3/20/2006 1:29 PM Eastern Daylight Time  #    Disclaimer  |  Comments [1]  | 

 Thursday, February 09, 2006

I'm really not in love with IE or anything, but I do fight with it a lot...

I need to cover what I am in love with: my family, music, ice cream... -- the good stuff.

2/9/2006 6:02 PM Eastern Standard Time  #    Disclaimer  |  Comments [0]  | 

 Saturday, October 01, 2005

  • .Text 0.95, extremely customized
  • Windows 2003 Server, IIS 6, & MSSQL 2000
  • Dell Optiplex 733Mhz, 384MB RAM, ~10GB mirrored drives, and a crappy Belkin UPS
  • ~3mBps / 1mBps residential ADSL
  • much love, frustration, and self-nitpicking

Nothing so fancy as a kitchen appliance, but I'm impressed anyway.

Figured I'd better justify the "meta-throbs" post category.  Hey wait a sec, was that meta-meta??

10/1/2005 11:54 PM Eastern Daylight Time  #    Disclaimer  |  Comments [0]  | 

 Tuesday, July 12, 2005

but no, I haven't been deep in the NetHack dungeons (I wish!).  Rather, every client (current or not) called me simultaneously needing something... ....AND every computer I possess simultaneously broke.

Sure, it's an ego-boost to be in-demand, but that novelty wears off very quickly when I'm making bricks without straw.

7/12/2005 12:15 PM Eastern Daylight Time  #    Disclaimer  |  Comments [0]  | 

 Friday, June 24, 2005

From a Kentucky neighbor (whom I found via GeoURL), Chris Vaught writes about How to Start and Keep Blogging.

Good as it is, I have little more to add by blogging...
about blogging...
about blogging.
I guess it's just that good!

(So does this count as using my English Major, Mike? :>)

6/24/2005 4:32 PM Eastern Daylight Time  #    Disclaimer  |  Comments [1]  | 

*sigh*, more comment Spam today -- 150 in a few minutes, despite my nice new .Text spam filters (they were all identical).

Unfortunately, I can't just go into blog_content and delete the range (since the comment count wouldn't be updated), and I didn't want to click [Delete], [Yes], [Continue] 150 times, SO: I just fired-up SQL Profiler, reverse-engineered a standard delete call, and slapped together a utility Stored Procedure to loop that call, for big cleanup jobs.

It takes IDs for the first and last comment spam which make it through, and wipes them all out with .Text's native blog_DeletePost stored proc.  Just paste this into Query Analyzer and run to install:

CREATE PROCEDURE re_wipe_commentrange 
@p_ID int,
@p_lastID int
AS

DECLARE @v_sql varchar(8000)
WHILE @p_ID <= @p_lastID
BEGIN
	SET @v_sql = 'exec blog_DeletePost @ID = ' + cast(@p_ID as varchar(5)) + ', @BlogID = 0'
	EXECUTE(@v_sql)
	SET @p_ID = @p_ID + 1
END
GO
(Note: this is for single user .Text blogs.  Multiple-user blogs will need fiddling with the embedded BlogID parameter.)

Then to use it, call like so in QA: EXEC re_wipe_commentrange 900, 1000.

Might save someone a few minutes (even with writing and posting it here, I think I'd still be clicking delete right now).

Time to consider a way to implement MT-Blacklist...

6/24/2005 2:32 AM Eastern Daylight Time  #    Disclaimer  |  Comments [2]  | 

 Thursday, June 09, 2005

, and 90% were spam.

But I just got me a nice new .Text Anti-Comment-Spam SQL Trigger (in addition to the Anti-Referral-Spam SQL Trigger I've had the whole time!).
  ...Looks good so far!

6/9/2005 7:53 PM Eastern Daylight Time  #    Disclaimer  |  Comments [4]  | 

 Tuesday, June 07, 2005

My friend Mike Butler posted a thought-provoker about blog self-censorship and choosing topics.

I've struggled with that dilemma too.

One one hand, I want my family, friends, and strangers to be able to read my blog without being offended or bored.  On the other, I need to express myself freely.  I realized early with this blogging venture that I have a habit of putting on personas for each situation.  That bugged me since it seemed disingenuous, and it was making me second guess myself.  I think I settled on making my blog just For Me (at least as far as topics) -- including the tech-geek, the father, the immature Jr. High dork, the business man, the music-fan, the navel-gazing philosopher, etc.

If a subject bores or bothers someone in real life, they have to grit their teeth.  Here at least they can ignore me without worrying about my feelings :>

I think my goal is no longer about avoiding boring/scaring people away, but rather trying to attract people by giving each of my facets a balanced representation.  For example, Me-the-father hasn't really posted yet (mostly due to the sheer magnitude of the thoughts I want to distill into a post), so there's a whole audience I've missed so far. 

Good food for thought.  Thanks Mike.

6/7/2005 2:56 PM Eastern Daylight Time  #    Disclaimer  |  Comments [1]  | 

 Thursday, June 02, 2005

I've implemented Dean EdwardsStar-Light for code-formatting here.  It's an awesome (and useful!) demonstration of the power of DHTML Behaviors.

Oh, and it's free (just a Creative Commons license).

And it works in both IE and Firefox*.

All it takes is a linked stylesheet and a CSS class on the target code section (specifying the language of the code), and Star-Light dynamically formats and colors it in the browser.  For example, this code:

<pre class="vbscript">
' this is a "comment"
'' so is 'this'
DIM string
string = "' string '"
call msgbox("Hello ""Dean""!")
FUNCTION getText(a, b, c)
	getText = a + b & cstr(c)
END FUNCTION
</pre>

displays thusly:
' this is a "comment"
'' so is 'this'
DIM string
string = "' string '"
call msgbox("Hello ""Dean""!")
FUNCTION getText(a, b, c)
	getText = a + b & cstr(c)
END FUNCTION

The supported languages are CSS, HTML, Javascript, PHP, and XML.  (For fun, it can also enhance plaintext conversation text: emoticons into images, *bold* into bold, /italic/ to italic, _underline_ to underline, plus enhancing ">" quoted sections.)

Coolest of all, though, it's highly extensible via language modules.  I glanced through the code to see if I could make it support VBScript.  The engine is pretty complicated, but each module is a simple HTC file.

From there, it was easy to create a new module for VBScript and plugin the appropriate keywords straight from Microsoft's Windows Script 5.6 Documentation.  I sent my VBScript module (working above) to Dean -- he made a couple improvements, and said he'll include it with the rest soon.  (I may also create modules for VB6 or VB.Net, but there's a lot stuff to those languages...)

I don't mean to gush, but: Very Cool.

Unfortunately, Dean hasn't yet documented how to do write your own module (I figured it out on my own), but it's pretty easy for someone who knows HTCs and has a language reference to copy/paste.

* Another gee-whiz bit: despite the coolness of DHTML Behaviors, they are normally only supported by Internet Explorer.  But Dean's done a wonder, and written a Mozilla XBL wrapper which makes Mozilla/Firefox support DHTML Behaviors too! (which is of course wrapped into Star-Light).  This situation should be the poster child for the de-facto standards camp -vs- the slow academic W3C types, but more on that another day.  Meanwhile, I'll sit back and regret my rationale "DHTML Behaviors are IE-only anyway, so I'll go ahead and use all this other IE-specific code." Like, uh, VBScript..... (dough!)

6/2/2005 2:38 AM Eastern Daylight Time  #    Disclaimer  |  Comments [0]  | 

 Tuesday, May 24, 2005

Traditional email spam like the unsolicited Door Store ads they drop on my step (in plastic covers to maximize slipping).

Comment spam is a "We're voting for Mr. Shmiggle" sign put in my yard without my consent.

Now that I've worked it out, I understand why comment spam irks me so much more, because it (ab)uses my reputation for its own (search engine) advancement.  But I don't want to put up a fence by closing comments tho, because I do want my friendly neighbors to visit and talk to me.

So anyway, if anyone using .Text 0.95 is interested, here's my code to negate the search engine benefit to the comment spammers:

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
	Dim reqURL As String = Request.CurrentExecutionFilePath
	IF reqURL.toLower().indexOf("/archive/")<0 OR Request.Form.ToString()<>"" THEN EXIT SUB
	
	'-- get content
	Dim oWriter As New StringWriter()
	Server.Execute(reqURL, oWriter)
	Dim strResponse As String = oWriter.ToString()
	oWriter = Nothing

	'-- find comment section
	Dim iStart As Integer, iStop As Integer
	iStart = strResponse.IndexOf("<div id=""comments"">")
	IF iStart>0 THEN iStop = strResponse.IndexOf("</div>", iStart)

	If iStart <> -1 And iStop <> -1 Then
		'-- nofollow comment section's links
		DIM strTarget as string = strResponse.Substring(iStart, iStop - iStart)
		DIM strTargetFixed as string = _
			strTarget.replace("<a target=""_new"" href=""http", _
			"<a target=""_new"" rel=""nofollow"" href=""http")
		strResponse = strResponse.replace(strTarget, strTargetFixed)
	End If

	'-- send content
	Response.Write(strResponse)
	Response.End()		'prevent conventional response
End Sub

Just replace the standard Application_BeginRequest procedure with this one in the global.asax.vb file (or absorb mine into it.)  It intercepts outgoing comments and dynamically inserts rel="nofollow" into any contained links.

It won't prevent comment spam, but it will negate the search engine benefit to the comment spammer, turning the "Vote-For-Me" signs into mere litter in your yard.

One catch:  this breaks .Text's inline "Remove Comment" links.  You can still delete them in the the admin area's Feedback section, tho.  Since the comment spam seems to come in waves, that's an easier way to delete them all at once anyway.

(I guess my next goal is actually preventing comment spam via a captcha or challenge-reponse mechanism, but til then I feel more luxury of time to explore possibilities.)

5/24/2005 12:42 PM Eastern Daylight Time  #    Disclaimer  |  Comments [1]  | 

 Monday, May 23, 2005

This sucks, but the gambling comment spam has hit a critical limit, and I've wasted a stupid amount of time trying to solve it (without luck). 

So I've closed commentsAnd now reopened, with my own clever nofollow solution.

To enumerate my frustrations:

* The code for both .Text and Community Server's code is way too complicated.  Why is an open-source app -- which is supposed to encourage hacking from other devs -- full of such highly-abstracted code??  A main reason I settled on CS/.Text was because I know ASP.net fairly well (and ASP extremely well).  Unfortunately, the extreme complexity/abstraction and lack of decent docs pretty much cancels that out.  I've seen PHP apps which were easier to figure out (and I barely know PHP).

....If I'm going to waste this much time on fixing one little thing (comment spam), it's so tempting to just write my own.  I specifically tried to avoid that, though, because I have so many other technical time-drains.

Argh!

5/23/2005 4:08 PM Eastern Daylight Time  #    Disclaimer  |  Comments [3]  | 

 Saturday, January 15, 2005

Introvert I am, I'm also analyzing my motives for how I'm blogging, and why I'm blogging at all.

My space.  Life gets crowded sometimes.  Work and family roles fill up most of it.  I guess I'm seeking a space all of my own, a “studio” (even if just a virtual studio) where I can work on being (and figuring out) Me.

Publishing.  This is the biggest motivation.  As a web developer, I've built a ton of stuff I want to share with the world.  I started doing this a couple years ago and self-publishing it in a section of my business site.  It's always seemed a bit odd, though, since it wasn't really business.  (Giving away stuff for free doesn't pay the bills now does it?).  Furthermore, if that business ever went away, I'd still want to keep doing and publishing that stuff.

Self-Unification:  Sounds weird, and it is.  It falls somewhere between the first two, and has bothered me recently.  It was the final straw that got me here typing now.  I tend to cope with the complications of life by compartmentalizing my life, but many things fit more than one compartment.  The aforementioned publishing issue is one major symptom of this.

I guess these are all facets of the same issue.  I'm a developer at heart (I'd keep coding even if I was suddenly independently wealthy), and that creates tensions I have problems rectifying.  If I was only a developer by day, it'd be fine -- I'd leave work at work.  I can't leave it there though.

Heck, the reason I chose this profession is a story of its own, but one highlight is this:  I was just starting my 4th year of an English Lit degree circa 1997, and still didn't know what I was going to do with it (and was not a little panicky about that).  I was wrapping up my 2nd or 3rd website when my “A-ha!” moment happened -- I realized that a) I loved what I was doing, and b) I could get paid to do it.

I think my second “A-ha” has been more gradual.  A major part of it has been the blog phenomenon (I'll never forget my confusion at how google suddenly started returning a bunch of schmo developer's personal sites when I was doing work research, and how it was not only extremely pertinent, but often better than the official documentation!).  Another big part was reading the fairly amazing Cluetrain Manifesto (read it now!), which pretty much just verbalized what had been churning.  This “A-ha” is basically that business is about people, including me, and so I can't treat my career (my calling?) like a job.  It's not just what I do, or where I spend 8hrs/day -- it's part of me.

I consider myself extremely fortunate to have found a profession I love (even if it's still by the “sweat of my brow” ), but I guess that love needs its own space.

I love to code.

(Perhaps that should by my blog tagline?)

1/15/2005 4:51 AM Eastern Standard Time  #    Disclaimer  |  Comments [0]  | 

Sheesh, it's been mere minutes, and that opening post already looks to me like verbal-diarrhea!  That's the problem with thinking while you talk.

I know I said it was “about me” and all that junk, but what's the point if even I don't want to look at it?!?  This is the web after all.  I've been reading almost 200 blogs for a couple years now, and I've gotten to be a way better skimmer than I ever was in school. 

So: why say it if nobody read it?  

It's a battle between Expression and Communication.  To define: Expression is about simply “getting something out”.  Communication is about “getting something in” -- into someone else's head.  Apparently I look at language and the web as a medium of communication, but not expression? 

Is Expression of an idea valid on its own, even if nobody hears it?  Why do we speak?  (If a tree falls in a forest and nobody hears it....)

I dunno.  Perhaps I should just boil stuff down anyway. 

I'll try a list -- they're hard to make wordy. My intentions:

  • Voice: be open and uninhibited, but succinct
  • Subjects:
    • talk about big web/dev/tech news
    • publish lots of my existing web/dev/tech-related tools/code/articles
    • thoughts on life (if you haven't noticed yet!)
    • obligatory fun/funny links
    • some sort of music features (as-yet-undetermined)
  • Means:
    • That's just it, though, I've got enough means.  This is about the end.  Therefore, Keep It Simple Stupid!
    • And to that end, I'm self-hosting (yes, I am a control-freak), but building atop the .Text blog engine (to avoid creating yet another content mgmt system -- done enough of those thanks!)

Works for me.  Heh, I'm sure you care :>

1/15/2005 3:49 AM Eastern Standard Time  #    Disclaimer  |  Comments [0]  | 

Check check, “sssibilance”

Alright, “hello world” woulda worked too, but I hate clichés.  Now pardon me while I find my own voice...

Reluctant as I am to get near what seem like cliché opening posts, I now understand why they they're popular.  In particular, the usual statement of intentions -- such as “I plan to talk about technical things and my seven beautiful schnauzers” -- now makes sense to me.  It's a way of setting a goal and reminding yourself to pursue it.  The “yourself” part is what's weird tho...

See, blogging rubs against several parts of my social conditioning -- inhibitions in fact.  One is manners: it's rude to talk about yourself too much.  The other is the avoidance of seeming like a “know-it-all”:  I learned to wrap statements in phrases like “I think” or “that's my opinion.” 

Blogging is pure vanity,” and vanity is bad, right? 

Those inhibitions just don't fit here, though, which I realized the moment I started typing.  Basically, a blog (mine anyway -- there I go already, case-in-point) is about me, it's all about me.  Terms like “I think” and “that's just my opinion” do belong in a conversation (they're certainly conducive to a friendly one, tho perhaps not as lively of one :>).  Yes, they have their place in a dialog, but not in a monologue.

(Aside:  apparently we Americans aren't consistent in our -log/logue spelling?  I'm not, anyway.  I never noticed that before.)

So there should be a time and place to be completely self-centered, and it's more commonly known as introspection.  I am definitely an introvert, so I do plenty of that.  The difference here is that doing this in a blog is introspection-out-loud.  I'm used to filtering what I express, all the way from my grand secret plans for world domination, down to simple parts of speech, which just happens to be conversational-lube.  ...Not that I plan to give away my secret plans (suffice it to say it begins just after “get stinking rich”), but I don't wanna sound or feel stilted either.

This is a journal/log, though, and more personal expression than I'm used to lately.  However, y'all would get bored quick if it was always this verbose.  I just had to get that out of my system first. 

I guess that's another issue: I do want to take a dump-it-out-first approach here, rather than the filter-and-refine-it for the audience style I learned as an English major.  It's a forest-for-the-trees situation: I feel like my unwavering focus on succinct expression has made me miss larger ideas. (Ironic bit here: I just spent a lot of effort expressing that very thought in language -- hopefully it's not always a catch-22).   *

Anyway, hopefully saying it out-loud and without reservation will pave that road for an interesting journey.  ...So that's my intention for this blog: to express myself without the cruft of social inhibitions. 

That's one intention, anyway.  I'll get to the other(s?) shortly...


* (Ironic bit#2 here: I just re-edited the post for succinctness anyway, so perhaps the old-school first draft/final draft approach is the answer to my bad edit-as-you-think habit).

So, is this thing on?

1/15/2005 3:09 AM Eastern Standard Time  #    Disclaimer  |  Comments [2]  |