The Maintenance Club Goes Live!

The Maintenance Club is a Preventative Maintenance system for the rest of us!

The Maintenance Club, live today, is a free Preventative Maintenance System that allows for the management of equipment maintenance, parts inventories, and corrective maintenance history. With a simple to use wizard to help users get started new users are just a few steps away from creating their first PM and improving the reliability of their equipment.

Join now and reduce the chances of a breakdown!


Credit Card companies resist regulation

I'm sorry... WHAT??????

CitiBank is Rate-Jacking again!

I had no idea that regulated industries had a say in the matter when regulation was pending, to help prevent things like S&L meltdowns, or Banking collapses, or Credit Card Client Raping!!!

It has become painfully obvious that Banks and Wallstreet can not self regulate. They've proven this time and again! Hello Madoff????

Now we find out that: oh, well there is pushback in the credit industry to regulation to prevent Epic Client Screwing... What the HELL does that have to do with anything???? There's pushback from taxes but average Joe Blows like you and me still dole out our taxes every year like lemings!!!

I am REALLY starting to feel like I'm being duped here...

And it really sounds like it's time to go Cash only. Of course I guess that means I don't get to buy any more houses or cars.

Damn... It's really starting to suck being a tax payer...


Open Letter to Congress

This is the text of a letter that I sent to each of my national representatives:

Dear Senator,

I am writing you to provide feedback on some of the short term results of efforts made by congress and the federal government to deal with the current economic struggle our country faces. Some of the efforts made so far that I am aware of include spending up to $700,000,000,000, of which I believe half has already been spent, repeated reductions in interest rates, potential bailout of some American automakers and rumors of some sort of housing or mortgage bailout. Two companies I have confirmed that have received at least $25,000,000,000 each in “Bailout” funds are JP Morgan Chase and CitiBank. Additionally, American Express has requested at least $3,500,000,000 from the “Bailout” fund. I have accounts with all of these institutions.

Last week, I received a letter regarding my Chase Mastercard that stated they were lowering my credit limit due to various reasons. The letter stated these reasons were found by reviewing my credit report with Experian. Note that I have neither been late in any payment in years nor have I recently increased any balances on any credit cards by more than a few hundred dollars, and that only due to Christmas. I reviewed my Experian credit report within hours of reading this letter from Chase. I noticed two things: first, that all accounts stated either Current or Paid Satisfied; second, I reviewed all inquiries on my credit report to see what companies have queried my report and when. I noticed that the last review by any Chase related company was in January 2007 and that wasn’t even a Credit Card related inquiry. To me, it would then appear that whatever prompted the reduction in my credit limit was not related to any information in my credit report since they did not even look at it.

The only extenuating circumstance to this issue is that two months ago I chose to exercise the insurance that every credit card company tries to push on their customers, which protects against things such as job loss or disability. I did this due to the recent birth of my second child which has put my wife out of work for several months.

Yesterday, I received a letter from my CitiBank MasterCard stating they were increasing my interest rate. They gave an option of opting out of this increase; however, it stated that my account would be closed and the balance would have to be paid in full when my current card expires if I did so.

Additionally, several weeks ago my wife received a letter from American Express stating that the limit on her card would also be reduced. We just assumed the reason was because we don’t use this card much. We’re starting to wonder now…

I am not asking for personal intervention in my situation. I only wish to share my first hand experience with the results of some of the economic bailout efforts. It is my opinion that the results hoped for are not being achieved.

Respectfully yours,
Ramon S. Ebert


Yet one more .NET photo album online

So we've all seen a million different picture albums online. Outside of the pro's like Snapfish and Picasa nearly every website out there has picture albums with thumbnails that you click to view a larger image. Been there done that.

I've had these on my website since it's inception in 1995 or so... I've used various methods over the years to create these. I've tried Photoshop web photo albums, Picasa web photo albums, Frontpage photo albums etc. I kept running into issues that bothered me when I used someone else's solution so I started coding my own albums in straight HTML using tables etc. This worked perfectly because I had complete control of the code but it sure was tedious!

As my digital photography sophistication increased, at least that's my perception anyway, so did the number of pictures I shot and the size of my picture albums. My Yellowstone road trip album has over 300 images in it. Yeah, that's a lot of friggin pictures! It's even more HTML coding and <TD> tags!!! As any developer knows the more code you hand type the more potential you have for typos...

So I've spent too much time trying to find a better solution for me that met the exacting, and some might say odd or anal, requirements that I had for creating picture albums. Here are my requirements:
- Needs to be a grid of thumbnails that when clicked opens a larger version of the image.
- Needs to load relatively fast.
- Would be fun if you could have a next and previous feature so as to act like a slideshow.
- Some interesting animation would be neat!
- Would like to display the image name, when it was shot and the camera used.
- Would like to be able to easily add comments to any picture.
- Would like the images sorted by the date they were taken.
- Would NOT like to code HTML for any picture album!
- Would NOT like to create thumbnails manually!
- Would like to be able to add comments or change them after the images are uploaded so that I can at least create the album, post it, then update comments later.
- Would like to be able to add a header and body text without having to create a new page for the album.
- Bonus points if I can dynamically decide which style sheet to use.
- Will be developed in .NET 2.0/3.5 and Visual Basic.

Those are the main requirements. There may be other things that I don't remember right now. So here is the strategy I came up with:

There should be a thumbnail creator that will automatically generate thumbnails, and save them to disc, in the correct format, landscape or portrait, from a set of source images. The thumbnailer should also read the meta-data of the images for date taken, camera type, and also file name. It should be robust enough that if the meta-data is missing it should use alternate data. The thumbnailer should finally take this data and store it in an XML file saved to the same folder as the images.

The next step would then be to create a slideshow engine that uses the generated XML document to display the thumbnails sorted by date taken and link to the larger version of each image. The slideshow engine should have the facility to decide which stylesheet to apply based on a querystring value. It should also decide if there are header and body text files that it can insert into the page to give content.

Simple yes? Well yes and no. I ran into a few roadblocks along the way. Don't worry, I'll supply code below... Originally I created the entire thumbnailer/slideshow engine as one super dooper photo album engine. Worked great on my local server too! Problem was when I uploaded it to godaddy.com it could no longer read the meta-data on the images. I also ran into permissions issues with creating the XML file and with saving the thumbnails.

So my solution then became the two part process mentioned above. Actually there are the preceding steps of picking the images and then resizing them for the web, but I'll leave that for another topic perhaps...

So the Thumbnailer:
You'll need these imports:

Imports System
Imports System.IO
Imports System.Text
Imports System.Drawing
Imports System.Drawing.Image
Imports System.Windows.Media
Imports System.Windows.Media.Imaging
Imports System.Xml

I have a predefined image folder where all images will be stored in subfolders. When I call the thumbnailer from the browser I need to include the folder I want processed. I decided to go ahead and enumerate these folders to make it easier to go through them. I just dump this to a label on the page as list of links.

Dim oFileSystem = Server.CreateObject("Scripting.FileSystemObject")
Dim oFolder = oFileSystem.GetFolder(Server.MapPath(sfullPath + sSubFolder))
Dim oSubFolders = oFolder.subFolders
Trace.Warn("Page_load", "Folder Count: " + CStr(oSubFolders.count))
If oSubFolders.Count > 0 Then
lblFolderList.Visible = True
lblFolderList.Text = ""
Dim oSingleFolder = oFolder.subFolders
For Each oSingleFolder In oSubFolders
lblFolderList.Text += "<a href=pictionator.aspx?s=" + _
Server.UrlPathEncode(oSingleFolder.Name) + ">" + oSingleFolder.Name + _
oSingleFolder = Nothing
End If
oFileSystem = Nothing
oFolder = Nothing
oSubFolders = Nothing

Now I have a list of links that I can just click on to process any subfolder in my images folder.

First step is to generate thumbnails:

Dim sSubFolder As String = ""
Dim sfullPath As String = "imges/"
If Len(Request("s")) > 0 Then
sSubFolder = Request("s") + "/"
End If
Dim oDir As System.IO.DirectoryInfo
oDir = New System.IO.DirectoryInfo(Server.MapPath(sfullPath + sSubFolder))
If oDir.Exists() Then
Dim oFileSystem = Server.CreateObject("Scripting.FileSystemObject")
Dim oFolder = oFileSystem.GetFolder(Server.MapPath(sfullPath + sSubFolder))
Dim oFiles = oFolder.Files
Response.Write("File Count: " + CStr(oFiles.Count))
If oFiles.Count > 0 Then
Dim oFile = oFolder.Files
Dim fileNameLink, fileNameExt As String
Dim i As Int32 = 0
Dim thW As Integer = 0
Dim thH As Integer = 0
Dim imgFile As String
Dim myimg As System.Drawing.Image
For Each oFile In oFiles
'Basically on process JPG's that do not have a thumbnail already
If Not File.Exists(Server.MapPath(sfullPath + sSubFolder) + "\" + _
fileNameLink + "_sm." + fileNameExt) And Right(fileNameLink, 3) <>_
"_sm" And fileNameExt.ToLower = "jpg" Then
imgFile = (Server.MapPath(sfullPath + sSubFolder) + "\" + _
fileNameLink + "." + fileNameExt)
myimg = System.Drawing.Image.FromFile(imgFile)
'decide format of the image
If myimg.Width > myimg.Height Then
thH = 120
thW = 150
thH = 150
thW = 120
End If
myimg = myimg.GetThumbnailImage(thW, thH, Nothing, IntPtr.Zero)
myimg.Save(Replace(imgFile, "." + fileNameExt, "_sm." + _
fileNameExt), myimg.RawFormat)
End If
End If
End If

The next step is to build the XML document:

Protected Sub buildXMLDoc()
If Request.QueryString("s") Is Nothing Then
lblMessage.Text = "Sorry that folder does not seem to exist."
Dim sSubFolder As String
Dim sfullPath As String = "images/"
sSubFolder = Request.QueryString("s")
Dim dir As New IO.DirectoryInfo(Server.MapPath(sfullPath + sSubFolder))
'Get a list of only .jpg files. Others can expand this to different
'file types.
Dim fileSet As IO.FileInfo() = dir.GetFiles("*.jpg")
Dim afile As IO.FileInfo
Dim imageXMLWriter As XmlTextWriter = New _
XmlTextWriter(Server.MapPath(sfullPath + sSubFolder + "/picXML.xml"), _
imageXMLWriter.Formatting = Formatting.Indented
'Beginning of the XML Doc.

'list the names of all files in the specified directory
For Each afile In fileSet
If InStr(afile.Name.ToString, "_sm") = 0 Then
'Add node for each image.
addImageNode(sfullPath + sSubFolder + "/" + afile.Name.ToString,_
afile.Name.ToString, imageXMLWriter)
End If

'End and close the writer

dir = Nothing
fileSet = Nothing
afile = Nothing

Catch ex As Exception
End Try
End If
End Sub

We need to create the nodes:

Private Sub addImageNode(ByVal fileNamePath As String, ByVal fileName As String, ByRef theXMLDoc As XmlWriter)
Dim thumbExt As String = ""
'I've used several different identifiers for thumbnails over the years.
If File.Exists(Server.MapPath(Replace(fileNamePath.ToLower, ".jpg", _
"_sm.jpg"))) Then
thumbExt = "_sm.jpg"
ElseIf File.Exists(Server.MapPath(Replace(fileNamePath.ToLower, ".jpg", _
"_small.jpg"))) Then
thumbExt = "_small.jpg"
ElseIf File.Exists(Server.MapPath(Replace(fileNamePath.ToLower, ".jpg", _
"_th.jpg"))) Then
thumbExt = "_th.jpg"
End If

Dim img As BitmapSource = BitmapFrame.Create(New _
Dim meta As BitmapMetadata = img.Metadata
'create the data elements for the image
theXMLDoc.WriteElementString("thumbnail", Replace(fileNamePath.ToLower, _
".jpg", thumbExt))
theXMLDoc.WriteElementString("filename", fileNamePath)
theXMLDoc.WriteElementString("Comment", _
FormatDateTime(meta.DateTaken.ToString, DateFormat.ShortDate) + " - " + _
fileName.ToString + " - " + meta.CameraModel.ToString)
Catch ex1 As Exception
theXMLDoc.WriteElementString("Comment", fileName.ToString)
End Try
theXMLDoc.WriteElementString("ImageName", fileName.ToString)
theXMLDoc.WriteElementString("CameraModel", meta.CameraModel)
theXMLDoc.WriteElementString("datetaken", FormatDateTime(meta.DateTaken,_
theXMLDoc.WriteElementString("sortnode", _
Catch ex2 As Exception
Dim oFile As FileInfo = New FileInfo(Server.MapPath(fileNamePath))
theXMLDoc.WriteElementString("datetaken", _
FormatDateTime(oFile.CreationTime(), DateFormat.ShortDate))
theXMLDoc.WriteElementString("sortnode", _
oFile = Nothing
End Try
theXMLDoc.WriteElementString("rel", "lightbox[images]")

meta = Nothing
img = Nothing
Catch ex As Exception
End Try
End Sub

The final step that I do is to create a header.txt and a body.txt in each image subfolder that contains the text content of the page. I put as little HTML in my content as possible, however this allows me to tell a story about the images below and I still don't have to edit the slideshow page!

The reason this is now a two step process is because all of the stuff above has to run on my local server where I have complete control of permissions and stuff. Your hosting service may allow you to run all this stuff on their server. Mine wouldn't...

Now we have the Slideshow engine itself. After I post all my image subfolders and all the content to my hosting server this is the part that creates the slideshow for the user:

The ASPX page looks like this:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Ebertworld Slideshow Engine</title>
<asp:Literal ID="litStyleSheet" runat="server"></asp:Literal>
<link href="style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous.js?load=effects"></script>
<script type="text/javascript" src="js/lightwindow.js"></script>
<link rel="stylesheet" href="css/lightwindow.css" type="text/css" media="screen" />
<link rel="shortcut icon" href="../websiteicon.ico" />
<form id="form1" runat="server">
<div style="width:800px;">
<!--#include file="nav.htm"-->
<br />
<asp:Label ID="lblMessage" runat="server"></asp:Label><br />
<asp:Label ID="lblHeader" runat="server" Visible="false"></asp:Label><br />
<asp:LinkButton id="lnkShowStoryTop" runat="server" Visible="False">More of
the story...</asp:LinkButton>
<asp:label id="lblBody" runat="server" Visible="false"></asp:label>
<asp:Label id="lblBodyTeaser" runat="server"></asp:Label>
 <asp:LinkButton id="lnkShowStory" runat="server"><br />More of the
<asp:DataList ID="dlImageList" runat="server" RepeatColumns="4"
RepeatDirection="Horizontal" HorizontalAlign="Center">
<div style="text-align:center;">
<asp:HyperLink ID="hprLink" runat="server" NavigateUrl='<%#
eval("filename") %>' class="lightwindow" rel='<%# eval("rel") %>'
title='<%# eval("Comment") %>'>
<asp:Image ID="thumbnail" runat="server" AlternateText='<%#
eval("Comment") %>' ImageUrl='<%# eval("thumbnail") %>' ToolTip='<%#
eval("Comment") %>' />
</asp:HyperLink><br />
<asp:Label ID="lblTitle" runat="server" Text='<%# eval("ImageName") %>'
Font-Size="6pt" ForeColor="#FFFF66"></asp:Label>


You might notice some references to prototype, scriptaculous and lightwindow. I'm using these awesome javascript libraries for the image display features. You could skip that or use something else like Mootools, that's up to you. The other thing to notice here is that I'm using a literal in the header for placement of a stylesheet link...

Here is the slideshow engine in all it's glory:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Request.QueryString("s") Is Nothing Then
lblMessage.Text = "Sorry that folder does not seem to exist."
lblBodyTeaser.Visible = False
lnkShowStory.Visible = False
If Request.QueryString("p") Is Nothing Then
litStyleSheet.Text = "<link rel='stylesheet' type='text/css' href='../Style.css' />"
Select Case Request.QueryString("p")
Case "1"
litStyleSheet.Text = "<link rel='stylesheet' type='text/css' href='css/1/style.css' />"
Case "2"
litStyleSheet.Text = "<link rel='stylesheet' type='text/css' href='../2/Style.css' />"
Case "3"
litStyleSheet.Text = "<link rel='stylesheet' type='text/css' href='../3/Style.css' />"
Case Else
litStyleSheet.Text = "<link rel='stylesheet' type='text/css' href='../Style.css' />"
End Select
End If
Dim sSubFolder As String
Dim sfullPath As String = "images/"
sSubFolder = Request.QueryString("s")
Dim myFileText As String
Dim sr As StreamReader

If File.Exists(Server.MapPath(sfullPath + sSubFolder + "/header.txt")) Then
sr = New StreamReader(Server.MapPath(sfullPath + sSubFolder + "/header.txt"))
myFileText = sr.ReadToEnd()
lblHeader.Text = myFileText
lblHeader.Visible = True
End If

If File.Exists(Server.MapPath(sfullPath + sSubFolder + "/body.txt")) Then
sr = New StreamReader(Server.MapPath(sfullPath + sSubFolder + "/body.txt"))
myFileText = sr.ReadToEnd()
lblBody.Text = myFileText
lblBodyTeaser.Text = Left(myFileText, 120) + "..."
lblBodyTeaser.Visible = True
End If
sr = Nothing
If File.Exists(Server.MapPath(sfullPath + sSubFolder + "/imageXML.xml")) Then

Dim xmlRdr As XmlReader = XmlReader.Create(New IO.StreamReader(Server.MapPath(sfullPath + sSubFolder + "/imageXML.xml")))

Dim ds As DataSet = New DataSet
Dim dv As DataView
dv = ds.Tables(0).DefaultView
dv.Sort = "sortnode"

dlImageList.DataSource = dv
xmlRdr = Nothing
lblMessage.Text = "Sorry didn't find an image list..."
End If
Catch ex As Exception
End Try
End If
End Sub

You can see that I'm also processing the header.txt and body.txt files if they exist. Pretty simple huh? I used a text hiding feature for the body text so that people who only want to look at the pictures can, while those that want to read the story have that option too. The mechanisms for hiding and showing that text is here:

Private Sub lnkShowStoryTop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lnkShowStoryTop.Click
If lblBody.Visible = True Then
lblBody.Visible = False
lblBodyTeaser.Visible = True
lnkShowStory.Text = "More of the story..."
lnkShowStory.ToolTip = "Click to view the entire event narrative"
lnkShowStoryTop.Text = "More of the story..."
lnkShowStoryTop.Visible = False
lnkShowStoryTop.ToolTip = "Click to view the entire event narrative"
lblBodyTeaser.Visible = False
lblBody.Visible = True
lnkShowStory.Text = "Hide..."
lnkShowStory.ToolTip = "Click to hide the event narrative"
lnkShowStoryTop.Text = "Hide..."
lnkShowStoryTop.Visible = True
lnkShowStoryTop.ToolTip = "Click to hide the event narrative"
End If
End Sub
Private Sub lnkShowStory_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lnkShowStory.Click
If lblBodY.Visible = True Then
lblBodY.Visible = False
lblBodyTeaser.Visible = True
lnkShowStory.Text = "More of the story..."
lnkShowStory.ToolTip = "Click to view the entire event narrative"
lnkShowStoryTop.Text = "More of the story..."
lnkShowStoryTop.Visible = False
lnkShowStoryTop.ToolTip = "Click to view the entire event narrative"
lblBodyTeaser.Visible = False
lblBodY.Visible = True
lnkShowStory.Text = "Hide..."
lnkShowStory.ToolTip = "Click to hide the event narrative"
lnkShowStoryTop.Text = "Hide..."
lnkShowStoryTop.Visible = True
lnkShowStoryTop.ToolTip = "Click to hide the event narrative"
End If
End Sub

One final comment.

You may have noticed an extra node in my XML document that I didn't really mention. The "sortNode". I kept running into the problem of when sorting my pictures by the dateTaken they would sort as if the date was a text string not a date. So a picture taken on 12/3/07 would show up before a picture taken on 3/3/07. I went down the path of trying to use either an XSD or an XSLT to help me sort the nodes but the solution did not prosent itself in a timely manner and I can have a short attention span from time to time. I call it the Shiny Object Syndrome...

Anyway, I decided that I just needed a way for the gridview to natively sort on an element in my XML document properly. I knew that it could handle strings and numbers pretty well. Then it dawned on me. Dates on a computer are stored as ticks, 100 millisecond segments of time since a given point in the past. This value is a big int! Perfect! So I just added the sort node and formatted the dateTaken value in ticks and I had my perfect sort value.


The Shrimp

Well, lets tell the whole back story...

I worked the game last night. Which among other things means I had to go up to the press box and eat in the dining area there. Okay, I guess I didn't have to... I ordered a yummy shrimp, sun dried tomatoes, mushrooms, angel hair pasta and red sauce topped with a little cheese and oregano. Like I said... Yummy!

I take my concoction to the press level desks above home plate and sit down with a notebook to watch the game, eat, and write some notes down for a meeting the next day.

With my second bite a shrimp jumped to the back of my throat. No shit! It went directly from the fork to the back of my throat! I'm sitting in an open area with dozens of reporters, all of the Padres PR staff, several security folks, Local TV Personalities and ironically the CEO of the Padres. My first thought is to try to cough up this shrimp, but it's not in my airway it's in my esophagus. So coughing does nothing. My only two options are to try to throw up in front of all these people or swallow. Guess what I did?

So for the next three hours I tried to clear this shrimp from my esophagus. I had thought being a slimy shrimp that it might just pass right on through, but that was not my luck. I went through 4 bottles of water, a cookie, and a diet coke in my efforts. Nothing went down and all of that stuff came back up. Of course I was doing this in the bathroom during game time so I would try to time my puking to coincide with the bathroom being empty.... By 9PM I had some work to do and as long as I did not try to eat or drink anything I wasn't all that uncomfortable. I finished my game day duties, waited for traffic to die down and went home. In case you were wondering the Pads won!

Once home I tried again to clear this miserable crustacean to no avail.

This morning I tried again several times. Now I had some pain due to the repeated hard swallowing and puking. Still that little fucker was stuck in there!

So I called the doc. Went to urgent care at 9AM. By 10AM they sent me to Scripps hospital in La Jolla. By noon I was on a gurney with an IV of sugar water chilling me and electrodes attached to me at various points. Endoscopy here I come!

They knocked me out with something that literally took seconds from the moment they put it into my IV to my head swimming and my vision going all wacky. Of course that experience lasted all of 10 seconds...

An hour later I was waking up. Somehow I was dressed. I have no idea how this happened. Most of this time is pretty fuzzy so I got the replay from Mandi. Plus they gave me pictures as a souvenir! I'd be happy to scan them and email them to you if you like. Surprisingly NONE of the nurses laughed at ANY of my jokes! Bitches! Actually they took very good care of me and laughed at me only a little.

The doc found a whole shrimp at the bottom of my esophagus. He pushed it down into my stomach, after taking a picture of it. He then took a few biopsies and shot another picture of what appears to be scar tissue that is causing food to be impacted in my esophagus. I have to go back in one month to get a repeat of today except this time they'll try to stretch my esophagus and remove or deal with the scar tissue.

I think next time I'll just hit the salad bar...


Lunchtime Confessions

I was in a bad mood at lunch today so I decided to take a walk and try to clear my head. As both of my readers know I work in Downtown San Diego. So I went for a walk on a beautiful day. I did clear my head of some things and filled it with others...

As I walked up 7th towards the book store I passed a couple talking. I overheard the man say he didn't have money to buy an all day bus pass to be going all over San Diego today. He asked his companion if she had any money. Her response was "I told you I have $5..." My problems became less weighty...

As I continued my walk on market then up on 6th I ended up behind a group of girls walking along. I didn't put much effort into looking away as the skirt of the one on the left would blow up in the wind... What problem was I thinking about again?

I shopped a bit in the book store. I noticed a lady with a stroller apparently filled with all her worldly possessions. She was thumbing through a picture book. I asked to use their restroom. You need a token and dude gave me one. As I was coming out a guy came running at me. I figured quickly to gain access to the head without a token. I didn't put any effort into holding the door for him. He made it.

I headed south on 6th again then over on Market to 7th and headed for Subway. Along the way was a girl sitting in the middle of the sidewalk reading the classifieds. She didn't appear homeless and I don't know what she was looking for. It struck me though that I wish I could be more helpful to folks. The man and woman I'd passed earlier only seemed to need bus fare. This girl I'm going to guess was looking for an apartment or a job. Not sure what help could be provided, but still, I hope she does not need to spend a night on the street tonight.

I see things like this most days I go walking around and it makes me wish I could do more, something... Then the cynic in me might say "you can't change the world..." and liberal in me would even agree. It would just be nice to change someone's day...


It's a Grind doesn't make the cut

Wanted a nice Americano this morning. Headed over to the "It's a Grind" at 10th and J street near Petco Park. I've been to this place a few times and the vibe is real funky here. Usually there's a homeless guy out front. Service is usually slow so it's not a place I'd try to pop in to get a quick cup of coffee. But if you want an espresso your choices are limited within a five minute walk of the ball park.

Nice girl took my order though she seemed a bit distracted which is common in this place. Then I walk over near the pick up counter to await my coffee. The three people in front of me eventually got their coffee. Then the three people behind me got their orders. And note - these weren't just coffee orders from the pre-brewed pots they were espresso and latte and iced coffee orders.

Now I'm watching this dumbass try to figure out the difference between the medium and large cups. This literally took 2 or 3 minutes. He can see me standing there watching him. I spend my time reading a ridiculous petition to make Petco Park's Park at the Park a Leash Free park, but I won't get into that idiotic nonsense...

20 minutes after placing my order and watching numerous people behind me get their orders dipshit calls my name. He asks if I want hot or cold water in my Americano. This inept mentally stunted fool works in a coffee house and he does not know what a fucking Americano is??? I pointedly tell him Hot! Three minutes later he finally hands me my coffee and proceeds to spill boiling fucking coffee all over my hand. However he couldn't be bothered with that triviality because he needed to keep on his conversation with some girl in the place.

I turned to him and said: Hey spanky I know your job is very complicated but perhaps if you could focus for just three minutes you could make an espresso without burning your customer...

I understand that people's job opportunities are limited to their own physical and mental capacities. This guy has exceeded his...

So now we need to find Ray a new coffee house within a five minute walk of Petco Park or Ray is going to get Grumpy...