<?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>Wegner Design Blog</title>
	<atom:link href="http://www.wegnerdesign.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.wegnerdesign.com</link>
	<description>A blog for passionate programmers.</description>
	<lastBuildDate>Fri, 11 May 2012 20:27:09 +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>Generate Domain Names</title>
		<link>http://www.wegnerdesign.com/blog/generate-domain-names/</link>
		<comments>http://www.wegnerdesign.com/blog/generate-domain-names/#comments</comments>
		<pubDate>Fri, 11 May 2012 20:27:09 +0000</pubDate>
		<dc:creator>Joe Wegner</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wegnerdesign.com/?p=322</guid>
		<description><![CDATA[As I approach a new phase in life (I&#8217;m leaving my current job, if you didn&#8217;t know) the thought of starting something new keeps creeping into my head.  I keep looking around at all the people that are flourishing in the startup world and am simply jealous.  So, as I daydream I come to the [...]]]></description>
			<content:encoded><![CDATA[<p>As I approach a new phase in life (I&#8217;m leaving my current job, if you didn&#8217;t know) the thought of starting something new keeps creeping into my head.  I keep looking around at all the people that are flourishing in the startup world and am simply jealous.  So, as I daydream I come to the realization that I don&#8217;t have a ton of million-dollar ideas, and often fall back on trying to come up with awesome domain names and hoping an idea sprouts out of that (not really..  but perhaps a side project could).  So, today I wrote a little app that could fuel my time-wasting past time.  Check it out at <a href="http://domain.wegnerdesign.com">domain.wegnerdesign.com</a></p>
<p>The idea was actually fueled by my love for <a href="http://www.gumroad.com">Gumroad</a> (and a bit of jealousy).  As the story goes, <a title="Sahil Lavingia" href="https://twitter.com/#!/shl">Sahil Lavingia</a> had this awesome idea for a startup.  So, he hacked away for a couple nights, and came to the point that he was ready to show the world an MVP.  If I understand it correctly, he had the domain gumroad.com sitting in a stockpile somewhere, and it just happened to be abstract enough to work.  Man, I wish I was that cool.</p>
<p>Speaking of Sahil and Gumroad, did you hear that he recently closed a<a href="http://techcrunch.com/2012/05/07/gumroad-7-million-series-a-kleiner-perkins/"> $7.7 million round of funding</a>?  Congrats, man.</p>
<p>If you&#8217;re interested, the source for this app can be found on <a href="https://github.com/josephwegner/domainGenerator">Github</a>, and is written in Node.js.  There&#8217;s a little portion that I wrote in PHP and haven&#8217;t shared, but it&#8217;s incredibly simple.  The only important part is that it&#8217;s calling from a database of 200,000 possible words (that I may open source at some point).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wegnerdesign.com/blog/generate-domain-names/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Node.js: JSON Format Response Before Sending</title>
		<link>http://www.wegnerdesign.com/blog/node-js-json-format-response-before-sending/</link>
		<comments>http://www.wegnerdesign.com/blog/node-js-json-format-response-before-sending/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 20:14:05 +0000</pubDate>
		<dc:creator>Joe Wegner</dc:creator>
				<category><![CDATA[Node.js]]></category>
		<category><![CDATA[override]]></category>

		<guid isPermaLink="false">http://www.wegnerdesign.com/?p=312</guid>
		<description><![CDATA[Chances are that if you&#8217;re reading this blog, you&#8217;re probably doing something in Node.js, or at least javascript. Furthermore, chances are that if you are doing something in Node.js, you like to speak JSON.  JSON is the universal language for speaking between two systems that don&#8217;t necessarily speak the same language.  Originally the standard for [...]]]></description>
			<content:encoded><![CDATA[<p>Chances are that if you&#8217;re reading this blog, you&#8217;re probably doing something in Node.js, or at least javascript. Furthermore, chances are that if you are doing something in Node.js, you like to speak <a title="JSON" href="http://www.json.org/">JSON</a>.  JSON is the universal language for speaking between two systems that don&#8217;t necessarily speak the same language.  Originally the standard for this sort of exchange was XML, but JSON is becoming the preferred format due to its support for more specific types such as arrays.  If you&#8217;re not already using JSON internally, it&#8217;s probably a good idea to start, as many of the big-name APIs are defaulting to JSON.<span id="more-312"></span></p>
<p>Trying to keep to that standard, I find myself writing the same lines over and over to encode my objects in JSON before returning them (this is generally returning to an API call).  I wrote a quick little script to automatically detect if I&#8217;m trying to respond with an object.  Here goes:<br />
<pre class='prettyprint' lang='lang-js' >//This probably goes somewhere else, but for testing purposes...<br />
var http = require('http');
//Scope this however is ideal for your environment<br />
var hold = http.ServerResponse.prototype.end;<br />
http.ServerResponse.prototype.end = function() {<br />
if(typeof(arguments[0]) === "object") {<br />
arguments[0] = JSON.stringify(arguments[0]);<br />
}
hold.apply(this, arguments);<br />
};
http.createServer(function(req, res) {<br />
//And build your objects however you like. No special format - just your data.<br />
var dat = {<br />
a: "This",<br />
b: "is",<br />
c: "some",<br />
d: "data!"<br />
};
res.end(dat);<br />
}).listen(1234);</pre></p>
<p>Pretty simple little addition. As I mentioned in the code, you may want to scope the `hold` variable a little different, depending on your environment. Also &#8211; <strong>this is important</strong> &#8211; this will NOT work if you are using res.write(). This generally isn&#8217;t the case if you are formatting in JSON, because it&#8217;s hard to chunk an object, but if you are fancy like that you will need to make some modifications. It should be simple enough to override the res.write() function in a similar way as I did with res.end().</p>
<p>Additionally, a system like this can be used for pretty much any pre-write hook.  It&#8217;s not always a good idea to override the pre-defined functions in Node.js (it&#8217;s hard to maintain), but occasionally that makes the most sense.  If you have different functionality you&#8217;d like to add, just replace the http.ServerResponse.prototype.end portion with whatever you need to do.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wegnerdesign.com/blog/node-js-json-format-response-before-sending/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Always Use Real Time</title>
		<link>http://www.wegnerdesign.com/blog/always-use-real-time/</link>
		<comments>http://www.wegnerdesign.com/blog/always-use-real-time/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 20:34:57 +0000</pubDate>
		<dc:creator>Joe Wegner</dc:creator>
				<category><![CDATA[Node.js]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[real time]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.wegnerdesign.com/?p=303</guid>
		<description><![CDATA[Many moons ago I used to cringe whenever the idea of having something &#8220;real time&#8221; was brought up.  While it&#8217;s been somewhat possible for a long time, the methods have been very dirty and often required a lot of coding and bandwidth.  Usually what ended up happening is you would write some javascript to do [...]]]></description>
			<content:encoded><![CDATA[<p>Many moons ago I used to cringe whenever the idea of having something &#8220;real time&#8221; was brought up.  While it&#8217;s been somewhat possible for a long time, the methods have been very dirty and often required a lot of coding and bandwidth.  Usually what ended up happening is you would write some javascript to do an AJAX request to your server every few seconds to see if any new data had arrived (this is how Twitter does it).  This worked, but unfortunately it&#8217;s a pretty bad practice and is only a faux-real time.  Well, it&#8217;s the future now, and true real-time is not only possible, but I think you would be foolish to ignore it for how easy it is.</p>
<p><span id="more-303"></span></p>
<p>As a bit of a disclaimer, I&#8217;m pretty crazy about Node.js.  Whether you think that&#8217;s a justified insanity is up to you, but I certainly think it&#8217;s worth at least looking in to.  Much of the world is trying to avoid Node.js &#8211; it&#8217;s new, it&#8217;s a little confusing, it&#8217;s all javascript, and it requires a lot of work to move from something like a LAMP stack to a full Node.js server.  Here&#8217;s the thing, though: I don&#8217;t want you to leave LAMP.  Obviously there&#8217;s a lot of benefits to getting away from Apache/PHP, but they&#8217;re not requirements to use Node.js for real-time data.  The solution I&#8217;m presenting simply uses a lightweight Node.js server on the side that accepts HTTP requests and passes them on to the frontend.  Send your requests from PHP, python, cURL, or some other awful language, and you&#8217;ll get exactly the same functionality.</p>
<p>The backbone of this system is <a title="Socket.io" href="http://socket.io">socket.io</a>, which I consider to be the holy grail of Node.js in web development.  Socket.io is a system that utilizes <a title="Web Sockets" href="http://en.wikipedia.org/wiki/WebSocket">web sockets</a> to pass data back and forth between a server and a client in real time.  Because it&#8217;s based on web sockets, it doesn&#8217;t require a new connection to be made every time data needs to be sent &#8211; it keeps a connection open and just listens for whenever the other side starts talking.  The bright side to using Socket.io to handle your web sockets is that they&#8217;ve built in some wonderful<a title="Socket.IO Browser Support" href="http://socket.io/#browser-support"> graceful degradation</a> for older browsers that might not support web sockets.</p>
<p>So here&#8217;s how we start on the server.  Essentially we&#8217;re just starting up a Socket.io server and an HTTP server.  When that HTTP server receives data it pinpoints the user to send it to, and then sends it via Socket.IO.</p>
<pre class='prettyprint' lang='lang-js' >var http = require('http');<br />
var socketio = require('socket.io');<br />
var qs = require('querystring');
var destinations = {}; //This will hold all of our registered clients
var app = http.createServer(function(req, res) {<br />
    var postData = "";
    req.on('data', function(chunk) {<br />
        postData += chunk; //Get the POST data<br />
    });
    req.on('end', function() {<br />
        var POST = qs.parse(postData);
        if(typeof(destinations[POST.destination]) !== "undefined") {<br />
            destinations[POST.destination].emit("push", {<br />
                data: POST.data //Send it!<br />
            });<br />
        }<br />
    });
    res.end();<br />
}).listen(8080);  //Use a non-standard port so it doesn't override your Apache
var io = socketio.listen(app); //Attach socket.io to port 8080
io.sockets.on('connection', function(socket) {<br />
    socket.on('register', function(data) { //Client registers so we know where to send<br />
        destinations[data.id] = socket;<br />
    });<br />
});<br /></pre>
<p>That&#8217;s it!  Your Node.js server is ready to start passing data between your frontend and the backend.  All you need to do is include socket.io on the frontend and register with the server.</p>
<pre class='prettyprint' lang='lang-html' >&lt;script type="text/javascript" src="http://www.mydomain.com:8080/socket.io/socket.io.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript"&gt;<br />
var socket = io.connect("http://www.mydomain.com:8080");
socket.on('push', function(data) {<br />
	//Do something with the data<br />
});
socket.emit('register', {<br />
	id: 12345 //Use a unique ID here.  I'm using my session ID<br />
});
&lt;/script&gt;</pre>
<p>You&#8217;re good to go.  Now to pass data all you have to do is make an HTTP request to the server running Node.js on port 8080.  The request will need two POST parameters:</p>
<ul>
<li>destination -&gt; The ID of the user that should receive the data.  This should match the ID that you sent via Socket.io on the frontend (which is why I&#8217;m using the session ID)</li>
<li>data -&gt; The data to send to the user.  I generally encode this in JSON, but you can do whatever you want</li>
</ul>
<div>Enjoy!</div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wegnerdesign.com/blog/always-use-real-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Swift Portfolio Theme</title>
		<link>http://www.wegnerdesign.com/blog/swift-portfolio-theme/</link>
		<comments>http://www.wegnerdesign.com/blog/swift-portfolio-theme/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 20:34:35 +0000</pubDate>
		<dc:creator>Joe Wegner</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wegnerdesign.com/?p=294</guid>
		<description><![CDATA[I guess I just loved designing the portfolio theme for WegnerDesign so much that I had to create a new one.  Perhaps not, because I don&#8217;t generally love doing design work.  Whatever the reason, I&#8217;ve created the Swift Portfolio Theme that I&#8217;m selling on Gumroad. Swift really has everything that you&#8217;d want in a portfolio. [...]]]></description>
			<content:encoded><![CDATA[<p>I guess I just loved designing the portfolio theme for WegnerDesign so much that I had to create a new one.  Perhaps not, because I don&#8217;t generally love doing design work.  Whatever the reason, I&#8217;ve created the Swift Portfolio Theme that I&#8217;m <a title="Swift Portfolio Theme Gumroad Page" href="https://gumroad.com/l/GtQcB">selling on Gumroad</a>.<span id="more-294"></span></p>
<p>Swift really has everything that you&#8217;d want in a portfolio.  It&#8217;s run on CSS3 and HTML5, so you can flash those buzz words around all you want.  Along with some of the tricks provided by CSS3, it utilizes jQuery to make it fully responsive so it looks great on every device.  It&#8217;s also got some crazy navigation features that might rock your world.  I&#8217;ll put some screenshots below, but you might just be better off checking out <a title="Swift Demo" href="http://wegnerdesign.com/demos/swift/">the demo</a>.</p>
<p><strong>The Nav Pane</strong></p>
<p>Fact: Pretty much every website out there does the same thing for navigation.  They&#8217;ve either got some buttons on the header up top, or some buttons on the sidebar on the left.  BORING.  Swift comes with a full-page nav pane that you can customize with as many icons as you&#8217;d like.  Don&#8217;t worry &#8211; if you add too many our fancy CSS3 will make sure that it flows pleasantly down the page.</p>
<p><a href="http://www.wegnerdesign.com/wp-content/uploads/92f8b7.png"><img class="alignnone size-medium wp-image-295" title="92f8b7" src="http://www.wegnerdesign.com/wp-content/uploads/92f8b7-300x143.png" alt="" width="300" height="143" /></a></p>
<p>Look kind of boring?  Like how in the world do you know what those icons mean?  Just roll over them, and we&#8217;ll tell you (if you don&#8217;t go blind from our beautiful tooltip first).</p>
<p><a href="http://www.wegnerdesign.com/wp-content/uploads/Screenshot-6.png"><img class="alignnone size-full wp-image-296" title="Screenshot-6" src="http://www.wegnerdesign.com/wp-content/uploads/Screenshot-6.png" alt="" width="180" height="299" /></a></p>
<p><strong>The Content</strong></p>
<p>You&#8217;ve played this theme game before.  Some guy who think he knows it all is going to give you a pretty little textbox and tell you that&#8217;s where you put your content.  Well that sucks, because Mr. know-it-all doesn&#8217;t really know how you want your content to look.  I&#8217;m not a know-it-all, so I&#8217;m gonna let you code-it-all.  That&#8217;s right, with Swift you get to write in your own HTML so things will look exactly how you want them.  Don&#8217;t be afraid &#8211; we&#8217;ll provide you with some sample HTML if you&#8217;re not savvy enough to write your own yet.</p>
<p><a href="http://www.wegnerdesign.com/wp-content/uploads/106955.png"><img class="alignnone size-medium wp-image-297" title="106955" src="http://www.wegnerdesign.com/wp-content/uploads/106955-300x143.png" alt="" width="300" height="143" /></a></p>
<p>Hold up &#8211; I&#8217;ve read your mind again.  You&#8217;re currently thinking, &#8220;But Joe, these super long one-page websites suck!  It takes forever for me to navigate around and view all the content!&#8221;  I hear ya &#8211; they do suck.  That&#8217;s why Swift keeps the navigation always at your fingertips with the home button (really &#8211; check this one out in the demo.  It&#8217;s mind-blowing).</p>
<p><a href="http://www.wegnerdesign.com/wp-content/uploads/73a6fc.png"><img class="alignnone size-full wp-image-298" title="73a6fc" src="http://www.wegnerdesign.com/wp-content/uploads/73a6fc.png" alt="" width="175" height="162" /></a></p>
<p>Now I&#8217;ve been considering what I should sell this for&#8230;.  What do you think?  $1 million dollars?  No, no, I couldn&#8217;t possibly go higher than that.  Well, here&#8217;s the deal: I like you.  Really, I like you so much, I&#8217;m going to <strong>give you this theme for only $10!  </strong>That&#8217;s right &#8211; head over to <a href="https://gumroad.com/l/GtQcB">Gumroad</a> ASAP to pick up the Swift Portfolio Theme for just $10.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wegnerdesign.com/blog/swift-portfolio-theme/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google Won&#8217;t Beat Oracle</title>
		<link>http://www.wegnerdesign.com/blog/google-wont-beat-oracle/</link>
		<comments>http://www.wegnerdesign.com/blog/google-wont-beat-oracle/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 17:43:18 +0000</pubDate>
		<dc:creator>Joe Wegner</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://wegnerdesign.com/?p=283</guid>
		<description><![CDATA[Oracle has got a lovely little document available right now that outlines their opening statements in their copyright infringement case against Google.  As you can see, I&#8217;ve found this document hilarious on multiple levels, but also a bit sobering.  Up until this point I haven&#8217;t taken much time to really look at the dispute going [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle has got a lovely little <a title="Oracle Opening Statements" href="http://www.oracle.com/us/corporate/features/opening-slides-1592541.pdf">document</a> available right now that outlines their opening statements in their copyright infringement case against Google.  As <a title="Joe_Wegner #Oracle" href="https://twitter.com/#!/search/%23Oracle%20from%3AJoe_Wegner">you can see</a>, I&#8217;ve found this document hilarious on multiple levels, but also a bit sobering.  Up until this point I haven&#8217;t taken much time to really look at the dispute going on between Google and Oracle, because I&#8217;ve always considered Google as some unstoppable force of money and good PR.  As I look at the details, though, it&#8217;s becoming clear that Google is grasping for straws, and Oracle may have the upper hand in this case.</p>
<p><span id="more-283"></span></p>
<p>To be clear, I&#8217;m still rooting for Google.   Oracle quoted Andy Rubin in their opening statements:</p>
<blockquote><p>&#8220;Finally, SUN has a different license for its library for SE and ME. The SE library is LGPL, ME library is GPL. That means anything that links with the ME library gets infected. And the SE library is not optimized for embedded systems.  Sun chose GPL for this exact reason so that companies would need to come back to them and take a direct license and pay royalties.”</p></blockquote>
<p>This is a pretty disgraceful way to use an open source license &#8211; OSS isn&#8217;t about making a profit, it&#8217;s about innovating as a developer community.  Ironically, the same thing applies to the copyright and patent system that are now so abused.  While Oracle may have very valid points in this lawsuit, I certainly believe Google is paving the road of innovation with Android, and will hold my respect whichever way the case goes.</p>
<p>In case you&#8217;re not familiar with the Google-vs-Oracle case, here&#8217;s a bit of back story.  Sun (now owned by Oracle) wrote an incredible piece of software called Java Runtime Environment (JRE), which is best known for its powerful Java Virtual Machine (JVM).  The JVM allowed developers to write code in a single language and run it on any platform (coined &#8220;Write Once, Run Anywhere&#8221; by Sun).  This was an incredible innovation, and added some great efficiencies for developers whose markets were cross platform.  Along with the JVM, Java has another critical piece: the Java API.  The API is the portion that is commonly (and somewhat incorrectly) called the Java programming language.  In reality, the Java API is just like any other API &#8211; it&#8217;s an interface supplied by Sun so that developers can interact with the JVM.</p>
<p>In functionality, the Java API behaves quite similarly to a standard programming language, but differs in how it compiles.  Standard languages like C compile down to assembly language, and is processed directly from there.  Java, however, compiles down into a type of <a title="Java Bytecode" href="http://en.wikipedia.org/wiki/Java_bytecode">bytecode</a>, and that bytecode is again compiled by a just-in-time complier built into the JVM.  This is the crucial piece that makes Java an API, instead of a standard programming language.  Java is just an interface  which people can use to communicate with the JVM.</p>
<p>This is Google&#8217;s fatal flaw.  Google is trying to argue with Oracle that they <a href="http://i2mag.com/google-says-you-cant-copyright-a-programming-language-oracle-says-you-can/">can&#8217;t copyright a programming language</a>.  I believe they will successfully win that argument, and for good reason.   Can you imagine a world where C could have been copyrighted?  Unfortunately, Java <strong>is not a programming language</strong>.  Java is an interface for interacting with a piece of software (the JVM).  Google was intentional about not wording their argument as such, because I believe it&#8217;s very clear that they could not win.  Under that definition, there is an incredibly large amount of APIs out there that are necessarily copyrighted.  Flip this on its head, and imagine if Google had to open up their <a title="Google Custom Search API" href="https://developers.google.com/custom-search/v1/overview">Customer Search API</a>.  Not only would they lose one of their major revenue sources (because they couldn&#8217;t license it), but their entire structure would break down because the world would have a clear view into how they score their search results.</p>
<p>I guess at the end of the day I&#8217;m torn.  Google is mostly in the right, here &#8211; they&#8217;re using Java in an innovative way and they&#8217;ve created a wonderful developer platform with Android, but on the other hand <strong>they&#8217;re clearly stealing.</strong>  I would hate to see Oracle win this case, because I believe they decrease the flexibility in the tech sector on many fronts, but I&#8217;m also afraid of the implications of APIs not being copyrightable.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wegnerdesign.com/blog/google-wont-beat-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pure CSS3 UI Set</title>
		<link>http://www.wegnerdesign.com/blog/pure-css3-ui-set/</link>
		<comments>http://www.wegnerdesign.com/blog/pure-css3-ui-set/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 02:43:33 +0000</pubDate>
		<dc:creator>Joe Wegner</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://wegnerdesign.com/?p=274</guid>
		<description><![CDATA[Buzz word alert.  CSS3!  CSS3!  CSS3!  You&#8217;ve heard it a million times, and I&#8217;m sure at this point you&#8217;ve gotten over the faux-excitement surrounding the new CSS standards.  Regardless of your excitement, though, it&#8217;s hard to deny that there are some truly useful things that are starting to show up.  For a long time, any [...]]]></description>
			<content:encoded><![CDATA[<p>Buzz word alert.  CSS3!  CSS3!  CSS3!  You&#8217;ve heard it a million times, and I&#8217;m sure at this point you&#8217;ve gotten over the faux-excitement surrounding the new CSS standards.  Regardless of your excitement, though, it&#8217;s hard to deny that there are some truly useful things that are starting to show up.  For a long time, any sort of fancy design was dependent on using images.  Anything with a gradient, a rounded corner &#8211; God forbid you want a text shadow &#8211; would drastically slow down your page from loading all the images.  CSS3 gives us some powerful tools to do some great design without loading any images.</p>
<p>The downside to all the magic in the CSS3 spec is that much of  it isn&#8217;t available in the leading browsers yet.  So, with that said, take what I&#8217;m about to post with a grain of salt.  It won&#8217;t work in every browser (actually, currently, it only officially works in Chrome).</p>
<p><span id="more-274"></span></p>
<p>I&#8217;ve put together a CSS3-based UI set that can be easily applied to any input element just by adding a class.  No weird HTML structures, no javascript, and no images.  Just add a class, and let CSS3 do the rest.  The set is certainly pretty young at this point &#8211; much of the design is just a proof of concept &#8211; but I intend to build in enhancements over time.  Also, my general design skills are awful (terrible) (disgusting), so don&#8217;t expect an award-winning look.</p>
<p>Anyways, here&#8217;s a glimpse of what it looks like, and you can also check out <a title="UI Set Demo" href="http://wegnerdesign.com/demos/uiset/">this demo</a>.</p>
<p><img class="alignnone" title="Pure CSS3 UI Set" src="http://www.wegnerdesign.com/wdApp/c3ef97.png" alt="" width="332" height="385" /></p>
<p>Also, the source for this icon set can be found on <a title="CSS3 UI Set Github Page" href="https://github.com/josephwegner/CSS3-UI-Set">Github</a>.</p>
<p>&nbsp;</p>
<p><em>Note:  Upon further research, it turns out I didn&#8217;t fully understand the CSS3 spec for pseudo elements.  Apparently elements that are &#8220;void&#8221;, or don&#8217;t have any content, do not officially support the :after and :before meta tags.  Much of this UI set depends on that, so it will only work in Chrome in its current state.  I will think of a smarter way to do this, refactor, and update here when it&#8217;s ready for prime time.  Sorry!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wegnerdesign.com/blog/pure-css3-ui-set/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Portfolios: Design for your Goals</title>
		<link>http://www.wegnerdesign.com/blog/portfolios-design-for-your-goals/</link>
		<comments>http://www.wegnerdesign.com/blog/portfolios-design-for-your-goals/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 02:28:32 +0000</pubDate>
		<dc:creator>Joe Wegner</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://wegnerdesign.com/?p=269</guid>
		<description><![CDATA[You may have noticed recently that Wegner Design went through a major overhaul. Like, really major. Like, from a crappy free wordpress template to a completely home-built, cutting-edge unique design. Now, you&#8217;re probably looking at the page around this text &#8211; yes, it&#8217;s completely, 100%, white &#8211; and thinking &#8220;this is a pretty simple design. [...]]]></description>
			<content:encoded><![CDATA[<p>You may have noticed recently that Wegner Design went through a major overhaul. Like, really major. Like, from a crappy free wordpress template to a completely home-built, cutting-edge unique design. Now, you&#8217;re probably looking at the page around this text &#8211; yes, it&#8217;s completely, 100%, white &#8211; and thinking &#8220;this is a pretty simple design. He probably spent 5 minutes on this.&#8221; Let me assure you, that&#8217;s not the case. This design went through tons of iterations, went through just about every symptom of the <a href="http://uxdesign.smashingmagazine.com/2012/03/15/symptoms-of-epidemic-web-design-trends/">design epidemic</a>, and got thrown furiously into the trash many times.  But here&#8217;s the icing on the cake: I learned <em>a ton</em> in the process, and now have a beautiful website.</p>
<p><span id="more-269"></span></p>
<p>The problem with being me and wanting to have a website is that  - although I&#8217;ve got the chops to make things happen in CSS &#8211; I haven&#8217;t got an ounce of creativity in me.  The majority of what I do and love is backend design, and the frontend design is in very little snippets, like jQuery plugins.  Faced with the task of making an entire website flow together and look nice, I pretty much didn&#8217;t know where to start.</p>
<p>Then I had a brilliant idea.  I&#8217;ll just look at all the other awesome web designers I know, find what I like about their portfolio sites, and find a way to stitch all that together into my new site.  That&#8217;s how everyone does it, right?  <del>Stealing</del> Being inspired by other designs is how everyone does it!  It worked out wonderfully.  I actually designed about five different versions of Wegner Design that I thought were fantastically beautiful, but eventually scrapped them because they weren&#8217;t getting across the point I was trying to make.</p>
<p>The problem was that all the designers I was looking at were <em>career designers</em>.  When they drive traffic to their site, they&#8217;re looking to show off what they&#8217;ve done, and convince people that having a similarly pretty website is going to make them major cash.  The designers I was using for inspiration were looking to drive <em>customers</em> to their site.  I&#8217;m not.  As I mentioned before, whenever I am faced with a design task, I generally end up screaming profanities at my monitor.  <em>I don&#8217;t want to sell things to my users, so I shouldn&#8217;t design that way</em>.</p>
<p>That&#8217;s why everything you see right now is either black or white.  I&#8217;m not trying to wow you with some cool stitched border, or my awesome textured background, or my knack for typography (none of which I could actually wow you with).  I want you to come to Wegner Design <em>to learn something</em>.  On the homepage, I&#8217;m trying to quickly show my users where my skills are as a developer, and whether or not I would be a good fit for their project.  On the blog, I&#8217;m trying to share the knowledge that I&#8217;ve picked up as I dive into this industry.  Knowing that, I&#8217;ve pushed <strong>everything</strong> else out of the way, and just shown you what&#8217;s important.</p>
<p>The results?  No one is clicking through from the homepage to the blog.  No one is moving from the blog to the homepage.  I&#8217;m not getting more followers on my twitter, and &#8211; as far as I know &#8211; I haven&#8217;t won any design awards.  Good!  That&#8217;s not the point!  If those things were happening, that means I missed the point, and am targeting my site to the wrong goal.  What is happening, though, is that my average time on page is increasing, people are sharing my articles more often, and people are reading more posts every time they view the site.  Best of all, there&#8217;s been a massive increase of return readers, who have been able to get past the design and read into the meat of what I post.</p>
<p>I write all this, because I think that many of my readers are in similar spots.  The things I write aren&#8217;t generally design focused, so I would image you aren&#8217;t either.  When you&#8217;re designing your next website, keep in mind that a pretty design isn&#8217;t really what matters.  What matters is that you&#8217;re serving your users content in a way that effectively communicates your intentions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wegnerdesign.com/blog/portfolios-design-for-your-goals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery Image Tile Plugin</title>
		<link>http://www.wegnerdesign.com/blog/jquery-image-tile-plugin/</link>
		<comments>http://www.wegnerdesign.com/blog/jquery-image-tile-plugin/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 15:18:39 +0000</pubDate>
		<dc:creator>Joe Wegner</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Websites]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[eyecandy]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://wegnerdesign.com/?p=251</guid>
		<description><![CDATA[As we&#8217;ve learned in the past, when I get bored I like to build fun little jQuery plugins.  I don&#8217;t know why I do this &#8211; I don&#8217;t have any immediate need, but I suppose I just think it&#8217;s fun and possibly useful to other people.  Anyways, I was in a similar situation today, and [...]]]></description>
			<content:encoded><![CDATA[<p>As we&#8217;ve learned in the past, when I get bored I like to build fun little <a title="How To: Build a Tooltip Plugin in Jquery" href="http://wegnerdesign.com/blog/how-to-build-a-tooltip-plugin-in-jquery/">jQuery plugins</a>.  I don&#8217;t know why I do this &#8211; I don&#8217;t have any immediate need, but I suppose I just think it&#8217;s fun and possibly useful to other people.  Anyways, I was in a similar situation today, and decided to build another image animation plugin.  It doesn&#8217;t serve any true functionality, aside from being a pretty cool design that would look good on many websites.  Get an in-depth view on the details of how it works, and how you can extend it after the break.</p>
<p>&nbsp;</p>
<p><strong>View the demo, <a title="Demo" href="http://wegnerdesign.com/demo/fadeTiles/" target="_blank">here</a>!</strong></p>
<p><span id="more-251"></span><br />
<a href="http://wegnerdesign.com/wp-content/uploads/fadeTilesDemo.png"><img class="aligncenter size-full wp-image-256" title="Fade Tiles Demo" src="http://wegnerdesign.com/wp-content/uploads/fadeTilesDemo.png" alt="" width="500" height="287" /></a><br />
At the very base usage, all you need is jQuery and an image.  The plugin is smart enough to figure out the size and position of the image you&#8217;re working with, and it automatically defaults to make a 10&#215;10 grid over your image.  To get it running at the very base level, your code should look like this.</p>
<p>&nbsp;</p>
<pre class="prettyprint code">&lt;html&gt;
&lt;head&gt;
    &lt;script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="jquery.imageTile.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript"&gt;
         $(window).load(function() {
             $("#image").imageTile();
         });
    &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;img src="image.jpg" id="image" /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>That will put a 10&#215;10 grid of white tiles over your image, and randomly fade them in and out.  It&#8217;s a pretty cool effect, and just the simple base like that should work in most cases.  However, I&#8217;ve built in some options so that you can override the defaults.  The options are:</p>
<ul>
<li>rows -&gt; Integer, the number of rows in the grid.  Defaults to 10</li>
<li>columns -&gt; Integer, the number of columns in the grid.  Defaults to 10</li>
<li>animateTime -&gt; Integer or String, the time for the fade effect to finish on each tile.  This accepts a millisecond value, or a jQuery timing string such as &#8220;slow&#8221;.  Defaults to 800</li>
<li>newTilesTime -&gt; Integer, how often new tiles will be chosen to fade, in milliseconds.  Defaults to 400</li>
<li>tilesAtATime -&gt; Integer, the number of tiles to fade at the same time.  Defaults to 5</li>
<li>backgroundColor -&gt; String, the color of the tiles.  Accepts any valid CSS value, such as &#8220;white&#8221; or &#8220;#C1C1C1&#8243;.  Defaults to &#8220;white&#8221;</li>
<li>className -&gt; String, the class name to give the &lt;div&gt; that will be created over the image.  Defaults to jquery_tile_div</li>
<li>maxOpacity -&gt; Integer, the maximum opacity you want applied to any tile</li>
</ul>
<p>And to load in those options, you simply modify your javascript to look like this:</p>
<p>&nbsp;</p>
<pre class="prettyprint code">$("#image").imageTile({
    rows: 5,
    columns: 10,
    animationTime: 600,
    newTilesTime: 300,
    tilesAtATime: 10,
    backgroundColor: "blue",
    className: "dontOverrideTiles",
    maxOpacity: 0.4</pre>
<pre class="prettyprint code">});</pre>
<p>And that&#8217;s it!  The source is hosted <a title="Jquery Tile Image Github Page" href="https://github.com/josephwegner/jQuery-Image-Tile">on Github</a>, so feel free to grab it from there, make any changes, or simply look at it and find all the awful parts of my code.  If you have any issues or ideas, feel free to leave them in the comments or on the Github issue tracker.</p>
<p>&nbsp;</p>
<p><strong>View the demo, <a title="Demo" href="http://wegnerdesign.com/demo/fadeTiles/" target="_blank">here</a>!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wegnerdesign.com/blog/jquery-image-tile-plugin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Multipost for Node.js</title>
		<link>http://www.wegnerdesign.com/blog/multipost-for-node-js/</link>
		<comments>http://www.wegnerdesign.com/blog/multipost-for-node-js/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 15:36:38 +0000</pubDate>
		<dc:creator>Joe Wegner</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://wegnerdesign.com/?p=242</guid>
		<description><![CDATA[If you&#8217;ve been keeping tabs on me lately, you&#8217;ve probably picked up that I have a new project I&#8217;m working on: DownJS. I&#8217;m not going to get into the details of DownJS (that&#8217;ll be in another post), but there are some things that are blog-worthy about the DownJS system. One of my goals with DownJS [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve been keeping tabs on me lately, you&#8217;ve probably picked up that I have a new project I&#8217;m working on: <a title="DownJS" href="http://www.downjs.com" target="_blank">DownJS</a>. I&#8217;m not going to get into the details of DownJS (that&#8217;ll be in another post), but there are some things that are blog-worthy about the DownJS system. One of my goals with DownJS was to write the entire site &#8211; backend and portions of the frontend &#8211; in Node.js. I&#8217;ve been pretty crazy about Node.js for awhile, but have never had the gusto to tackle a full-featured product entirely in javascript. There&#8217;s been a lot of <del datetime="2012-04-04T15:06:51+00:00">hiccups</del> learning along the way, and I just published the biggest of the modules I&#8217;ve used in DownJS. Multipost is a Node.js module for sending data via the multipart/form-data protocol. That probably doesn&#8217;t make much sense, so read more after the break.<span id="more-242"></span></p>
<p>Raise your hand if you&#8217;ve ever submitted something via a web form.  Hopefully everyone has their hand raised.  If not, scroll down and leave a comment, then come back and raise your hand.  OK &#8211; put your hands down.  The obvious statement here is that pretty much everyone uses web forms, and everyone uses them because they&#8217;re <em>so easy</em>.  Put in a couple lines of HTML, handle the $_POST variables in PHP, and let the browser do the rest.  It&#8217;s a beautiful thing &#8211; at least until you need to send data from a script.</p>
<p>The usual scenario is that an API will offer a standard cURL interface, so you can just use simple cURL syntax for uploading from a script.  In DownJS&#8217;s cases, though, the API we&#8217;re using for storing the javascript files <span style="text-decoration: underline;">requires</span> a multipart/form-data formatted request.  This requires all kinds of crazy syntax about Content-Types and Content-Length, and then some weird gibberish stuff called &#8220;boundaries&#8221;.  And, for heaven&#8217;s sake, don&#8217;t put a \r\n in the wrong place!  Even after you figure out the crazy formatting, there&#8217;s still one big issue that needs to be solved &#8211; multipart/form-data (I&#8217;m going to call them MFD from now on) requests require an accurate Content-Length header.  This means that you normally would have to save the file to the local disk, read it into memory and tack it on to the end of your POST string, check the length, and then send out the entire thing in the HTTP request.  Unfortunately, I don&#8217;t have that kind of memory that I can play with, so a better solution was needed.</p>
<p>Enter Multipost.  Multipost is a Node.js modules that allows you to cut out all the gibberish involved in MFD requests, and additionally allows you to pipe files directly over HTTP, rather than loading them into memory beforehand.  The idea is that you write some standard javascript syntax, and we handle the mess and send off the request in the most efficient manner.  You can check out the source as well as some documentation on the <a title="Multipost Github" href="https://github.com/josephwegner/Multipost/blob/master/test/fileUpload.js" target="_blank">Github page</a>, and you can easily install Multipost via <a title="Multipost NPM" href="http://search.npmjs.org/#/multipost">NPM.</a></p>
<p>Multipost is brand new, and relatively untested.  I don&#8217;t necessarily encourage you to use it in a production environment (although, we are at DownJS), until you&#8217;ve thoroughly tested it in your environment.  If you find any issues,  please drop them on the <a title="Issue Tracker" href="https://github.com/josephwegner/Multipost/issues">issue tracker</a>, and I&#8217;ll fix them as quickly as I can.</p>
<p>&nbsp;</p>
<p><strong>Big thanks to <a title="Onteira Twitter" href="https://twitter.com/#!/onteria_">onteria</a> for <a title="Onteria Multipart Blog" href="http://onteria.wordpress.com/2011/05/30/multipartform-data-uploads-using-node-js-and-http-request/">this wonderful post</a> that guided me through formatting MFD requests.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wegnerdesign.com/blog/multipost-for-node-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I&#8217;m buying into this Gumroad thing</title>
		<link>http://www.wegnerdesign.com/blog/im-buying-into-this-gumroad-thing/</link>
		<comments>http://www.wegnerdesign.com/blog/im-buying-into-this-gumroad-thing/#comments</comments>
		<pubDate>Sun, 26 Feb 2012 15:49:05 +0000</pubDate>
		<dc:creator>Joe Wegner</dc:creator>
				<category><![CDATA[startup]]></category>
		<category><![CDATA[teensintech]]></category>
		<category><![CDATA[Websites]]></category>
		<category><![CDATA[80char]]></category>
		<category><![CDATA[disrupt]]></category>
		<category><![CDATA[funding]]></category>
		<category><![CDATA[gumroad]]></category>
		<category><![CDATA[idea]]></category>

		<guid isPermaLink="false">http://wegnerdesign.com/?p=201</guid>
		<description><![CDATA[Funny story.  About six months ago I was in the heavy stages of development for my startup/side project/time-killer, 80char.  I was coming to the realization that if I intended to release 80char anytime in the near future, I would have to have someone working beside me on the development.    I was pretty new to [...]]]></description>
			<content:encoded><![CDATA[<p>Funny story.  About six months ago I was in the heavy stages of development for my startup/side project/time-killer, <a title="80char" href="http://80char.com" target="_blank">80char</a>.  I was coming to the realization that if I intended to release 80char anytime in the near future, I would have to have someone working beside me on the development.    I was pretty new to the startup community, but had recently heard of a young rockstar developer who had <a title="Turntable for iPhone" href="http://techcrunch.com/2011/09/07/turntable-fm-iphone-app/" target="_blank">built the turntable for iPhone app</a> &#8211; Sahil Lavingia.  I sent <a title="Sahil Lavingia Twitter" href="https://twitter.com/#!/shl" target="_blank">Sahil</a> an email talking up 80char and asking him to come be a part of the cool stuff I was doing.  He sent a polite, yet somewhat secretive, response saying he was trying to raise funding for one of his own projects, and wished me the best of luck.  Well, just a couple of weeks ago, Sahil&#8217;s startup Gumroad got <a title="Gumroad gets funding" href="http://techcrunch.com/2012/02/08/gumroad-gets-1-1-million-from-chris-sacca-max-levchin-and-others-to-turn-any-link-into-a-payment-system/">$1.1 million in funding</a>.  Apparently I was out of my league.<span id="more-201"></span></p>
<p>I&#8217;ve known about <a title="Gumroad" href="https://gumroad.com/">Gumroad</a> for quite some time now, and I&#8217;ve always dismissed it with the thought that &#8220;I don&#8217;t have anything I can sell&#8221;.   Gumroad was a product built for the creative type &#8211; graphic designers, poets, musicians.  Even the example product was an awesome icon that I could never dream of designing.  The more I think about it, though, the more I realize that that&#8217;s simply not true.  Perhaps all of the examples that Gumroad provides are artsy fartsy, but why couldn&#8217;t I have zipped up node-session, and sold it for $2?  I still could have open sourced it, but I could have used Gumroad as a donation platform (think free-as-in-beer, but free-as-in-coke because I&#8217;m not 21).</p>
<p>That&#8217;s the beautiful thing about the internet.  Chances are that if you&#8217;re reading this blog, you&#8217;re not one of those people that just consumes what the internet has to offer &#8211; you&#8217;re a producer.  Whether you do <a title="Kevin Lipp - Graphic Designer" href="http://kevinlipp.com/" target="_blank">graphic design</a> or you churn out <a title="Ben Alman - Javascript Guru" href="http://benalman.com/" target="_blank">awesome javascript plugins</a>, you&#8217;re producing something, and you mine as well make money from it.  It used to be that you had to jump through all kinds of hoops in order to sell anything online &#8211; Gumroad is disrupting that standard in a massive way.  You probably haven&#8217;t thought of it yet, but now that the barrier to entry is simply an email address, what are you doing that you can sell?</p>
<p>Now Sahil just needs to take me up on my idea to <a title="Gumroad and Square tweet" href="https://twitter.com/#!/Joe_Wegner/status/173499819824906240" target="_blank">integrate Gumroad and Square</a>, and then he can finally take over the world.  (Seriously, think about it!  Swipe your card, and get sent a link to download node-session!)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wegnerdesign.com/blog/im-buying-into-this-gumroad-thing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

