<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>existdissolve.com &#187; Web Development</title>
	<atom:link href="http://existdissolve.com/category/web-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://existdissolve.com</link>
	<description>the singularity of being and nothingness</description>
	<lastBuildDate>Wed, 16 May 2012 12:54:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>I&#8217;m Probably Getting Ready to Dump Firefox</title>
		<link>http://existdissolve.com/2010/08/im-probably-getting-ready-to-dump-firefox/</link>
		<comments>http://existdissolve.com/2010/08/im-probably-getting-ready-to-dump-firefox/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 03:59:54 +0000</pubDate>
		<dc:creator>existdissolve</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://existdissolve.com/?p=1680</guid>
		<description><![CDATA[Anyone who knows me knows that I have long been a big supporter of Firefox.  Back in the day, Firefox was the breath of fresh air in the otherwise olfactory-oppressing wasteland of an IE-dominated interwebs.  Firefox was fast, innovative, and, best of all, let you add stuff on to it. Add cool stuff.  Like Pay-Pal plugins.  Like&#8230;]]></description>
			<content:encoded><![CDATA[<p>Anyone who knows me knows that I have long been a big supporter of Firefox.  Back in the day, Firefox was the breath of fresh air in the otherwise olfactory-oppressing wasteland of an IE-dominated interwebs.  Firefox was fast, innovative, and, best of all, let you add stuff on to it.</p>
<p>Add cool stuff.  Like Pay-Pal plugins.  Like RSS readers.  <a href="http://getfirebug.com/">Like Firebug</a>.</p>
<p>It was the bees&#8217; knees, and looked like it was going to gobble up all the stragglers that IE left in its &#8220;who cares about the experience&#8221; attitude toward the internet.</p>
<p>But then Chrome came along.  It was sleek.  It was fast.  And best of all, it brought some fresher-than-Firefox ideas to browsing.</p>
<p>Better, fresher ideas.  Like tabs-on-top.  Like better architecture for faster&#8230;everything.  Like not-having-to-upgrade-every-2.5-seconds.</p>
<p>So I&#8217;ve been using Chrome alot lately.  Sure, it&#8217;s different.  But what I&#8217;ve found is that it&#8217;s better.  Sure, it doesn&#8217;t have Firebug (which is probably the only reason whatsoever that I continue to use Firefox).  But every version gets better.  And faster.  And awesomer.</p>
<p>And Firefox?  Perhaps its my groaning, Vista-laden PC, but Firefox hates everything.  It&#8217;s slow, it freezes, it crashes&#8230;and very few of the plugins that I depend on for Firefox to be awesome can keep up with the releases.</p>
<p>And the things I&#8217;ve been seeing for v4 are less than impressive.  The other day I <a href="http://www.youtube.com/watch?v=HmgtW2Iw-kE">watched a video</a> on their &#8220;new&#8221; feature for 4&#8211;tabs on top.</p>
<p><strong>Tabs on top. </strong></p>
<p>Hmmm&#8230;where have I seen that before?  Oh yeah, every other browser to update its version in the last 6 months.</p>
<p>Now in all fairness, tabs on top makes sense, and the logic in the video&#8211;IMO&#8211;is pretty well founded.  But it just feels like a lot of far too little and way too late.</p>
<p>Obviously, I&#8217;m going to keep using Firefox in some capacity.  There&#8217;s the perennial issue of cross-browser compatibility that I always have to wrangle for my work, and Firebug still destroys Chrome&#8217;s girly development tools. However, I see our paths steadily diverging, and see little opportunities for them to entwine again.</p>
]]></content:encoded>
			<wfw:commentRss>http://existdissolve.com/2010/08/im-probably-getting-ready-to-dump-firefox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 Server-Sent Events</title>
		<link>http://existdissolve.com/2010/07/html5-server-sent-events/</link>
		<comments>http://existdissolve.com/2010/07/html5-server-sent-events/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 12:38:29 +0000</pubDate>
		<dc:creator>existdissolve</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Push Data]]></category>
		<category><![CDATA[Server-Sent Events]]></category>

		<guid isPermaLink="false">http://existdissolve.wordpress.com/?p=1588</guid>
		<description><![CDATA[A common requirement in the era of Web 2.0 (and beyond) technologies is the ability to have &#8220;smart&#8221; client interfaces that are aware of changes that occur on the server (data, sessions, etc.). Most approaches include some manner of AJAX that regularly polls the server for changes. While this is easy enough to accomplish, it&#8230;]]></description>
			<content:encoded><![CDATA[<p>A common requirement in the era of Web 2.0 (and beyond) technologies is the ability to have &#8220;smart&#8221; client interfaces that are aware of changes that occur on the server (data, sessions, etc.).  Most approaches include some manner of AJAX that regularly polls the server for changes.  While this is easy enough to accomplish, it can be a taxing and somewhat annoying process.  After all, wouldn&#8217;t it be much better if the server could communicate to the client when it has something share, rather than the client mindlessly asking over-and-over-again for the same thing?</p>
<p>In HTML5, this becomes a reality.  Enter Server-Sent Events.  In a nutshell, server-sent events &#8220;<a href="http://dev.w3.org/html5/eventsource/">enable servers to push data to Web pages over HTTP or using   dedicated server-push protocols.</a>&#8221;  This means, basically, that the client doesn&#8217;t have to keep asking for information: the server will notify the client when new information is available.</p>
<p>In it&#8217;s present state, server-sent events are only available for Opera and Chrome (6) dev releases.  Additionally, they are currently implemented in two different ways.  For Opera, the technology utilizes a DOM element  (), while Chrome is entirely JS based.  For this overview, I&#8217;ll be concentrating on the Chrome implementation.</p>
<p>For the example I worked up, <a href="http://singularityconcepts.com/code_samples/serversent/serversent.cfm">I&#8217;ve created a simple chat interface</a>. The basic idea is that two people share usernames, entering them into their respective client interfaces.  When each chat message is sent, the record is saved to a database on the server, and an independent page continues to query the db for new data pertaining to the chat session.  If new data exists, it pushes it to the clients&#8217; interfaces.</p>
<h2>The Code</h2>
<p>So first things first.  Let&#8217;s create our <strong>EventSource</strong>, the base object that we&#8217;ll utilize to make the magic happen:</p>
<pre>serverevent = new EventSource("serversent_helper.cfm");
serverevent.addEventListener('message', onMessageHandler);</pre>
<p>This is easy enough to see what&#8217;s happening.  Basically, I define a new <strong>EventSource</strong>, and pass to it the server-side page that will manage the pushing of data.  Finally, I add a listener to the &#8220;onmessage&#8221; event of the EventSource, which then in turn calls a user-defined function to do whatever with the data from the server (an event object is passed in the callback method).</p>
<p>That&#8217;s it.  Seriously, pretty simple.  From here, the rest is basically getting the data from the server to be in the proper format to work with the EventSource.  And this is where it gets a little murky.  <a href="http://dev.w3.org/html5/eventsource/">Per the spec</a>, the data pushed from the server has to be in a very specific format.  To be honest, I spent more time than I&#8217;d care to admit on this.  But it was a good lesson.</p>
<p>There&#8217;s a lot in the spec about this, so I&#8217;ll only cover the most important details.  This is from <strong>serversent_helper.cfm</strong>, the source specified in the EventSource invocation:</p>
<pre>
           writeoutput("data:"&amp;serializejson(message)&amp;chr(10));
           writeoutput("id:"&amp;qmessages.messageid&amp;chr(10));</pre>
<p>What I&#8217;m not showing you is the queries I used to create and retrieve data from the chat sessions.  Assuming that a chat to be pushed exists, this is the code that generates the data pushed to the client.</p>
<p>First, notice the content declaration of &#8220;<strong>text/event-stream</strong>&#8220;.  This is incredibly important.  If your content is not in this format, the push from the server will not work.</p>
<p>Next, notice the output sections.  Per the spec, data pushed should be in the following format:  &#8220;data:  [string]&#8220;.  It is the combination of &#8220;data:&#8221; and an accompanying string that makes the push work.  Without it, nothing will happen.  Following the &#8220;data:&#8221; declaration, I&#8217;ve also set &#8220;id:&#8221;.  This is important because you can optionally tag each push with an id which will then be subsequently passed as a header in future interactions between the client and server.  Specifically, the header &#8220;Last-Event-ID&#8221; will be used, so if a connection is lost, the last-used id can be processed when the connection is restored, picking up where it left off.</p>
<p>Finally, notice the newline characters at the end of each line (&#8220;chr(10)&#8221; in ColdFusion, &#8220;\n&#8221; in other languages).  This is EXTREMELY important because the &#8220;field names&#8221; of the response are processed on the basis of the newline characters.  In this example, if I did not put the newline character after the &#8220;data&#8221; block, my response would look like <strong>{&#8230;jsonstring&#8230;}id:numeric</strong>, rather than just <strong>{&#8230;jsonstring&#8230;}</strong>.  Additionally, the Last-Event-ID would not get set.</p>
<p>And yes, you can use JSON, so not problems at all pushing complex data objects <img src='http://existdissolve.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Additional Methods and Considerations</h2>
<p>I didn&#8217;t use these in my demo, but thought I&#8217;d point them out anyway.  Besides the &#8220;onmessage&#8221; event, you can also add listeners to the following exposed events from EventSource:</p>
<ol>
<li><strong>onopen</strong> &#8211; fires when connection between server and client is created</li>
<li><strong>onerror</strong> &#8211; fires when there&#8217;s an error in the connection</li>
</ol>
<p>And in addition to the url and Last-Event-ID, the <strong>readyState</strong> attribute is available from EventSource.  As its name implies, readyState represents the current state of the connection, and can take the following values:</p>
<ol>
<li><strong>CONNECTING</strong> = 0</li>
<li><strong>OPEN</strong> = 1</li>
<li><strong>CLOSED</strong> = 2</li>
</ol>
<h2>Wrapping Up</h2>
<p>As mentioned earlier, because of the relative newness of EventSource, its implementation is severely limited.  However, I think it is a pretty cool idea and I can think of lots of potential uses for this, specifically in relation to connection-less data pushing.  I&#8217;m excited to see how this develops as the spec is more well-defined and more browsers begin to implement it.</p>
<p><a href="http://singularityconcepts.com/code_samples/serversent/serversent.cfm">A note about the demo</a>.  It definitely works, but there are a few things to keep in mind:</p>
<ol>
<li>It will ONLY work with the <a href="http://www.chromium.org/getting-involved/dev-channel">latest dev version of Chrome (v. 6)</a>.  If you try it in any other browser, it will be quite disappointing <img src='http://existdissolve.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Because it&#8217;s just a quick demo, you&#8217;ll have to arrange a chat with someone with the same dev version of Chrome, and you&#8217;ll have to coordinate the usernames that you&#8217;ll use to try it out, given that the chat sessions are based on user-entered names</li>
<li>Sure, I could have made a static example&#8230;but I thought the chat would show off the tech a bit more&#8230;so sue me!!!</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://existdissolve.com/2010/07/html5-server-sent-events/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML5(ish) Notifications</title>
		<link>http://existdissolve.com/2010/07/html5ish-notifications/</link>
		<comments>http://existdissolve.com/2010/07/html5ish-notifications/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 17:16:34 +0000</pubDate>
		<dc:creator>existdissolve</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Notifications]]></category>
		<category><![CDATA[Webkit Notifications]]></category>

		<guid isPermaLink="false">http://existdissolve.wordpress.com/?p=1580</guid>
		<description><![CDATA[Something that&#8217;s coming down the pike pretty soon in tandem with HTML5 is the related, but independent W3C draft of a &#8220;Notifications&#8221; interface.  Basically, this new interface provides a way for the browser to send notification messages on your desktop or device.  So as example, while Facebook Chat will currently use AJAX to update the&#8230;]]></description>
			<content:encoded><![CDATA[<p>Something that&#8217;s coming down the pike pretty soon in tandem with HTML5 is the related, but independent <a href="http://dev.w3.org/2006/webapi/WebNotifications/publish/">W3C draft of a &#8220;Notifications&#8221; interface</a>.  Basically, this new interface provides a way for the browser to send notification messages on your desktop or device.  So as example, while Facebook Chat will currently use AJAX to update the content on the browser page (causing the annoying tab &#8220;flicker&#8221; when a new message arrives), using the Notifications interface will allow a browser-independent message to be displayed directly on your desktop.</p>
<p>As with the other items we&#8217;ve been exploring in our look at HTML5-related technologies, Notifications are really easy to work with.  A word of warning, however.  Right now, this is only implemented in <a href="http://www.google.com/chrome/">Chrome</a>, and the W3C spec is itself based upon a <a href="http://www.chromium.org/developers/design-documents/desktop-notifications/api-specification">webkit-specific API</a>.  So in order to make these work right now, you have to use the Chromium API, not the W3C spec.  The fundamental principles are precisely the same (since the latter is based on the former), but has some minor differences.</p>
<p>So now for the <a href="http://singularityconcepts.com/code_samples/notification/notification.cfm">obligatory example</a>&#8211;let&#8217;s get my (or someone else&#8217;s&#8230;) most recent <a href="http://twitter.com/existdissolve">Twitter post</a> and display a notification.</p>
<p>First, let&#8217;s create a reference to the Notifications object:</p>
<pre>var notification = window.webkitNotifications;</pre>
<p>(Notice the &#8220;webkit&#8221; syntax)</p>
<p>Now that we have a reference to our Notifications interface, let&#8217;s handle the entering and submitting of a Twitter username:</p>
<pre>function SetNotification() {
     var username = Ext.get('twitterusername').getValue();
     if(username=='') {
          Ext.Msg.alert('Attention!','Please enter a Twitter username');
          return false;
     }
     if(notification.checkPermission()==0) {
          GetTwitterData();
     }
     else {
          notification.requestPermission(PermissionDelegate);
     }
}</pre>
<p>A few things to point out here.  First, as part of the spec, the user has to grant permissions to the service to create Notifications.  Before we actually handle the requesting of permissions, we can check if permissions already exist by invoking the <strong>checkPermission()</strong> method.  This will return three possible values:</p>
<ol>
<li>PERMISSION_ALLOWED = 0;</li>
<li>PERMISSION_NOT_ALLOWED = 1;</li>
<li>PERMISSION_DENIED = 2;</li>
</ol>
<p>To me, the numbering is a bit counter-intuitive (0 == allowed?), but it&#8217;s easy enough to work with.</p>
<p>So if we&#8217;ve already obtained permissions, we simply call our main function for retrieving Twitter data.  If permissions do not exist, however, we invoke the <strong>requestPermission()</strong> method.  This will create a browser prompt, and the user can either Allow or Deny permissions for Notifications.  requestPermission() takes one argument: a callback function.  This can be invoked to handle post-permission granting/denying.  In this example, the callback is PermissionDelegate():</p>
<pre>function PermissionDelegate() {    �
     // if permissions have been granted (checkpermission()==0), proceed; otherwise, show error message and cancel operation�
     if(notification.checkPermission()==0) {
          GetTwitterData();
     }
     else {
          Ext.Msg.alert('Notice','To receive notifications from this application, please grant permissions when prompted.&lt;br /&gt;&lt;br /&gt;Please try again.');
     }
}</pre>
<p>Simple enough.  If the user grants permissions (checkPermission()==0), we continue with the processing.  If not, we display an error message and suggest that the users tries the operation again.</p>
<p>So on with the example.  I won&#8217;t bore you with the process of getting the Twitter post.  If you want, you can check the source code, but it boils down to the <a href="http://remysharp.com/2007/10/08/what-is-jsonp/comment-page-1/">nifty JSONP hack</a>&#8230;</p>
<p>Now that we&#8217;ve been granted permission to create Notifications, and finally have the Twitter data, let&#8217;s create a notification!</p>
<pre>function TweetSuccess(req) {
     if(req.length) {
          var type = Ext.getCmp('radiogroup').getValue().value;
          var img     = req[0].user.profile_image_url;
          var name    = req[0].user.screen_name;
          var tweet    = req[0].text;
          if(type==1) {
               var tweet    = tweet.parseURL().parseUsername().parseHashtag();
               notification.createHTMLNotification("notification_helper.cfm?title="+name+"&amp;img="+img+"&amp;content="+tweet).show();
          }
          else {
               notification.createNotification(img,name,tweet).show();
          }
      }
      else {
           Ext.Msg.alert('Uh-oh','Sorry, that\'s not a valid Twitter username. Please try again!');
           return false;
      }
}</pre>
<p>Most of this function is just getting the values from the returned data, so we&#8217;ll skip to the important stuff: <strong>createNotification()</strong> and <strong>createHTMLNotification()</strong>.</p>
<p>Why two methods?  Well, each provides a little bit different way of displaying notifications, of course! <img src='http://existdissolve.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>createNotification() </strong>creates a standard, vanilla notification that inherits whatever styles the browser has defined for its notifications.  This method takes three arguments:</p>
<ol>
<li>iconUrl &#8211; This is the path (absolute) of the icon that you would like displayed in the notification</li>
<li>title &#8211; Um, the title of the notification <img src='http://existdissolve.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>body -  The main content to be displayed in the notification.</li>
</ol>
<p>While this works pretty nicely, I wasn&#8217;t thrilled with the look of the notification.  And although I didn&#8217;t pursue it very far, I couldn&#8217;t get links or any other styling to show up in the notification.</p>
<p><strong>createHTMLNotifications()</strong> picks up where createNotification() falls short in the customization department.  Whereas you pass icons, titles, and body content to createNotification(), you simply pass a url to a page that defines your notification content for createHTMLNotifications().  While this creates a bit more work for arranging icons, titles, and body content, it does allow you to be a bit more creative in how the notifications look.  Plus, since it&#8217;s an HTML notification, you can use some nifty CSS3, and who doesn&#8217;t love that!</p>
<h2>Wrapping Up</h2>
<p>There&#8217;s a bunch more to Notifications that I didn&#8217;t cover (like closing them programmatically, etc.), but hopefully this is a nice introduction to the concepts behind what will hopefully be embraced by all browsers in the very near future.  I see a lot of promise to these, and can&#8217;t wait until all the environments are more unified to start utilizing them to their full potential.</p>
<p>As always, be sure to <a href="http://singularityconcepts.com/code_samples/notification/notification.cfm">check out the demo</a> (remember, Chrome only <img src='http://existdissolve.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) and let me know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://existdissolve.com/2010/07/html5ish-notifications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Add an MP3 Player to EasyBe</title>
		<link>http://existdissolve.com/2010/05/add-an-mp3-player-to-easybe/</link>
		<comments>http://existdissolve.com/2010/05/add-an-mp3-player-to-easybe/#comments</comments>
		<pubDate>Sat, 29 May 2010 09:42:53 +0000</pubDate>
		<dc:creator>existdissolve</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[EasyBe]]></category>
		<category><![CDATA[MP3]]></category>

		<guid isPermaLink="false">http://existdissolvetest.wordpress.com/2010/05/29/add-an-mp3-player-to-easybe</guid>
		<description><![CDATA[I recently worked on a project which, among other things, involved implementing the &#34;easybe 1-2-3&#34; music store software (basically, it&#039;s a pretty simple-to-use platform for managing for-sale music downloads). One of the major drawbacks of this software is that it doesn&#039;t come pre-built with a music player.&#160; While it does provide links to file samples&#8230;]]></description>
			<content:encoded><![CDATA[<p>I recently worked on a project which, among other things, involved implementing the &quot;<a href="http://easybe.com/">easybe 1-2-3</a>&quot; music store software (basically, it&#039;s a pretty simple-to-use platform for managing for-sale music downloads).</p>
<p>One of the major drawbacks of this software is that it doesn&#039;t come pre-built with a music player.&nbsp; While it does provide links to file samples that users can download and listen to (way too many steps for 30 seconds&#8230;), there&#039;s no one-step player for checking out clips from all the songs on an album. &nbsp;</p>
<p>No fear!&nbsp; There are ways around this, and in the following I&#039;ll walk you through the simple steps to deploy a free, light-weight mp3 player that can play the music you want your visitors to hear.</p>
<p>First, let&#039;s get the mp3 player.&nbsp; While you could use many of the freely-available mp3 players out there, I like the one from <a href="http://premiumbeat.com">premiumbeat.com</a>.&nbsp; It&#039;s super-stipped down and simple to use.&nbsp; Plus, it accepts an XML file, which will work perfectly for our needs.</p>
<p>Once you have the mp3 player of your choice, go ahead and deploy it on your server.&nbsp; Don&#039;t worry, I&#039;ll wait until you&#039;re done.</p>
<p>All set?&nbsp; Excellent.&nbsp; The next step is to open up the Album Details template file in easybe.&nbsp; It&#039;s in the 123-music-shop/templates/shop/ directory, named something like &quot;albumdetails.tpl&quot;.&nbsp; Why this page?&nbsp; Well, when this page is active, certain data is exposed via PHP that we can access and pass on to other pages that we&#039;ll need to modify.&nbsp; So for example, on the album details page, an object named &quot;Album&quot; is available, and from this we can access the &quot;id&quot; value, which identifies our album in the database.&nbsp; (NOTE: I&#039;m not sure this is documented.&nbsp; I found it out simply by playing around and making good guesses!)</p>
<p>So here&#039;s what we&#039;ll add to the &quot;albumdetails.tpl&quot; page:</p>
<p>&lt;script type=&quot;text/javascript&quot; src=&quot;swfobject.js&quot;&gt;&lt;/script&gt;<br />&lt;div id=&quot;flashPlayer&quot;&gt;<br />&nbsp; This text will be replaced by the flash music player.<br />&lt;/div&gt;<br />&lt;script type=&quot;text/javascript&quot;&gt;<br />&nbsp;&nbsp; var so = new SWFObject(&quot;playerMultipleList.swf&quot;, &quot;mymovie&quot;, &quot;295&quot;, &quot;160&quot;, &quot;7&quot;, &quot;#FFFFFF&quot;); &nbsp;<br />&nbsp;&nbsp; so.addVariable(&quot;autoPlay&quot;,&quot;no&quot;)<br />&nbsp;&nbsp; so.addVariable(&quot;playlistPath&quot;,&quot;playlist.php?albumid={$Album.id}&quot;)<br />&nbsp;&nbsp; so.addVariable(&quot;playerSkin&quot;,&quot;2&quot;)<br />&nbsp;&nbsp; so.write(&quot;flashPlayer&quot;);<br />&lt;/script&gt;</p>
<p>Pretty simple.&nbsp; Basically, we simply initialize the mp3 player (the one from premiumbeats.com, in this instance), passing a dynamic path in our playlistPath variable.&nbsp; Notice that I&#039;m passing {$Album.id} &#8212; this is id of the album I mentioned before that is exposed.</p>
<p>Ok, so we&#039;re almost there!&nbsp; All that&#039;s left now is to generate the XML that will build our playlist and feed the mp3 player.</p>
<p>Now go ahead an open up a new file.&nbsp; I creatively named mine &quot;playlist.php&quot;, but feel free to be more generic if it suits you <img src='http://existdissolve.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>In this file, we need to do a couple things.&nbsp; First, we need to evaluate the &quot;albumid&quot; that we pass through the URL query string.&nbsp; Next, we need to query the database to get all the songs for the albumid that we&#039;ve passed.&nbsp; And finally, we need to generate some XML that the mp3 can understand.</p>
<p>(I&#039;m going to assume you know how to set up your database connection in PHP, and hopefully you also know how to parse out the query string.&nbsp; WIth that assumption, let&#039;s move on to the database query.)</p>
<p>So one of the odd things about easybe is their db structure.&nbsp; Rather than storing info about albums, songs, etc. in a flat, relational way, they store the data in an almost key-value pair (or trio or quad&#8230;) manner.&nbsp; While not impossible to work with, it can make getting at the data a little less that straightforward if you&#039;re not used to seeing this kind of thing. </p>
<p>For example, 1 song in the &quot;productav&quot; table spans at least 7 rows, producing a structure like this:</p>
<p><strong>ID&nbsp;&nbsp; &nbsp;Name&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ord&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Value</strong><br />1 &nbsp;&nbsp;&nbsp; artist &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL &nbsp;&nbsp;&nbsp; Seth Condrey<br />1 &nbsp;&nbsp; &nbsp;title &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; NULL &nbsp;&nbsp; &nbsp;Jesus Paid It All<br />1 &nbsp;&nbsp; &nbsp;running_time &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; NULL &nbsp;&nbsp; &nbsp;5:17<br />1 &nbsp;&nbsp; &nbsp;free_download &nbsp;&nbsp; &nbsp; NULL &nbsp;&nbsp; &nbsp;true<br />1 &nbsp;&nbsp; &nbsp;song_file_name &nbsp;&nbsp; NULL &nbsp;&nbsp; &nbsp;Jesus Paid It All_1.mp3<br />1 &nbsp;&nbsp; &nbsp;demo_file_name &nbsp; NULL &nbsp;&nbsp; &nbsp;Jesus Paid It All 30sec_1.mp3<br />1 &nbsp;&nbsp; &nbsp;single &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL &nbsp;&nbsp; &nbsp;yes</p>
<p>Obviously, a regular relational approach will not serve your queries very well!&nbsp; Of course, there are several ways to accomplish the desired result, but here&#039;s the final query that I arrived at:</p>
<p>select &nbsp;&nbsp; &nbsp;p.id,<br />&nbsp;&nbsp; &nbsp;(select value from productav pv where name = &#039;artist&#039; and pv.productid = p.id limit 1) as artist,<br />&nbsp;&nbsp; &nbsp;(select value from productav pv where name = &#039;title&#039; and pv.productid = p.id&nbsp; limit 1) as title,<br />&nbsp;&nbsp; &nbsp;(select value from productav pv where name = &#039;demo_file_name&#039; and pv.productid = p.id&nbsp; limit 1) as path<br />from product p<br />join bundleproductasm b on p.id = b.productid<br />where bundleid = $albumid<br />order by childorder<br />&nbsp;<br />The most interesting thing to note here is the use of the subqueries in the select statement.&nbsp; If you&#039;re not familiar with this approach, what I&#039;m doing is to basically create a faux column of data, based on the results of another query within the scope of the currently executed statement. In other words, I can take the 7 or so rows from the productav table and flip them into a structure that I can actually use.</p>
<p>Ok, so much for mySQL.&nbsp; Now our last step is to write the PHP code that will produce the XML.&nbsp; What follows is a very limited approach: you may want to try something a little more robust if you have more extensive needs:</p>
<p>&lt;?php<br />&nbsp;&nbsp; &nbsp;// Send the headers<br />&nbsp;&nbsp; &nbsp;header(&#039;Content-type: text/xml&#039;);<br />&nbsp;&nbsp; &nbsp;header(&#039;Pragma: public&#039;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;header(&#039;Cache-control: private&#039;);<br />&nbsp;&nbsp; &nbsp;header(&#039;Expires: -1&#039;);<br />?&gt;<br />&lt;?php echo(&#039;&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&#039;); ?&gt;<br />&lt;xml&gt;<br />&lt;?php if ($count &gt; 0): ?&gt;<br />&nbsp;&nbsp; &nbsp;&lt;?php while($row=mysql_fetch_array($rsongs)): ?&gt;<br />&nbsp;&nbsp; &nbsp;&lt;track&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;path&gt;public/demos/&lt;?php echo $row[&#039;path&#039;]?&gt;&lt;/path&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;title&gt;&lt;?php echo $row[&#039;title&#039;]?&gt; &#8211; &lt;?php echo $row[&#039;artist&#039;]?&gt;&lt;/title&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/track&gt;<br />&nbsp;&nbsp; &nbsp;&lt;?php endwhile; ?&gt;<br />&lt;?<br />
ph<br />
p endif; ?&gt;<br />&lt;/xml&gt;</p>
<p>N<br />
othing even worth pointing out here.&nbsp; A simple loop of the data, and we have some nice XML to spit back at our mp3 player.</p>
<p>And that&#039;s about it.&nbsp; Even though easybe is pretty limited OOTB, it is easily hackable, so adding on some nice little touches here and there are relatively easy and make for a much better product when it&#039;s all said and done.</p>
]]></content:encoded>
			<wfw:commentRss>http://existdissolve.com/2010/05/add-an-mp3-player-to-easybe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick connectionString Epiphany</title>
		<link>http://existdissolve.com/2010/05/quick-connectionstring-epiphany/</link>
		<comments>http://existdissolve.com/2010/05/quick-connectionstring-epiphany/#comments</comments>
		<pubDate>Fri, 14 May 2010 08:47:29 +0000</pubDate>
		<dc:creator>existdissolve</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[connectionString]]></category>
		<category><![CDATA[SQL Server 2005]]></category>

		<guid isPermaLink="false">http://existdissolvetest.wordpress.com/2010/05/14/quick-connectionstring-epiphany</guid>
		<description><![CDATA[Ok, if you&#039;re like me and aren&#039;t the smartest cookie in the jar, something like specifying a connectionString in a web.config file can be maddening.&#160; Of course, it doesn&#039;t help that there are literally 123 billion possible ways to do a connection string&#8230;but I digress. While searching for an answer, I ran across a pretty&#8230;]]></description>
			<content:encoded><![CDATA[<p>Ok, if you&#039;re like me and aren&#039;t the smartest cookie in the jar, something like specifying a connectionString in a web.config file can be maddening.&nbsp; Of course, it doesn&#039;t help that there are literally 123 billion possible ways to do a connection string&#8230;but I digress.</p>
<p>While searching for an answer, I ran across a pretty neat little technique that will make the development of your connection string quite painless.</p>
<p>First, open Explorer, and create a new file. Now, rename the file to <strong>X.UDL</strong>. Double-clicking this file will open up a <strong>Data Link Properties</strong> dialog window.</p>
<p>The super nifty thing about the DLP is that you can actually create a full-on connection to a datasource, and test out various settings.&nbsp; Nice.</p>
<p>But the really beneficial part (well, besides verifying that, yes, this particular service account does, in fact, have access to SQL Server&#8230;) is the &quot;All&quot; tab.&nbsp; Here, you&#039;ll see all of the properties of your connection.&nbsp; While nice information, this is super sweet because these properties are precisely the parameters that you need to enter into your web.config connection string in order to make SQL Server happy.&nbsp; That&#039;s awesome, and a huge time saver if building connection strings isn&#039;t something that you do on a routine basis <img src='http://existdissolve.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://existdissolve.com/2010/05/quick-connectionstring-epiphany/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interesting XSLT Gotcha</title>
		<link>http://existdissolve.com/2009/10/interesting-xslt-gotcha/</link>
		<comments>http://existdissolve.com/2009/10/interesting-xslt-gotcha/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 15:26:23 +0000</pubDate>
		<dc:creator>existdissolve</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Stupid]]></category>
		<category><![CDATA[XSLT]]></category>

		<guid isPermaLink="false">http://existdissolvetest.wordpress.com/2009/10/08/interesting-xslt-gotcha</guid>
		<description><![CDATA[Today, I got around to trying to tackle some of the XHTML validation errors we&#039;ve been receiving on our sites at work.&#160; One of the peskiest errors was what appeared to be a simple unclosed &#60;img&#62; tag&#8211;easy to fix, right?&#160; Well, I promptly navigated to the xslt file, opened it up, and quickly found the&#8230;]]></description>
			<content:encoded><![CDATA[<p>Today, I got around to trying to tackle some of the XHTML validation errors we&#039;ve been receiving on our sites at work.&nbsp; One of the peskiest errors was what appeared to be a simple unclosed &lt;img&gt; tag&#8211;easy to fix, right?&nbsp; Well, I promptly navigated to the xslt file, opened it up, and quickly found the offending tag.&nbsp; </p>
<p>&#8230;</p>
<p>&#8230;it was already closed.</p>
<p>&#8230;</p>
<p>&#8230;hmmm&#8230;</p>
<p>Honestly, I couldn&#039;t figure out what was going on.&nbsp; Just to make sure, I recopied the most recent, seemingly correct version.&nbsp; </p>
<p>No change.&nbsp; </p>
<p>I went back to the file, made ABSOLUTELY sure that the tag was closed and that there were no weird quotes floating around.</p>
<p>No change.</p>
<p>By now, I was desperate.&nbsp; I even started commenting out random bits of code around the &lt;img&gt; tag until I was POSITIVE that nothing else was causing this issue.</p>
<p>No change.</p>
<p>Blurg.</p>
<p>Well, it turns out the fix is pretty easy, and it all has to do with the &quot;method&quot; attribute of the &lt;xsl:output&gt; directive.&nbsp; On my xslt file (which I did not create, BTW), the method was set to &quot;HTML&quot; like so:</p>
<p>&lt;xsl:output method=&quot;HTML&quot; &#8230;./&gt;</p>
<p>For whatever reason, this method of output can do funky things like remove the self-closing parts of tags.&nbsp; Dumb.</p>
<p>Anyway, I simply switched the output method to XML and it resolved the issue.&nbsp; Not only that, but it knocked out about 10 other validation errors that I hadn&#039;t even started looking at yet.&nbsp; Woot!</p>
<p>So if you&#039;re interested in learning more about this xsl:output nonsense, be sure to check out the <a href="http://www.w3.org/TR/xslt">W3C definition</a>&#8230;it&#039;s a riveting read, but does&#8211;at least&#8211;provide the right answer <img src='http://existdissolve.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://existdissolve.com/2009/10/interesting-xslt-gotcha/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Falling in Love with Aptana</title>
		<link>http://existdissolve.com/2009/05/falling-in-love-with-aptana/</link>
		<comments>http://existdissolve.com/2009/05/falling-in-love-with-aptana/#comments</comments>
		<pubDate>Sun, 17 May 2009 14:17:05 +0000</pubDate>
		<dc:creator>existdissolve</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Aptana]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://existdissolvetest.wordpress.com/2009/05/17/falling-in-love-with-aptana</guid>
		<description><![CDATA[Yeah, so I&#039;m really dumb.&#160; For a long time, I&#039;ve used DreamWeaver pretty much exclusively as an IDE for my web projects.&#160; There&#039;s something that makes sense here, as it has pretty good HTML and CSS features, and some limited ColdFusion and XML niceties.&#160; However, it is the suck when it comes to JavaScript editing.&#8230;]]></description>
			<content:encoded><![CDATA[<p><img src="/Users/Joel/AppData/Local/Temp/moz-screenshot.jpg" alt="" /><img src="/Users/Joel/AppData/Local/Temp/moz-screenshot-1.jpg" alt="" />Yeah, so I&#039;m really dumb.&nbsp; For a long time, I&#039;ve used DreamWeaver pretty much exclusively as an IDE for my web projects.&nbsp; There&#039;s something that makes sense here, as it has pretty good HTML and CSS features, and some limited ColdFusion and XML niceties.&nbsp; However, it is the suck when it comes to JavaScript editing.</p>
<p>Today I discovered <a href="http://www.aptana.com/">Aptana</a>.&nbsp; Of course, I&#039;ve used Aptana before&#8230;by used, I mean, of course, that I downloaded the free version and played around with it (especially the built in AIR support).&nbsp; However, I had never really used it to modify JavaScript.</p>
<p>Well, there is a new love in my life!&nbsp; Aptana is smart enough to take my JavaScript, spaghetti-code as it is, and self-document all of the functions and variables that I have set.&nbsp; They may not seem like a big deal, but when you have several hundreds of lines of JS code with inline comments, it can be a big pain to scroll around trying to find this or that. &nbsp;</p>
<p>With Aptana, this kind of stone-age button pecking is over.&nbsp; Aptana has a nice, built-in &quot;Outline&quot; toolbar that helpfully shows all of the functions in the selected file, along with any declared variables.&nbsp; Plus, each function and variable is linked so that you can quickly and easily jump to the appropriate function/variable in an instant. &nbsp;</p>
<p>Yes, so I am a noob to be just now figuring this out.&nbsp; But you have to admit, it&#039;s pretty flippin&#039; cool <img src='http://existdissolve.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://existdissolve.com/2009/05/falling-in-love-with-aptana/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Little Off Subject…</title>
		<link>http://existdissolve.com/2008/08/a-little-off-subject/</link>
		<comments>http://existdissolve.com/2008/08/a-little-off-subject/#comments</comments>
		<pubDate>Sat, 30 Aug 2008 16:07:24 +0000</pubDate>
		<dc:creator>existdissolve</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Dork]]></category>
		<category><![CDATA[XHTML Validation]]></category>

		<guid isPermaLink="false">http://existdissolvetest.wordpress.com/2008/08/30/a-little-off-subject</guid>
		<description><![CDATA[So a coworker and I are always talking about code.&#160; Not terribly interesting (especially for people who aren&#039;t in the biz&#8230;), but sometimes we make ourselves laugh.&#160; Yes, I know.&#160; I am a huge nerd for finding conversations about code to be funny&#8230; &#160; But anyway, the other day we were talking about XHTML validation&#8230;]]></description>
			<content:encoded><![CDATA[<p>So a coworker and I are always talking about code.&nbsp; Not terribly interesting (especially for people who aren&#039;t in the biz&#8230;), but sometimes we make ourselves laugh.&nbsp; Yes, I know.&nbsp; I am a huge nerd for finding conversations about code to be funny&#8230;</p>
<p>&nbsp;</p>
<p>But anyway, the other day we were talking about XHTML validation (you&#039;re welcome to start sleeping about right now, if you wish) and how validation fails if there are markup tags that are not &quot;closed&quot; (e.g., a &quot;div&quot; tag that hold an image, text, etc. needs to have a &quot;closing&quot; tag to tell the browser what it&#039;s dealing with).&nbsp; </p>
<p>&nbsp;</p>
<p>Somehow, the comment was made that life feels like failed XHTML validation&#8211;replete with open &quot;tags&quot; of disappointment that never close&#8230;</p>
<p>&nbsp;</p>
<p>Boy, I made myself bored just writing this.&nbsp; Appartently my line of work is dorky and lame.&nbsp; Oh well. &nbsp;&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://existdissolve.com/2008/08/a-little-off-subject/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick Look at ScrnShots&#039; API</title>
		<link>http://existdissolve.com/2008/06/quick-look-at-scrnshots-api/</link>
		<comments>http://existdissolve.com/2008/06/quick-look-at-scrnshots-api/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 21:36:12 +0000</pubDate>
		<dc:creator>existdissolve</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[ScrnShots]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://existdissolvetest.wordpress.com/2008/06/04/quick-look-at-scrnshots-api</guid>
		<description><![CDATA[A few months ago, I ran across ScrnShots. It&#039;s basically a service for uploading, tagging and sharing screenshots of websites. This is pretty useful for me given my profession . One of the things, however, that has always impressed me about the site is how easy and fun to use it is. It features really&#8230;]]></description>
			<content:encoded><![CDATA[<p>A few months ago, I ran across <a href="http://scrnshots.com/">ScrnShots</a>.  It&#039;s basically a service for uploading, tagging and sharing screenshots of websites.  This is pretty useful for me given my profession <img src='http://existdissolve.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .  </p>
<p>One of the things, however, that has always impressed me about the site is how easy and fun to use it is.  It features really deep networking capabilities, the tagging is pretty robust, and everything is fast, fast, fast!</p>
<p>Of course, while uploading from the site is easy, I&#039;ve been waiting with baited breath for them to release an API.  Well, recently this happened, and I couldn&#039;t be more excited!</p>
<p>The API is alot like Twitter&#039;s in that it uses Basic Authentication for user-specific http calls.  While not the most secure form of authentication, it is ridiculously easy, especially if you&#039;re using ColdFusion whose cfhttp tag has a built in mechanism for managing it.</p>
<p>So tonight, I spent a couple minutes digging into the API, and came away with an easy function for uploading, tagging and providing a description and link for an image.   And of course, if you&#039;re using ColdFusion, it&#039;s cake!</p>
<p>Here it is:</p>
<pre>&lt;cfhttp url=&quot;<a href="http://www.scrnshots.com/screenshots.xml" target="_blank">http://www.scrnshots.com/screenshots.xml</a>&quot; method=&quot;POST&quot; charset=&quot;utf-8&quot; username=&quot;existdissolve&quot; password=&quot;password&quot; multipart=&quot;yes&quot;&gt; &nbsp;&nbsp;&nbsp; &lt;cfhttpparam name=&quot;enctype&quot; type=&quot;header&quot; value=&quot;multipart/form-data&quot;&gt;&nbsp;&nbsp;&nbsp; &lt;cfhttpparam name=&quot;screenshot[uploaded_data]&quot; type=&quot;file&quot; file=&quot;#filearea#&quot; mimetype=&quot;image/jpeg&quot;&gt; &nbsp;&nbsp;&nbsp; &lt;cfhttpparam name=&quot;screenshot[description]&quot; value=&quot;#FORM.description#&quot; type=&quot;formfield&quot;&gt;&nbsp;&nbsp;&nbsp; &lt;cfhttpparam name=&quot;screenshot[tag_list]&quot; value=&quot;#FORM.tags#&quot; type=&quot;formfield&quot;&gt; &nbsp;&nbsp;&nbsp; &lt;cfhttpparam name=&quot;screenshot[source_url]&quot; value=&quot;#FORM.url#&quot; type=&quot;formfield&quot;&gt;&lt;/cfhttp&gt;</pre>
<p>The function for uploading an image takes 4 arguments, one for the image itself, one for tags, one for the description and a final one for the url (if any).  Simple.  And the function returns a nicely formatted XML structure that could be used to store upload information, compile tags, etc.</p>
<p>Needless to say, I am very excited about this.  Progress on my CSS gallery is coming along, and I am going to hook it into ScrnShots so that all of the featured sites that I add will automatically be populated to ScrnShots, thus boosting my stats on the site.  Woot!</p>
<p>Oh, yeah, and be sure to <a href="http://scrnshots.com/users/existdissolve">check me out on ScrnShots</a>! </p>
]]></content:encoded>
			<wfw:commentRss>http://existdissolve.com/2008/06/quick-look-at-scrnshots-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Woot!  My First WordPress Plugin!</title>
		<link>http://existdissolve.com/2008/05/woot-my-first-wordpress-plugin/</link>
		<comments>http://existdissolve.com/2008/05/woot-my-first-wordpress-plugin/#comments</comments>
		<pubDate>Thu, 29 May 2008 19:31:33 +0000</pubDate>
		<dc:creator>existdissolve</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Jobs]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://existdissolvetest.wordpress.com/2008/05/29/woot-my-first-wordpress-plugin</guid>
		<description><![CDATA[Over the last week and a half, I have been working with an old co-worker of mine on a project that he started about a month (or so) ago: searchwebjobs.com. This site is a pretty cool job listings site that is really easy to browse for jobs. In brainstorming how to make the site better,&#8230;]]></description>
			<content:encoded><![CDATA[<p>Over the last week and a half, I have been working with an old co-worker of mine on a project that he started about a month (or so) ago: <a href="http://searchwebjobs.com">searchwebjobs.com</a>.  This site is a pretty cool job listings site that is really easy to browse for jobs.  </p>
<p>In brainstorming how to make the site better, I suggested that we create a WordPress plugin that would allow others (presumably, CSS galleries&#8230;) to grab a feed of our jobs and display them on their site.</p>
<p>So, grabbing my PHP 5 manual (and dusting it off&#8230;), I set to work.  Fortunately, I have had some recent exposure to WordPress, so I felt reasonably sure that something could be done.  </p>
<p>In all honesty, I couldn&#039;t be more impressed with WordPress&#039; support for plugins.  Consider this: it took me&#8211;a complete idiot at PHP&#8211;only 3 hours to program then entire plugin from nearly scratch.  Not bad.</p>
<p>The beauty of WordPress&#039; plugin support&#8211;IMO&#8211;is the default database that is so easily exposed.  Instead of having to create stupid PHP connections, that stuff already exists, so all you have to do is basically write SQL.  Plus, there are a few native functions to WordPress that allow you to use a row (or two) in the default tables for things like configuration data&#8211;very handy for simple plugin setup information.</p>
<p>So yeah, this was a great experience and I am impressed with how easy WordPress makes it.</p>
<p>Anyway, if you are looking to display some great web and tech related job listings on your site, <a href="http://searchwebjobs.com/wordpress">check out the plugin</a>.  As this plugin is barely above Alpha, I would be very grateful for some suggestions on how to improve it, ideas for new features, etc.  And if there are any PHP&#039;ers out there willing to provide some constructive criticism on my code, I&#039;d very much appreciate that!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://existdissolve.com/2008/05/woot-my-first-wordpress-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

