The Florida SEO - Learning Linux One Mistake at a Time.

A couple months ago I decided to take the leap into actually installing and running a Linux machine. After a couple of failed installs, I managed to format a disk and install my new favorite distro ... Debian installed. Coming from a Windoze environment there were a lot of hurdles to overcome just to figure out how to get around on a Linux setup. First off ... I've got to give props to the guys over at forums.debian.net ... without the hundreds of how-to posts I don't think I would have gotten too far.

The first real hurdle for me was wrapping my tiny little brain around the way Linux 'mounts' work. Being used to the drive letter mentality, it was odd to understand that there really is no drive letter ... it's just a label for how Windoze mounts a partition. I still don't really understand it all, but I do have an idea how It works now.

While Windoze typically installs to let's say c:\, Linux does not make a letter for a partition. As such, in Linux there is just '/' which is the root directory. Nearly all the working directories are installed under the root directory ... unless of course you should so choose to move them elsewhere ... which, is another story.

Typically, a Linux install will have the default directories installed as follows ...

/ - root = The main directory and the root of where everything else is.
/bin/ = The executable directory ... where stuff that can execute goes.
/boot/ = Guess what goes here heh? Yeah, your boot loader, kernels, etc.
/dev/ = Devices ... Big topic ... lot's of stuff in here ... mostly disks and tty's. Google it.
/home/ = This is where your files are ... You are running as a user right and not root right? If not ... Well ... You'll probably be reinstalling your system pretty soon ...
/etc/= This is where the configuration files are located in a Debian distro.
/lib/ = Libraries ... this is where the informational source files required by the systems' essential binaries are ...
/media/ = Mounted points for removable media ... like a usb or a CD-ROM ...
/opt/ = Optional applications ... Now this one is interesting because sometimes it's used for add-on applications that are not part of a typical .deb package. There may also exist sub directories under /opt too ... such as /opt/bin, /opt/include, /opt/lib, etc.
/proc/ = This is a virtual file system where processes status are found ... I.E. /proc/cpuinfo
/root/ = The REAL root users file. This is not the same as / root. This is the root users' home directory ... You really shouldn't be in there if your just working as a user.
/sbin/= System binaries – This is for the root user or the system ... not your stuff.
/srv/ = The serve directory ... I choose this one to serve my web stuff from. Why? I don't know ... I just happen to like the sound of /srv/ instead of /var/www ...
/sys/ = Supposedly the file system for kernel objects ... Don't know much about it yet.
/usr/ = The second level file system for shareable stuff ... like /usr/local, /usr/bin, or /usr/sbin ...
/var/ = Variable data ... many Linux distros will install Apache related stuff here ... Like /var/www for web docs ... I moved mine though but I don't think it really matters where it comes from ...
Again ... I'm new to Linux so a lot of this is well still new to me ... sue me if I say the wrong thing.

The biggest hurdle was trying to figure out how to actually move around the files system. First of all ... If you don't have permission ...Linux may not even let you enter a directory. Say for example you try to 'CD' to enter into the /root/ home directory you'll simply get a permission denied message. This is how Linux keeps standard users from accessing places they shouldn't. In order to access the /root/ directory you either need to be the root user (which you should never use while operating X windowed programs) or you need a special access level to get there. This access is called 'SU' or Substitute User. However, before being allowed to use SU ... you must be given permission in a special access file called the sudoers file ... Now on a Debian based Linux distro ... the sudoers file is located under /etc/ ... specifically /etc/sudoers ...

So you need to have root access to either add yourself or someone else to the sudoers file. I don't know exactly why, but you are supposed to only edit this file with the visudo command which, opens the file in the VI editor ... At this point you can either add yourself or someone else to the file as a 'sudoer' so that access may be given. However, if your not familiar with getting around in VI or VIM ... then well ... guess what ... You've got some more learnin' to do ... cause if you don't know how to get around in VIM (like I didn't) then you are going to be in for quite a surprise ...

So ... after literally two months of trial and error, I've finally gotten to the point where I can actually use Linux ... it's taken a lot of work ... but if I can figure it out then I guess nearly anyone can ...

Here's a screenshot of my Debian box running with KDE 4.4

BlogCFC ColdFish Code Block Print Function Update

Normally I pay quite a bit of attention to my site after I do any major updates or changes but I've been quite a slacker lately and I seemed to have missed a few issues that happened after I updated my blog core ... Bad me.

Something interesting that I truly thought would be an isolated incident - and my problem - actually wasn't. It seems that there was a bug where Gecko based browsers - Firefox - don't seem to like the window.frames[] syntax ... So, for those that are using BlogCFC and want to be able to print code blocks from Firefox ... You may need to update the formatter.cfc with the new syntax ... Here's the link for the formatter.cfc ... on RIAForge ... or you can simply copy the update from here ...

view plain print about
1<!---
2    Copyright 2009 Jason Delmore
3    All rights reserved.
4    jason@cfinsider.com
5    
6    This program is free software: you can redistribute it and/or modify
7    it under the terms of the GNU Lesser General Public License (LGPL) as published by
8    the Free Software Foundation, either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public License    
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18    --->

19<cfcomponent output="false">
20    <cffunction name="init" access="public" hint="This function initializes all of the variables needed for the component." output="false">
21        <cfscript>
22            //initialize a buffer
23
                
24            // If you're using JDK 1.5 or later and want some extra performance this can be a StringBuilder
25
            //variables.buffer=createObject("java","java.lang.StringBuilder").init();
26
            variables.buffer=createObject("java","java.lang.StringBuffer").init();
27            
28            // initialize private variables
29
            // TODO : Change the parser state to be a struct rather than individual variables.
30
            variables.isCommented=false;
31            variables.isTag=false;
32            variables.isValue=false;
33            variables.isCFSETTag=false;
34            variables.isCFScript=false;
35            variables.isCFQueryTag=false;
36            variables.isOneLineComment=false;
37            variables.isMXML=false;
38            variables.isActionscript=false;
39            variables.isSQL=false;
40            variables.isSQLValue=false;
41            variables.initialparser="";
42            variables.spansOpened = 0;
43            variables.spansClosed = 0;
44        
</cfscript>
45        <cfreturn this/>
46    </cffunction>
47    
48    <cffunction name="getHTMLOutput" access="public" hint="This function accepts a block of code and formats it into syntax highlighted HTML." output="false">
49        <cfargument name="code" type="string"/>
50        <cfargument name="parser" type="string"/>
51        <cfargument name="codesig" type="string"/>
52        <cfscript>
53            var BIstream = createObject("java","java.io.StringBufferInputStream").init(arguments.code);
54            var IStream = createObject("java","java.io.InputStreamReader").init(BIstream);
55            var reader = createObject("java","java.io.BufferedReader").init(IStream);
56            var line = reader.readLine();
57            var linenumber = 0;
58            
59            if (arguments.parser neq ""{
60                "variables.is#arguments.parser#" = true;
61            }
62            
63            if (getConfig().getShowToolbar()) {
64                variables.buffer.append(getToolbarHTML(arguments.code,arguments.codesig));            
65            }
66            
67            variables.buffer.append("<span id='formatted_code_" & arguments.codesig & "' style='" & getStyle("TEXT") & "'>");
68            while isdefinedd("line")) {
69                if (getConfig().getShowLineNumbers()) {
70                    linenumber = linenumber + 1;
71                    variables.buffer.append("<span style='" & getStyle("LINENUMBER") & "'>" & linenumber & "</span>");
72                }
73                formatLine(line);
74                line = reader.readLine();
75            }
76            // there appears to be more spans created than cleaned up... closing up any extras... will need to review to see what is keeping extra spans
77
            while (variables.spansOpened gt variables.spansClosed) {
78                variables.spansClosed = variables.spansClosed + 1;
79                variables.buffer.append("</span>");
80            }
81            variables.buffer.append("</span>");
82            reader.close();
83
84            return variables.buffer;
85        
</cfscript>
86    </cffunction>
87    
88    <cffunction name="getToolbarHTML" access="private" output="true">
89        <cfargument name="code" type="string"/>
90        <cfargument name="codesig" type="string"/>
91        <cfset var toolbarHTML = ""/>
92        <cfsavecontent variable="toolbarHTML">
93            <iframe id='print_frame_#arguments.codesig#' style='display:inline;height:0px;width:0px;' frameborder='0'></iframe>
94            <script type='text/javascript'>
95                function toggle_view_#arguments.codesig#() {
96                    var temp = document.getElementById('htmlencoded_plain_#arguments.codesig#').style.display;
97                    document.getElementById('htmlencoded_plain_#arguments.codesig#').style.display=document.getElementById('formatted_code_#arguments.codesig#').style.display;
98                    document.getElementById('formatted_code_#arguments.codesig#').style.display=temp;
99                    if (temp=='none') {
100                        document.getElementById('view_#arguments.codesig#').innerHTML='view formatted';
101                    } else {
102                        document.getElementById('view_#arguments.codesig#').innerHTML='view plain';
103                    }
104                }
105                function copy_to_clipboard_#arguments.codesig#() {
106                    var code=unescape(document.getElementById('htmlencoded_plain_#arguments.codesig#').innerHTML).replace(/&lt;/g, '\x3C').replace(/&gt;/g, '\x3E').replace(/&amp;/g, '\x26').replace(/\x3Cbr\x3E/gi, '\r\n').replace(new RegExp('&nbsp;&nbsp;&nbsp;&nbsp;', 'gi'), '\t');
107                    window.clipboardData.setData('text',code);
108                }
109                function print_#arguments.codesig#() {
110                    document.getElementById("print_frame_#arguments.codesig#").contentWindow.document.body.innerHTML = document.getElementById('formatted_code_#arguments.codesig#').innerHTML;
111                    document.getElementById("print_frame_#arguments.codesig#").contentWindow.focus();
112                    document.getElementById("print_frame_#arguments.codesig#").contentWindow.print();
113                }
114                function show_about_#arguments.codesig#() {
115                    document.getElementById('about_#arguments.codesig#').style.display='inline';
116                    window.setTimeout('hide_about_#arguments.codesig#();', 4000);
117                }
118                function hide_about_#arguments.codesig#() {
119                    document.getElementById('about_#arguments.codesig#').style.display='none';
120                }
121            </script>
122            <div style='#getStyle("TOOLBAR")#'>
123                <span style='margin:0 0 0 2em'/>
124                <!--- Toggle code view --->
125                <a href='javascript:toggle_view_#arguments.codesig#()' style='#getStyle("TOOLBARLINK")#' id='view_#arguments.codesig#'>view plain</a>
126                
127                <!--- Copy to clipboard --->
128                <a href='javascript:copy_to_clipboard_#arguments.codesig#()' style='display:none;#getStyle("TOOLBARLINK")#' id='view_copy_to_clipboard_link_#arguments.codesig#'>copy to clipboard</a>
129                <!--- The cross-browser copy to clipboard methods out there are hacky and only work on certain browsers... if the browser handles it, then the link show up... --->
130                <script type='text/javascript'>if(window.clipboardData) { document.getElementById('view_copy_to_clipboard_link_#arguments.codesig#').style.display='inline';}</script>
131                
132                <!--- Print --->
133                <a href='javascript:print_#arguments.codesig#()' style='#getStyle("TOOLBARLINK")#'>print</a>
134                
135                <!--- About --->
136                <a href='javascript:show_about_#arguments.codesig#()' style='#getStyle("TOOLBARLINK")#'>about</a>
137                
138            </div>
139            <span id='about_#arguments.codesig#' style='display:none;#getStyle("TEXT")#'><span style='#getStyle("LINENUMBER")#'>&nbsp;</span>&nbsp;ColdFISH is developed by Jason Delmore.  Source code and license information available at <a href='http://coldfish.riaforge.org/'>coldfish.riaforge.org</a><br/></span>
140            <span id='htmlencoded_plain_#arguments.codesig#' style='display:none;#getStyle("TEXT")#'>#REReplace(REReplace(htmleditformat(arguments.code), "\n", "<br />", "ALL"),"\t","&nbsp;&nbsp;&nbsp;&nbsp;","ALL")#</span>
141        </cfsavecontent>
142        <cfreturn toolbarHTML/>
143    </cffunction>
144    
145    <cffunction name="formatLine" access="private" hint="This function takes a single line of code and formats it into syntax highlighted HTML." output="false">
146        <cfargument name="line" type="any"/>
147        <cfscript>
148            var character = "";
149            var thisLine=arguments.line;
150            var i = 0;
151            var endtagPos = 0;
152            var startAttributePos = 0;
153            var keywordskip = 0;
154
155            
156            if (variables.isOneLineComment) endOneLineComment();
157            
158            for (i=0; i LT thisLine.length(); i=i+1)
159            {
160                character=thisLine.charAt(javacast('int',i));
161                if (character EQ '
<')
162                {
163                    if (variables.isCFScript AND NOT variables.isValue)
164                        endCFScript();
165                    if (regionMatches(thisLine, 1, i+1, "!--", 0, 3))
166                    {
167                        if (regionMatches(thisLine, 1, i+4, "-", 0, 1))
168                        {
169                            startComment("CF");
170                        } else {
171                            startComment("HTML");
172                        }
173                    } else {
174                        if (regionMatches(thisLine, 1, i+1, "CF", 0, 2) OR regionMatches(thisLine, 1, i+1, "/CF", 0, 3))
175                        {
176                            startTag("CF");
177                            if (regionMatches(thisLine, 1, i+3, "SET", 0, 3) AND NOT regionMatches(thisLine, 1, i+6, "T", 0, 1)) // CFSET Tag
178                            {
179                                variables.buffer.append(thisLine.substring(javacast('int',i+1), javacast('int',i+6)));
180                                i=i+5;
181                                startCFSET();
182                            }
183                            else if (regionMatches(thisLine, 1, i+3, "SCRIPT>", 0, 6)) // CFSCRIPT TAG
184                            {
185                                variables.buffer.append(thisLine.substring(javacast('int',i+1), javacast('int',i+9)) & "&gt;");
186                                i=i+9;
187                                startCFScript();
188                            }
189                            else if (regionMatches(thisLine, 1, i+3, "QUERY", 0, 5)) // START CFQUERY TAG
190                            {    // TODO: This sets the value color immediately to match SQL values including the CFQuery tag...
191                                variables.isCFQueryTag = true;
192                            } else if (regionMatches(thisLine, 1, i+4, "QUERY", 0, 5)) // END CFQUERY TAG
193                            {
194                                variables.isCFQueryTag = false;
195                                endSQL();
196                            }
197                        }
198                        else if    (
199                                     regionMatches(thisLine, 1, i+1, "TA", 0, 2) OR
200                                    regionMatches(thisLine, 1, i+1, "/TA", 0, 3) OR
201                                    regionMatches(thisLine, 1, i+1, "TB", 0, 2) OR
202                                    regionMatches(thisLine, 1, i+1, "/TB", 0, 3) OR
203                                    regionMatches(thisLine, 1, i+1, "TD", 0, 2) OR
204                                    regionMatches(thisLine, 1, i+1, "/TD", 0, 3) OR
205                                    regionMatches(thisLine, 1, i+1, "TF", 0, 2) OR
206                                    regionMatches(thisLine, 1, i+1, "/TF", 0, 3) OR
207                                    regionMatches(thisLine, 1, i+1, "TH", 0, 2) OR
208                                    regionMatches(thisLine, 1, i+1, "/TH", 0, 3) OR
209                                    regionMatches(thisLine, 1, i+1, "TR", 0, 2) OR
210                                    regionMatches(thisLine, 1, i+1, "/TR", 0, 3)
211                                ) // HTML TABLE
212                        {
213                            startTag("HTMLTABLES");
214                        }
215                        else if (regionMatches(thisLine, 1, i+1, "IMG", 0, 3) OR regionMatches(thisLine, 1, i+1, "STY", 0, 3) OR regionMatches(thisLine, 1, i+1, "/STY", 0, 4)) //IMG or STYLE Tag
216                        // TODO: Do separate syntax highlighting for stuff inside style
217                        {
218                            startTag("HTMLSTYLES");
219                        }
220                        else if (
221                                    regionMatches(thisLine, 1, i+1, "FORM", 0, 4) OR
222                                    regionMatches(thisLine, 1, i+1, "/FORM", 0, 5) OR
223                                    regionMatches(thisLine, 1, i+1, "INPUT", 0, 5) OR
224                                    regionMatches(thisLine, 1, i+1, "/INPUT", 0, 5) OR
225                                    regionMatches(thisLine, 1, i+1, "TEXT", 0, 4) OR
226                                    regionMatches(thisLine, 1, i+1, "/TEXT", 0, 5) OR
227                                    regionMatches(thisLine, 1, i+1, "SELECT", 0, 6) OR
228                                    regionMatches(thisLine, 1, i+1, "/SELECT", 0, 7) OR
229                                    regionMatches(thisLine, 1, i+1, "OPT", 0, 3) OR
230                                    regionMatches(thisLine, 1, i+1, "/OPT", 0, 3)
231                                )
232                        {
233                            startTag("HTMLFORMS");
234                        }
235                        else if (
236                                     regionMatches(thisLine, 1, i+1, "MX:", 0, 3) OR
237                                    regionMatches(thisLine, 1, i+1, "/MX:", 0, 4)
238                                )
239                        {
240                            if (regionMatches(thisLine, 1, i+4, "SCRIPT>", 0, 6)) // MX:SCRIPT TAG
241                            {
242                                startTag("ACTIONSCRIPTTAG");
243                                variables.buffer.append(thisLine.substring(javacast('int',i+1), javacast('int',i+10)) & "&gt;");
244                                i=i+10;
245                                startActionscript();
246                            } else if (regionMatches(thisLine, 1, i+5, "SCRIPT>", 0, 6)) // END MX:SCRIPT TAG
247                            {
248                                endActionscript();
249                                startTag("ACTIONSCRIPTTAG");
250                                variables.buffer.append(thisLine.substring(javacast('int',i+1), javacast('int',i+11)));
251                                i=i+12;
252                                endTag();
253                            } else {
254                                startTag("MXML");
255                                startAttributePos=find(' ',thisLine,i+1); //start finding the next space from current position
256                                endtagPos=find('>
',thisLine,i+1); //start finding the end tag from current position
257                                if (startAttributePos neq 0) {  // start attribute colors
258                                    variables.buffer.append(thisLine.substring(javacast('int',i+1), javacast('int',startAttributePos)));
259                                    i=startAttributePos-1;
260                                    startMXMLTag();
261                                } else {
262                                    if (endtagPos neq 0) { // found >

263                                        variables.buffer.append(thisLine.substring(javacast('int',i+1), javacast('int',endtagPos-1)));
264                                        i=i+endtagPos;
265                                        variables.buffer.append("&gt;");
266                                        endHighlight();
267                                    }
268                                }    
269                            }
270                        } else {
271                            if (variables.isActionscript or variables.isSQL) {
272                                variables.buffer.append("&lt;");
273                            } else {
274                                startTag("HTML");
275                            }
276                        }
277                    }
278                }
279                else if (character EQ '>')
280                {
281                    if (variables.isCommented AND regionMatches(thisLine, 1, i-2, "--", 0, 2))
282                    {
283                        if (regionMatches(thisLine, 1, i-3, "-", 0, 1))
284                        {
285                            endComment("CF");
286                        } else {
287                            endComment("HTML");
288                        }
289                    } else {
290                        if (variables.isCFSETTag) {
291                            endCFSET();
292                        } else if (variables.isActionscript) {
293                            //This is where a CDATA for AS ends
294                            variables.buffer.append("&gt;");
295                        } else if (variables.isSQL) {
296                            variables.buffer.append("&gt;");
297                        } else if (variables.isCFQueryTag) {
298                            endTag();
299                            startSQL();
300                        } else if (variables.isMXML) {
301                            endMXMLTag();
302                        } else {
303                            endTag();
304                        }
305                    }
306                }
307                else if (character EQ '"')
308                {
309                    if (variables.isTag OR variables.isCFScript OR variables.isActionscript)
310                    {
311                        if (NOT variables.isValue) {
312                            startValue();
313                            variables.buffer.append('"');
314                        } else {
315                            variables.buffer.append('"');
316                            endValue();
317                        }
318                    } else {
319                        variables.buffer.append('"');
320                    }
321                }
322                else if (character EQ '{')
323                {
324                    startBind();
325                    variables.buffer.append("{");
326                    endBind();
327                }
328                else if (character EQ '}')
329                {
330                    startBind();
331                    variables.buffer.append("}");
332                    endBind();
333                }
334                else if (character EQ '/')
335                {
336                    if ((variables.isCFScript OR variables.isActionscript) AND regionMatches(thisLine, 1, i+1, "/", 0, 1) AND NOT variables.isCommented)
337                    {
338                        if (variables.isActionscript) {
339                            startOneLineComment("MXMLCOMMENT");
340                            variables.buffer.append("/");
341                        } else {
342                            startOneLineComment("HTMLCOMMENT");
343                            variables.buffer.append("/");
344                        }
345                    }
346                    else if (variables.isCommented)
347                    {
348                        if (regionMatches(thisLine, 1, i-1, "*", 0, 1))
349                        {
350                            endComment("SCRIPT");
351                        } else {
352                            variables.buffer.append("/");
353                        }
354                    } else {
355                        if (regionMatches(thisLine, 1, i+1, "*", 0, 1))
356                        {
357                            startComment("SCRIPT");
358                        } else {
359                            variables.buffer.append("/");
360                        }
361                    }
362                }
363                else if (variables.isSQL AND character EQ '-')
364                {
365                    if (regionMatches(thisLine, 1, i+1, "-", 0, 1) AND NOT variables.isCommented)
366                    {
367                        startOneLineComment("SQLCOMMENT");
368                        variables.buffer.append("-");
369                    } else {
370                        variables.buffer.append("-");
371                    }
372                }
373                else if (variables.isSQL AND character EQ "'" AND NOT variables.isCommented)
374                {
375                    if (NOT variables.isValue) {
376                        startValue();
377                        variables.buffer.append("'");
378                    } else {
379                        variables.buffer.append("'");
380                        endValue();
381                    }
382                }
383
384                // straight up replacements
385                else if (character EQ '\t' OR character EQ '    ')
386                {
387                    variables.buffer.append("&nbsp;&nbsp;&nbsp;&nbsp;");
388                }
389                else if (character EQ ' ')
390                {
391                    variables.buffer.append("&nbsp;");
392                }
393                else if (character EQ '&')
394                {
395                    if (regionMatches(thisLine, 1, i+1, "##", 0, 1)) {
396                        variables.buffer.append("&");
397                    } else {
398                        variables.buffer.append("&amp;");
399                    }
400                } else {
401                    if (not variables.isCommented AND not variables.isValue and (i eq 0 OR NOT listcontainsnocase('a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,@', thisLine.substring(javacast('int',i-1),javacast('int',i))))) {
402                        keywordskip = 0;
403                        // would like this to be much more generic rather than checking "is"
404                        if (variables.isActionscript) {
405                            keywordskip = keywordsearch(thisLine,i,"Actionscript");
406                        } else if (variables.isCFscript or variables.isCFSetTag) {
407                            keywordskip = keywordsearch(thisLine,i,"CFscript");
408                        } else if (variables.isSQL) {
409                            keywordskip = keywordsearch(thisLine,i,"sql");
410                        }
411                        if (keywordskip) {
412                            i = i + keywordskip;
413                        } else {
414                            variables.buffer.append(character.toString());
415                        }
416                    } else {
417                        variables.buffer.append(character.toString());
418                    }
419                }
420            }
421            variables.buffer.append("<br />");
422        </cfscript>
423    </cffunction>
424    <cffunction name="keywordsearch" access="private" hint="This function searches for keywords." output="false">
425        <cfargument name="thisLine" type="any"/>
426        <cfargument name="i" type="numeric"/>
427        <cfargument name="parser" type="string"/>
428        <cfset var keywordmap = getConfig().getKeywordmap()/>
429        <cfset var keyword = listfirst(thisLine.substring(javacast('int',i)),' (')/> <!--- search starting from current position --->
430        <cfset var findkey = StructFindKey(keywordmap[parser], keyword)/>
431        <cfset var keywordtype = ""/>
432        
433        <cfif arraylen(findkey)>
434            <cfset keywordtype = findkey[1].value/>
435            <cfset variables.buffer.append("<span style='" & getStyle(keywordtype) & "'>" & keyword & "</span>")/>
436             <cfreturn keyword.length()-1/>
437        </cfif>
438        <cfreturn 0/>
439    </cffunction>
440    <cffunction name="regionMatches" access="private" hint="This function checks if a regionMatches." output="false">
441        <cfargument name="string1" type="any"/>
442        <cfargument name="caseInsensitive" type="boolean" default="true"/>
443        <cfargument name="startPosition1" type="numeric"/>
444        <cfargument name="string2" type="any"/>
445        <cfargument name="startPosition2" type="numeric"/>
446        <cfargument name="endPosition2" type="numeric"/>
447        <cfreturn arguments.string1.regionMatches(arguments.caseInsensitive, javacast('int',arguments.startPosition1), arguments.string2, javacast('int',arguments.startPosition2), javacast('int',arguments.endPosition2))/>
448    </cffunction>
449    <cffunction name="startHighlight" access="private" hint="" output="false">
450        <cfargument name="element" type="string"/>
451        <cfset variables.spansOpened = variables.spansOpened + 1/>
452        <cfset variables.buffer.append("<span style='" & getStyle(arguments.element) & "'>")/>
453    </cffunction>
454    <cffunction name="endHighlight" access="private" hint="" output="false">
455        <cfargument name="line" type="any"/>
456        <cfset variables.spansClosed = variables.spansClosed + 1/>
457        <cfset variables.buffer.append("</span>")/>
458    </cffunction>
459    <cffunction name="startOneLineComment" access="private" output="false">
460        <cfargument name="type" type="string"/>
461        <cfscript>
462        startHighlight(type);
463        variables.isOneLineComment=true;
464        variables.isCommented=true;
465        
</cfscript>    
466    </cffunction>
467    <cffunction name="endOneLineComment" access="private" output="false">
468        <cfscript>
469        endHighlight();
470        variables.isOneLineComment=false;
471        variables.isCommented=false;
472        
</cfscript>    
473    </cffunction>
474    <cffunction name="startComment" access="private" output="false">
475        <cfargument name="type" type="string"/>
476        <cfscript>
477        if (type  EQ  "CF"{
478            startHighlight("CFCOMMENT");
479            variables.buffer.append("&lt;");
480        } else if (type  EQ  "HTML"{
481            if (variables.isMXML) {
482                startHighlight("MXMLCOMMENT");
483            } else {
484                startHighlight("HTMLCOMMENT");
485            }
486            variables.buffer.append("&lt;");
487        } else {
488            if (variables.isActionscript) {
489                startHighlight("ACTIONSCRIPTCOMMENT");
490            } else if (variables.isSQL) {
491                startHighlight("SQLCOMMENT");
492            } else {
493                startHighlight("CFSCRIPTCOMMENT");
494            }
495            variables.buffer.append("/");
496        }
497        variables.isCommented=true;
498        
</cfscript>
499    </cffunction>
500    <cffunction name="endComment" access="private" output="false">
501        <cfargument name="type" type="string"/>
502        <cfscript>
503        if (type  EQ  "SCRIPT"{
504            variables.buffer.append("/");
505        } else {
506            variables.buffer.append("&gt;");
507        }
508        endHighlight();
509        variables.isCommented=false;
510        
</cfscript>
511    </cffunction>
512    <cffunction name="startTag" access="private" output="false">
513        <cfargument name="type" type="string"/>
514        <cfscript>
515        if NOTT variables.isCommented AND NOT variables.isValue) {
516            if (type  EQ  "CF"{
517                startHighlight("CFTAG");
518            } else if (type  EQ  "HTMLSTYLES"{
519                startHighlight("HTMLSTYLES");
520            } else if (type  EQ  "HTMLTABLES"{
521                startHighlight("HTMLTABLES");
522            } else if (type  EQ  "HTMLFORMS"{
523                startHighlight("HTMLFORMS");
524            } else if (type EQ "MXML"{
525                startHighlight("MXML");
526            } else if (type EQ "ACTIONSCRIPTTAG"{
527                startHighlight("ACTIONSCRIPTTAG");
528            } else { // type is HTML
529
                startHighlight("HTML");
530            }
531            variables.isTag=true;
532        }
533        variables.buffer.append("&lt;");
534        
</cfscript>
535    </cffunction>
536    <cffunction name="endTag" access="private" output="false">
537        <cfscript>
538        variables.buffer.append("&gt;");
539        if NOTT variables.isCommented AND NOT variables.isValue) {
540            endHighlight();
541            variables.isTag=false;
542        }
543        
</cfscript>
544    </cffunction>
545    <cffunction name="startValue" access="private" output="false">
546        <cfscript>
547        if NOTT variables.isCommented) {
548            if (variables.isCFSETTag OR variables.isCFScript) {
549                startHighlight("CFSCRIPTVALUE");
550            } else if (variables.isActionscript) {
551                startHighlight("ACTIONSCRIPTVALUE");
552            } else if (variables.isMXML) {
553                startHighlight("MXMLVALUE");
554            } else if (variables.isSQL) {
555                startHighlight("SQLVALUE");
556            } else {
557                startHighlight("VALUE");
558            }
559            variables.isValue=true;
560        }
561        
</cfscript>
562    </cffunction>
563    <cffunction name="endValue" access="private" output="false">
564        <cfscript>
565        if NOTT variables.isCommented) {
566            endHighlight();
567            variables.isValue=false;
568        }
569        
</cfscript>
570    </cffunction>
571    <cffunction name="startBind" access="private" output="false">
572        <cfscript>
573        if NOTT variables.isCommented) {
574            startHighlight("BIND");
575        }
576        
</cfscript>
577    </cffunction>
578    <cffunction name="endBind" access="private" output="false">
579        <cfscript>
580        if NOTT variables.isCommented) {
581            endHighlight();
582        }
583        
</cfscript>
584    </cffunction>
585    <cffunction name="startCFSET" access="private" output="false">
586        <cfscript>
587        if NOTT variables.isCommented) {
588            startHighlight("CFSET");
589            variables.isCFSETTag=true;
590        }
591        
</cfscript>
592    </cffunction>
593    <cffunction name="endCFSET" access="private" output="false">
594        <cfscript>
595        if NOTT variables.isCommented) {
596            endHighlight();
597            variables.buffer.append("&gt;");
598            endHighlight();
599            variables.isCFSETTag=false;
600        } else {
601            variables.buffer.append("&gt;");
602        }
603        
</cfscript>
604    </cffunction>
605    <cffunction name="startMXMLTag" access="private" output="false">
606        <cfscript>
607        if NOTT variables.isCommented) {
608            startHighlight("MXMLATTRIBUTES");
609            // TODO: Add in MXML Value colors.
610
            // setStyle("VALUE","color:##900");
611
            variables.isMXML=true;
612        }
613        
</cfscript>
614    </cffunction>
615    <cffunction name="endMXMLTag" access="private" output="false">
616        <cfscript>
617        if NOTT variables.isCommented) {
618            endHighlight();
619            variables.buffer.append("&gt;");
620            endHighlight();
621            // TODO: Add in MXML Value colors.
622
            // setStyle("VALUE","color:##0000CC");
623
            variables.isMXML=false;
624        } else {
625            variables.buffer.append("&gt;");
626        }
627        
</cfscript>
628    </cffunction>
629    <cffunction name="startCFScript" access="private" output="false">
630        <cfscript>
631        if NOTT variables.isCommented) {
632            endHighlight();
633            startHighlight("CFSCRIPT");
634            variables.isCFScript=true;
635        }
636        
</cfscript>
637    </cffunction>
638    <cffunction name="endCFScript" access="private" output="false">
639        <cfscript>
640        if NOTT variables.isCommented) {
641            endHighlight();
642            variables.isCFScript=false;
643        }
644        
</cfscript>
645    </cffunction>
646    <cffunction name="startActionscript" access="private" output="false">
647        <cfscript>
648        if NOTT variables.isCommented) {
649            endHighlight();
650            startHighlight("ACTIONSCRIPT");
651            variables.isActionscript=true;
652        }
653        
</cfscript>
654    </cffunction>
655    <cffunction name="endActionscript" access="private" output="false">
656        <cfscript>
657        if NOTT variables.isCommented) {
658            variables.isActionscript=false;
659        }
660        
</cfscript>
661    </cffunction>
662    <cffunction name="startSQL" access="private" output="false">
663        <cfscript>
664        if NOTT variables.isCommented) {
665            variables.isSQL=true;
666        }
667        
</cfscript>
668    </cffunction>
669    <cffunction name="endSQL" access="private" output="false">
670        <cfscript>
671        if NOTT variables.isCommented) {
672            variables.isSQL=false;
673        }
674        
</cfscript>
675    </cffunction>
676    
677    <!--- configuration methods --->
678    <cffunction name="setConfig" access="public" hint="This sets the coldfish configuration object for the parser to use." output="false">
679        <cfargument name="config" type="any"/>
680        <cfset variables.coldfishconfig = config/>
681    </cffunction>
682    <cffunction name="getConfig" access="public" hint="This sets the coldfish configuration object for the parser to use." output="false">
683        <cfargument name="config" type="any"/>
684        <cfreturn variables.coldfishconfig/>
685    </cffunction>
686    <cffunction name="getStyle" access="private" hint="This function can be used to get the style used in conjunction with a type of language element." output="false">
687        <cfargument name="element" type="string"/>
688        <cfreturn getConfig().getStyle(element)/>
689    </cffunction>
690    <cffunction name="getInitialParser" access="private" hint="You can set the initial parser state with this.  This is helpful for scripts that make initial parsing impossible (ie. Script, Actionscript)" output="false">
691        <cfreturn getConfig().getInitialParser()/>
692    </cffunction>
693    <cffunction name="getKeywordmap" access="private" hint="You can set the keywordmap with this." output="false">
694        <cfreturn getConfig().getKeywordMap()/>
695    </cffunction>
696</cfcomponent>

I'd like to extend a special thanks to Ray Camden & Jason Delmore for their prompt replies and expeditious changes ... Much Appreciated.

How to Get Thousands of Quality Links in One Minute

The first thing you need to know about getting top rankings in Google is that you need to have quality content - so when you get Google's traffic you can actually generate business from it - then you need Inbound Links to get you to the first position. So, for those of you that just want to know how you can get those oh so coveted links, read quick and I'll show you how to get thousands of quality links in one minute.

You Need to Get Inbound Links for the Keywords You Want to Rank For

Okay - this may seem a bit oversimplified - but it's not really. Finding link partners is really pretty simple. Simple I mean like walking to New York from Miami. It's not a difficult concept to grasp, but it takes time to get there ... so, let's get started.

1

Go into Google and Search for the keyword that you most want to rank for and then copy the link location, (Right Click and then Copy Link Location, Copy Shortcut or Copy Link Address) to the first page, first position listing on the results page. For example, if we want to rank for Lawyer Directory, we would search Google for Lawyer Directory and simply copy the address to the top ranking site. (Not too difficult - eh?)

2

Next we are going to open a new tab in your browser. It doesn't matter which browser you have, the shortcut for "open a new tab" is CTRL+T in Windows or CMD+T in Mac for Firefox, Opera, Chrome and even Internet Explorer, I am using Firefox because I'm addicted to it ... but it really doesn't matter so go ahead and open a new tab ...

3

Then we are going to go the address for Site Explorer in Yahoo! (http://siteexplorer.search.yahoo.com/) - You can either highlight the address that's currently in your browser by hovering over the address area with your mouse and clicking or you can do it like a pro and learn the shortcut for highlighting the address area in your browser of choice. I bet CTRL+L in Windows or CMD+L in Mac are what you're looking for, so either type in the address for Yahoo's! Site Explorer or be a whiz kid and get there through the nifty little shortcut you just learned.

4

Once you've gotten to Yahoo's! Site Explorer simply paste in the URL to site that is ranking in Google for your keyword and click Explorer URL.

5

Now that we have access to your competitors information courtesy of Yahoo! We only need to retrieve the Inbound Link Data. In order to get just that, we have to click on the Inlinks Tab ...

6

Since we now have access to the info for the Inbound Links, we want to sort the data so that it only shows information on Inbound Links from other sites. We don't need to know if our competitors' site links to itself as they probably wouldn't be a very good link partner for us ... so we need to select "Except from this Domain" from the "Show Inlinks" dropdown list.

7

If you're still with me thus far, (a quick study shouldn't be more than about thirty seconds into this ...) you're doing great and just a few more steps to dominating the SERP's ... Now what we need to do is Grab All the Inbound Link Data. To do that, we are going to click on Export first 1000 results to TSV to download your competitors' link info as a .tsv file. The .tsv format is simply a text format that uses a tab as the delimiter - hence the name Tab Separated Values.

8

Okay ... the file you are downloading contains all of your competitors' Inbound Link Data, but to make this information easy to work with we need to massage it a little. If you have Excel this is a breeze, if not - well, you may have some luck with Calc from Open Office.What we need to do now is save the .tsv file. When you download the file, (which should be named 'url_inlinks.tsv') you need to save it to either your desktop or a place that you will be able to easily find it - unlike your browsers' temporary folder ... eh hem.

9

The next step is to simply open up Excel or Calc and then import the file into a more readable and manageable format. So, Open up Excel and Select the Data Tab.

10

Now we want to import the data from our 'url_inliks.tsv' file. So with the Data Tab active, navigate to the far left hand side of your Excel window and select Get External Data and then select From Text.

Now once you've selected the From Text button in Excel the 'Import Text File' dialogue box will open up. You need to select All Files (*.*) from the Files of Type Dropdown List and navigate to where you stored the file. I simply stored mine on the desktop for now ...

Now the Text Import Wizard will open up ... and for simplicity I'm only going to show one diagram here.

  • Text Import Wizard - Step One: All you have to do is select Delimited as the data type and click next.
  • Text Import Wizard - Step Two: Since the format is .tsv, the Delimiter should be automatically set to Tab but if it's not, check the radio button for Tab and click next.
  • Text Import Wizard - Step Three: You shouldn't have to anything here except click Finish.

If Excel wants you to select an Area or a New Sheet, just select Cell A1 in the top left corner and that's it! I like to get rid of all the Title information as it really doesn't do me much good ... so I clean up my spreadsheets a little by simply deleting the A column ...

If you did everything correctly you should have up to a thousand highly targeted links for your primary keyword. I hope this helps you and Good Luck with your link campaign!

Link Building Articles for Link Builders

The title, Link Building Articles for Link Builders, pretty much says exactly what it should. Over the past few years I've collected some of the most influential articles available on the subject of link building. Though it's not a complete list, I think there's enough about link building here to keep even a pro busy for quite a while. If you feel that you can contribute to the list leave me a comment and I'll check it out ...

A Linking Campaign Primer

Backlinks: The Beginner's Guide to Backlink Theory

Link Building from A to Z

LinkMoses Linking Commandments

Professional's Guide to Link Building

Link Building 101 - The Almost Complete Link Guide

Link Building with the Experts

Up Close Look at Eric Ward's Link Building Desktop

Advanced Link Building Strategies

The Enormous Link Baiting Articles List

Link Building Strategies: 69 Solid Tactics

101 Ways to Build Link Popularity

131 (Legitimate) Link Building Strategies

Link Baiting: Which Hook Attracts the Right Fish?

Market Research for Link Building - Who You Can Get Links From

Matt Cutts Interviewed by Eric Enge

Eric Enge Interviews Eric Ward

How Google Finds Your Needle in the Web's Haystack

The Google Pagerank Algorithm and How It Works

Matt Cutts on PageRank sculpting

Over 125 Legitimate Link Building Strategies

.edu Link Fallacies Explained

Are You A Link Whore?

Linking's Holy Grail: The Passively-Obtained Backlink

Looking for Links In All The Wrong Places

What Makes a Web Site Link-Worthy?

Linking Mistakes To Avoid, Part 1 - Link Optimization and Short URLs

Linking Mistakes To Avoid, Part 2 - Removing Orphaned URLs

Why Reciprocal Links Will Always Be Viable

What If Everything You Know About Link Building Is Wrong?

Riding The Twitter Link Waves

How Link Signals Can Be Misunderstood

Link Building's Glass Ceiling

8 Ways Backlink Analysis Can Offer Competitive Intelligence

10 Commandments of Link Building

10 Goals For Link Building Campaigns: Moving Beyond "Get More Links"

11 Experts on Link Development Speak Out

12 Different Types of Links and How To Get Them

17 Ways Search Engines Judge the Value of a Link

21 Link Builders Share Advanced Link Building Queries

Jim Westergren - Link Building Guide

Website Content & Content Writing: Does Quality Content Really Matter?

Understanding Your Websites' Audience is Critical to Marketing Your Website

One of the most common beliefs held by many SEO experts is that content is king. I also hold this belief. However, as popular as the view is, I'm surprised at the amount of people involved in search marketing initiatives that discount website content as simply a means to an end - text that's essentially necessary to make the website appear 'professional.' In more than a few occasions I've had clients that practically refused to add content because they feel their site should communicate their message through its images and branding. Based on that premise, they want to focus on link building to improve their sites keyword rankings and landing page optimization to increase the sites conversion ratios.

So Does Website Content Really Matter?

This issue of which marketing initiative to approach, brings us to one of the most controversial subjects in the SEO industry - Content -vs- Links. I really try not to argue here because I find the question essentially to be parallel to asking if a cars transmission or engine is more important. The answer here should be self evident. However, it's not. In my humble opinion there's no right or wrong answer. I think the important question is really whether your website communicates the message required to affect the desired result. What may be effective for one website may not be for another. I feel that the key to effective website marketing is in understanding how to communicate to your audience and knowing which marketing initiative to take to communicate that message effectively. In some cases content is of the utmost importance and inbound links are simply required to obtain rankings - in other cases just the opposite holds true - inbound links are top priority and website content is simply not a major requirement. What is truly important is in knowing which marketing initiative to take.

Effective Communication is the Key to Website Marketing

In order to determine the most effective marketing strategy for a website the single most important question that needs to be answered is: What are you attempting to communicate through the website? Once that question is answered, you can consider the available options to get that message across and create a marketing campaign from there. Sounds simple right? Well, in concept it is. However, determining the most effective campaign requires a bit of insight into the type of communication needed. As a rule of thumb I generally find that service based websites have a stronger requirement to focus on the quality of content than consumer and retail based websites. The reason for this is quite simple and has little if anything to do with websites. This matter is actually based on the type of industry - not the type of website. Most service based industries do not have a visible, tangible product. As such, content is typically required to express a position of value for the service whereas retail based websites such as one that sells consumer electronics or mobile phones, would generally want to focus on communicating the value of the product or the products' brand which, doesn't always require words to express.

Google Site Preview in Search Results

I was taking a look on line and noticed that Google's waxing experimental again ... this time with site preview in the search engine results pages ... Now I can see how this would be beneficial - Let's keep people from having to go back and forth from Google results to site 1 back to the results and then site 2 ... This is pretty cool ...

Good Call Google ... I'm all for it. Much better in my book than the 'Google Instant' idea.

WordPress Thesis Theme Customization - Adding a Custom XHTML Sitemap

The Thesis Theme for WordPress - One Powerful WordPress Framework

Lately I've been learning all I can on leveraging the functionality of the Thesis theme for WordPress. When I first heard about the versatility and power of Thesis in a blog post by Rae Hoffman, I was immediately interested in what benefits I could offer my customers that opted to have me design and build them a custom WordPress site. Having customized and hacked several of Chris Pearson's WordPress themes in the past, I figured I should just go for it and purchase the Thesis developer theme - Chris' greatest accomplishment thus far.

Wow Thesis is Sophisticated - There's a Lot to Learn

I have to admit, when I first took a look into the core of the Thesis framework, I was a bit intimidated - Thesis was nothing like I expected under the hood. First off, Thesis comes with lots of customization options right out of the box ... [Take a look here] So, getting to know what was available from the core install was quite an undertaking in itself. The good news is, when you purchase Thesis, you not only get a lifetime subscription to the theme, you also get the exceptional tech support of the Thesis designer / developer community. The support community is always available to help you along the way as you learn how to negotiate the Thesis framework.

Some Folks Just Can't Leave Well Enough Alone

I'm definitely not the kind of guy that is happy with being 'okay'. If there's a way to make something better, stronger or faster - then that's what I'm gonna' try to do next. So, when I saw that there wasn't a simple way of making custom page templates in Thesis - I knew that I needed to set out to tackle that issue. One of the first things I wanted to do in my own Thesis themes, was to create and XHTML sitemap like some other WordPress themes had. In the past, I would simply create a custom page template for my sitemap page and then rip out and modify the code from a theme that I admired. Simple. However, in Thesis things aren't so easy. First of all, the Thesis was of customizing pages is to make all your custom changes to pages that won't be affected in future upgrades. Thesis does so by offering customization through manipulating two files; styles.css, custom_functions.php, both of which are available under the theme's custom folder. However, most of the customization are actually 'hooked' in to the framework by creating your own custom functions. The old way of simply creating a new template and then assigning it to a page or post won't work with Thesis.

On With The Show - Classes - Object Oriented Customizations

So basically I had to answer the question ...

How Can I Create Sophisticated Customizations and Minimalize Negative Effects?

After searching online, I finally found an answer to my problem. Creating Custom Classes. In Gary Jones' tutorial in creating an XHTML sitemap for Thesis, I recognized the ultimate solution to customizations in Thesis - leveraging the Object Oriented nature of the Thesis framework. Gary basically makes all customizations in a custom classes file as in this example for an XHTML sitemap. Following Gary's example, we create a file for our new class entitled GT_Sitemap.php, and place it in a directory named classes which is located in under our Thesis custom directory.

view plain print about
1<?php
2/**
3* Allows XHTML sitemap to be added
4*
5* @package GT_Sitemap
6* @author Gary Jones 
7* @version 2010-05-19
8* @since 2010-03-20
9*/

10
11class GT_Sitemap  {
12 /**
13  * @var string
14  */

15  protected $_pagesText;
16 /**
17  * @var string
18  */

19  protected $_postsText;
20 /**
21  * @var string
22  */

23  protected $_archivesText;
24 /**
25  * @var int
26  */

27  protected $_headingLevel;
28 /**
29  * @var array
30  */

31  protected $_order = array();
32 /**
33  * @var bool
34  */

35  protected $_showPageDate;
36 /**
37  * @var string
38  */

39  protected $_showPostDate;
40 /**
41  * @var bool
42  */

43  protected $_showPostCount;
44 /**
45  * @var string
46  */

47  protected $_archivesType;
48 /**
49  * @var string
50  */

51  protected $_pagesDateFormat;
52 /**
53  * @var string
54  */

55  protected $_postsDateFormat;
56 /**
57  * @var string
58  */

59  protected $_customPagesQuery = '';
60 /**
61  * PHP4 compatible constructor
62  */

63  public function GT_Sitemap() {
64  if(version_compare(PHP_VERSION,"5.0.0","__construct")) {
65  register_shutdown_function(array($this,"__destruct"));
66  }
67  }
68 /**
69  * PHP5 constructor, setting defaults
70  */

71  public function __construct() {
72 $this->
_pagesText = 'Pages';
73  $this->
_postsText = 'Posts';
74  $this->_archivesText = 'Monthly Archives';
75  $this->_headingLevel = 3;
76  $this->_order = array('pages', 'posts', 'archives');
77  $this->_showPageDate = true;
78  $this->_showPostDate = 'published';
79  $this->_showPostCount = true;
80  $this->_archivesType = 'monthly';
81  $this->_pagesDateFormat = get_option('date_format');
82  $this->_postsDateFormat = get_option('date_format');
83  $this->_customPagesQuery = '';
84  }
85 /**
86  * @param string $id
87  */

88  public function setPagesText($id) {
89  $this->_pagesText = $id;
90  return $this;
91  }
92 /**
93  * @param string $id
94  */

95  public function setPostsText($id) {
96  $this->_postsText = $id;
97  return $this;
98  }
99 /**
100  * @param string $id
101  */

102  public function setArchivesText($id) {
103  $this->_archivesText = $id;
104  return $this;
105  }
106 /**
107  * @param array $id
108  */

109  public function setOrder($arg1, $arg2 = null, $arg3 = null) {
110  $this->_order = func_get_args();
111  return $this;
112  }
113 /**
114  * @param int $id
115  */

116  public function setHeadingLevel($id) {
117  $this->_headingLevel = $id;
118  return $this;
119  }
120 /**
121  * @param string $id
122  */

123  public function setPageDateFormat($id) {
124  if ( 0 === func_num_args() ) {
125  $this->_showPageDate = '';
126  } else {
127  $this->_pagesDateFormat = $id;
128  }
129  return $this;
130  }
131 /**
132  * @param string $id
133  */

134  public function setPostDateFormat($id) {
135  if ( 0 === func_num_args() ) {
136  $this->_showPostDate = '';
137  } else {
138  $this->_postsDateFormat = $id;
139  }
140  return $this;
141  }
142 /**
143  * @param string $id
144  */

145  public function setDateFormat($id) {
146  $this->setPageDateFormat($id);
147  $this->setPostDateFormat($id);
148  return $this;
149  }
150 /**
151  *
152  */

153  public function hidePostCount() {
154  $this->_showPostCount = false;
155  return $this;
156  }
157 /**
158  * @param string $id
159  */

160  public function setArchivesType($id) {
161  $archiveTypes = array('yearly', 'monthly', 'daily', 'weekly', 'postbypost', 'alpha');
162  if ( in_array($id, $archiveTypes) ) {
163  $this->_archivesType = $id;
164  $this->setArchivesText(substr_replace($id, strtoupper(substr($id, 0, 1)), 0, 1) . ' Archives');
165  }
166  return $this;
167  }
168 /**
169  * @param string $id
170  */

171  function setCustomPagesQuery($id) {
172  $this->_customPagesQuery = $id;
173  return $this;
174  }
175 /**
176  * @param string $shortcode The shortcode keyword that will be used to output the sitemap
177  */

178  public function shortcode($shortcode) {
179  add_shortcode( $shortcode, array(&$this, 'build') );
180  }
181 /**
182  * Does the main work of creating the output
183  */

184  public function build() {
185  foreach ($this->_order as $section) {
186 if ( 'pages' === $section ) {
187  $output .= '<h' . $this->_headingLevel . '>' . $this->_pagesText . '</h' . $this->_headingLevel . '>' . "\n"
188  . '<ul>' . "\n" . wp_list_pages('echo=0&show_date=' . $this->_showPageDate . '&date_format=' . $this->_pagesDateFormat . '&title_li=&' . $this->_customPagesQuery) . '</ul>' . "\n";
189  }
190 if ( 'posts' === $section ) {
191  $output .= '<h' . $this->_headingLevel . '>' . $this->_postsText . '</h'. $this->_headingLevel . '>'."\n"
192  . '<ul>' . "\n" . $this->_posts_by_category() . '</ul>' . "\n";
193  }
194 if ( 'archives' === $section ) {
195  $output .= '<h' . $this->_headingLevel . '>' . $this->_archivesText . '</h'. $this->_headingLevel . '>' . "\n"
196  . '<ul>' . "\n" . wp_get_archives('type=' . $this->_archivesType . '&echo=0&show_post_count=' . $this->_showPostCount). '</ul>' . "\n";
197  }
198  }
199  return $output;
200 }
201 protected function _posts_by_category() {
202  global $wpdb, $post;
203  $tp = $wpdb->prefix;
204  $sort_code = 'ORDER BY name ASC, post_date DESC';
205  $the_output = NULL;
206  $last_posts = (array)$wpdb->get_results("SELECT {$tp}terms.name, {$tp}terms.term_id, {$tp}term_taxonomy.term_taxonomy_id    FROM {$tp}terms, {$tp}term_taxonomy    WHERE {$tp}terms.term_id = {$tp}term_taxonomy.term_id AND {$tp}term_taxonomy.taxonomy = 'category'");
207  if (empty($last_posts)) {
208  return NULL;
209  }
210  $the_output .= '';
211  $used_cats = array();
212  $i = 0;
213 foreach ($last_posts as $posts) {
214  if (in_array($posts->name, $used_cats)) {
215  unset($last_posts[$i]);
216  } else {
217  $used_cats[] = $posts->name;
218  }
219  $i++;
220  }
221  $last_posts = array_values($last_posts);
222 foreach ($last_posts as $posts) {
223  $the_output .= '&lt;li&gt;&lt;a href="' . get_category_link($posts->term_id) .' "&lt;strong&gt;' . apply_filters('list_cats', $posts->name, $posts) . '&lt;/strong&gt;&lt;/a&gt;&lt;ul&gt;';
224  
225  $arcresults = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' AND ID IN (SELECT object_id FROM {$tp}term_relationships, {$tp}terms WHERE {$tp}term_relationships.term_taxonomy_id =" . $posts->term_taxonomy_id . ") ORDER BY post_date DESC");
226  
227  foreach ( $arcresults as $arcresult ) {
228  $the_output .= '&lt;li&gt;&lt;a href="' . get_permalink($arcresult->ID) . '"&gt;' . apply_filters('the_title', $arcresult->post_title) . '&lt;/a&gt; ';
229  if ($this->_showPostDate) {
230  $the_output .= date($this->_postsDateFormat,strtotime($arcresult->post_date));
231  }
232  $the_output .= '&lt;/li&gt;';
233  }
234  $the_output .= '&lt;/ul&gt;&lt;/li&gt;';
235  }
236  return $the_output;
237  }
238  }
239  ?>

Then, we simply add the next three lines of code in our custom_functions.php file:

view plain print about
1require_once 'classes/GT_Sitemap.php'; 
2  $sitemap = new GT_Sitemap;
3  
4  $sitemap->
shortcode('sitemap');

The first line simply includes our custom class file. The second line then instantiates a new sitemap object and third, we assign the variable $sitemap to the shortcode 'sitemap' so that all we need to do is to add the shortcode in the body of a new page or post and voila' - we have a new sitemap.

Note: If you wish to implement this code, I had to modify several lines from the code I found on Gary's site - In a comparison with Gary's code, you'll see there are several differences. Apparently Gary made some changes to the current code which were not updated. I modified the current code on his site with some of the older code I found here. In short, I had to debug several lines to come up with the code above. If it works for you great. If not - Hey, I got it to work but I can't guarantee it for you ...

That's it.

What's In a Web Host? Your Hosting Company Is Your Business

Over the years I've been lucky enough to have relatively few major incidents with my sites - Knock Knock. But, I can't same the same for some of my clients. I've had a handful of clients that didn't do much research about their web hosting company and found out later why they really should have taken the time to find a good host.

Go on ... ?

One of my new clients – Someone that I know personally – decided to have me assist them with SEO on their site. Their setup is pretty common. They have an online ecommerce store that sells medical products. The store is built in icart – a good ecommerce application overall, running on Linux, Apache, MySQL and PHP – a LAMP stack. Since my client's domain name really didn't have good keyword prominence for their target market, and the PageRank of the domain was fairly low, I decided to buy a new domain name with more keyword relevance and to simply redirect the old pages to the new domain name – Simple right?

The Gory Details

I set up the DNS for the new domain to point to the current server and contacted the current web host - the company that is also administering the icart application - to determine what needs to be done in the application to make the changes without any problems. They assured me that they would have the changes made but that they would have to bill my client for the work needed to be done. Okay – I guess that's par for the course. Five phone calls and a week later the domain name finally pointed to my client's site. Hmmm ... why it takes a week to point a domain name to a site when the DNS was done for you I just can't figure but hey – maybe they were really busy?

The Really Ugly Stuff

So, I logged in to the application's administration panel to make some simple Meta Tag changes and update some of the global settings to reflect the new name. Finally I had made some progress. However, when I logged out of the application and went to log back in, the application informed me that the license was invalid. I can only presume that this was caused by the application be licensed to the original domain name – not the new one. So, I called the host to have this problem resolved as I wasn't able to log in to the application now. Basically, my client's out of business. After an hour on hold (Busy Again?) the host informed me that there tech support is gone for the day and that they would have a technician to work the problem ticket first thing in the morning. This particular host is in Provo, UT so they are open 8:30 - 5:00 MST. So my client's losing money because their host doesn't have an evening tech team.

The Camel's Back is Broken

The next day I called the hosting company to find out if and when my client's site would be accessible. After One and a half hours on hold, a very curt and unimpressive gentleman informed me that he could not discuss the particulars of the problem ticket with me – even though I was the acting representative of my client, with the proper Login and Password for the account administrator. After giving him a piece of my mind about the quality of hosting experience I had been so lucky to witness, he then asked me if I had anything else I wanted to say... I basically informed him that he just lost his hosting client and asked him if he had anything that he'd like to say.

Again - Your Hosting Company is Your Business

If you run an online business, it is of the utmost importance to find out what kind of support they have. When problems arise and your site goes down are they going to be there to assist you? Or are you going to be waiting indefinitely for support and answers? Can you afford to lose customers due to a lack of hosting support? I luckily don't have these problems because I host all my sites with Hosting.com. To date, I have made well over 250 support calls and more than 95% were resolved in a matter of no time. I can't speak for some of the other hosting companies – but I am now very thankful that I have my business websites in the good hands of the folks over at Hosting.com. Oh, and my client will be there very shortly as well.

That's It

Florida SEO - Back to the SEO Blog After a Year

Well I've decided to start getting back to blogging after a year long hiatus. I really don't have a lot to say on this return post except that it's officially been one year since I've done any other writing and I figured that it's time to get back to the SEO Blog.

That's It.

:-)

GOD Must Love Gold - Florida SEO - Sunrise & Atlantic

Here's some awesome shots I took on Fort Lauderdale Beach around 7-ish September 1st 09' .... Nice ... :)

:)

Flash Security Vulnerability? Not with Firefox & NoScript

Apparently there is a Flash Security Vulnerability deriving from the 'authplay.dll' in Adobe's Flash Player on Windows, Mac and Linux for both Adobe Reader and Acrobat v9.x. Basically, an unsuspecting victim may be lured to a site that contains malicious Flash code to either crash or compromise the integrity of the victims computer ... Hmmm.

A CERT spokesperson stated ...

The Adobe Flash browser plug-in is available for multiple Web browsers and operating systems, any of which could be affected ... An attacker could also create a PDF document that has an embedded SWF file to exploit the vulnerability. This vulnerability is being actively exploited.

According to Trusteer, Two weeks after the press release, approximately 80 percent of Trusteer's installed base of 2.5 million online banking users still haven't received the Flash update.

What To Do? Use Firefox with NoScript.

Here's just one more notch in the belt for Firefox, and a prime example of why using Giorgio Maone's NoScript plug-in for Firefox is a must have.

For more info on NoScript ... check out Maone's Rockin' Site, NoScript.net ...

If your still using I.E., That's a shame ...

That's it.

ALS » Lou Gehrig's Disease » Sucks » Give a Damned » Save a Life Today

@FoxlairSolitare's Mom has ALS, AKA Lou Gehrig's Disease and she needs help. If you want to help save a life ... Dig in to your pocket and do it. That's it. Everyday the collective American population spends money on useless crap and we never even bat an eye in doing so ... This is important folks. Please Help out. Give a damned ...

Go to this link ... NOW ... DEFEAT ALS » LOU GEHRIG'S DISEASE ... and make a donation ...

That's it ...

Why are you still here?

Make Money on Google AdWords Scams » Google Cracks Down

Have you seen the "Make Money on Google" advertisements in Google? If not, your'e really not missing out ... Most of the ads you'll find for "Make Money" are worthless, nevertheless ... many people are taken in by the lure of easy money, and apperently Google, is not too happy about people being ripped off by the worthless ads and has decided to crack down on the fraud ... Though most people have enough sense to take the ads at face value ... there are many that may believe that the ads are legitimate based solely on the misconception that if it's seen on the front page of Google, there may be some merit to it. Poor Soles ...

Make Money on Google Scams

Image Credit: Barry Schwartz

Even though there have been reports of these worthless "Make Money on Google" ads for some time now, Search Engine Watch recently reported that Google is cracking down on ads they feel may be related to AdWords fraud. Moreover, Google has also reported taking against the account owners too ... A thread in Google's AdWords Help Forum shows evidence that Google is serious and even stated future account termination for violations.

Google AdWords Account Termination

Managing ColdFusion and Database Services Through Batch Scripting

Managing ColdFusion Application Services » Does StartUp Need So Many Steps? No.

Some time last year I realized the need to manage the application development services running simultaneously on my dev box. On my main box I'm running ColdFusion 8 on IIS 7, MySQL, MSSQL, and a WAMP setup as well. So when the need arose to manage which services were running, I would previously had called up an MMC snap-in and manually cranked up the required ColdFusion services; the MySQL or MSSQL database services and finally the sites I needed running on IIS - ad hoc. A good portion of my daily work schedule was getting consumed going back and forth to my MMC console.

Managing StartUp Services with Batch Scripting

I created a simple batch script to either crank up or shut down ColdFusion as needed and then I put a shortcut in a directory under c:\ where the shortcut would be accessible to my computer's PATH variables. This way I can get even lazier by just running my batch script by typing Win Key + R - enter my batch script shortcut name which is uniquely named "CF" and hitting enter ... Having the shortcut has been really convenient. However, there were some issues with my batch script. Namely, if ColdFusion or a database service were already running and I tried to start them ... Windows would throw help message 1282 - The requested service has already been started. So, I needed to clean up my batch script by testing for the running services first. I also added a call to open a separate cmd window with the status the development services in question. Below is my new and improved batch script - Again, uniquely titled - Dev Cranker. Very Unique - Almost brandable.

TITLE --- Dev Cranker ---

@ECHO OFF

REM - THIS IS A FILE TO MANAGE DEVLOPMENT ... HI

SETLOCAL ENABLEDELAYEDEXPANSION

:BEGIN

IF EXIST CODE.TXT DEL CODE.TXT

SET MySQL=MySQL

SET CF1= "ColdFusion 8 .NET Service"

SET CF2= "ColdFusion 8 ODBC Agent"

SET CF3= "ColdFusion 8 ODBC Server"

SET CF4= "ColdFusion 8 Application Server"

SET SBR= "SQL Browser"

SET MSSQL= "MSSQL$SQLEXPRESS"

ECHO.

SC QUERY %CF1% |FINDSTR "SERVICE_NAME"> CODE.TXT

ECHO.

SC QUERY %CF1% |FINDSTR "DISPLAY_NAME STATE" >> CODE.TXT

ECHO.

SC QUERY %CF2% |FINDSTR "SERVICE_NAME" >> CODE.TXT

ECHO.

SC QUERY %CF2% |FINDSTR "DISPLAY_NAME STATE" >> CODE.TXT

ECHO.

SC QUERY %CF3% |FINDSTR "SERVICE_NAME" >> CODE.TXT

ECHO.

SC QUERY %CF3% |FINDSTR "DISPLAY_NAME STATE" >> CODE.TXT

ECHO.

SC QUERY %CF4% |FINDSTR "SERVICE_NAME" >> CODE.TXT

ECHO.

SC QUERY %CF4% |FINDSTR "DISPLAY_NAME STATE" >> CODE.TXT



SC QUERY %MySQL% |FINDSTR "SERVICE_NAME" >> CODE.TXT

ECHO.

SC QUERY %MySQL% |FINDSTR "DISPLAY_NAME STATE" >> CODE.TXT

ECHO.

SC QUERY %SBR% |FINDSTR "SERVICE_NAME" >> CODE.TXT

ECHO.

SC QUERY %SBR% |FINDSTR "DISPLAY_NAME STATE" >> CODE.TXT

ECHO.

SC QUERY %MSSQL% |FINDSTR "SERVICE_NAME" >> CODE.TXT

ECHO.

SC QUERY %MSSQL% |FINDSTR "DISPLAY_NAME STATE" >> CODE.TXT

ECHO.

START "DEV CRANKER II --- SERVICE STATE " TYPE CODE.TXT

:ZERO

CLS

ECHO.

ECHO ====================================================================================================

ECHO.

ECHO Dev Cranker ...

ECHO

ECHO ====================================================================================================

ECHO.

ECHO 1. Start ColdFusion

ECHO 2. Stop ColdFusion

ECHO 3. Start a Database

ECHO 4. Stop a Database

ECHO 5. Quit and Exit

ECHO.

ECHO What Do You Want To Do?

ECHO ====================================================================================================

CHOICE "/C:12345"

ECHO ====================================================================================================

IF ERRORLEVEL ==5 GOTO NINE

IF ERRORLEVEL ==4 GOTO SIX

IF ERRORLEVEL ==3 GOTO TWO

IF ERRORLEVEL ==2 GOTO FIVE

IF ERRORLEVEL ==1 GOTO ONE

:TEN

ECHO ====================================================================================================

ECHO Good Bye! ...

ECHO Dev Cranker ...

SLEEP 3

GOTO END

:NINE


ECHO ====================================================================================================

ECHO.

ECHO Finished?

ECHO.

ECHO ====================================================================================================

CHOICE "/C:YN"

ECHO ====================================================================================================

IF ERRORLEVEL ==2 GOTO ZERO

IF ERRORLEVEL ==1 GOTO TEN

:EIGHT

SC QUERY %Mysql% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 1 (

SC STOP %Mysql% >> code.txt

ECHO %Mysql% Is Winding Down ...

) ELSE (

ECHO %Mysql% Isn't Running ...

)GOTO NINE

:SEVEN

SC QUERY %SBR% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 1 (

SC STOP %SBR% >> code.txt

ECHO %SBR% Is Winding Down ...

) ELSE (

ECHO %SBR% Isn't Running ...

)SC QUERY %MSSQL% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 1 (

SC STOP %MSSQL% >> code.txt

ECHO %MSSQL% Is Winding Down ...

) ELSE (

ECHO %MSSQL% Isn't Running ...

)

GOTO NINE

:SIX

ECHO ====================================================================================================

ECHO.

ECHO 1. MSSQL (Exp)

ECHO 2. MySql

ECHO 3. Just Exit (N/A)

ECHO ====================================================================================================

ECHO Which Database Are You Stopping?


ECHO ====================================================================================================

CHOICE "/C:123"

IF ERRORLEVEL ==3 GOTO NINE

IF ERRORLEVEL ==2 GOTO EIGHT

IF ERRORLEVEL ==1 GOTO SEVEN

EXIT

:FIVE

SC QUERY %CF1% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 1 (

SC STOP %CF1% >> code.txt

ECHO %CF1% Is Winding Down ...

) ELSE (

ECHO %CF1% Isn't Running ...

)

SC QUERY %CF2% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 1 (

SC STOP %CF2% >> code.txt

ECHO %CF2% Is Winding Down ...

) ELSE (

ECHO %CF2% Isn't Running ...

)

SC QUERY %CF3% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 1 (

SC STOP %CF3% >> code.txt

ECHO %CF3% Is Winding Down ...

) ELSE (

ECHO %CF3% Isn't Running ...

)

SC QUERY %CF4% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 1 (

SC STOP %CF4% >> code.txt

ECHO %CF4% Is Winding Down ...

) ELSE (

ECHO %CF4% Isn't Running ...

)

GOTO NINE

ECHO ====================================================================================================

ECHO.

ECHO Need To Stop a DataBase?

ECHO.

ECHO ====================================================================================================

CHOICE "/C:YN"

IF ERRORLEVEL ==2 GOTO NINE

IF ERRORLEVEL ==1 GOTO SIX

:FOUR

SC QUERY %Mysql% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 0 (

SC START %Mysql% >> code.txt

ECHO %Mysql% Is Cranking Up ...

) ELSE (

ECHO %Mysql% Is Already Cranked Up ...

)

GOTO NINE

:THREE

SC QUERY %SBR% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 0 (

SC START %SBR% >> code.txt

ECHO %SBR% Is Cranking Up ...

) ELSE (

ECHO %SBR% Is Already Cranked Up ...

)

SC QUERY %MSSQL% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 0 (

SC START %MSSQL% >> code.txt

ECHO %MSSQL% Is Cranking Up ...

) ELSE (

ECHO %MSSQL% Is Already Cranked Up ...

)

GOTO NINE

:TWO


CHO ====================================================================================================

ECHO.

ECHO 1. MSSQL (Exp)

ECHO 2. MySql

ECHO 3. Just Exit (N/A)

ECHO.

ECHO Which Database Are You Cranking Up?

ECHO ====================================================================================================

CHOICE "/C:123"

IF ERRORLEVEL ==3 GOTO NINE

IF ERRORLEVEL ==2 GOTO FOUR

IF ERRORLEVEL ==1 GOTO THREE

:ONE

SC QUERY %CF1% |FIND /i "RUNNING" > code.txt

IF !ERRORLEVEL! NEQ 0 (

SC START %CF1% >> code.txt

ECHO %CF1% Is Firing Up ...

) ELSE (

ECHO %CF1% Is Already Cranked Up ...

)SC QUERY %CF2% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 0 (

SC START %CF2% >> code.txt

ECHO %CF2% Is Firing Up ...

) ELSE (

ECHO %CF2% Is Already Cranked Up ...

)

SC QUERY %CF3% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 0 (

SC START %CF3% >> code.txt

ECHO %CF3% Is Firing Up ...

) ELSE (

ECHO %CF3% Is Already Cranked Up ...

)

SC QUERY %CF4% |FIND /i "RUNNING" >> code.txt

IF !ERRORLEVEL! NEQ 0 (

SC START %CF4% >> code.txt

ECHO %CF4% Is Firing Up ...

) ELSE (

ECHO %CF4% Is Already Cranked Up ...

ECHO.

)

ECHO ====================================================================================================

ECHO.

ECHO Need Data?

ECHO.

ECHO ====================================================================================================

CHOICE "/C:YN"

IF ERRORLEVEL ==2 GOTO NINE

IF ERRORLEVEL ==1 GOTO TWO

:END

If any one has some suggestions here - Feel free to share your opinion - This is one of the first batch scripts I've created so I'm sure there could improvements ... That's it.

5 Great Examples of SEO Friendly JavaScript & CSS Menus

Florida SEO Says, "Dear JavaScript ... Will You Ever Forgive Me? "

In my last post ... I attempted to explain how pure JavaScript menus were not good for SEO. However, after reading how the message came across to some of my readers, I feel it's probably best if I add some clarification. Thanks to Dan Switzer at PengoWorks for pointing out that my post needed some explanation. What I mentioned regarded the usage of pure JavaScript menus -Not All- JavaScript menus. If my post confused anyone, I apologize. There are lot's of SEO friendly menus that incorporate both JavaScript and yet maintain good web design practices ... So, now let's take a look at a few that stuck out with me.

In my humble opinion, menus that use JavaScript to manipulate the DOM (Document Object Model) and CSS (Cascading Style Sheets) to handle styling, maintain a good balance between usability and provide a dynamically appealing experience.

Okay ... So Show Me Some Cool Stuff Now

Before I show the following examples I want to point out the main factor that make these menus search engine friendly is the accessibility of the links to the robots. These menus do not rely on JavaScript to display the content either.

The first example here is from one of the most respected names in design ... A List Apart. Here Dave Shea provides an excellent detail on creating a menu implementing CSS Sprites with JQuery.

1. CSS Sprites2 - It's JavaScript Time

A List Apart
by: Dave Shea

CSS Sprites - A List Apart

Next, one of my favorite designers, Collis Ta'eed provides in exhaustive detail, everything required to create a very attractive and effective tabbed content area using CSS & JQuery ...

2. Slick Tabbed Content Area using CSS & JQuery

NetTuts
by: Collis Ta'eed

Slick Tabbed Content Area using CSS & JQuery

Soh Tanaka offers a very clean and attractive JQuery & CSS menu. Aside from issues with IE6's non-support of the :hover psuedo-class for elements other than anchor tags, this is a very good menu and degrades gracefully with JavaScript disabled.

3. Sexy Drop Down Menu w JQuery & CSS

Noupe
by: Soh Tanaka

Sexy Drop Down Menu w JQuery & CSS

Clark gives a solid example of how to create an animated drop down menu that also degrades well with JavaScript disabled - The key here is that the animation on the list elements is acceptable regardless of whether the visitor has JavaScript enabled.

4. Animated Drop Down Menu with jQuery

ClarkLab

Animated Drop Down Menu with jQuery

Okay ... I'm not a great designer by any sense. But, when I created this site I decided I wanted a little DHTML action and of course promote good SEO techniques at the same time ... So, I used Adobe's Spry  Accordion Widget to build my right navigation ... It too degrades gracefully with JavaScript disabled - The menus tabs will simply open up if JavaScript is not activated.

5. SEO Compliant Spry Accordion Menu

SEO Compliant Spry Accordion Menu

by: Adobe Lab

There are many excellent examples out there ... I really just wanted to take a few minutes to clarify the difference between a pure JavaScript menu and a menu that uses JavaScript and CSS.

That's it.

Florida SEO - SEO Fundamentals JavaScript vs Text Based Menus

SEO 101: Search Engine Robots Can't Follow Links in Pure JavaScript Menus

I've recently been receiving some interesting quotes for SEO services with Florida Search Engine Optimization. As part of the standard procedure I employ when reviewing a prospective client's site, I inform them that site architecture is very important and therefore must be taken into consideration. On several occassions I've suggested the removal of JavaScript based menus, and was met with a challenge. One of the prospective clients asked me why it was neccessary. So, I explained the mechanics of a crawler to him in some detail. The other prospective client wasn't all that trusting at first, so he decided to get a second opionion from another SEO before giving me the go ahead. I didn't have any problem with that ... I've been doing SEO for a while now and I've yet to find a client that accepted my opinion of a site review on blind faith regardless of the successful campaigns I've demonstrated.

SEO Experience Required - A Case for SEO Standardization?

What happened next really suprised me. I expected the need to debate my case with the prospective client that was not all that warm to me. However, I was actually opposed by both client's SEO's. Yes, that's correct. Both of the prospective client's SEO's were baffled as to why I suggested having text based menus. Oh yeah ... we SEO's tend to think they know everything ...

After receiving the suggestion for the menu removal, one of the SEO's mentioned to my client, "It's not important ... just make an XML sitemap so the robots can find you ... " I found that rather amusing. However, I found the other SEO's comment to be just as interesting as the first's. He simply stated that "He's even made Flash based sites rank on the first page ... " Thing is, the client requested a quote for services with me primarily due to the SEO's lack of effectiveness ... said SEO didn't so much as provide one case-in-point example - Pwned. So an experienced SEO is essentially stating that by providing an XML sitemap to the navigation of a site, serious issues arising from JavaScript based menus can be resolved. Okay - I don't think so ... But, let's see how accurate this is ... or isn't.

To Crawl or Not to Crawl? That Is ... Important.

A web site's internal link structure is very important when considering SEO. Almost any Decent SEO will attest to this. So why is it important? Because a web site is really nothing more than a group of pages linked together. Granted the linking relationships can become quite complex but it's really just a  Web of Links. When robots can't determine what is and isn't a link, they can't move from link A to B ... Link A was never realized.

To demonstrate ... Let's take a look at a site that employs JavaScript navigation and may not neccessarily require having highly crawlable links. I'm going to use Deluxe-Menu.com for this example - It's a very nice site that uses a JavaScript based menu, and does so with impunity - The site's entire theme is provided on the home page.

From the Eyes of a Spider - Where's the Web?

JavaScript Based Menu

So what we see here is a screen shot of the site's navigation ... We can clearly see the links for Home, Product Info, Samples, Download, Purchase and Support in the menu. Simple enough. However, if we inspect the internal linking of the page through a text-only browser such as Lynx,  it also shows that there are no visible traces to these links. The screen shot below is from the SEO text browser over at domaintools.com which, I have quite a habit of using ...

Text Browser View

So what are we're looking at here? This basically provides a detail of the elements a search engine robot would recognize when they visit a site. Blue signifies an anchor or link element. Red signifies images - for this example it isn't relevant to us whether those images are also links. The first link we see at the top of the page is for the site's logo, deluxe-menu.com. The next link we see in the document structure is for the site's sitemap which comes directly after the JavaScript menu. Notice how there are no links elements recognized by the text browser for the menu. A crawler would not identify this as a link either.

Okay, so I wouldn't expect someone in the C-Suite to be able to gauge the performance or effectiveness of a web site. But for an SEO? This should be first year  ... I find an unusually high amount of people claiming to be a "professional SEO" that don't know the first thing about web design, web development, Server Side programming or even HTML for that matter ...

In short ... This is old hat.

Business Getting Slow? Invest in SEO

Search Engine Optimization Increases Business » Any Questions?

Sometimes I'm baffled by the lack of understanding most business owners have in the value of online visiblity. Even some of the clients I have worked with which have seen and realized fantastic results still fail to recognize the benefits. In this desperate economy isn't an increase in revenue a good thing?

I recently went through the effort of creating a detailed analytics presentation on the performance of one of my clients sites since signing with Florida Search Engine Optimization. Self promotion aside - their site is performing and producing phenomenally well, which in turn evaluates to a significant increase in revenue. However, shortly after giving the successful presentation and discussing moving forward with increasing their search marketing efforts - their focus and committment waned and they haven't moved forward since.

Not trying to brag here ... but I feel it's important to mention that I hardly ever market for new clients - Almost all of the business that I get is through my own optimization efforts. When I first started out I did have to grab the 50 pound phone to get things kicked off, but I haven't had to do "hard marketing" in a long time ...

I feel partially responsible in not being able to effectively communicate the value of SEO to the "C Suite" ... I guess I just consider an increase in conversions and revenue a no brainer.

That's it.

Google RESTful Ajax » JSON Search in ColdFusion

While I was hacking and cursing my way through a routine to convert RSS feeds in to HTML ... I had an idea. I thought, "Wow, maybe there's another way to do this ..." Converting RSS can be messy so I opted for a much easier and cleaner solution ... JSON. For those Ajax pros out there ... have a heart ... I'm definitely a nOOb at JSON ... I just wanted to share my experience because the introduction and experience was enlightening ... at least to me it was.

Before I go in to this, I am offering this obligatory warning. What I'm about to do may not be in compliance with Google's T.O.S. So, if you get yourself in a pickle with the big G ... It's on you. You've been warned.

What I wanted to do is create dynamic and fresh content for say ... Oh the news. That's a no brainer. Typically you could just grab some RSS feeds and embed them in your content. So, What if you wanted the HTML from say ... Google's news ... Hmmm? You could use a SOAP request to Google for the info ... But SOAP won't be supported by Google for much longer ... So, that's no good. That's where Google's RESTful JSON interface comes in. According to Google documentation for their AJAX Search API, The interface was created for developers that need to have access to Google's Search API in non-JavaScript environments. The docs provide the base URL's to retrieve results for several of their searchers. Here' s a list of all the types of searchers you can access remotely.

  • Web Search: http://ajax.googleapis.com/ajax/services/search/web
  • Local Search: http://ajax.googleapis.com/ajax/services/search/local
  • Video Search: http://ajax.googleapis.com/ajax/services/search/video
  • Blog Search: http://ajax.googleapis.com/ajax/services/search/blogs
  • News Search: http://ajax.googleapis.com/ajax/services/search/news
  • Book Search: http://ajax.googleapis.com/ajax/services/search/books
  • Image Search: http://ajax.googleapis.com/ajax/services/search/images
  • Patent Search: http://ajax.googleapis.com/ajax/services/search/patent

So I decided to have my hand at grabbing some news ... Here we go ...

view plain print about
1<!--- Create a Couple Vars for the Search Params ... ---> 
2<cfset gQuery = #ReReplaceNoCase("ColdFusion","\s+","%20","ALL")#>
3<cfset qRegion = #ReReplaceNoCase("Fort Lauderdale","\s+","%20","ALL")#>
4
5<!--- Call Google's AJAX Service ---> 
6<cfset gData = "http://ajax.googleapis.com/ajax/services/search/news?v=1.0&rsz=large&#qRegion#&q=#gQuery#">
7
8<!--- Save the Result to a Var ---> 
9<cfhttp
10    url="#gData#"
11    method="get"
12    result="gDataResult">

13</cfhttp>
14
15<!--- Make the Data is JSON --->
16<cfset gData = #SerializeJSON(gDataResult,false)#>
17
18<!--- Clean up the Result Data with RegEx --->
19<cfset gData = #REReplace(gDataResult.FileContent, 
20        "^\s*[[:word:]]*\s*\(\s*","")#
>

21<cfset gData = #REReplace(gData, "\s*\)\s*$""")#>
22
23<!--- Make Sure We Have JSON ... --->
24<cfif !IsJSON(gData)>
25  <h3>Uh Oh ... Somthing Went Terribly Wrong ... <br />
26      But! Don't Fret ... Coders are Hard at Work to Get Things Up ... <br />
27      Right Away ...  ;)
28  </h3>
29
30<!--- If the JSON is Good, Deserialize It. --->
31<cfelse>
32    <cfset gData = #DeserializeJSON(gData)#>
33
34<!--- Create a Var for the Reponse Data    --->
35<cfset response = #gData.responseData.results#>
36  <cfloop from="1" to="#ArrayLen(response)#" index="ndx">
37    <cfoutput>
38      <p><strong>
39          <a href="#response[ndx].unescapedurl#" rel="nofollow" 
40          target="_blank">
#response[ndx].titleNoFormatting#</a>
41          </strong><br /><br/>
42          #response[ndx].content# <br /> <br />
43      </p>
44    </cfoutput>
45  </cfloop>
46</cfif>

The Google Search API's Class reference has a list of all the arguments you can include as URL parameters that will give you plenty of options to customize your results ...

Mastering SEO Rankings with Analytics Data

After reading this post you won't be able to "Master Search Engine Rankings" ... However, with some simple guidelines, you can create an effective plan to put your analytics data to work for you. Before I jump on my soapbox and start preaching the gospel of SEO, I want to state for the record that there isn't one absolute way to plan out an SEO strategy.To be honest, I don't think I've ever taken the same exact approach for any web site I've worked on ... and I've worked on quite a few over the years.

SEO is to Analytics as Grapes are to Wine

When I was in college I waited tables at a really exclusive restaurant because ... well, I could make decent money if I could sell steak and wine. Every day we would have lessons from an in-house sommelier that would instruct us about all the different features of what ever wine they had to offer. I really didn't know much about wine so I tried to get this guy to tell me everything he knew. So, I asked, "What do I need to know to sell the best wines?" and he said ... "It's grape juice ... just tell the customers what's it tastes like ..." That made it ridiculously easy to look at wine as nothing more than ... sour grapes ... my wine sales soared after that ... The point is ... SEO Analytics are not mysterious, esoteric and complicated. People are though ... and many SEO's and web masters don't really "get the point" to having analytics data.

SEO Analytics Data » Looks So Good

Forbidden Girl

GrapesI hate to be a buzz kill but in my book there really isn't anything exciting about ... data. Maybe if some hot naked blonde was presenting it to me ... I might be a bit more interested ... but that doesn't happen ... everyday. Now don't get me wrong, there are some great software applications that display visual depictions of rankings, conversions, click-patterns, visitor trending and heat maps, in uber cool Flash and Flex applications or snazzy charting and graphics, but the only thing these visuals are representing is data. That's it.

Analysis Paralysis is Not Good

When I first started in SEO I was working for a company with a fairly large base of resources and tools at my disposal to research, review, study and learn all about the SEO field. That wasn't necessarily a good thing. Though I have a voracious appetite for knowledge ... I found that after a while I wasn't being all that effective with all of this stuff I learned. ConfusedI had to keep what I could use everyday and leave the rest for later. So, that got me looking in to some GTD solutions ... more stuff to learn ... but, this time the learning was definitely worth it.

Research » Plan » Execute

That's it. This is my big secret to mastering search engine rankings ... It's that simple. Please note that I said simple ... not easy. If you want your analytics data to work for you ... you need to know what metrics are important to you, and which one's are not. Since I do SEO work mostly in the services sector, most of my clients are interested in generating business leads. Based on that, the most important metric for me to measure is the value of a new client for my clients. Once I have that figured, I move in to action by setting up goals and objectives. SEO Analytics data is simply the information required to create ... A Plan. Once I know the key performance indicators for my campaigns, I set up a plan to either increase or maintain the positive aspects and reduce the threats and liabilities. As soon as I forge a solid plan of action ... I execute. After I execute ... I go back to the analytics data, do my research, come up with another plan and execute again. Guess what I do next.

Dear Lisa - I'll Always Remember You

February was probably the most difficult month I have ever had. After wrecking my car on February 9th, I had a hard time getting around ... I had forgotten to add rental coverage to my insurance policy when I signed up ... Smooth ... Next, I lost my new phone only six days after I got it ... so, I was out of contact for a day or two ... Then, the Broward Sheriffs department lost my accident report ... so my insurance company delayed my claim until I tracked down the reporting officer to give me a copy ... I'm still waiting for a claim check there ... However, nothing could have been more devastating to me than what happened next. On February 16th, 2009, my girlfriend committed suicide ... Until then, I hadn't ever had someone close to me do something so drastic. When I found out that she had been found dead ... I was in disbelief ... the realization didn't actually set in for a couple of days ... I think I went into an immediate state of denial. It was about a week later that all at once, the pain and reality that my beautiful, loving and sweet girlfriend was gone ... hit me.

The pain of losing her has been so intense that I have nearly been unable to function and work. She was very special to me and we were in the height of our relationship ... I don't want to discuss the events that led up to her death ... they are too personal to share at this point ... But, I have been completely immersed in a state of shock, sorrow, grief and sadness ever since the day I heard what had happened to her. Honestly, I just want to say that I loved Lisa very much and I will always remember her for the intimate times we shared together. She was the light of my life and I will never forget her ...

Dear Lisa, I will always remember you baby ...

Love always,

Eddie

Florida SEO » Online Conversions » Analytics » Search Engine Rankings

Goal Conversions are The Bottom Line

Recently there seems to be a big shift in focus in the SEO industry regarding the importance of conversions over search engine rankings. This concept really sounds like a no-brainer to me ... probably because I was trained in SEO by a company that earned income solely from their lead generation ... If our rankings didn't turn into conversions for our clients ... We didn't complete our goals ... We lost our clients. The bottom line for my SEO strategy has always been focused toward online conversions of search traffic.

So Why Are Conversions Important » Now?

Last year Google ramped up their personalized search initiative which effectively tailors search results from behavior based user data ... According to Google's Matt Cutts, there needs to be a shift in the way SEO's currently operate. WebProNews's Mike McDonald recently asked Matt "Is Ranking Dead?" In response to Mike Matt stated,

"I'm not sure I would say ranking is dead but it's not as important as it used to be. The fact is the smart SEOs are not just necessarily looking at the rankings. They are looking at conversion, they are looking at their server log. It's great if you're ranking for a phrase but unless that leads to sales that doesn't help you very much."

"The challenge is not to pay so much attention to ranking, pay attention to traffic, pay attention to conversions and keep building good content and don't worry about 'can I show people that I rank number one for my trophy phrase ' ... "

The video below is from the interview with Matt Cutts and Mike McDonald at PubCon LasVegas ...



Furthermore, Google's working diligently on their Universal Search model and SEO's need to be able to adapt to Google's ever changing environment by learning to develop and initiate a broader range of tools to complete the conversion equation by bringing in targeted search traffic. For the SEO industry this means you need to focus more than ever before on building campaigns that are targeted towards conversions and not so much on rankings. However, it is important to note that rankings are only a metric, and have always been only part of the equation that is required to increase conversions. Obtaining search engine rankings without actually benefiting from that positioning is not very useful.

SEO is Changing » Is Your SEO Strategy Changing Too?

Recently there was a guest post by Eduard Blacquiare on Joost de Valk's site entitled, "Measuring SEO » Why Rankings Are Worthless". In his post he mentions several key points supporting the transition of rankings-based success to a conversion focused model. Some of the key factors Eduard mentioned are:

  • Ranking Checkers » Google has recently been blocking some automated ranking testing equipment.
  • Personal Search » Google is putting a great emphasis on their efforts to tailor their search results.

Furthermore, Eduard continues in his post with his view on things we can do to measure our success.

  • Measure the Growth Rate of Search Engine Traffic ...
  • Measure the Growth Rate of Search Engine Traffic per Keyword ...
  • Measure the Growth of Conversions from Search Engine Traffic ...
  • Measure the Growth of Conversions from Search Engine Traffic per Keyword ...

Personalized Search » What About Traffic from Nationally Focused Search Terms?

This is a topic I would like to discuss with Matt myself... In Matt's discussion with Mike McDonald, he mentions searching for the word "bank" will illicit a different result in the United States than it would in Great Britain. This is due in part because part of the metrics to determine personalized search results are based on the user's I.P., their search trends and their search behavior. From what we can infer from what Matt stated, personalized search result are relevant to the term as well as user data. Though personal search is playing a big roll in the dynamic, ever-changing environment at Google, I don't believe that competition for keyword ranking is going to be dismissed for nationally focused keywords.

Analytics are Paramount in the Quest to Obtain Conversions

Again, I received a fairly intense introduction to the SEO industry, so I have a solid understanding of the importance of conversion statistics. One of the first tools that I used was ClickTracks, which I still to this day consider a powerful tool in any SEO's arsenal. However, I recently also picked up a copy of the absolutely fantastic book, "Advanced Web Metrics with Google Analytics" by Brian Clifton which I highly recommend for anyone interested in measuring the success of their SEO marketing campaigns.

A Little Gem at the End

So, now that you've gotten this far, I can only assert that you are interested in the success of your SEO campaigns. Again there was another excellent post on Joost de Valk's blog, this one by Andre Scholten, on how you can track your organic Google rankings with Google Analytics ... Here's the video on Vimeo ...



Adding a ranking filter in Google Analytics from Joost de Valk on Vimeo.


I've implemented this on several of the campaigns that I am currently running and I can verify that it definitely works. You can now have your organic keyword rankings appear in your Analytics reports by setting up some custom filters in your Google Analytics account. This means you can determine the quality of the conversions you are getting from both paid, and non-paid keywords and their respective positioning in the search engine results pages ... How's that for conversion statistics?

That's It.

Florida SEO » Google Web Site Penalty Checker with Hyves

Hyves Google Web Site Penalty Checker » As I was perusing through the updates on Seo Master List, I saw an interesting post from Search Engine Watch regarding checking whether your web site is penalized or banished from Google by simply adding "hyves." Before your domain name ... IE (hyves.google.com) Though it may seem strange ... it apparently works. All you have to do is add the name hyves before your domain name and you will get the results ...

According to Marcus Tandler, AKA Media Adonis, the resulting PageRank from the addition of the sub-domain will return the result in the form of the following grades on the Google Tool Bar PageRank indicator:

  • PR 0 » The site is banned in Google
  • PR 4 » The site has received a Google Penalty
  • PR 7 » The site is okay.
I went ahead and tried my luck at it with my site to see what I could come up with ... and luckily I got a PR 7 ...

You might want to take a look at your site's condition soon though ... once this gets out to the mainstream it's only a matter of time before the big G gets it offline ...

Florida Search Engine Optimization » Apache MultiViews » Mod_Rewrite

Apache apparently has a server module call mod_negotiation which contains an option called MultiViews. MultiViews is a setting that gives the server the ability to decide the best representation for a requested file that doesn't exist. Furthermore, If MultiViews is enabled on the server, it will take operational precedence before any mod_rewrite directives that you provide in your .htaccess files. Had I been aware of this setting being turned on by default with my host, I would have requested for them to turn if off. However, I was completely oblivious that the setting even existed. The Apache documentation states ...

MultiViews » I should have known

My issue with MultiViews was discovered after a WordPress installation went south. I had installed WP 2.7 with a theme that I created and a group of plug-ins which I typically use. After creating a page for the HTML sitemap, I browsed the URL to make sure everything was working correctly. The destination URL was www.website.com/sitemap/, yet when I browsed to the page, the server was re-writing the URL as www.website.com/sitemap.xml/ which incidentally did not exist. Now, I also had Arne Brachold's Google Sitemap Generator for WordPress installed and I figured that there must be something wrong with either my .htaccess files or his sitemap plug-in on WP 2.7. After uninstalling his plug-in and several others in an attempt to solve the mysterious problem, checking and re-checking my .htaccess files, re-installing WordPress several times and arguing with my host that I have exhausted practically all efforts ... I became quite irritated. It was only when one of the tech support guys that had some experience with Apache realized the issue and sent me an e-mail informing me that the issue was due to MultiViews being enabled on the server. He suggested that I should have had requested to have it turned off ... I should have known.

Woe to you ... on shared hosting

If you are on shared hosting, you may not even know that some shared hosting accounts come equipped with the mod_negotiation module activated by default. If you are using the Apache2handler and want to find out yourself, just create a .php file with phpinfo(); in it and run that ... you should be able see if the mod_negotiation module is loaded ... If you are using the CGI/FastCGI such as I am, I don't know how you can tell ... phpinfo(); doesn't reveal those settings ... for the record contact your host.

SEO Side Effects » Duplicate Content with MutiViews

After doing some research and about MutiViews, I found a thread on WebMasterWorld stating that there may be duplicate content issues from using the MultiViews as well. Apparently MutiViews will allow for multiple URL's to point to the same content ... If you are having issues with duplicate content ... or if you can't seem to get your mod_rewrite directives to work as expected, you may want to take a look at the fantastic article in WebMasterWorld by: JDMorgan "A guide to fixing duplicate content & URL issues on Apache" ...

That's it.

Florida SEO » LinkDiagnosis » One Fantastic SEO Tool

While doing my morning crawl through my email I ran across an article from Eric Enge of Stone Temple Consulting regarding a recent interview he had with Angus Norton of Microsoft ... after reading the article, I was persuaded to go check out Eric's site to see if there is anything valuable to the SEO world that he was kind enough to share with the rest of the us ... and sure enough there was ...

Perusing through the linkbuilding category on his site, I found a reference to LinkDiagnosis.Com ... knowing Eric to be of a discriminating taste, I investigated a little more ... and I'm glad I did ... This is one gold mine of a tool ...

Once you go to LinkDiagnosis.Com ... you need to click on the download link and install the firefox extension (Sorry IE users) and then restart your browser ... then return to the page and enter your URL or your competitions ...

I'll let you be the judge of the rest ...

That's it ...

Florida SEO » The ColdFusion Maniac Returns

So I recently installed Adobe CS4 Master Collection on my laptop ... I want to test it on there before I convert from CS3 on my main development box. So far it's pretty cool. However, it's going to take me a bit to get used to the new interface ... all of the apps seem a bit too "low profile" ... kind of two dimensional. I guess I'll get used to it.

Looking back on 08' I realize the one thing I would like to do most is improve my quality of life. That entails taking on several personal commitments and one of those commitments is to programming. I think I am going to dedicate part of my time this year to getting my CF certification ... yeah I know most of the uber coders out there are going to say it's not "really" necessary, but I have a strong belief in setting goals. So, this is one goal I think I'm going to take a concerted effort at. If anyone's got some advice about cert training, I'd really appreciate it.

A friend of mine and manager of the South Florida CFUG, was nice enough to honor me to the board of directors for the group ... I guess it's time to start getting serious about my love affair with CF and show my worth. CF cert training ... here I come ...

That's it.

Florida SEO » Blog Humbug » Blah Blah Blah

Okay ... I haven't been blogging too much as most of those that I speak to have mentioned ... Well ... I have to be honest ... I really haven't been interested enough in anything to write ... maybe I'm just being resistant to the "Once a Week" suggestions from the blogging pros ...

For what it's worth ... the blog bug has somewhat returned ... so, I'll try to get back to writing at least once a week ... Blog ... Blah ... Blah ... Let's see how long this lasts ... Oh yeah ... Have a Merry Christmas and a Happy New Year ... If I don't blog again before their times arrive ...

Blog Humbug ...

ColdFusion Ajax & JQuery ... Learn to Earn

Recently I decided that it's time to start paying a bit more attention to improving the visual presentation of one of my sites. The site's built in ColdFusion with lot's of nifty CF Ajax stuff thrown in. CFDiv's, CFWindows, and Pods here and there too. So, I figured since I'm not too bad at coding in CF - at least I can usually Google my way through most of the snags I run in to - I wanted to try challenging myself a bit by taking on something fairly foreign to me. Ajax.

I know the basics of Ajax. Asynchronous JavaScript with XML - Sending and receiving Http requests and responses to a server to return data to a site without refreshing the documents. However, I had little experience actually taking on an Ajax project. But if that wasn't difficult enough, I wanted to get really frustrated, so I decided to use a JavaScript library that I had little if any experience with - Entrance JQuery.

Now I've seen a lot of very groovy examples of the nifty UI tricks that can be done with JQuery. They are cool. But I really wanted to learn how to use JQuery for my specific needs. So, I did. I choose to launch my campaign with a real world example. So for my project, I mapped out what I wanted to do with ColdFusion, JQuery, and Some CFAjax stuff. Here's what I planned out ... First, I wanted to add a US database to my site, SEOMasterList.com, to build out some dynamic pages. The reasons for that should be quite apparent. I'm planning to obtain rankings and possibly monetize the site.

Next, I wanted to add some cool visual effects while providing improved functionality to the site, and possibly give visitors a better experience.

And finally, I just wanted to see if I could actually do it - two weeks in to it, I finished it. I have got to admit I spent a hell of a lot of time learning while trying to get the site done - someone with experience could have probably launched it in a matter of no time. But, I learned a lot.

Once I modified, installed, and built out the components to accommodate the addition of the database, I set up another component to dynamically bind the results from the database to two selects in a form. This was very challenging - I spent the better part of two days just trying to get the bindings to work. Luckily, I found a cool ColdFusion script and modified it to output my database queries to XML. That came in really handy. The first go at trying to output 80,000+ records to a single flat XML file didn't work out to well. I ended up rebuilding the data CFC's several times in order to get what I needed. I ended up with a 1.4 MB XML file that I'm now using to bind to the data in the selects.

After tackling that part of the project, I wanted to introduce some visually appealing effects to the site so I picked up the latest JQuery code and sent it up to my site. After some effort, I was successful in creating a pretty slick interface for my Ajax loaded form. Through the use of some nifty ('#div').show(),('#div').hide () functionality on the form page, I was able to add and remove elements of the page which weren't necessary at every stage of the form submission process. This proved to be tougher to implement than I had expected. Up to this point I have a form bound by CFC's to data, an asynchronous form handler to process a form submission, and some nifty JQuery going on to assist in dressing up my application modifications. All in all. I think it went really well - and I learned a whole hell of a lot doing it. If you want to see what I did ... have a heart ... I'm an Ajax nOOb. Check it out on SEOMasterList ...

Florida SEO » CFEclipse » Aptana Migration

I learned ColdFusion in DreamWeaver. For that matter, I've learned HTML, CSS, JavaScript and PHP in DreamWeaver too, so it's been fairly difficult for me to completely switch over to Eclipse even though I actually prefer working in Eclipse more than I do DreamWeaver. For some reason I just feel like I'm 'really' coding when I'm working in Eclipse. I don't feel like a 'serious' programmer when I'm working in DreamWeaver. So, I've decided to share some of the things I've done to make the migration a bit more tolerable.

First off I have Eclipse 3.3.1.1 Europa J2EE. I'm sticking with that platform for now because the latest Eclipse release, Ganymede, doesn't play to well with CFEclipse.

Then I installed CFEclipse, and added the ColdFusion extensions for Eclipse, the ColdFusion 8 help files for Eclipse, the ColdFusion 8 Syntax dictionaries, and finally plugged CFEclipse in to the CFLib and CFSnippets snippex servers.

After that, I installed Aptana. Except for the annoying 'upgrade to pro' messages they send, Aptana's really nice. What I really like about Aptana, is it's great HTML, CSS and JavaScript functionality. Coding web pages in Aptana is a snap, and since I'm a snippets freak, Aptana's snippets view helps me make the transition to Eclipse that much easier. The most important thing I needed from Aptana though, was remote FTP view. Being able to FTP from within the IDE was definitely keeping me tied to DreamWeaver, and by removing the key bindings in Eclipse for CTRL+Shift+U, and CTRL+Shift+D, I was then able to take advantage of the default GET and PUT FTP shortcuts that were so familiar to me from working in DreamWeaver. CTRL+Shift+U (PUT File via FTP ), CTRL+Shift+D (GET File via FTP). I live by these shortcuts.

Snippets are a way of life for me in DreamWeaver. Once I create something reusable, it goes in to a snippet folder, and I assign a keyboard shortcut to it. One thing that really sold me on CFEclipse, was the awesome job Mark Drew did on making snippet variable regions. That's too damned cool. For working with HTML, CSS and JavaScript snippets, I've just added the snippets view from Aptana to my CFEclipse perspective and the same with my Aptana view, I added the sniptree view to my Aptana perspective. That way, I can get the best of both worlds. For more customizations, I decided to install JSEclipse for my JavaScript work. JSEclipse is also really nice.

So, it may still take me a bit to get used to Eclipse, but I'm going to do my damndest to make it my primary IDE.

Florida Search Engine Optimization » Goodbye MoxyMedia SEO

The MoxyMedia SEO division is officially gone. I have to be honest and tell you that before I decided to start my own company, I really enjoyed working with most of the people over there, and I learned quite a lot too. On Tuesday Oct 7th, I found out the official news when a friend of mine that I trained over there sent me a text message letting me know that all of the employees in the SEO division were let go. I have since learned that Tsavo media picked up some of MoxyMedia's assets as well as a search engine optimization firm, Better, Inc. That probably explains why they decided to let the staff over at Moxy go - Tsavo apparently has other plans. However, in reality the writing has been on the well for a long time. As for the team of folks I enjoyed working with over at Moxy (you know who you are) Good luck and I hope the future brings you much happiness and prosperity. It was an honor working along side you.

Google PageRank Update Sept 26

Well, it seems that the mighty Google is back at their PageRank updates again. At the time of writing this post, the Tool Bar PageRank of Florida Search Engine Optimization and SEO Fort Lauderdale went down a point. That's interesting since Matt Cutts recently mentioned the possibility of this happening on his blog ...

"I wouldn't be surprised if new PageRanks started showing up this weekend or so."
Matt Cutts » September 24, 2008

However, I'm not too sure the update has stabilized yet - many sites I visit often have also dropped a point from the prior rankings and I've noticed some new sites that had no PageRank a day or two ago now showing up as PR 4 and 5. This leads me to suspect that this ain't over yet.

Social Media » Internet Marketing Strategies » Florida SEO

I'm really impressed by some of the new and effective internet marketing strategies that have been coming out lately. On LinkedIn, I saw a post for a sharing widget and decided that it would be cool to add this functionality to the collection of social media buttons on Florida SEO Blog. [directions to install the code].

As long as LinkedIn doesn't decide to change the API too much, I can have my readers spread the word about the content on Florida Search Engine Optimization and Florida SEO Blog to all of their contacts in LinkedIn and possibly expand Florida Search Engine Optimization's reach to a targeted market that otherwise I would not be accessible to.

For the CF coders that want to install the LinkedIn code on to BlogCFC, it's not too hard. There are five URL variables to be updated to share the article submission with your LinkedIn network.

  • 1. The LinkedIn URL
  • 2. The Article URL
  • 3. The Article Title
  • 4. The Article Source
  • 5. The Article Summary

view plain print about
1http://www.linkedin.com/shareArticle?mini=true&url=
2    {articleUrl}&title={articleTitle}&summary={articleSummary}
3    &source={articleSource}

I added the following code to the row of BlogCFC's social media buttons around line 100 of index.cfm. The content for this area is within div class="byline". If you want to add a LinkedIn Icon ... there's a good set of LinkedIn Icons here ... I used the 16px version.

view plain print about
1<img src="#application.rooturl#/images/LinkedIn_16.png" align="middle" title="Share on LinkedIn!" 
2    height="16" width="16">
 <a href="http://www.linkedin.com/shareArticle?mini=true&url=
3    #application.blog.makeLink(id)#&title=#URLEncodedFormat("
#title#")#&summary=
4    #URLEncodedFormat("
#Left(application.blog.renderEntry(body,false,enclosure),200)#")#&source=
5    #URLEncodedFormat("
#application.blog.getProperty('blogTitle')#")#" rel="nofollow" target="_blank">
LinkedIn Share!</a>

Oh Yeah ... If you liked this article ... Don't forget to share it with your LinkedIn network ... :)

Florida Search Engine Optimization » SEO for Lawyers

SEO for lawyers has turned out to be a very good return on investment for most legal services. Though I have done some SEO campaigns for several other verticals such as mortgage, real estate, insurance, educational loans and local retail business, the legal industry as a whole seems to benefit much better from SEO than some of the other service sectors. Quite simply » SEO for lawyers, rocks.

I actually got my beginning in search engine optimization as an SEO for lawyers when I worked for a large holder of legal domains. After I left the company and started
Florida Search Engine Optimization, I soon realized that doing SEO for lawyers was a win-win situation for my clients and my company.

From my experience, there are many practice areas that benefit greatly from SEO. Of those, the ones that I have found SEO for lawyers to produce the biggest earnings for include:

  • Tax lawyers
  • Litigation Lawyers
  • Bankruptcy Lawyers
  • Immigration Lawyers
  • Personal Injury Lawyers
  • Criminal Defense Lawyers
  • Class Action » Tort Lawyers
  • Medical Malpractice Lawyers
  • International Business Lawyers

First off, the value of a lawyer reaching the first page in Google will vary. Not all conversions for legal cases are worth the same amount. For instance, the value of a medical malpractice lead may be worth anywhere from $10,000 to $1,000,000.

A personal injury lawyer that practices in one of the 6 major markets, where the search volume for personal injury cases are relatively high, would benefit greatly by having high search engine rankings and even a highly competitive SEO campaign that costs between $25,000 to $50,000 a year would pay for itself in a matter of no time.

However, comparing that same case scenario with that of a traffic lawyer and the return goes down quite a bit. Realistically the aggregate value of a traffic case is loosely around $100 to $1,000. Following the same level of competition with the SEO campaign for a personal injury lawyer, this would require at least 50 cases a year just to cover the cost of the campaign » not a real profitable investment.

From my experience, it takes anywhere from 15 to 20 cases for the average general practice lawyer to make a profitable return on their investment within the first year. However, after the first year, the value of the initial investment of an SEO campaign will normally sustain it's value since the value of the site increases as the internal quality of the site improves, the amount of content increases, inbound link partnerships are built, and PageRank is established. Furthermore, the rankings that have been obtained from the first year's optimization efforts may be maintained relatively easily through an SEO maintenance plan which, is nominal in comparison to the cost of a full SEO campaign.

I'm quite amazed at the amount of lawyers that choose Pay Per Click (P.P.C.) advertising over organic search engine optimization. The only viable reason that I would justify spending money on a P.P.C. campaign is to provide support for an organic campaign that is still attempting to obtain an acceptable position in the Search Engine's Results Pages, (S.E.R.P.'s). I tend to think the difference between a P.P.C. campaign and organic SEO is like paying rent in an apartment versus owning your own home. If you can afford your own home, why rent an apartment?

With a P.P.C. campaign, once the keyword budget is depleted, all value from the investment is gone. If you compare an organic SEO campaign to a P.P.C. advertising campaign, it's easy to see how organic SEO for lawyers is the only way to go. If you want SEO for Lawyers, Contact Florida Search Engine Optimization.


Hurricane Ike » Live in Florida » Sept 9 08

According to storm tracking predictions at Stormpulse, Hurricane Ike is going to be arriving in South Florida sometime Early in the A.M, Wednesday, September 9th.

Hurricane Ike Live In Florida
Image credit: StormPulse

If you've ever been lucky enough see a major hurricane first hand, it's not something you'll likely forget anytime soon. Seeing that Ike is slated to be a cat four by the time he arrives to Andros Island, which is less than two hundred miles from Fort Lauderdale, and a category two when he makes land fall, I am going to show him a little respect and get out of his way.

Storm tracking is based on predictions » predictions are not always accurate. If you want to check out what the soothsayers predict, check out Stormpulse » the visuals and the data points are really good.


Google Chrome » Rocks

So my first impression about Google's new Chrome browser, is that it Rocks. It's quite apparent that the engineers at Google know exactly what the development community is looking for and they make no small feat in creating a web browser that is able to completely annihilate the competition. Moreover, I really like some of the features that are included by default like the Firebug style DOM inspector that you can invoke by a right click context menu (Nice).

Chrome Rocks

In my first shot at testing out the new browser's speed, I attempted to pull up a Google Map that I have on my site which makes a remote call to Google's GeoCoder object to retrieve coordinates for a city to update the map locations based on those coordinates. Though I should actually have the coordinates in a Google GeoCoder Cache to speed up the process, I don't » yet.

The results were amazing. while it took Firefox 2 approximately 4 seconds to fully display the map image, it took all of 500 milliseconds for Chrome to display. My results are just from personal experience though. Google claims that Chrome's new JavaScript engine, V8, shows remarkable performance levels and they provide a collection of benchmark test results to boast. [Chrome Test Results.]

According to the developers over Mozilla, the new browser is not as impressive as Google may claim and they also ran some tests on Chrome with a JavaScript testing engine named SunSpider. Mozilla claims that the new TraceMonkey JavaScript engine slated to be included in a future edition of Firefox, will perform even faster than V8. Things really start to get interesting though when JQuery's inventor, John Resig, decided to run some of his own performance tests on Chrome. In short » John agrees that Chrome's JavaScript engine is really fast.

Hey » I Want Your Regular Expressions » Now

I really like regular expressions (RegEx's) and I have this crazy fascination with learning and using them whenever and wherever I get a chance. If you don't know what a regular expressions is, the Sun Developer's Network's states:

"A regular expression is a pattern of characters that describes a set of strings." » Simple enough.

I picked up the bug for RegEx's after trying to "think my way through" a JavaScript form validation function without any experience in regular expressions or JavaScript for that matter.

That event led me to pick up Mastering Regular Expressions, III ed. By Jeffrey Friedl; OReilly's JavaScript, The Definitive Guide, By David Flanagan, and a fierce desire to learn more about the almost alien-looking esoteric characters that were here to take over my programming world.

The good news I found out later was not only that I am not the only RegEx fan that has been drawn in by their mysterious attraction. Many of the coders and developers that I've found to respect, have this crazy bug too.

So, what I want to do now, is put together a RegEx Library right here on this post for all of the coolest regular expressions you know. So, post me your regular expression(s), with a brief description.

Florida Search Engine Optimization » Link Campaign Planning » 101

In the last post in my series on creating a link campaign to increase a web site's authority and improve visibility, I decided to describe a link campaign as one might do when planning for a long trip. Now, I am not a 'bad planner' per se, however, when I get excited or impatient about doing something, like the opportunity to get away on a trip, I have a tendency to romance the illusion of the trip and forget about the details which might have made that trip a more enjoyable reality. You with me there? So, to make the illusion of a successful link campaign a reality, I am going to reference some advice from the journals of link campaign masters.

Travel Lite – Be a Lazy SEO

One thing I've learned on my path to "SEO" – programmer – developer nirvana, is that being a 'lazy programmer' is much better than being a busy programmer. That basically just means that I am going to plan to get the most out of the resources that I have. Transferring this mentality over to link building, I am going to use the experience of veteran link builders, as a "Lazy SEO" guide. So, I have a few link builders that I tend to have quite a bit of respect for. First and foremost is the "Link Moses", Eric Ward. I really like the way that Eric approaches etiological link building. (That sounds rather confusing to me) I think it just means good content attracts good links – Go figure.

Follow the Stars

Another one of the linkerati that I like to follow is Eric Enge. So, now we have Eric squared (Eric √). One of my favorite link building articles is from Eric Enge's "√" interview with Eric Ward back in April 07'. Another Enge article that I reference quite closely is: "Linking is the Key ", that is a really good overview of the importance of inbound links. There too, are some others that need mentioning here; "101 Link Building Tips to Market Your Website" from Aaron Wall, "evil blogger" and Andy Hagans, is also a very good resource to reference. I created the title of this series, with the incredibly played out yet extremely effective, "{insert anything} 101", from the first suggestion in their 101 list.

There are many, many, excellent link builders out there to follow for your own personal mentoring as well. Some of the others that you might get some clues from are:

Make Your Own Path – To Thine Own Self Be True

So, on with the details. The most important I consider when planning for a link campaign is what I shall do to make a good impression upon those that I want to link to me. The craziest thing I see is when I receive an obviously automated link request asking to please link to whogivesashit .com, without so much as a reason as to why I would want to do so – Useless. In order for me to link to a site, I would need to have three very important questions answered ...

Credibility – If I don't have respect for the individual that is requesting that I link to them, I don't want to link to them. That simple. If however, I respect the content, value and purpose of a site, and I find that the site is relevant based on the quality of the content, or as a resource, then I 'may' be compelled to provide a link to it. Without establishing credibility first, I don't have any respect for that site. Why would I want to link to that site? On the other hand, if I have respect for a site or blogger, then I will freely link to it on my own. The sites that I am compelled to link to, are typically from those that would not ask me for a link – Any link request that I receive, better be pretty good.

Curiosity – I don't want to link to a site or content that is not interesting. I don't think that any webmaster, blogger, copywriter or casual internet surfer would either. In order for me to be curious enough to open up Dreamweaver, find or write a page to put the link in, and place it on my site for all my visitors to see, I am going to have to have quite a bit of curiosity at the onset of the link request dialogue to go through changing the look and feel of my masterpiece website to compensate for the needs of another. Even if the link is a benefit to me, the simple fact that I was "solicited" a link request, is enough to put me on the defensive. Call me a hard ass, but that's just how I am.

Benefits – Something else that I feel is vitally important to a link request is the benefits. I rarely see link requests that address this extremely effective measure. If I want something important from someone, I am not going to tell them why it is I want "blue widgets" from them without first letting them know what the benefits are for them. Why? Because, most people don't really give a damned about what I want. They want to know "what's in it for me"? Asking for something empty handed is never an easy proposition. Couple that with a request to a total stranger, and the likely hood of failure or rejection has just multiplied exponentially. However, if the request is delivered as a description of the benefits to the other, then we have taken on a whole new paradigm. If I started seeing link requests in the form of, "Our site provides ... {Benefit A, B, C ...}", I might see that there is a need for this link from my site, and credibility 'may' then be established in my mind.

Where Do We Go Now?

At this point I think I have opened up the "path to link building enlightenment", enough to determine that it is important to establish a position of credibility to the person that is receiving a link request, and that without credibility and curiosity, the best of intentions are sure to end up just that, intentions. Establishing quality links is done through having quality relationships with other sites. Websites are run by people. People have relationships with other people. Next time, we're going to discuss just how to build our link relationships. Link » Building Relationships » 101.

Delicious Goes Dot Com » Changes Page Layout

News travels fast on Twitter, and while I was checking out my updates, I saw that Delicious has changed their domain name from del.icio.us to the dot com delicious.com. I don't typically like change too much, but I think it will definitely help the site attract more visitors transferring over to the simpler name. I can't even count the amount of people that I tried to get started with delicious bookmarks that were completely confused with del.icio.us.

Changing the domain name wasn't what really stood out the most for me though. When I browsed over to my delicious bookmarks page to see the new name in my browser, I noticed that they completely changed the layout too.

New Layout for Delicious

Now I do a lot of bookmarking in delicious, but I usually don't go to the actual page that much since I have delicious bookmarks for Firefox installed - I just do all my bookmarking from the browser and don't actually go see the site.

The first thing I like about the new page design is the much simpler and probably more effective style of managing the bookmarks. With over 1800 bookmarks ... it gets really tough to handle the hundreds of different tags and bundles I've placed them all in.

That's It.

Florida SEO » BrowseRank? » Larry Page's Brother?

Okay, so the wind of change is screaming at Microsoft ... That's not all that shocking. However, it seems that the incumbent software giant is trying to one up Google by coming out with a late-in-the-game answer to the PageRank algorithm - BrowseRank.

Now, it seems a bit strange that the geniuses at Microsoft would be so thoughtless of the current search community, so "Microsoft", they would actually create the name of their project with only a one word difference from Google's - BrowseRank? Wasn't the name for Google's PageRank algorithm based on Larry Page?

So, does Microsoft have an engineer named Browse? Apparently they want to be known as the knock-offs of the search industry. I wonder if they figured that metric in to their "User Behavior Data" concept.

If you want to see the details on their "unique" idea - letting visitors vote for web page importance ... you can check out the PDF on "Microsoft's research" ...

But wait a minute ... didn't Google recently decide to start the beta testing for implementing a Digg like interface which, is slated to let visitors vote for sites?... Oh yeah ... and didn't Google and Microsoft recently start their preparations for Bidding on Digg?

Now, I may not be smart enough to write a search algorithm or a business plan to capture market share ... but it sure seems like Microsoft needs to rethink their business strategy a bit when it comes to the search industry. The last thing we need is to find out that Larry Page has a brother named Browse that's trying to take over the search market.

That's it.

Florida SEO » Dave Naylor » Twitter Back Link Trick

If you are wanting to get a nice back link from Twitter, Dave Naylor recently exposed a way to get a do follow link from Twitter - If you're reading this, you might just want to open up another browser tab and do it while you're here ... I don't think this opportunity is going to be around for too long.

Here's the deal. The "More Info URL" area in the account settings page for twitter offers a link for whatever web site you have ... But, the link is a NoFollow link which doesn't give you any PageRank ... if your twitter page even has any at all ... Mine does not ... (Florida_SEO).

So, if you take a look at the Bio information ... You can insert your URL in there, and get a Do Follow back link ... for now ...

Do Follow Back Link on Twitter


That's it.

Florida SEO » CFC Problem » Solved

In my last post, I was ranting about a frustrating situation with CFC's on shared hosting over at HostMySite. Several months ago, I installed a rather cool CFC that only had a life span of three days - it worked fine - then all of a sudden - it stopped working.

A few weeks ago the same scenario took place - I installed a component on another one of my CF sites, SEO Master List - It ran fine for three weeks and the all of a sudden - it stopped working.

After many hours of confusion with the guys over at HostMySite, it turns out that occasionally during server resets the security permissions are changed. I really don't know whether there's someone to blame for it, but at least I know the why of it if not the how.

So, if you have a CF site on shared hosting over at HMS and find your CFC's stop working and your pretty certain that they should be, make sure to take a look at the security settings - That's it.

CFC Madness » Where's The Damned Component?

Okay, So I might be a bit frustrated here ... I have had ongoing issues with CFC's at HostMySite, and I can't for the life of me find the root cause to my dilemma. If someone could give me a clue ... I would really appreciate it. My problem follows ...

I have shared hosting accounts with HostMySite for my CF sites. A few months back I attempted to work with the CFlickr CFC on my blog ... However, after a few days of being in operation, I started to receive errors stating that ...

" The value of the Function Foo is not of type components.someComponent. "

After working with tech support for a few days, our first guess was that there was a mapping issue with the CFC, and that we just needed to update the mappings ... after checking the mappings several times, reinstalling the component several times, and having support finally tell me that "there must be something wrong with the code", I abandoned the project feeling a bit ... beaten.

Recently I created a feed aggregator based on the same code from ColdFusionBloggers ... For several weeks the site ran fine ... no problems. But recently, I tried to login to the admin area ... and I started to receive errors by email that were strikingly similar to the errors I had with the CFlikr CFC. This time I'm getting ...

" The value returned from the getComponent function is not of type components.entries "

So, I contacted tech support, only to hear the familiar lines ... "We'll create a ticket ... and call you when we know something ... " Which usually means I'll have to figure it out for myself. Now, I don't quite understand why a component would just stop working without any changes to it ... but I'm starting to think that this issue is not something that I caused. If there's a CFer out there that has had a similar experience and found a solution ... could you please throw me a rope?

That's it.

Google Adwords Keyword Tool External Shows Exact Searches

Well it has been a long awaited advancement for the SEO, SEM and SMO industry ... but Google has finally added exact searches per month for keyword phrases to their keyword tool, Adwords Keyword Tool External.

Previously, the tool would return results for the targeted keyword in the form of a low, medium or high bar graph which really didn't help to quantify the value of a given search term. However, as with the previous major keyword tool Overture, Google Adwords Keyword Tool External provides the amount of searches for a given term per month and the average amount of the aggregate search volume for the search term ...
The snapshot below shows the new results ... That's it.

Google Keyword Tool Shows Exact Search Volume

Florida Search Engine Optimization » SchoolLoans.com LLP

Recently I completed the launch for the new web site for student loans, www.SchoolLoans.com. Working along side Seth Kravitz of Cyber Technology LLC, Florida Search Engine Optimization has completed the initial phases of an SEO campaign and is pleased to announce high confidence for the future of the new site. SchoolLoans.com, provides a unique loan comparison tool which allows prospective students or parents of students the opportunity to seek out the most appropriate student loan and easily start the loan directly through a web application interface.

Just a few of the Student Loans that are available on SchoolLoans.com are:

The site's main function is to bridge the gap between students, parents and lenders by providing Educational Loans from some of the most well respected names in the educational loans industry. For more information about the new site, pay a visit to www.SchoolLoans.com.

Florida SEO Love's July 4th! - Happy B-Day America!

Okay ... So I am a real freak for my country. I really love the United States and especially where I live, Fort Lauderdale, Florida (WooHoo). There are few other places that I would truly rather be. It really makes me mad when I hear people that are from other countries talking smack about how they don't like this or that about America. If it's so bad, why are they here? I am proud to be an American, and I feel that I owe a great bit of debt to my country for giving me everything that I have today.

I think the number one problem with most people today is a lack of gratitude for what they have. A great deal of the American public has become spoiled by the freedom which has been given to us from those that fought for our country. Maybe if all US citizens had to fight or contribute in some way for their citizenship, they might be a little more appreciative of what they really have here. At any rate, I Love America and it's with pride I say, Happy Birthday to the U.S.A. That's it.

Florida SEO Love's July 4th! - Happy B-Day America!

An evening with Loren Baker » Search Engine Journal

Thursday June 26, I was privileged enough to hear a presentation on the basics of link building by Loren Baker of Search Engine Journal. Loren, gave a solid beginning to intermediate level preso, focused on building authority through internal links and delivered some good advice to those that might not have any experience in dealing with the touchy subject of link requests. All and all, his approach was straight up.

I'd like give a word of thanks to the guys over at the S. Florida SEO meetup ... John Carcutt, Daryl Long, Mark Laymon, and Mark Hughes, and all the others that made it another great night. I'm really looking forward to hearing what might be on the agenda for the up and coming months, and may be inclined to start focusing my attention a bit more to Tech Crunch after listening to what Loren had to say ... (hmmm ... ) That's it.

Pics @ the preso ...

Florida Search Engine Optimization » SEO Master List Is Alive

Well, It's alive ... I've launched SEO Master List. I have high expectations for this application and hope that it is well received in the SEO community. Which, brings me to another subject. SEO's, can be quite pretentious and highly critical ... So, we'll just see how they like it. Then again ... if they don't ... I really dont' care all that much. I like it.

SEOMasterList is basically just a feed aggregator with a lot of cool Ajaxy stuff on it and some cool styling. Ray Camden actually created the app ... the original code is on coldfusionbloggers.org. A Big thanks goes out to him for his help in debugging the install too ... Thanks Ray.

For those that want their 'SEO' feeds aggregated on SEOMasterList.com ... send me an e-mail and I'll get right on it ... maybe. If your feed wasn't aggregated, and I tried to add it to the list ... there may have been a problem with the xml structure - there were many good SEO blogs that I was unable to parse due to xml rendering issues ...

Thats it.

Shout Out To Shana » The Social Media Sweetheart » Happy Birthday

I just wanted to post a belated (June 9th) birthday shoutout to Shana of Social Desire ...

Shana is a friend of mine that contributes an enormous amount of her time and energy to blogging about all things Social media, Web 2.0, and search engine optimization ...

Besides being an incredibly disciplined and driven blogger, a full-time mom, and a darn good writer, she too is a very sweet and endearing person that I hold a great deal of admiration for ...

So, without further adieu ...

Shana ...

Happy Birthday to You ..

Florida Search Engine Optimization » Has A New Bag

I've come up with a very cool new app that I put together ... The base code for the app comes from one of the baddest CF dudes around, Ray Camden, the ColdFusionJedi. I have really big expectations for this new app, and cannot wait to release it to see how the SEO community takes to it ... sorry, but I just can't say what it is ... yet.

Florida Search Engine Optimization » Link Campaign 101

One of the most important factors to increase a web site's authority and improve visibility, is to obtain in bound links from other web sites. Easy right? Yes ... well the concept is anyways. I like to think that a link campaign is similar to walking from one state to the next. It's not hard to understand ... but it usually takes quite a long time. So, If we expect to reach our destination, we should plan to take it one step at a time.

An inbound link, is very much like a relationship. As in most social circles, the more popularity you have, the more relationships you usually have. Search engines view and measure the authority of a web site similar to the way our society measures authority ~ through our position in society. In order for a web site to be credited with a position of authority, the site has to have in bound links from sites that are known as authorities.

That out of the way, we should keep in mind that just as with money, power and success, authority is not normally just given away. It must be earned. Next time, we're going to discuss how we are going to plan our long journey to building a web site's authority through a link campaign. Link Campaign Planning » 101.

SQL UDF to Convert Uppercase to Propercase

So, I figured that it would be a good idea to try and expand Florida Search Engine Optimization web coverage beyond the Miami, Fort Lauderdale areas. So, I started a project to build a quazi regional network in my site. At first, I tried to be creative and store all of the cities and counties of Florida in an array with the counties as an array of structs.

With some work, I was able to get this running. However, I realized that if and when I want to make changes or additions to the cities or counties, it was going to be quite a bit of work.

After some consideration I decided that it would be much easier to just use a database table with the cities and counties.

Now, everything was going quite well with the addition of the new database when I found that the city and county fields were all in uppercase ... I really didn't want to leave the data like that, so I decided to figure out how to change the 80,000 plus records to propercase, and I found just the thing ... a cool little T-SQL UDF ... that changes the data to propercase ... the code follows ...

view plain print about
1create FUNCTION PROPERCASE
2(
3--The string to be converted to proper case
4@input varchar(8000)
5)
6--This function returns the proper case string of varchar type
7RETURNS varchar(8000)
8AS
9BEGIN
10IF @input IS NULL
11BEGIN
12--Just return NULL if input string is NULL
13RETURN NULL
14END
15
16--Character variable declarations
17DECLARE @output varchar(8000)
18--Integer variable declarations
19DECLARE @ctr int, @len int, @found_at int
20--Constant declarations
21DECLARE @LOWER_CASE_a int, @LOWER_CASE_z int, @Delimiter char(3), @UPPER_CASE_A int, @UPPER_CASE_Z int
22
23--Variable/Constant initializations
24SET @ctr = 1
25SET @len = LEN(@input)
26SET @output = ''
27SET @LOWER_CASE_a = 97
28SET @LOWER_CASE_z = 122
29SET @Delimiter = ' ,-'
30SET @UPPER_CASE_A = 65
31SET @UPPER_CASE_Z = 90
32
33WHILE @ctr <= @len
34BEGIN
35--This loop will take care of reccuring white spaces
36WHILE CHARINDEX(SUBSTRING(@input,@ctr,1), @Delimiter) >
 0
37BEGIN
38SET @output = @output + SUBSTRING(@input,@ctr,1)
39SET @ctr = @ctr + 1
40END
41
42IF ASCII(SUBSTRING(@input,@ctr,1)) BETWEEN @LOWER_CASE_a AND @LOWER_CASE_z
43BEGIN
44--Converting the first character to upper case
45SET @output = @output + UPPER(SUBSTRING(@input,@ctr,1))
46END
47ELSE
48BEGIN
49SET @output = @output + SUBSTRING(@input,@ctr,1)
50END
51
52SET @ctr = @ctr + 1
53
54WHILE CHARINDEX(SUBSTRING(@input,@ctr,1), @Delimiter) = 0 AND (@ctr <= @len)
55BEGIN
56IF ASCII(SUBSTRING(@input,@ctr,1)) BETWEEN @UPPER_CASE_A AND @UPPER_CASE_Z
57BEGIN
58SET @output = @output + LOWER(SUBSTRING(@input,@ctr,1))
59END
60ELSE
61BEGIN
62SET @output = @output + SUBSTRING(@input,@ctr,1)
63END
64SET @ctr = @ctr + 1
65END
66
67END
68RETURN @output
69END
70
71GO
72SET QUOTED_IDENTIFIER OFF
73GO
74SET ANSI_NULLS ON
75GO

So all that was required to get this to work, was to call the UDF after it was created ...

view plain print about
1END
2RETURN @output
3END
4
5GO
6SET QUOTED_IDENTIFIER OFF
7GO
8SET ANSI_NULLS ON
9GO
10
11--Insert your call here ... 
12UPDATE TABLENAME 
13SET fieldname=dbo.PROPERCASE(fieldname)
14FROM DBNAME..TABLENAME

Now this saved me a hell of a lot of time and was a very simple and easy way to format the data the way that I wanted. Unfortunately, when I went to repeat the same action for the counties, I accidentally wrote over the city fields with the data in the counties field ... Smooth.

It would really come in handy if something like this could have been done in ColdFusion without having to create a UDF to do so ... maybe the guys over at Adobe will read this and decide that it merits inclusion into the next release.

SEO » SES URL » RegEx Cheat Sheet

Recently I have been going through the fantastic book, Mastering Regular Expressions, by Jeffrey Friedl. Since I first learned the basics of creating a URL re-write in ColdFusion from a buddy that I used to work with, I developed a crazy fascination with Regular Expressions. For the CF developers that are reading this, it may seem like really old news to you, but many of the "SEO" folks will find this to be foreign, (a programmer is laughing right now ...)

So, for the non-code oriented readers, regular expressions are a very powerful and efficient set of tools, methods and commands to manipulate strings of text and data. You might be wondering how that can be of any benefit to the SEO community. I shall attempt to explain.

The first major benefit that regular expressions offer is through SES (Search Engine Safe) URL re-writing. For Instance, let's take a URL that would be considered as "Unsafe" for search engine optimization.

view plain print about
1~ section508.gov/index.cfm?FuseAction=Content&ID=3

Now, I am probably going to catch hell for using this URL as an example, but you have got to love the fact that the web site for Section 508 which regards usability standards, does not use search engine safe URL's. ( Is there anyone screaming 'REMatch' out there? ). There are several characters in dynamic URL's that cause search engine spiders to stop crawling - Question marks, equal signs, ampersands, and colons, are but a few to mention. So, in the example above, we could simply run the URL through a regular expression which, replaces all of the unwanted characters with ones that are search engine safe.

Since this is not a tutorial on ColdFusion's Regular expression functions, I'm only going to show an example of how this URL could be manipulated with a regular expression.

view plain print about
1<cfset dirtyURL = ('#CGI.PATH_INFO# #CGI.QUERY_STRING#')>
2  <cfset fixit = #ReplaceList(dirtyURL, "?,=,&","/,/,/")#>
3  <cfset cleanURL = #ReReplace(fixit,"([[:space:]])","/","ALL")#>
4<cfoutput>#cleanURL#</cfoutput>

So, here we simply store the URL as a string variable, and replace the unsafe characters with desirable ones.

The end result above, would take an unsafe URL, like this ...

view plain print about
1~ section508.gov/index.cfm?FuseAction=Content&ID=3

And return a SES URL like this ...

view plain print about
1~ section508.gov/index.cfm/FuseAction/Content/ID/3

Which, is much better for the search engine spiders to index the content on your site ... and ... "it looks prettier".

So, that is just one of the many powerful things that can be done with regular expressions, and as I learn more about them, I'll be sure to post my discoveries, delights, and not-so-friendly encounters for all to see ... (Oh joy ... )

In the mean time, I have concocted a cool little cheat sheet, based on the one from Dave's IloveJackDaniel's Old site ...

I'm putting it here so that I can remember what the hell all the different Metacharacters in the various flavors of RegEx syntax do.
Feel free to do with it as you will.

» RegEx Cheat Sheet «

Anchors Quantifiers Groups and Ranges
^
\A
$
\Z
\b
\B
\<
\>
Start of string
Start of string
End of string
End of string
Word boundary
Not word boundary
Start of word
End of word
*
+
?
{3}
{3,}
{3,5}
0 or more
1 or more
0 or 1
Exactly 3
3 or more
3, 4 or 5
.
(a|b)
(...)
(?:...)
[abc]
[^abc]
[a-q]
[A-Q]
[0-7]
\n

Any char except new line (\n)
a or b
Group
Passive Group
Range (a or b or c)
Not a or b or c
Letter between a and q
Upper case letter
between A and Q
Digit between 0 and 7
nth group/subpattern

Note: Ranges are inclusive.
Quantifier Modifiers
"x" ~ below represents a quantifier
x? ~ Ungreedy version of "x"
Character Classes Escape Character Pattern Modifiers
\c
\s
\S
\d
\D
\w
\W
\x
\O
Control character
White space
Not white space
Digit
Not digit
Word
Not word
Hexadecimal digit
Octal digit
\ ~ Escape Character g
i
m
s
x
e
U
Global match
Case-insensitive
Multiple lines
Treat string as single line
Allow comments and
white space in pattern
Evaluate replacement
Ungreedy pattern
Metacharacters (must be escaped)
  • ^
    $
    (
    )
    <
  • [
    {
    \
    |
    >
  • .
    *
    +
    ?
POSIX Special Characters String Replacement (Backreferences)
[:upper:]
[:lower:]
[:alpha:]
[:alnum:]
[:digit:]
[:xdigit:]
[:punct:]
[:blank:]
[:space:]
[:cntrl:]
[:graph:]
[:print:]

[:word:]
Upper case letters
Lower case letters
All letters
Digits and letters
Digits
Hexadecimal digits
Punctuation
Space and tab
Blank characters
Control characters
Printed characters
Printed characters and
spaces
Digits, letters and
underscore
\n
\r
\t
\v
\f
\xxx
\xhh
New line
Carriage return
Tab
Vertical tab
Form feed
Octal character xxx
Hex character hh
$n
$2
$1
$`
$'
$+
$&
nth non-passive group
"xyz" in /^(abc(xyz))$/
"xyz" in /^(?:abc)(xyz)$/
Before matched string
After matched string
Last matched string
Entire matched string
Assertions Sample Patterns
?=
?!
?<=
?!= or ? ?>
?()
?()|
?#
Lookahead assertion
Negative lookahead
Lookbehind assertion
Negative lookbehind
Once-only Subexpression
Condition [if then]
Condition [if then else]
Comment
Pattern
([A-Za-z0-9-]+)
(\d{1,2}\/\d{1,2}\/\d{4})
([^\s]+(?=\.(jpg|gif|png))\.\2)
(^[1-9]{1}$|^[1-4]{1}[0-9]{1}$|^50$)
(#?([A-Fa-f0-9]){3}(([A-Fa-f0-9]){3})?)
((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,15})

(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})
(\<(/?[^\>]+)\>)
Will Match
Letters, numbers and hyphens
Date (e.g. 5/3/2008)
jpg, gif or png image
Any number from 1 to 50 inclusive
Valid hexadecimal colour code
String with at least one upper case
letter, one lower case letter, and one
digit (useful for passwords).
Email addresses
HTML Tags
Note: These patterns are intended for reference purposes and have not been
extensively tested. Please use with caution and test thoroughly before use.


Florida SEO Try Catch Application.CFC

Okay, so I am only a year in to CF development now, and I still feeling about as confident with my skills as well, the first month I started ... don't ask me why, but I always seem to find a problem that baffles me. This time is not an exception.

I recently moved to Application.CFC ... (Don't know what that is? Don't worry, I know as much as you. Want to find out more? ... Ray "Raymond" has info on his site ... )

So, this move came about since I had no idea how to manage error handling for 404 pages in CF ... for instance, if a link to a page on my site was missing, or broken ... the 404 page would get returned. However, if someone requested a .cfm page that did not exist whatsoever ... then the "IIS" template would kick in ... Not Good ...

So, I wanted my 404 template to kick in even when someone requested a specific ColdFusion page as well as broken links, moved pages, anything else ...

The only way to get what I really needed ... a default error handler in CF for all pages ... was not going to be available on a shared hosting platform ... which my site is on ... Good thing that ColdFusion 8, has the functionality available by way of the onMissingTemplate function through Application.CFC ...

Now, I saw a few references regarding the cflocation tag ...

view plain print about
1<cffunction name="onMissingTemplate" returnType="boolean" output="false">
2    <cfargument name="thePage" type="string" required="true">
3    <cflog file="somefiles" text="#arguments.thePage#">
4    <cflocation url="404.cfm?thepage=#urlEncodedFormat(arguments.thePage)#" addToken="false">
5</cffunction>

But this was a problem due to redirecting from a 404 page ... The search engines would definitely have a problem with a 404 page returning a "page moved temporarily" or a "page moved permanently" flag when in fact it didn't exist at all ... That would Not be good for the rankings ...

So, the answer it seems was to try a bit of a different solution ... similar, yet a bit different ... here's the next shot ...

view plain print about
1<cffunction name="onMissingTemplate" returnType="boolean" output="true">
2    <cfargument name="targetPage" type="string" required="true" />
3    <cflog file="somefile" type="error" text="Missing template: #Arguments.targetPage#">
4    <cfinclude template="404.cfm" />
5    <cfreturn true />
6</cffunction>

Generally it's not a real smart idea for a newbie coder such as myself to go playing around with really important functions on a production site ... but, then again I can't have problems with 404 pages either ... So, I chanced fate ... and came up with the solution above ...

I also created a custom 404 page which I am rather fond of ... if an event fires my 404 template ... I have an include of my site map so search engine robots can give me a some credit by crawling the sitemap ... and at the same time, I can offer my visitors a useful way to navigate a page that they might have been looking for ...

You have been warned! If, you decide to use a 404 page ... make sure that you don't include it either in your .xml site map ... and that you implement a header status 404 ...

view plain print about
1<cfheader statuscode="404" statustext="Not Found" />

Furthermore, pay attention to your Meta Robots Tag ...

view plain print about
1<meta name="robots" content="noindex, follow" />

If not ... you are basically telling the search engines that your pages exist ... (status 200 » okay ) ... and that will kill your search engine optimization efforts ... fast.

Google Hits Record High » Yahoo! & Live » Fall

In recent news, there were reports that the incumbent search engine Google, reached record highs (again) for the Month of March 08', with an incredible 59.8% of the market share. The data was collected from Hitwise and Compete for the US search stats, and clearly shows that Google is stronger than ever. Not like anyone doubted that, but it's official.

 

The tale of the tape as far as comscore has it, is as follows:

  • Google » 59.8%
  • Yahoo » 21.3%
  • Microsoft  » 9.4%
  • AOL » 4.8%
  • Ask » 4.7%

Regarding market share versus amount of searches per month ...

  • Google » 6.4 billion
  • Yahoo » 2.3 billion
  • Microsoft » 1 billion
  • AOL » 521 million
  • Ask » 503 million

Based on these stats, it's pretty clear to see that Google, is still the search engine that drives the most traffic.

CF 8 Image CAPTCHA » toScript JS Validation

I finally got to the point where I had seen just about as much spam that I could handle and being somewhat of a ColdFusion developer, I decided to take some action ...

My first shot at stopping the pesky spammers was by implementing a Lyla CAPTCHA. However, I had some problems getting the CFC working correctly, and after several failed attempts, I tried to use Rob Gonda's AjaxCFC with Lyla too ... Yet, I still wasn't able to get the CAPTCHA working ...

So, after talking with a friend, that is quite familiar with ColdFusion ... he asked me why I didn't just use CF8's native support for CAPTCHA's with the CF Image tag ...

I really hadn't even thought of it ... I found the answer ...

I learned quite a bit more CF code in order to get the image going along with some JS validation ... For starters, I got the base idea from Camden's example of using CF CAPTCHA ... but I didn't want to break the layout of my form page by expanding the form during validation error messages ... I had to find a way to convert Ray's form validation in to JavaScript validation ...

Well, I searched through hundreds of pages in order to find a solution to my problem ... How to turn ColdFusion variables ... in to JavaScript variables ... I didn't have a clue ... until I found another non-related tutorial example by ... (guess who ...) yep, it's Ray again ... that alluded to the toScript method ... almost everywhere else I had searched, returned answers which expresses that there was no way in converting a ColdFusion object in to a JavaScript object ...

So, I was one step closer to my goal ... then, I hit another obstacle ... the error strings all ended with a "<br />" in order to separate the error strings when returned to the page ... that would not convert in to a JavaScript variable ... New Problem ... how could I insert a line break » Carriage Return in to a ColdFusion variable ... and return it in JavaScript without throwing errors?

Thanks to the friendly Ben Nadel ... for his contributions to the CF community again ... where I found a post of his on converting CF characters to JS ...

So, with a bit of my own efforts some where in there ... I finally have a CF CAPTCHA on my site ... and can say good bye to the spammers ... bye spammers ... 

SEO Fort Lauderdale » Neo Hacked WP Theme

Okay, I recently got a little creative and decided to build a WordPress theme for my fledgling Florida Search Engine Optimization Dot Org ... I'm calling it Neo Hacked.

I got the initial idea to take a shot a customizing my own theme after I was researching an SEO article on the Google PageRank Algorithm by Ian Rogers.

Besides having a brain that will probably all the rage for the medial community once he dies ... Ian has a pretty good taste in design too ... I however, do not have the greatest taste in design ... and I'd be lucky to pass on the four and a half bucks worth of my dead minerals to the benefit of my family.

So, I attempted to develop a Hack out of the original theme that Ian used ... connections 1.0 ...  However, all I managed to do is log about 30 hours of coding practice only to realize that the theme was way too outdated to use as a base for the WordPress platform has sophisticated quite a bit since the initial release of the connections theme ... Take One = Scraped.

Except for the green, I really liked the look and feel of connections, but I needed a more powerful template to work with ... so, I tried to use a couple of Pearson's chops ... The second shot went up with the Cutline theme ... but that didn't work out too well either ... Then I tried to build out the theme with the SandBox ... But, that didn't work out either ... It could have but I honestly didn't want to invest the time that it would take to build an entirely original theme ... I'm a lazy programmer.

End Result? I used the Neo Classical theme as the base template ... and ripped out the CSS and layout styles that were native to connections ... The whole process took me about a week to get right ... but I am happy with it.

Florida SEO - What's in your Search Engine Optimization - SEO Tool kit?

When I first started doing SEO work I used little more than Dream Weaver, Overture, Word and Excel. I went through a fairly intense OJT training where the unspoken, but thoroughly understood realization was ...

If you lagged behind your co-workers, even in the slightest, you had better have a backup job awaiting. 

So, for my first six months as a neophyte SEO specialist, web developer and programmer, I literally worked day and night, to absorb every thing I could about my craft. I probably slept an average of two, to three hours a night during week days, and only a bit longer on the weekends.

After my skills in sharpened  a bit, I began to use more powerful and more productive tools to get my SEO work done. So, out of the hundreds of different applications, services, tools and products that I have used to do SEO work with, I have generated a list of the top ten SEO tools that I use for SEO campaigns.

Number One - Dream Weaver

I have learned how to develop HTML, CSS, JavaScript,  ColdFusion, and PHP, all within this one IDE. Hands down, this is the most productive tool for SEO that I use.

Number Two - The Web Developer Toolbar By: Chris Pederick.

For all of the projects that I work on, I use the Web Developer Toolbar to help me with the common HTML and CSS tasks quite a bit ... Now that I have been using it a while ... I wouldn't want to work without it.

Number Three - Xenu Link Checker

I love reports ... and with Xenu, I can check several important facts about a web site really fast. If there is a problem with redirects, 404's or bad inbound links ... it's really simple to just check out the report after running a scan and get a quick snapshot of the condition of a web site.

Number Four - MS Excel

Now many of you that read this will think that Excel has nothing to do with SEO ... but I use it so much that my life as an SEO would be very difficult without it. I use Excel for so many different SEO tasks that I have set a side a little bit of time each week just to learn more tips and tricks about Excel ...

Number Five - Webconfs Keyword Density Checker

I don't always check the density on the SEO pages that I create but there are times when I feel that a search term or situation calls for attention to the density of the keywords for a project ... Even though I am getting to the point where I can usually just go with my intuition on keyword density ... the keyword density checker at Webconfs is the one I use when I decide to get the numbers.

Number Six - Domain Tools SEO Text Browser

I really like the online SEO Text Browser that domain tools has ... It's gives a very nice depiction of a web site much like one would see if using a regular text only browser such as Lynx, but, without the poor navigation  and ugly user interface you get with most text only browsers ... it even gives you the basic details regarding you Meta Tags ...

Number Seven - Webconfs HTTP Header Checker

This is one tool that I am beginning to rely on more and more ... sometimes when you are unsure of the responses that you are getting back from a site ... it's a good idea to check out what the server response codes are to determine if there are any unseen errors ... this is one very handy tool.

Number Eight - Search Status Extension for Firefox

This is a tool that I only picked up recently but since I added it to my tool kit ... it has become apparent that this is a very cool little feature to have around ... it really comes in handy when I have to get stats on a site quick ... this makes it an invaluable resource for dealing with clients that want answers on the fly. 

Number Nine - SEO Link Analysis Extension for Firefox

This tool is becoming one of my favorites to get info on link data. Joost De Valk has really brought a fantastic extension together to provide link information to SEO's from the interface of Yahoo! ... this is also another tool that can can save a conversation about links from going south ... fast.

Number Ten - Trellian's Keyword Discovery

I left the best for last on this one ... No SEO campaign can be complete without effective and thorough keyword research. Though it is the most time consuming and tedious part of an SEO campaign, SEO's that don't do their homework usually end up with results that reflect just that ... Keyword Discovery proves to offer the most reliable selection of keyword data for the price ...

BlogCFC XML-RPC & Windows Live Writer

I recently decided to take a shot at creating Blog entries to BlogCFC through a desktop publishing application. ScribeFire, is a nice tool that offers the ability to create Blog posts directly to from Firefox. Yet, it lacked quality functionality and support that is required for those that are doing serious publishing. While searching through the ColdFusion Blogging community lately, I  ran across several articles suggesting the use of Google Docs as a method for posting to BlogCFC too. I really didn't  care for that method either.

So I managed to find a reference on Ray Camden's Blog to using Windows Live Writer via XML-RPC.  BlogCFC has been supporting XML-RPC for some time now, so I was eager to start using it after I figured out what it was actually was capable of doing. For those that are not familiar with XML-RPC, it is a specification that allows connections between two computers through remote procedure calls to XML.

The reference on Ray's site was to a demo from Dan Vega, which explains how to get the writer up and running. Several things have to be pointed out though. First, the categories from BlogCFC are not editable from WLR. To edit those, you'll have to go in to the BlogCFC admin. Second, the style sheets from BlogCFC don't seem to import correctly. That doesn't seem to carry over in the post though so personally I can handle dealing with it. Another thing is, deleting posts from within WLR, will remove the entry from the Blog, but not from the xmlrpc.cfm cache or, rather the ScopeCache.cfm template ... in order to deal with that, you might want to add the code below to the xmlrpc.cfm file, just below the blogger.deletePost case switch statement around lines 185-190.

view plain print about
1<!--- clear cache --->
2
3        <cfmodule clearall="true" scope="application" template="../tags/scopecache.cfm">

This way the Blog's cache will update whenever you delete a post ... Much thanks goes out to Shane for that.

All and all, I must admit that editing in WLR is very clean - much nicer than working directly in an online editor, and though WLR does not have the power of a word processor, or the design and HTML editing capabilities of an IDE, it is still a nice tool to use for creating blog posts.

Florida SEO Bringing on Visuals - CFlickr CFC

I recently decided that it was about time to start adding some imagery to my Blog. I am the first person to go to bat for Content being the King on the web, but straight text content can at times be a little boring to look at. So I went on the hunt for a simple way to add life to my blog.

I found an API called CFlickr, that is written in ColdFusion and provides the ability to work with Flickr's REST API. There are some really cool examples of the things that you can do with the API over at SixFive.

CFlickr's developer, (Chris Blackwell), gives some very good examples of how the API can be used to develop dynamic pages through working with the API. He has even gone through the trouble of setting up the CFC's Documentation.

If you haven't ever worked with ColdFusion Components, there are a few things that you have to do to make sure that the component works correctly. If you are in a shared hosting environment, you will have to ask your host to provide a mapping to the directory where CFlickr is under your web root. Make sure you are careful to get the mapping right ... if you aren't ... you will find out really fast.

I'm not going to try to go in to a tutorial on using the API just yet, but if you are interested in learning more about it, you can get more at the CFlickr Site.

Stunned By Beauty - There is a world beyond you

I recently received an email from a very good friend of mine, that included some pictures of the Carnival De Venise 07' ... These images struck me so hard, that I was completely stunned by their beauty.

I live to grow my business and that way of life is alright with me. However, I often find myself missing out on a lot of things.  I justify that it's all good because my work is serving a higher purpose, the support of my children, but still, I find that there has to be something more to living than just working day in and day out ... always chasing the rabbit ...

When I saw the pictures from Carnival De Venise 07', I realized that there is a world beyond me ... not that I didn't think that there wasn't, but I rarely if ever take the time to just enjoy it ...

Stunned By Beauty - There is a World Beyond You

Florida SEO - CakePHP - Ruby on Rails - BarCamp Miami

I went down to Miami with my good friend Mark from A List SEO to BarCamp Miami ... I didn't have tickets to the show I really wanted to be at, the Future of Web Apps, So I figured that at least I could hang out and get to meet some people at BarCamp.

Well, meet people I did ... and a lot of them. I was lucky enough to hang out and eat dinner with Larry Masters, the master mind behind the CakePHP framework. From our talks, I am definitely going to be checking out how I can start reaping the rewards of CakePHP as a rapid application development Framework.

Some of the other great guys that I spoke with were Kevin Marks, a developer advocate from Google ... Edgar Caballero, the senior technology consultant from Altra-App ... Jason Baptiste, CEO of Publictivity ... David Di Cillo, web and print designer with ThirtyNine ... Gary Schulthesis, & Craig Agranoff from Vois ... Sunir Shah from FreshBooks ... Eamon O'Connor from Refraction Films ... Onajide Shabakaka from the Miami Art Exchange ... and many more ...

So, from what I thought was going to be a nice get away turned out to be a networking home run ... some of these guys are making really big moves in the development community ... most notably, is Larry ... if that guys team works on a web application ... you are almost guaranteed that it's going to be rock solid.

Florida SMO A List SEO

While cruising around the Social Media Optimization world recently, I found my way to a very cool blog on SMO and SEM ... if you want to learn some inside info into the world of SMO ... check out A List SEO ... you might learn a little ...

Florida SEO - Omniture Analytics - A Nuke In The Marketing Industry

I was introduced to probably the most powerful analytics software available to date ... Omniture ...

This is without a shadow of a doubt, a weapon that can be equated to that of a nuclear warhead in the search engine marketing professionals arsenal.

To be honest, This really can't be considered an analytics "tool" at all ... this software suite is so powerful that if a skilled optimization firm is using it for their marketing campaigns, you can say with almost absolute certainty that their competitors have a very little chance to come near the performance level that can be delivered from a company that is armed with this software ...

If you want to check out a firm that is lucky enough to afford the incredible price tag ... check out my Mark over at That's My Ad ... But you better be ready to mortgage the house ... Omniture starts at around thirty grand a year ...

SEO Business Elite Business Plus I II III 360 SEO Services

Well it's all in the title folks ... I have unrolled the Search Engine Optimization Packages for Florida Search Engine Optimization LLC. I am fairly optimistic that I will get a good response from the array of services that I have introduced.

To recap what went on in the making of the packages, I wanted to categorize the different levels of SEO performance more so than in regards to quality. I sincerely believe that every customer should receive fair services regardless of the amount that they pay. I know of too many questionable SEO companys out there that don't do anything for customers that don't pay up the big bucks. I'm not going to give away the farm here ... but, I felt that it was only good business practice to create a diverse group of SEO packages to accommodate the company's that are seeking to generate some visibility too.

That is the reason that I came up with the I, II, III & 360 campaigns. There are many Fort Lauderdale, Miami, & West Palm Beach businesses that really don't have the money for a high performance SEO Product like the SEO Business Elite ... or the SEO Business Plus ...

I am really interested to see how prospective clients react to these plans ...

The SEO w Momentum Florida Search Engine Optimization LLC

I recently filed for the articles of incorporation for Florida Search Engine Optimization. Now I have to work double time to make sure that everyone that told me that I should have started the company while working for some one else, will have to take a look at how much there is to benefit from working as an independent.

First: What are the benefits of working on your own?

That's a tough one .... I have actually been working harder since I left my last full-time job. Why? Because I am much happier. The fact is that people produce much better when they are working in an environment that offers rewards. Call me simple, but I like rewards. Who wants to dedicate their heart and soul, blood sweat and tears, day in and day out, for a job, business, or company that has no intention of offering rewards for those sacrifices?

Second: What if you Fail?

In my book there is only one true failure in life. Giving Up.

Let's see what this guy accomplished by not giving up ...

In 1816 this guys family was kicked out of their home and he had to go to work to make sure that they survived ...

A couple of years later, His mother passed away ...

in 1831, He Failed In Business (Did he Boo Hoo ... ?)

The very next year, he tried to run for legislature ... and lost.
Denied ...

Later on that year, He lost his job, tried to get in to a law school
Denied ...

After that wonderful episode he got a loan from one of his buddies to launch a new business ... he went bankrupt by the end of that same year. For the better part of the next two decades, he worked at paying off that debt. (What did he do?)

In 1834 he decided he would have another go at the state legislature ...

ACCEPTED ...

Right after that he got engaged but his girl died ... he was destroyed. Shortly thereafter he went nuts and stayed in bed for half a year.

A few years later he tried to become a legislative speaker ... he was defeated by someone else ...
Denied ...

A couple more years later he wanted to become an elector ... but, he was defeated again ...
Denied ... (Did he Boo Hoo?) So, he decided that maybe it would be a good idea to run for Congress again ...
Denied ...

Then he figured that he should Give It Another Shot ... He was elected in to Congress, went to Washington and did great.

ACCEPTED ...

He tried to get re-elected in to Congress in 1848 ...
Denied ... He tried to take a position as a land officer in his home state in 1849
Denied ...

He tried to get in the US Senate in 1854
Denied ...

He tried to get the nomination for Vice-President at the national convention with his party in 1856.
Denied ... (He only got 100 votes ... )

He tried to run for the US Senate again in 1858 ...
Denied ...

He tried to become the president of the United States in 1860 ...
(After all of those Failures?)

HE WON ... and was one of the greatest presidents the United States has ever known. That guy ... was Abraham Lincoln.

ACCEPTED ...

I think my point is made ...

Third: Are you really going to be able to make it?

Keep checking back ... If I don't ... I could always try running for Congress ...

A Search Engine Optimization Campaign Quick & Dirty

Alright ... well I wrote an article a few weeks ago that has generated some fairly decent response from the folks that have been kind enough to share their opinions about it ... so, I am going to cut it loose here too. Check it out ... A Search Optimization Campaign - Quick & Dirty

SEO Sculpting and Shaping a Silo

I recently took a very daring plunge and reorganized the entire directory structure of my site ... I am going to take quite a hit in PageRank for a while, but in the end I think that it's going to be a vast improvement over the way I had previously set my site up.

There are a few important details regarding the way that a site is set up ... directory structure, visitor traffic flow, and most importantly, the way all of the links are mapped out throughout a web site.

Based on some very serious studies regarding the actual breakdown of PR on my site, I realized that there were some improvements that could be made to dramatically increase the site's potential for higher search engine rankings. That being said ... there is a fantastic report given several years ago from a guy who was way ahead of the pack where he hypothesized the actual distribution of PageRank through several different structures of websites.

The guys name is Ian Rogers ... He's Brilliant. If you want to get a look at the work that he reported on the Google PageRank Algorithm.


It's over here ... The Google Pagerank Algorithm and How It Works check it out ...

Sleepless SEO Going For Broke - Hard Core Search Engine Optimization

I have been working on getting my site up to a condition where I feel that it is acceptable enough to start marketing my services cold. I don't really feel that it is quite there yet. I have put in an all night run working on it and it is now 2:00AM the following day.

I have had some good responses from some people that I hope to start doing some business with. Soon, I will start to assertively market through article promotion and viral media. Coupled with a tele-marketing effort I think that I can remain afloat long enough to bring in some work that will get me back in black.

Hard Core SEO - Sell or Die ...

Lately I have come to the realization that the time has arrived to step up and be counted ... Win, Lose or Draw - No mind ... I have been working as an SEO for quite some time now and the results have been good at the level of commitment that I have given so far.

I need to let everyone that reads my posts know that I enjoy Search Engine Optimization ... I like working in web development ... these fields offer me a great challenge to continually learn and grow - expand my abilities - and enhance my skills in life, education, and trade.

But Search Engine Optimization is not going to be for "fun" anymore. I have a family to support that depends on my success for the betterment of their future. From this point forward, It is time to get Hard Core on SEO. This is business. It is time to treat it as such. As the "Old School" of sales used to say it's Sell or Die from this point on ...

SEO Services or Company - What to Do?

I recently parted ways with my employer over a very trivial dispute. Money. Though I had been instrumental in increasing traffic ~ leads ~ revenues for the company, they did not want to return the favor in the form of compensation, so I left.

I really liked working for my previous employer ... I didn't have to maintain the computers, the web sites, the accounts, payroll - none of that. However, I was not making nearly what I should have been earning from my efforts.

That being said, I am now tolling with the issue of whether I should attempt to keep developing and earning a living through providing Search Optimization Services full-time ... or sign on with an established company as an in-house SEO. To be honest, It's a tough decision.

On one hand - there are usually very little rewards in life without taking risks.
On the other - 9-5 is much easier than 24-7.
Decisions ... Decisions ... What to do ... What to do ...

Search Engine Optimization Keyword Research

Last month I performed a presentation at the South Florida Coldfusion Users Group. Since the presentation, I have received some requests from some of the people that attended regarding portions of the videos that I created.

Though I only touched on the subject, the video that I feel is of most importance, is on keyword research. I cannot stress enough, the importance of performing extensive keyword research prior to creating web pages so, I felt that it would be best to show a quick and dirty way to organize search engine optimization keyword research. (Double-Click to launch in You Tube ... )

If anyone is interested in seeing some of the other videos that I showed at the presentation, post me a comment and I'll grind out another one of the clips. The other movies are about Google Webmaster Tools, Keyword Density, and Building Web Pages for the Search Engines. The last entry, Into the Code, is a bit valuable, so I won't be making that one public ... If you want to see Into the Code, send me a request and we can work something out...

Ajax Framework for ColdFusion

As always, I am looking to expand my knowledge and understanding in Rich Internet Application development. Lately, I have been researching throughout the ColdFusion and Object Oriented communities for a solid framework that will be a good foundation for me to grow and learn in developing Ajaxian applications in a ColdFusion environment.

The first contender for my needs is JQuery. For reasons based on personality as well as principle, the ColdFusion "sensei" in whom I follow, Ben Nadel, seems to use the JQuery framework and I've adopted a tendency to trust his lead. There are several other options available as well that I have not set aside however. The mootools and prototype sets look rather attractive as well. If there are any JavaScript / Ajax pros out there that are familiar with frameworks for ColdFusion please let me know your thoughts.

ColdFusion Components and OO Java - Closely Related - Not the Same

Recently I have been reviewing ColdFusion 8 - Beyond the Basics by David Gassner and I have ventured into the world of ColdFusion Components (CFC's). I am starting to get a better understanding of how ColdFusion, or CFML Pages, are processed in the JRun server and how CFC's relate somewhat to Object Oriented Java. First of all I had to find out that the CFML alone is not related to Java. However, there is an ability in ColdFusion to integrate in a hybrid environment with Java through the use of CFC's.

Since I am very new to CFC's, I will not attempt to explain the complex architecture that is involved in relating ColdFusion to Java, but rather what it is that I came to realize from the Beyond the Basics series and by doing a little research on CFC's and Java.

[More]

Welcome to ColdFusion (Java?) Programming

Nine months ago I started to learn how to program in ColdFusion. At that time, I had never programmed before, but I was holding my torch up high for my quest in learning to be a programmer.

My sights were really set on Java or C ++ to give me the fundamentals that I would need. However, my company is working with ColdFusion, so it just seemed practical to start with a language that I would have the most exposure to, and be able to practice the most.

So, after learning a bit of HTML, CSS and JavaScript, I decided that I should move forward and start learning to learn how to program. Taking the advice of a senior applications developer at my job, I decided that it would be a good idea to build a web site and start coding. Well, I did and now I am well on my way as a beginner and learning more at every opportunity.

Little did I know at the time I started to program, that ColdFusion Markup is basically a very large and organized library of Java programs packaged in a tag based language. Now that I have had some introductory experience with the basics of ColdFusion, I feel that I am ready to start learning some of the advanced aspects of programming and quite possibly look toward earning a certification as a ColdFusion developer.

It may be a real challenge to be working as a manager of a search engine optimization division and studying, learning and practicing for the ColdFusion certified developers exam at the same time. To pull this off, it looks like I am going to put my torch to the test and see if it keeps my midnight oil burning ...

Search Engine Optimization Management

I recently moved into a search engine optimization management position for a national directory of 34 high volume web sites and I'm very grateful that I received the opportunity. The focus in handling a large group of sites like I have, is to allocate a balanced amount of resources so all the sites perform well.

In order to keep up with the workload, I have taken a prioritized approach to managing and scheduling the tasks that are to be performed on a daily, weekly and monthly basis. The schedule is based on a fairly simple concept, yet requires a high degree of organization and drive to keep up with.

To maintain a uniform level of progress between all of the sites, I have divided the tasks in to groups of responsibilities that are either dynamic such as errors and repairs, or fixed such as running news content, keyword research or article writing.

I have also created an excel workbook and inserted a worksheet for every site into the workbook. On the worksheets I have created columns to track the status of each responsibility that needs to be met, and scheduled the amount of time that is required to accomplish each task.

In the interim, I have been running search engine ranking reports on the sites every week to take a snapshot of the current condition of each web site.

Handling the optimization according to priority and based on responsibility classes, seems to keep thing simple, clear, and easily manageable. But the workload ... it just keeps on coming...

Optimizing The ColdFusion SEO Blog

I have got to give credit where credit is due. Blog CFC is very cool. Ray Camden and everyone that has participated in the development of this project have built a very powerful blogging platform. Hats off guys.

There are so many features and components that are part of the core install, that I haven't been able to fully get the most out of this platform just yet. From what I have seen from peeking under the hood of the blog's files, is that there has been a lot of attention given to make the platform search engine friendly and at the same time offer the extensibility of RSS, XML, and yet remain as a dynamically driven blog.

Very soon, I am going to spend some time really getting to know just how much I can optimize this blog for the search engines. This should be a very interesting challenge, and I love a good challenge. Till next time ...

SEO BlogCFC Moves In

This is the greatest... I have been eagerly awaiting the day that I could actually get to put the BlogCFC in to the site ... There were a lot of obstacles to work around to actually get the Blog together. First and foremost was that I had my site hosted at GoDaddy ... I am not much for slinging mud so I'll just try to leave my comment minimal.

If you are looking for ColdFusion hosting ... there are much better alternatives to the shared plan that GoDaddy provides. Do your self a BIG favor ... Keep looking. I'm happy to say that though I have only been with my new host for three days, Host My Site has delivered fantastic customer service thus far.

Next thing on the development list is to start chopping in to the CSS on this blog and see how well I can style the elements to mirror that of my site ... Well, onward to the world of CSS ... untill next time.

BlogCFC was created by Raymond Camden. This blog is running version 5.9.7. Contact Florida Search Engine Optimization L.L.C.
Search Engine Optimization Specialist || Web Designer || Web Developer || Edward J Beckett ||
Search Engine Optimization Company  || SEO Services || Internet Marketing Company || Search Engine Optimization Expert || Florida Search Engine Optimization LLC
Florida Search Engine Optimization || Search Engine Optimization || SEO Services || Florida SEO Blog
Florida Search Engine Optimization
Search Engine Optimization
SEO Services
Florida SEO Blog
May-18-2012
12:13 AM EST