Zastica • Rss http://www.zastica.com/posts/ RSS FEED en-us Open Admin Build 1 New Launch: LessaLamb.com http://www.zastica.com/posts/view/24/new-launch-lessalamb-com Fri, 21 May 2010 11:00:00 -0700 http://www.zastica.com/posts/view/24/new-launch-lessalamb-com <p>A couple months ago I finished up a website design for Lessa Lamb, a friend of mine who was looking for a website to publicize her artist modeling business. The site is a one page layout with some examples of art that other people have created about her, with a lightbox to display larger images. The design uses a bookmark effect for the navigation as well as headings. It also has subtle text effects to make it feel a little more&nbsp;engaging.</p> <p>According to&nbsp;Lesa,</p> <blockquote> <p>Working with Dave was an incredibly positive experience for me. He listened to my input about what I liked and didn&#8217;t like visually, and ultimately I think what we came up with is visually attractive, easily navigable, and contains all the information it needs to have&#8230; except for the information I haven&#8217;t given him&nbsp;yet.</p> <p>I would recommend working with Dave to anyone who needs an expert eye, a knowledge of possibilities, and someone who can stay on target, even when your time and energy are&nbsp;else-where.</p> </blockquote> <p>Here&#8217;s a couple screenshots of the&nbsp;site:</p> <p><img src="http://www.zastica.com/files/uploads/1c332c8bcf2dc8fe937ff64b83889311.png" alt="lessa lamb screenshot 1" /></p> <p><img src="http://www.zastica.com/files/uploads/1e1da2b44bf357526153807d6eba2644.png" alt="lessa lamb screenshot 2" /></p> <p>And just for fun, here&#8217;s a couple of concepts that didn&#8217;t get&nbsp;used:</p> <p><img src="http://www.zastica.com/files/uploads/1ffd9e753c8054cc61456ac7fac1ac89.png" alt="lessa unused 1" /> <img src="http://www.zastica.com/files/uploads/af413b52e441584d15571213951cc1cd.png" alt="lessa unused 2" /></p> <p>Overall, the project was very interesting to work on, as well as challenging. Lessa wanted a simple, elegant design, but she still needed it to be a little trendy and attractive to engage and encourage visitors that they should hire her to model for their art sessions. The final version of the site sets a standard for what other artist model sites can look&nbsp;like.</p> <p><a href="http://lessalamb.com/muse/">See the site:&nbsp;LessaLamb.com</a></p> concepts launches design clients The Real Rules of Programming Lecture http://www.zastica.com/posts/view/23/the-real-rules-of-programming-lecture Fri, 26 Feb 2010 17:00:00 -0800 http://www.zastica.com/posts/view/23/the-real-rules-of-programming-lecture <p>This past Tuesday, I had the chance to go and talk to <a href="http://www.plu.edu"><span class="caps">PLU</span></a>&#8217;s senior Computer Science Class. I was given the chance to talk about &#8220;anything technical&#8221;, so I wanted to talk about what it&#8217;s like in the programming world after graduation. Bjarne Stroustrup&#8217;s recent column on <a href="http://cacm.acm.org/magazines/2010/1/55760-what-should-we-teach-new-software-developers-why/fulltext"><em>What Should We Teach New Software Developers? Why?</em></a> was an interesting read and provided a starting point to talk about the transition from college to the&nbsp;&#8220;Industry&#8221;.</p> <p>I introduced Dave&#8217;s 1st Law of Programming&thinsp;&#8212;&thinsp;&#8220;<em>A technically perfect system that doesn&#8217;t work is no good.</em>&#8221;, as well as 5 &#8220;Rules&#8221; for post-graduate&nbsp;work:</p> <ul> <li>Everything you know is&nbsp;wrong</li> <li>You&#8217;re always&nbsp;responsible</li> <li>Normalize until it&#8217;s right, then optimize until it&nbsp;works</li> <li>All of programming is&nbsp;design</li> <li>To better understand software, you must understand&nbsp;people</li> </ul> <p>I also talked about some things that we can from those&nbsp;rules</p> <ul> <li>Be&nbsp;smart </li> <li>Be faster, better, <span class="amp">&amp;</span>&nbsp;stronger</li> <li>Your code sucks, but that&#8217;s&nbsp;ok </li> <li>Evaluate, explore, and test other people&#8217;s code and&nbsp;applications</li> </ul> <p>I also introduced Dave&#8217;s 2nd Law of Programming&thinsp;&#8212;&thinsp;&#8220;<em>Make it foolproof, and someone will make a better&nbsp;fool.</em>&#8221;</p> <p><a href="http://public.zastica.com/rules/">View the entire presentation (with jQuery slide/presentation&nbsp;goodness)</a></p> <p>I want to give a special thank you to Drs Wolff and Hauser for allowing me to come and talk to their&nbsp;students.</p> talks dave law programming Photos from Orcas Island http://www.zastica.com/posts/view/21/photos-from-orcas-island Thu, 04 Feb 2010 09:00:00 -0800 http://www.zastica.com/posts/view/21/photos-from-orcas-island <p>I recently went on a little vacation with my girlfriend up north to Orcas Island. The first night and morning we were there, a huge storm blew in. The interior bay of Orcas is big enough to be able to create its own weather patterns. By the time weather gets to Eastsound, it can be much worse than it would have been on the exterior of the&nbsp;island.</p> <p>This photo was taken on the morning of the big storm, looking out from Eastsound to the big bay. The weather was still a little rough at this&nbsp;time.</p> <p><a href="http://www.flickr.com/photos/stainedpollock/4327182798/sizes/m/"><img src="http://farm5.static.flickr.com/4026/4327182798_b5a5e1fcc2_d.jpg" /></a></p> <p>This one is on the road up Mt. Constitution, early in the morning. It was a little foggy, so there were sun breaks through the fog and&nbsp;clouds.</p> <p><a href="http://www.flickr.com/photos/stainedpollock/4326449197/sizes/m/"><img src="http://farm5.static.flickr.com/4016/4326449197_4f0cabf279_d.jpg" /></a></p> <p>Prints are available at $10 for 8&times;10, or $20 for 11&times;14. <a href="mailto:dave@zastica.com">Email Me</a> to learn more or&nbsp;order.</p> photography orcas island life vacation Stopping Spam with Akismet http://www.zastica.com/posts/view/20/stopping-spam-with-akismet Mon, 01 Feb 2010 10:30:00 -0800 http://www.zastica.com/posts/view/20/stopping-spam-with-akismet <p>If you&#8217;ve ever owned a blog or written for one, you know how much of a problem spam comments can be. In fact just earlier today, Harry Roberts of <span class="caps">CSS</span> Wizardry posted this on&nbsp;twitter:</p> <p><a href="http://twitter.com/csswizardry/status/8489682619/"><img src="http://zastica.com/files/uploads/c613344e1fa19336232ff782d821a6dd.png" alt="css wizardry on spam" /></a></p> <p>When I originally created this site and the <a href="http://hepcms.com">HepCMS</a> backbone that it runs on, I didn&#8217;t include any handling of comments except &#8220;Save, display&#8221;. There was an option to manually mark comments as spam after they were posted, but they always made it to the public pages. I did it that way for a couple reasons. First, I was curious to see how long it would take, and secondly, I was being lazy. Towards the end of last week, someone finally figured out how to automate adding comments to my site. And it only took them 3 months. In fact, if you own or run a blog, or any site that allows anyone to publish content, you&#8217;re going to have to deal with spam at some&nbsp;point.</p> <p>I did a pretty good job of manually catching the spam, but once once the spammer had automated adding things, I had to improve my defenses. enter <a href="http://akismet.com/">Akismet</a>. Akismet is the spam catcher that is used in Wordpress blogs. Via the Akismet <span class="caps">API</span>, anyone can add Akismet spam filtering to their site. If you&#8217;re already using Wordpress, you don&#8217;t have to worry about spam because they already use Akismet to catch spam&nbsp;content.</p> <p>Since HepCMS is built on CakePHP, I did some searching around for already built solutions. I found one particularily interesting, <a href="http://bakery.cakephp.org/articles/view/an-akismet-behavior">&#8220;An Akismet Behavior&#8221; by Tom O&#8217;Reilly</a>. The part about using a behavior at the model level of my application is that it&#8217;s almost automatic. The only thing I had to do to get it up and running was to add a <em>tiny</em> bit of code to my comments&nbsp;model.</p> <pre><code>var $actsAs = array('Akismet' =&gt; array( 'content'=&gt;'comment', 'author'=&gt;'author', 'type'=&gt;false, 'is_spam'=&gt;'spam' )); </code></pre> <p>For handling spam, this is a pretty quick solution, yet very powerful. I only spent about 30 minutes researching, installing the code, and testing it out. Once I was done, I saw the number of spam comments drop dramatically, and none reached the public portions of my site. The bottom line is that if you&#8217;re running a site that allows anyone to submit content, you need to deal with spam, and Akismet is the perfect way to do it. If you&#8217;re using Cake to run your application, a behavior is the perfect way to deal with&nbsp;spam.</p> cakephp php spam hepcms User Login Form Usability Ideas http://www.zastica.com/posts/view/19/user-login-form-usability-ideas Thu, 21 Jan 2010 14:00:00 -0800 http://www.zastica.com/posts/view/19/user-login-form-usability-ideas <p>If you have a site where users are able to have data associated with them, you probably have a login form. You may ask users to enter their email address, or a username for your site, or even an OpenID url. If they enter the correct information, they are granted access to otherwise protected areas of the site. But, if they don&#8217;t enter correct information for some reason, they get presented with an error message and have to try again. There are two major hurdles to login form design that I am going to&nbsp;address.</p> <h3>Show their username&nbsp;again</h3> <p>When a user&#8217;s login attempt fails, it&#8217;s a pretty standard practice to unset their username and password and force them to re-enter them both. This is a bad design pattern. Users should not be forced to remember and reenter their username. Consider this&nbsp;workflow:</p> <ul> <li>A user comes to your site, and enters their username and password. The username is entered into a regular text input, so it&#8217;s plainly visible to the user and anyone standing over their&nbsp;shoulder. </li> <li>The user&#8217;s information was incorrect, so the page refreshes, they see an error message. The user thinks, &#8220;Oh, I must&#8217;ve mistyped my password&#8221;. However, both the username and password fields are now&nbsp;empty.</li> <li>The user tries to login again, however they are momentarily disoriented by having to remember which username they use for this site. Sometimes, users might even have multiple logins for the site, so they have to remember which one they just tried to login with, and even if that username is&nbsp;correct.</li> <li>The user enters their username, and the password again, and hopes to get the information&nbsp;correct.</li> </ul> <p>If the site left the username in the field, the user would not have to remember which username they tried to use, and could focus on typing the password correctly. By leaving the username in the form, you can eliminate a point of confusion for the user, and ultimately help users use your&nbsp;site.</p> <h3>Unmasking&nbsp;passwords</h3> <p>In one off his AlertBox columns, <a href="http://www.useit.com/jakob/">Jakob Nielsen</a> takes the radical position&nbsp;that</p> <blockquote> <p>Usability suffers when users type in passwords and the only feedback they get is a row of bullets. Typically, masking passwords doesn&#8217;t even increase security, but it does cost you business due to login failures.&thinsp;&#8212;&thinsp;<a href="http://www.useit.com/alertbox/passwords.html">Jakob Nielsen, June 23,&nbsp;2009</a></p> </blockquote> <p>Personally, I don&#8217;t agree with him 100%, but since he&#8217;s the world&#8217;s foremost expert in usability there must be something to his claim. Security considerations aside, <strong>masking passwords does hurt usability</strong>. (Masking passwords means displaying bullets instead of letters and numbers&thinsp;&#8212;&thinsp;&#8216;&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;&#8217; instead of &#8216;password&#8217;) Why? It&#8217;s because it forces your users to think about typing their password correctly, and thinking is bad for&nbsp;usability.</p> <blockquote> <p>It doesn&#8217;t matter how many times I have to click, as long as each click is a mindless, unambiguous choice&thinsp;&#8212;&thinsp;<a href="http://www.sensible.com/">Krug&#8217;s second law of&nbsp;usability</a></p> </blockquote> <p>I don&#8217;t think that password masking is going away anytime soon, nor should it. It is still a security concern if someone can stand behind you and learn your login information. People routinely store all their life&#8217;s information in their email inbox, so if their email account was compromised by a nefarious individual&#8230; well it would be&nbsp;bad.</p> <p>Neilsen goes on to say, <q>&#8220;users are sometimes truly at risk of having bystanders spy on their passwords, such as when they&#8217;re using an Internet cafe. It&#8217;s therefore worth offering them a checkbox to have their passwords masked&#8221;</q>. This is a Good Idea, and offers a sufficient compromise between security and&nbsp;usability.</p> <p>So, for optimal login form&nbsp;usability,</p> <ul> <li>Don&#8217;t remove passwords after failed login attempts,&nbsp;and</li> <li>Unmask passwords by default, but give the user the option to mask the password, for example when someone is&nbsp;nearby.</li> </ul> usability design security Add Dates to Your <title>s http://www.zastica.com/posts/view/16/add-dates-to-your-lt-title-gt-s Tue, 12 Jan 2010 10:15:00 -0800 http://www.zastica.com/posts/view/16/add-dates-to-your-lt-title-gt-s <p>One of the things I noticed from my <a href="http://s17.zastica.com">old blog</a> was that old content can often get mistaken for new content by people who do not read your blog regularly. The main reason is that people can see, right in search results, how old the post is and how significant it might be. Check out this&nbsp;image:</p> <p><img src="http://www.zastica.com/files/uploads/db37f923a99940999452e4eb5a1d9f70.png" alt="example image" /></p> <p>There are two search results here&thinsp;&#8212;&thinsp;one that has a date and one that does not. The first one doesn&#8217;t give the user any indication of how old that page might be, while you immediately know that the second search result was created on Dec 14, 2009. six months from now, that page might be irrelevant, users can decide for themselves whether they want to visit the&nbsp;page.</p> <p>If you&#8217;re using CakePHP like I am, this is very easy. In your posts controller&#8217;s <code>view()</code> function, add this line of code. (Assuming that <code>$postdata</code> is the database&nbsp;entry.)</p> <pre><code>$this-&gt;pageTitle = ''.$postdata['Post']['title'].' - '.date('M j, Y', strtotime($postdata['Post']['published'])); </code></pre> <p>And then in your <code>app_controller.php</code> file, do something like this with the <code>beforeRender()</code> function. <code>beforeRender</code> gets called automatically by Cake just before any view begins to&nbsp;render.</p> <pre><code>function beforeRender() { //create page title $title = 'Zastica '; if(!empty($this-&gt;pageTitle)) { $title .= ' &amp;bull; '.$this-&gt;pageTitle; } else { $title .= ' &amp;bull; '.$this-&gt;params['action']; } $this-&gt;pageTitle = ucwords($title); } </code></pre> <p>What happens is that if you set a <code>pageTitle</code> in any controller or function, it is automatically formatted, and your site&#8217;s name added. If you don&#8217;t set it, it just becomes &#8220;SiteName &bull; $action&#8221;. As you can see in the image, &#8220;Zastica &bull; Seattle&#8221; vs. &#8220;Zastica &bull; Business Card 1.0 - Dec 14,&nbsp;2009&#8221;.</p> <p>The bottom line is that it helps users figure out how relevant your site&#8217;s content is from search&nbsp;results.</p> php cakephp usability Finding Posts in Multiple Categories http://www.zastica.com/posts/view/17/finding-posts-in-multiple-categories Fri, 08 Jan 2010 09:00:00 -0800 http://www.zastica.com/posts/view/17/finding-posts-in-multiple-categories <p>When you&#8217;re browsing around a blog, it is a big help to be able to browse posts by category&thinsp;&#8212;&thinsp;it helps you find related posts you might be interested in. For example, if you&#8217;re reading a post on something having to do with mysql, you can click on a link to see other similar&nbsp;posts.</p> <p>That&#8217;s pretty easy, and you can do it like&nbsp;this:</p> <pre><code>$sql = 'SELECT post_id FROM categories_posts WHERE category_id = '.$cat_id; </code></pre> <p>But what if you want to see posts in two categories, say mysql <em>and</em> php? You can&#8217;t adjust the query to use an <code>AND</code>, because that just wouldn&#8217;t work, and you can&#8217;t use the <code>IN</code> keyword, because that equates to a logical <code>OR</code>. So what do you do? One possibility is doing two separate queries and comparing the results. That&#8217;s not terrible efficient especially when you get more categories to compare. So, here&#8217;s what I&nbsp;did:</p> <pre><code>$sql = " SELECT Post.id FROM ( SELECT post_id, COUNT(category_id) as num FROM categories_posts WHERE category_id IN (".implode(",", $cat_ids).") GROUP BY post_id HAVING num=".count($cat_ids)." ) postids LEFT JOIN posts as Post ON post_id=Post.id "; </code></pre> <p>The inner query uses the <code>IN</code> keyword to find all posts in any of the categories, and then groups them by the post id and counting how many rows were found. Then the <code>HAVING</code> keyword filters the post group results to only those rows that have the same number of results as categories I asked for. So, If I query for posts in &#8220;<a href="http://www.zastica.com/posts/category/mysql/php">mysql and php</a>&#8221;, it finds all rows with either, groups them by the <code>post_id</code>, and then counts up how many rows are&nbsp;grouped.</p> <p>If a post was tagged with just <span class="caps">PHP</span>, the number would be one. Just MySQL would be the same. Posts without either MySQL or <span class="caps">PHP</span> wouldn&#8217;t show because of the <code>IN</code> command, but any post with both PHP and MySQL would have a 2, and be found by the query. The outer query is designed to return the list of post ids similar to Cake&#8217;s query results, so the data can be reused later to get comment and author&nbsp;data.</p> mysql php cakephp Welcome to 2010 http://www.zastica.com/posts/view/18/welcome-to-2010 Mon, 04 Jan 2010 11:00:00 -0800 http://www.zastica.com/posts/view/18/welcome-to-2010 <p>After my sophomore year in college, I spent most of the summer living in Colorado with my girlfriend (at the time). I worked at a candy store during the day, and a brewery waiting tables at night so I could pay for school. I worked 6 days a week, and as I drove into work in the morning, the song <em>Sunrise</em> by Norah Jones would play on the radio. (Every day. It was like they didn&#8217;t even shuffle their play&nbsp;list.)</p> <p>Since that summer, <em>Sunrise</em> has had a special significance for me. It&#8217;s a mellow song, and it reminds me of the calm the mornings of a town in the Colorado Rockies. The calm before everything goes absolutely nuts, the afternoon thunderstorm, and hordes of tourists on candy highs or little old ladies who make sure I bring them &#8220;exactly 3 sugar packets&#8221; for their iced&nbsp;tea.</p> <h3>Writing</h3> <p>I didn&#8217;t write much this last, which I attribute to my hectic work schedule and long commute. In November, I re-launched my site and am working on posting on a more regular basis. I am hopeful that by blogging more regularly, I can improve my writing skills and by connection my speaking skills as well. I want to start speaking and presenting this year, but it&#8217;s a long road to becoming a master web developer. Still, a journey of a thousand miles begins with a single foot step so you gotta start&nbsp;somewhere.</p> <h3>Working</h3> <p>In my day job, we opened an office in Spokane, so things have been mixed up a little bit. Still, we&#8217;re proving each day that we&#8217;re among the top development companies in the&nbsp;region.</p> <p>In my spare time, I&#8217;ve launched a few new sites. Most didn&#8217;t work out, but a couple did. I&#8217;ve also started doing my own design as well. I&#8217;ve had a few chances to try it out, and I think it&#8217;s going&nbsp;well.</p> <p>I also got a couple photos published in a couple magazines, and launched a new site for my photography business. I learned that perhaps a photography business isn&#8217;t really suited to me, but it&#8217;s really just a hobby. No harm, no&nbsp;foul.</p> <h3>Seattle</h3> <p>Living in Seattle has also been incredible. I love it, but it makes my commute awful. The area is awesome and lively, but it does have drawbacks. The apartment I live in was sold to new owners, and the new landlords ran the old (awesome) manager out. As a consequence, I&#8217;m looking into moving again. Hopefully this time, it&#8217;ll be into a place that I own instead of a place that someone else&nbsp;owns.</p> <h3>Dancing</h3> <p>I barely got out to dancing at all this last year. I was injured some of the time, and lost momentum the other times. I want to get back to dancing regularly in 2010. I&#8217;ll have to work at that a little better, but it&#8217;s worth it for the exercise and the social&nbsp;activity.</p> <h3>Onwards&#8230;</h3> <p>Over the last year, I&#8217;ve had many ups and downs. Some challenges I have faced well, and some I haven&#8217;t. Overall, I am happy with how everything turned out, but I hope that I can make the next year even&nbsp;better.</p> life Using the Flickr API to Show Photos http://www.zastica.com/posts/view/15/using-the-flickr-api-to-show-photos Wed, 30 Dec 2009 22:00:00 -0800 http://www.zastica.com/posts/view/15/using-the-flickr-api-to-show-photos <p>Hosting and serving images or photography, and doing it well, is one of the &#8216;hard&#8217; problems of web development. Most things like serving text content is trivial, but images are another story. To do it well, you have to resize the image, make sure it&#8217;s viewable on the web, store <em>lots</em> of data, and deal with the consequences of tranferring large amounts of data from your server to the user&#8217;s browser / computer. I was talking with <a href="http://mark.atwood.name/">Mark Atwood</a>, and he suggested using Flickr to host my&nbsp;photography.</p> <p>Flickr, as you probably already know, is the most popular social photography site, and they make it incredibly easy to post and share photos. Getting data from one site to another can be a pain, but fortunately, Flickr provides an <abbr title="Application Programming Interface"><span class="caps">API</span></abbr>. All I really wanted to do was create a <code>div</code> with a specific id, and have my site grab all the photos from Flickr and display them. I wanted it to look like&nbsp;this:</p> <pre><code>&lt;div id="photoset-72157622891400543" class="flickr-photoset"&gt;&lt;/div&gt; </code></pre> <p>To do this, all I really had to do was make an ajax call to my server-side Flickr app, and then stick the photos in the div. Then, I used jQuery <span class="caps">UI</span>&#8217;s dialog box to popup a bigger photo when you click on&nbsp;it.</p> <p>Check out this example of photos from my latest vacation to the Oregon&nbsp;Coast:</p> <div id="photoset-72157622891400543" class="flickr-photoset"></div> photography jquery javascript api flickr The Ampersand Broadside http://www.zastica.com/posts/view/14/the-ampersand-broadside Sat, 19 Dec 2009 11:15:00 -0800 http://www.zastica.com/posts/view/14/the-ampersand-broadside <p>I managed to snag one of <a href="http://www.ligatureloopandstem.com/">Ligature, Loop, and Stem</a>&#8217;s Ampersand broadsides. (Broadside is just another word for poster. It&#8217;s a letterpress printing thing.) The Ampersand print was a limited edition of 25, with ampersands (the ligature of the characters e and t, like in et cetera. It means &#8216;and&#8217;.) from different fonts, showcasing the different styles of the&nbsp;character.</p> <p>Overall, the quality of the print is very good. Entire print is debossed, and the registration of the ink and the debossment is perfect&thinsp;&#8212;&thinsp;meaning that either the inking and the debossment was done at the same time, or that the printer was very very good. Either way, very good quality. It also has a very nice wax seal on the bottom, and the number 6 of 25 written in&nbsp;pencil.</p> <p>One of the top edges of the print was mangled in the shipping process just a little bit, but some smoothing out made it much less noticeable. I wish that it was signed, however. The wax seal is a good addition, but for a print, it doesn&#8217;t replace a printer&#8217;s (or artist&#8217;s)&nbsp;signature.</p> <p>The whole&nbsp;shebang:</p> <p><img src="http://www.zastica.com/files/uploads/c75e95fc3cd7298e2628e37e9bba4eee.jpg" alt="http://www.zastica.com/files/uploads/c75e95fc3cd7298e2628e37e9bba4eee.jpg" /></p> <p>Close up of the Ampersand&nbsp;text</p> <p><img src="http://www.zastica.com/files/uploads/a659f4ddebe0ad77cfd4952ef000fdd3.jpg" alt="alt text" /></p> <p>The wax and&nbsp;number</p> <p><img src="http://www.zastica.com/files/uploads/3eb2ff861859095a50353a9102b7837b.jpg" alt="alt text" /></p> <p><img src="http://www.zastica.com/files/uploads/95f1de213c8fe6cc37d7cbef168a6be3.jpg" alt="alt text" /></p> <p><img src="http://www.zastica.com/files/uploads/777a22cd1f6234a769d5edde0d0356c5.jpg" alt="alt text" /></p> <p>Detail of some of the&nbsp;ampersands:</p> <p><img src="http://www.zastica.com/files/uploads/2f655fed8e48c7415f8fc8f01e02459a.jpg" alt="alt text" /></p> <p>The corner that got mucked up. The damage is in the top right corner. It&#8217;s not too bad, and is actually prett hard to see in this&nbsp;photo.</p> <p><img src="http://www.zastica.com/files/uploads/b1baf69a10eb59915b4bcf5209ea03eb.jpg" alt="alt text" /></p> <p>Anyone know what Butter Label is? Their site was not terribly&nbsp;descriptive&#8230;</p> <p><img src="http://www.zastica.com/files/uploads/348a7eeecd9b85e102a5f744ff68783c.jpg" alt="alt text" /></p> letterpress typography