<?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>Shai Perednik.com &#187; blockquote</title> <atom:link href="http://shaiperednik.com/tag/blockquote/feed/" rel="self" type="application/rss+xml" /><link>http://shaiperednik.com</link> <description>IT Guru &#38; Developer</description> <lastBuildDate>Fri, 30 Dec 2011 13:52:36 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>iPhone Apps Design Mistakes: Disregard Of Context</title><link>http://shaiperednik.com/2009/11/iphone-apps-design-mistakes-disregard-of-context/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=iphone-apps-design-mistakes-disregard-of-context</link> <comments>http://shaiperednik.com/2009/11/iphone-apps-design-mistakes-disregard-of-context/#comments</comments> <pubDate>Sun, 15 Nov 2009 21:00:32 +0000</pubDate> <dc:creator>System</dc:creator> <category><![CDATA[My Clippings]]></category> <category><![CDATA[Apple]]></category> <category><![CDATA[blockquote]]></category> <category><![CDATA[cli]]></category> <category><![CDATA[Extract]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Information]]></category> <category><![CDATA[IO]]></category> <category><![CDATA[ISO]]></category> <category><![CDATA[ma]]></category> <category><![CDATA[Mac]]></category> <category><![CDATA[man]]></category> <category><![CDATA[Photo]]></category> <category><![CDATA[php]]></category> <category><![CDATA[script]]></category> <category><![CDATA[video]]></category> <category><![CDATA[way]]></category> <category><![CDATA[XP]]></category><guid isPermaLink="false">http://shaiperednik.com/2009/11/iphone-apps-design-mistakes-disregard-of-context/</guid> <description><![CDATA[Automatically pulled from Google Starred    The iPhone will always be part of a much bigger picture. How well you address human and environmental factors will greatly determine the success of your product. All too often, iPhone developers create products in isolation from their customers. In order to create really appealing applications, developers must stop [...]]]></description> <content:encoded><![CDATA[<p>Automatically pulled from <a href="http://www.google.com/reader/shared/user/12161643044555212799/state/com.google/starred">Google Starred</a></p><table width="650"><tr><td width="650"><div> <img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/1e218_smashing-magazine-advertisement.gif" alt="" border="0" /><br /> <a href="http://creatives.commindo-media.de/www/delivery/ck.php?zoneid=56"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/9a8b2_avw.php?zoneid=56" border="0" alt="" /></a> <a href="http://creatives.commindo-media.de/www/delivery/ck.php?zoneid=63"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/9a8b2_avw.php?zoneid=63" border="0" alt="" /></a> <a href="http://creatives.commindo-media.de/www/delivery/ck.php?zoneid=64"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/6d5f5_avw.php?zoneid=64" border="0" alt="" /></a></div></td></tr></table><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/6d5f5_spacer.gif" alt="" border="0" width="1" height="1" /></p><p>The iPhone will always be part of a much bigger picture.  How well you address human and environmental factors will greatly determine the success of your product. All too often, iPhone developers create products in isolation from their customers. In order to create really appealing applications, developers must stop focusing only on the mechanisms of the apps. Zoom out: understand the person using the application, as well as the complex environmental factors surrounding that person.</p><p>To better understand the context of these design challenges, we’ll highlight several levels of human and environmental factors.</p><p>Also consider our related articles:</p><ul><li><a href="http://www.smashingmagazine.com/2009/07/21/iphone-apps-design-mistakes-overblown-visuals/" rel="bookmark" title="iPhone design mistakes: Overdesign">iPhone design mistakes: Over-Design</a></li><li><a href="http://www.smashingmagazine.com/2009/10/09/iphone-app-design-trends/">iPhone App Design Trends</a></li><li><a href="http://www.smashingmagazine.com/2009/08/11/how-to-create-your-first-iphone-application/">How to Create Your First iPhone Application</a></li></ul><h3>Level 1: You Are Here. To Create An App That Customers Love, Zoom Out</h3><p><strong>Level 1:</strong> The app itself.<br />This is how many developers view their apps. As a developer, you have a vision of what your product should look like and why customers will turn their attention to it. However, if you observe your product so closely, you may put it in the wrong context and design it for the wrong purposes and for the wrong users. This is why you need to zoom out.</p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/20623_myapp.jpg" width="419" height="330" /></p><p><strong>Level 2:</strong> A <em>person</em> is using this app.<br />That person has specific goals and challenges. In the section below we’ll start by exploring some of the most prominent — and most ignored — human factors pertaining to the iPhone. We’ll discuss basic physical ergonomics, visual limitations and common design mistakes.</p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/a309a_person.jpg" width="419" height="247" /></p><p><strong>Level 3:</strong> That person is using this app in a specific environment.<br />Step back and you’ll see that the app is a part of a complex social environment. It plays but a relatively small role in communication between people and helping people accomplish bigger goals. This is where the social components comes into play: networking, community, social-driven websites and applications and many other things create the environment — or the context — in which the application will be used.</p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/9b58c_crowd.jpg" width="419" height="251" /></p><p><strong>Level 4:</strong> The environment is part of a greater culture.<br />Your ability to address the unique needs of different cultures will affect the success of your product. Ignoring them is too expensive, especially if your app sells worldwide. Here it is important to understand that the environment is a part of global networking. You need to be aware of cultural differences, traditions and metaphors in order to create an application that will not only gain popularity in certain local circles, but will also have a global success.</p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/6be38_globe.jpg" width="419" height="310" /></p><h3>Level 2: Understand The Person’s Needs And Limitations</h3><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/bdf9a_person2.jpg" width="419" height="247" /></p><p>“Measure twice and cut once”: an effective strategy indeed. For you, the iPhone app developer, this means that you have to step back and answer these questions before you start coding:</p><ul><li>Who will be using your application?</li><li>What are the capabilities of that person?</li><li>What are the limitations of that person?</li></ul><p>Answering these questions will broaden your perspective and prepare you to address your customer’s needs. A whole Human Factors profession is dedicated to just that.</p><h4>Basic Physical Ergonomics</h4><p>Here are a couple of the most important physical-, cognitive- and ergonomic-related truths about the iPhone.</p><p><strong>1. Our fingers are not mouse pointers.</strong><br />Remember this property of our fingertips: their surface area is not equal to one pixel. In many applications, tappable objects are <a href="http://shaiperednik.com/tag/way/" class="st_tag internal_tag" rel="tag" title="Posts tagged with way">way</a> too small, making the interface frustrating to use. Here’s one example: in iFitness, different muscle groups are indicated with red pins. Tapping a pin brings up the name of that muscle. And if you tap the name, you get a list of exercises that develop that muscle.</p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/f431a_ifitness2.jpg" width="320" height="480" hspace="80" /></p><p>The pins are twice as small as those used in the <a href="http://shaiperednik.com/tag/google/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Google">Google</a> Maps app. Tapping the pin you want is very hard, because the surface of your fingertip covers an area of three or more pins. You end up tapping repeatedly on the area, enabling random pins, wishing you could sharpen your finger. After more than a few tries, you get lucky and hit the right one.</p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/36133_ifitness3d.png" width="529" height="284" /><br /><em>Which of these pins will be activated when you tap on it?</em></p><p>Here are some ways to solve these ergonomic challenges:</p><ol><li>Make buttons and other tappable objects bigger.</li><li>If making a button bigger is impossible, then enlarge the clickable area to be bigger then the button itself.</li><li>Reduce the number of options on each screen, and make the selection process sequential (e.g. Arm Muscles ? Biceps).</li><li>Implement multi-touch gestures within the interface. For example, selecting a muscle group in iFitness would be made easier by introducing a two-finger zoom feature.</li></ol><p><strong>2. We’re not superheroes, unfortunately.</strong><br />App designers need to take vision limitations into account. Mobile phones tend to be used in places with worse lighting conditions than computers. Think about those people who will be using your app on a bumpy bus or train or walking down a sunny street. Even if the technology is useful and perfectly executed, people will be reluctant to use the app if they find it hard to see what’s going on. Here are a few examples of potentially useful apps that do not account for vision limitations.</p><p><em>TweetDeck</em></p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/7d5e6_tweetdeck.png" width="320" height="480" /></p><p><em>Fish-tycoon</em></p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/e7d04_fish_tycoon.jpg" height="320" width="480" /></p><p>Here are some ways to avoid these mistakes:</p><ol><li>Choose only the elements that are absolutely necessary. Make them bigger, and get rid of everything else. If needed, create additional screens with fewer options.</li><li>Remember that pixel dimensions on the iPhone are smaller than those on your computer screen. So, screenshots viewed on your computer’s iPhone emulator look larger than they would on the iPhone itself, even though the resolution is the same.</li></ol><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/4d091_iphone_vs_simulator_dpi.jpg" width="480" /><br /><em>The author holds an iPhone (163 ppi) in front of <a href="http://shaiperednik.com/tag/apple/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Apple">Apple</a> Cinema’s 30-inch display (~100 ppi). Your iPhone screen layout may look fine on a computer emulator, but don’t be fooled: it will appear much smaller on the iPhone because of its smaller pixel dimensions.</em></p><h3>Level 3: Understand The Challenges Specific To The User’s Environment</h3><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/9b58c_crowd.jpg" width="419" height="251" /></p><h4>Goals and Environment</h4><p><strong>Your app will usually play a relatively small role in helping the user achieve a bigger goal.</strong> The better you understand what goals people have and what they need to achieve them, the better you can design your app to satisfy those needs. Mobile phones are often used in loud, distracting environments. A simple stroll through town brings plenty of noisy distractions (cars, dogs, mail carriers, etc.). Consider the following examples. Which voice memo app would do a better job?</p><table width="50%" border="0"><tr><td><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/25a8b_apple_voice_memos.png" width="320" height="480" /></td><td> </td><td><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/92d70_italk.png" width="320" height="480" /></td></tr><tr><td align="center"><strong>Apple Voice Memos</strong></td><td><strong>vs.</strong></td><td align="center"><strong>iTalk</strong></td></tr></table><p>Although Apple Voice Memos looks nice, iTalk addresses the average user’s goals and environment much better. Think about it: why would someone prefer to record a voice memo over writing a note? The audio format has fewer advantages than simple text. You can’t scan, edit or enhance audio files as easily as you can text. In most scenarios, text is a much more convenient format in which to exchange <a href="http://shaiperednik.com/tag/information/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Information">information</a>.</p><p>So, <strong>why</strong> and, more importantly, <strong>when</strong> would people use voice memos? When they are not able to type. The most common time is probably while driving.</p><p>According to the <a href="http://www.nytimes.com/2009/07/28/technology/28texting.html?pagewanted=1&amp;_r=1">New York Times</a>‘ summary of the <a href="http://www.vtti.vt.edu/PDF/7-22-09-VTTI-Press_Release_Cell_phones_and_Driver_Distraction.pdf">Virginia Tech Transportation Institute</a>’s findings, drivers who text have a 23-times greater risk of a collision than drivers who don’t text. Which application would be easier to use in this case? The one with the big shiny mic and the record button that is small and hard to reach (especially for right-handed people)? Or the one with the red record button half the size of the screen? Certainly the latter.</p><p>Confirming for the user that the recorder is activated is important, too.  Which interface communicates the device’s status more clearly?  Where do you tap when you’re done?</p><table width="50%" border="0"><tr><td><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/93e1d_voice_memos_active.jpg" width="320" height="480" /></td><td> </td><td><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/c3f6d_italk_active.jpg" width="320" height="480" /></td></tr><tr><td align="center"><strong>Apple Voice Memos</strong></td><td><strong>vs.</strong></td><td align="center"><strong>iTalk</strong></td></tr></table><p>Based on which design works better overall, iTalk wins. Apple Voice Memo looks great when you’re checking it out on a friend’s phone but performs poorly in a real-world context.</p><h4>Mobile Phones, Networking and Community</h4><p>The mobile phone is, without a doubt, a social tool. The greater the number of people involved, the more engaging the experience is. Think about it: if you were the only one with a phone, it wouldn’t be very useful. YouTube, Facebook and Twitter are driven by the understanding that we are social beings — we want to share! Imagine how dramatically designs that foster greater social interaction could change the mobile world.</p><p>With the seemingly endless ways to capture and share information, many people feel overwhelmed with information.  To help them cope, designers must exploit the iPhone’s platform to make their applications as efficient as possible. Here are some inspiring examples:</p><p><em>Bump</em></p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/c3f6d_bump.jpg" width="320" height="480" /></p><p>“Bump makes swapping contact information and photos as simple as bumping two phones together. No typing, no searching a list for the right person, no mistakes.” (iTunes Store description)</p><p><em>Mover</em></p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/1eb3d_mover_app.jpg" width="320" height="480" /></p><p>“Ever wished you could send something to the iPhone right next to you? Do it with style with Mover.”</p></p><p><em>Loopt</em></p><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/78492_ipodtouch_map_0.jpg" width="219" height="327" /></p><p>“Loopt transforms your mobile phone into a social compass to discover and navigate the world around you. Use Loopt to see who’s around, what to do, and where to go.”</p><p>How Loopt works (<a href="http://shaiperednik.com/tag/video/" class="st_tag internal_tag" rel="tag" title="Posts tagged with video">video</a>):</p></p><h3>Level 4: The Environment Is Part Of A Greater Culture.</h3><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/6be38_globe.jpg" width="419" height="310" /></p><p>Your ability to address the unique needs of different cultures will affect the success of your product. Ignoring them is too expensive, especially if your app sells worldwide. Design should adapt to regional challenges. Jacob Nielsen, a leading usability expert, gives us an <a href="http://www.useit.com/papers/international_usetest.html">illustration of this</a>:</p><blockquote><p> “In Sweden, the Automatic Teller Machines have very large buttons. I hadn’t noticed this particular design element on previous visits, which have usually been in warmer months. In 1996 I was in Stockholm in February and immediately realized why the ATM buttons are so big: you can press them wearing thick gloves.”</p></blockquote><p>Such insights are gained only by understanding the product in its real-world context. Here is the graphic designer’s point of view:</p><blockquote><p> “… Understanding the object in context moves graphic design from a purely formal arena to a social and political one.”<br />—<a href="http://www.hellerbooks.com/docs/books2.html">Steven Heller</a> and Karen Pomeroy in “Design Literacy,” Allworth Press, New York, 1997.</p></blockquote><p>More wisdom from <a href="http://www.useit.com/papers/international_usetest.html">Nielsen</a>:</p><blockquote><p> “A system must match the user’s cultural characteristics. This goes beyond simply avoiding offensive icons; it must accommodate the way business is conducted and the way people communicate in various countries.”</p></blockquote><p>Apple studied American users and addressed their goals. That’s why the iPhone is so popular in US. But it hasn’t succeeded in Japan. The handset is selling so poorly there that they are <a href="http://www.wired.com/gadgetlab/2009/02/why-the-iphone/">giving them away for free</a>.</p><h3>Conclusion: Excellence Comes From Hard Work</h3><p><strong>Designing a great app isn’t a simple task.</strong> Jacob Nielsen recently asserted that “<a href="http://www.useit.com/alertbox/mobile-usability.html">the mobile user experience is still miserable</a>.” Extracting user insights from testing is a challenge. People have difficulty telling you what they want; they usually only know it when they see it. But developers don’t have to tackle user research alone. Interaction designers are trained to find relevant user groups, talk to customers and read between the lines. They understand how real-world context affects an application’s design.</p><p>It takes a lot of leg work, but your efforts to understand user needs will be rewarded. The forefront of mobile technology is an exciting place to be.</p><h3>Related posts</h3><p>Please consider our related articles:</p><ul><li><a href="http://www.smashingmagazine.com/2009/07/21/iphone-apps-design-mistakes-overblown-visuals/" rel="bookmark" title="iPhone design mistakes: Overdesign">iPhone design mistakes: Over-Design</a></li><li><a href="http://www.smashingmagazine.com/2009/10/09/iphone-app-design-trends/">iPhone App Design Trends</a></li><li><a href="http://www.smashingmagazine.com/2009/08/11/how-to-create-your-first-iphone-application/">How to Create Your First iPhone Application</a></li></ul><p><em>Special thanks to Larissa Itomlenskis.</em></p><p><em>(al)</em></p><hr /><p>© Alexander Komarov for <a href="http://www.smashingmagazine.com">Smashing Magazine</a>, 2009. | <a href="http://www.smashingmagazine.com/2009/11/15/iphone-apps-design-mistakes-disregard-of-context/">Permalink</a> | <a href="http://www.smashingmagazine.com/2009/11/15/iphone-apps-design-mistakes-disregard-of-context/#comments">12 comments</a> | <a title="Bookmark in del.icio.us" href="http://del.icio.us/post?url=http://www.smashingmagazine.com/2009/11/15/iphone-apps-design-mistakes-disregard-of-context/&amp;title=iPhone%20Apps%20Design%20Mistakes:%20Disregard%20Of%20Context">Add to del.icio.us</a> | <a title="Bookmark in Digg" href="http://digg.com/submit?phase=2&amp;url=http://www.smashingmagazine.com/2009/11/15/iphone-apps-design-mistakes-disregard-of-context/">Digg this</a> | <a title="Stumble on StumbleUpon" href="http://www.stumbleupon.com/submit?url=http://www.smashingmagazine.com/2009/11/15/iphone-apps-design-mistakes-disregard-of-context/">Stumble on StumbleUpon!</a> | <a title="Tweet us!" href="http://twitter.com/home?status=@tweetmeme%20@smashingmag%20Reading%20'iPhone%20Apps%20Design%20Mistakes:%20Disregard%20Of%20Context'%20http://www.smashingmagazine.com/2009/11/15/iphone-apps-design-mistakes-disregard-of-context/">Tweet it!</a> | <a title="Bookmark in Reddit" href="http://reddit.com/submit?url=http://www.smashingmagazine.com/2009/11/15/iphone-apps-design-mistakes-disregard-of-context/">Submit to Reddit</a> | <a href="http://forum.smashingmagazine.com/">Forum Smashing Magazine</a><br /> Post tags:</p><p><a href="http://www.smashingmagazine.com/2009/11/15/iphone-apps-design-mistakes-disregard-of-context/">Go to Source</a></p><p><a href="http://shaiperednik.com/2009/11/iphone-apps-design-mistakes-disregard-of-context/" rel="bookmark">iPhone Apps Design Mistakes: Disregard Of Context</a> originally appeared on <a href="http://shaiperednik.com">Shai Perednik.com</a> on November 15, 2009.</p> ]]></content:encoded> <wfw:commentRss>http://shaiperednik.com/2009/11/iphone-apps-design-mistakes-disregard-of-context/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Simply Butons v2 with Javascript Enhancements</title><link>http://shaiperednik.com/2009/11/simply-butons-v2-with-javascript-enhancements/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=simply-butons-v2-with-javascript-enhancements</link> <comments>http://shaiperednik.com/2009/11/simply-butons-v2-with-javascript-enhancements/#comments</comments> <pubDate>Sun, 15 Nov 2009 01:00:25 +0000</pubDate> <dc:creator>System</dc:creator> <category><![CDATA[My Clippings]]></category> <category><![CDATA[blockquote]]></category> <category><![CDATA[css]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Javascript]]></category> <category><![CDATA[ma]]></category> <category><![CDATA[Mac]]></category> <category><![CDATA[Photo]]></category> <category><![CDATA[script]]></category> <category><![CDATA[way]]></category><guid isPermaLink="false">http://shaiperednik.com/2009/11/simply-butons-v2-with-javascript-enhancements/</guid> <description><![CDATA[Automatically pulled from Google Starred p51Labs came up with the Simply-Buttons v2. Buttons auto resize itself to fit text. There are 3 states: Inactive, Active, and Hover. They look and behave the same way in every browser and operating system. However, the caveats are the outlines on the buttons, the text is selectable. And These [...]]]></description> <content:encoded><![CDATA[<p>Automatically pulled from <a href="http://www.google.com/reader/shared/user/12161643044555212799/state/com.google/starred">Google Starred</a></p><p><strong>p51Labs</strong> came up with the <strong><a title="Simply Button 2.0" href="http://www.p51labs.com/simply-buttons-v2/">Simply-Buttons v2</a></strong>. Buttons auto resize itself to fit text. There are 3 states: Inactive, Active, and Hover. They look and behave the same <a href="http://shaiperednik.com/tag/way/" class="st_tag internal_tag" rel="tag" title="Posts tagged with way">way</a> in every browser and operating system. However, the caveats are the outlines on the buttons, the text is selectable. And These buttons are not mobile friendly.</p><p>With Simply-Buttons <a href="http://shaiperednik.com/tag/javascript/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Javascript">Javascript</a> component provided, you can solve the caveats above as well. You can easily modify the buttons look and feel.   You can do this by creating your own stylesheet. If you like this, you might be interested in <a title="Rounded CSS Buttons" href="http://www.webappers.com/2007/06/18/simple-round-css-buttons-wii-buttons/">Simple Round CSS Buttons</a> or <a title="Colorful Scalable Buttons" href="http://www.webappers.com/2009/07/23/colorful-and-scalable-buttons-with-css3-rgba/">Colorful and Scalable Buttons</a> or <a title="Beautiful Scalable CSS Buttons" href="http://www.webappers.com/2007/05/31/beautiful-scalable-css-buttons/">Beautiful Scalable CSS Buttons</a> as well.</p><p><a title="Simply Button 2.0" href="http://www.p51labs.com/simply-buttons-v2/"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/55595_buttons-2.jpg" alt="buttons-2" width="499" height="163" /></a></p><blockquote><p>Requirements: -<br /> Demo: <a title="Demo" rel="nofollow" href="http://www.p51labs.com/simply-buttons-v2/">http://www.p51labs.com/simply-buttons-v2/</a><br /> License: License Free</p></blockquote><div><h3>Related Posts</h3><ul><li><a href="http://www.webappers.com/2007/11/02/20-free-sunny-glossy-buttons-and-badges/" rel="bookmark" title="November 2, 2007">20 Free Sunny Glossy Buttons and Badges</a></li><li><a href="http://www.webappers.com/2007/05/31/beautiful-scalable-css-buttons/" rel="bookmark" title="May 31, 2007">Beautiful Scalable CSS Buttons</a></li><li><a href="http://www.webappers.com/2009/05/01/download-free-buttons-in-png-and-psd-format/" rel="bookmark" title="May 1, 2009">Download Free Buttons in PNG and PSD Format</a></li><li><a href="http://www.webappers.com/2009/07/23/colorful-and-scalable-buttons-with-css3-rgba/" rel="bookmark" title="July 23, 2009">Colorful and Scalable Buttons with CSS3 &amp; RGBA</a></li><li><a href="http://www.webappers.com/2007/06/14/how-to-make-sexy-buttons-with-css/" rel="bookmark" title="June 14, 2007">How to Make Sexy Buttons with CSS</a></li></ul></div><h3>Sponsors</h3><p><a href="http://www.pixmac.com/#WebAppers">Pixmac: Stock Photos, Royalty Free Pictures and Images</a></p><p><a href="http://www.webappers.com/2009/11/14/simply-butons-v2-with-javascript-enhancements/">Go to Source</a></p><p><a href="http://shaiperednik.com/2009/11/simply-butons-v2-with-javascript-enhancements/" rel="bookmark">Simply Butons v2 with Javascript Enhancements</a> originally appeared on <a href="http://shaiperednik.com">Shai Perednik.com</a> on November 14, 2009.</p> ]]></content:encoded> <wfw:commentRss>http://shaiperednik.com/2009/11/simply-butons-v2-with-javascript-enhancements/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Google Go: An Open-Source Programming Language</title><link>http://shaiperednik.com/2009/11/google-go-an-open-source-programming-language/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-go-an-open-source-programming-language</link> <comments>http://shaiperednik.com/2009/11/google-go-an-open-source-programming-language/#comments</comments> <pubDate>Thu, 12 Nov 2009 18:03:23 +0000</pubDate> <dc:creator>System</dc:creator> <category><![CDATA[My Clippings]]></category> <category><![CDATA[blockquote]]></category> <category><![CDATA[Build]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[IO]]></category> <category><![CDATA[Javascript]]></category> <category><![CDATA[ma]]></category> <category><![CDATA[man]]></category> <category><![CDATA[php]]></category> <category><![CDATA[script]]></category> <category><![CDATA[way]]></category> <category><![CDATA[XP]]></category><guid isPermaLink="false">http://shaiperednik.com/2009/11/google-go-an-open-source-programming-language/</guid> <description><![CDATA[Automatically pulled from Google Starred Google&#8217;s dominated search, online document collaboration, e-mail, telephony, and more, so why not programming, too? The tech giant has announced its own open-source, object-oriented programming language, called Go. The Google Open Source Blog says that &#8220;Go combines the development speed of working in a dynamic language like Python with the [...]]]></description> <content:encoded><![CDATA[<p>Automatically pulled from <a href="http://www.google.com/reader/shared/user/12161643044555212799/state/com.google/starred">Google Starred</a></p><p><img alt="GoogleGo.jpg" src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/8c33e_GoogleGo.jpg" width="153" height="55" /><a href="http://shaiperednik.com/tag/google/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Google">Google</a>&#8217;s dominated search, online document collaboration, e-mail, telephony, and more, so why not programming, too? The tech giant has announced its own open-source, object-oriented programming language, called Go.</p><p>The <a href="http://google-opensource.blogspot.com/2009/11/hey-ho-lets-go.html">Google Open Source Blog</a> says that &#8220;Go combines the development speed of working in a dynamic language like Python with the performance and safety of a compiled language like C or C++.&#8221; (If you don&#8217;t know what that means, don&#8217;t worry about it.) &#8220;Typical builds,&#8221; the blog continues, &#8220;feel instantaneous; even large binaries compile in just a few seconds. And the compiled code runs close to the speed of C.&#8221; Go supports multiprocessing, as well as true closures and reflection.<br /> The <a href="http://golang.org/">Go Web site</a> (golang.org) explains<br /> the rationale behind creating Go, mostly citing the change of the<br /> computer landscape that&#8217;s occurred over the past decade or so that&#8217;s<br /> seen very few (if any) major systems languages spring up: more powerful<br /> PCs, many of which use multicore processors; increased dependency<br /> management in software that&#8217;s not reflected in the &#8220;header files&#8221; of<br /> C-based languages; the growing desire for dynamically typed languages<br /> (such as Python and <a href="http://shaiperednik.com/tag/javascript/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Javascript">JavaScript</a>) instead of type systems such as Java<br /> and C++); and the poor support for concepts such as garbage collection<br /> and parallel computation.</p><p>Google says that Go takes full<br /> advantage of modern, multicore hardware; that it simplifies dependency<br /> analysis and avoids the overhead present in C-style languages (such as<br /> files and libraries); that Go&#8217;s type system has no hierarchy, which<br /> saves the programmer from having to define relationships between types;<br /> and that Go is fully garbage-collected and naturally supports<br /> concurrent execution and communication.</p><p>If you&#8217;re interested in<br /> getting started with Go, or you just want to learn more about its inner<br /> workings, Golang.org is loaded with tutorials, manuals, FAQs, and other<br /> documentation for easy assimilation<span>. </span>There&#8217;s<br /> even a section devoted to C++ programmers who want to learn Go. Also<br /> there to be found are code samples, such as the traditional beginning<br /> to all studies, &#8220;Hello, world!&#8221;:</p><blockquote><p>05    package main&lt;br&gt;<br />07 import fmt &quot;fmt&quot; // Package implementing formatted I/O.&lt;br&gt;<br />09 func main() { 10 fmt.Printf(&quot;Hello, world; or ???????? ?????; or ????? ??\n&quot;);&lt;br&gt;<br />11 }</p></blockquote><p>It&#8217;s<br /> <a href="http://shaiperednik.com/tag/way/" class="st_tag internal_tag" rel="tag" title="Posts tagged with way">way</a> too early to tell, of course, what the impact of Go on programmers<br /> or programming will be. But we have a feeling that in this way, as in<br /> so many others, quite a few people will fall behind Google and look at<br /> this as a convenient way of writing programs for modern hardware. If it<br /> won&#8217;t spell the end of the various programming languages in common use,<br /> it will undoubtedly represent at least the start of a major C change.<div></div><p><a href="http://www.appscout.com/2009/11/google_go_an_open-source_progr.php">Go to Source</a></p><p><a href="http://shaiperednik.com/2009/11/google-go-an-open-source-programming-language/" rel="bookmark">Google Go: An Open-Source Programming Language</a> originally appeared on <a href="http://shaiperednik.com">Shai Perednik.com</a> on November 12, 2009.</p> ]]></content:encoded> <wfw:commentRss>http://shaiperednik.com/2009/11/google-go-an-open-source-programming-language/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Google Offers &quot;Transparency&quot; in the Form of a Dashboard</title><link>http://shaiperednik.com/2009/11/google-offers-transparency-in-the-form-of-a-dashboard/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-offers-transparency-in-the-form-of-a-dashboard</link> <comments>http://shaiperednik.com/2009/11/google-offers-transparency-in-the-form-of-a-dashboard/#comments</comments> <pubDate>Fri, 06 Nov 2009 17:40:15 +0000</pubDate> <dc:creator>System</dc:creator> <category><![CDATA[My Clippings]]></category> <category><![CDATA[blockquote]]></category> <category><![CDATA[gmail]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Information]]></category> <category><![CDATA[IO]]></category> <category><![CDATA[ma]]></category> <category><![CDATA[php]]></category><guid isPermaLink="false">http://shaiperednik.com/2009/11/google-offers-transparency-in-the-form-of-a-dashboard/</guid> <description><![CDATA[Automatically pulled from Google Starred That whole &#8220;don&#8217;t be evil&#8221; thing is all well and good, but when a company&#8217;s whole goal is cataloging the world&#8217;s information, it would&#8211;at the very least&#8211;be nice to know what Google knows about you. The company has just launched Dashboard, which aggregates the different information its gathered from 20 [...]]]></description> <content:encoded><![CDATA[<p>Automatically pulled from <a href="http://www.google.com/reader/shared/user/12161643044555212799/state/com.google/starred">Google Starred</a></p><p>That whole &#8220;don&#8217;t be evil&#8221; thing is all well and good, but when a company&#8217;s whole goal is cataloging the world&#8217;s <a href="http://shaiperednik.com/tag/information/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Information">information</a>, it would&#8211;at the very least&#8211;be nice to know what <a href="http://shaiperednik.com/tag/google/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Google">Google</a> knows about you. The company has just launched <a href="http://www.appscout.com/www.google.com/dashboard">Dashboard</a>, which aggregates the different information its gathered from 20 different Google products, including <a href="http://shaiperednik.com/tag/gmail/" class="st_tag internal_tag" rel="tag" title="Posts tagged with gmail">Gmail</a>, Calendar, Docs, Web History, Orkut, YouTube, Picasa, Talk, Reader, Alerts, and Latitude.</p><p>You&#8217;ll need to sign in to view your own personal information. Users can also edit account information from the page, such as privacy settings. Of course transparency doesn&#8217;t mean that you can&#8217;t still pat yourself on the back. Writes Google,</p><blockquote><p>The scale and level of detail of the Dashboard is unprecedented, and we&#8217;re delighted to be the first Internet company to offer this&#8211;and we hope it will become the standard.</p></blockquote><p><a href="http://www.appscout.com/2009/11/google_offers_transparency_in.php">Go to Source</a></p><p><a href="http://shaiperednik.com/2009/11/google-offers-transparency-in-the-form-of-a-dashboard/" rel="bookmark">Google Offers &quot;Transparency&quot; in the Form of a Dashboard</a> originally appeared on <a href="http://shaiperednik.com">Shai Perednik.com</a> on November 6, 2009.</p> ]]></content:encoded> <wfw:commentRss>http://shaiperednik.com/2009/11/google-offers-transparency-in-the-form-of-a-dashboard/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>How to Create Mega Drop Down Menus with jQuery</title><link>http://shaiperednik.com/2009/11/how-to-create-mega-drop-down-menus-with-jquery/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-create-mega-drop-down-menus-with-jquery</link> <comments>http://shaiperednik.com/2009/11/how-to-create-mega-drop-down-menus-with-jquery/#comments</comments> <pubDate>Thu, 05 Nov 2009 13:20:04 +0000</pubDate> <dc:creator>System</dc:creator> <category><![CDATA[My Clippings]]></category> <category><![CDATA[blockquote]]></category> <category><![CDATA[css]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Information]]></category> <category><![CDATA[IO]]></category> <category><![CDATA[ma]]></category> <category><![CDATA[way]]></category> <category><![CDATA[XP]]></category><guid isPermaLink="false">http://shaiperednik.com/2009/11/how-to-create-mega-drop-down-menus-with-jquery/</guid> <description><![CDATA[Automatically pulled from Google Starred Do you remeber we have published a post of Accessible Very Tall Menus with jQuery and CSS? Some people found it not a good way to present information, because we cannot see everything on the menu in one go. Now SohTanaka has come up with another solution – Mega Drop [...]]]></description> <content:encoded><![CDATA[<p>Automatically pulled from <a href="http://www.google.com/reader/shared/user/12161643044555212799/state/com.google/starred">Google Starred</a></p><p>Do you remeber we have published a post of <a title="Tall Menus" href="http://www.webappers.com/2009/10/23/accessible-very-tall-menus-with-jquery-and-css/">Accessible Very Tall Menus with jQuery and CSS</a>? Some people found it not a good <a href="http://shaiperednik.com/tag/way/" class="st_tag internal_tag" rel="tag" title="Posts tagged with way">way</a> to present <a href="http://shaiperednik.com/tag/information/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Information">information</a>, because we cannot see everything on the menu in one go.</p><p>Now <strong>SohTanaka</strong> has come up with another solution – <a title="Mega Drop Down Menus" href="http://www.sohtanaka.com/web-design/mega-drop-downs-w-css-jquery/"><strong>Mega Drop Down Menus</strong></a>. According to usability expert Jakob Nielson, mega drop down menus tested to be more efficient for large scale websites.</p><p><a title="Mega Drop Down Menus" href="http://www.sohtanaka.com/web-design/mega-drop-downs-w-css-jquery/"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/abe5d_mega-dropdown-menu.jpg" alt="mega-dropdown-menu" width="480" height="167" /></a></p><blockquote><p>Requirements: jQuery Framework<br /> Demo: <a rel="nofollow" href="http://www.sohtanaka.com/web-design/examples/mega-dropdowns/">http://www.sohtanaka.com/web-design/examples/mega-dropdowns/</a><br /> License: License Free</p></blockquote><div><h3>Related Posts</h3><ul><li><a href="http://www.webappers.com/2009/09/24/greyscale-hover-effect-with-css-jquery/" rel="bookmark" title="September 24, 2009">Greyscale Hover Effect with CSS &amp; jQuery</a></li><li><a href="http://www.webappers.com/2009/05/06/how-to-create-an-image-rotator-with-jquery-and-css/" rel="bookmark" title="May 6, 2009">How to Create an Image Rotator with jQuery and CSS</a></li><li><a href="http://www.webappers.com/2009/05/13/sexy-page-peel-effect-tutorial-jquery-plugin/" rel="bookmark" title="May 13, 2009">Sexy Page Peel Effect Tutorial &amp; jQuery Plugin</a></li><li><a href="http://www.webappers.com/2009/09/10/create-a-simple-navigation-with-a-horizontal-subnav/" rel="bookmark" title="September 10, 2009">Create a Simple Navigation with a Horizontal Subnav</a></li><li><a href="http://www.webappers.com/2009/06/10/autoresizing-smart-columns-with-jquery/" rel="bookmark" title="June 10, 2009">Autoresizing Smart Columns with jQuery</a></li></ul></div><h3>Sponsors</h3><p><a href="http://www.dreamhost.com/r.cgi?311309/signup%7CWEBAPPER">Dreamhost: Get $50 Off with Coupon Code: WEBAPPERS</a></p><p><a href="http://www.webappers.com/2009/11/05/how-to-create-mega-drop-down-menus-with-jquery/">Go to Source</a></p><p><a href="http://shaiperednik.com/2009/11/how-to-create-mega-drop-down-menus-with-jquery/" rel="bookmark">How to Create Mega Drop Down Menus with jQuery</a> originally appeared on <a href="http://shaiperednik.com">Shai Perednik.com</a> on November 5, 2009.</p> ]]></content:encoded> <wfw:commentRss>http://shaiperednik.com/2009/11/how-to-create-mega-drop-down-menus-with-jquery/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Easy Form Validation Requires No Javascript Library</title><link>http://shaiperednik.com/2009/11/easy-form-validation-requires-no-javascript-library-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=easy-form-validation-requires-no-javascript-library-2</link> <comments>http://shaiperednik.com/2009/11/easy-form-validation-requires-no-javascript-library-2/#comments</comments> <pubDate>Wed, 04 Nov 2009 14:00:21 +0000</pubDate> <dc:creator>System</dc:creator> <category><![CDATA[My Clippings]]></category> <category><![CDATA[blockquote]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[IO]]></category> <category><![CDATA[Javascript]]></category> <category><![CDATA[ma]]></category> <category><![CDATA[script]]></category> <category><![CDATA[way]]></category><guid isPermaLink="false">http://shaiperednik.com/2009/11/easy-form-validation-requires-no-javascript-library-2/</guid> <description><![CDATA[Automatically pulled from Google Starred Validatious 2.0 is an easy form validation with unobtrusive JavaScript. Validatious requires no JavaScript library. However, if you’re already using one, Validatious can easily work with it, and even benefit from it. There are several settings allow you to control how and when Validatious does validation, how it displays errors [...]]]></description> <content:encoded><![CDATA[<p>Automatically pulled from <a href="http://www.google.com/reader/shared/user/12161643044555212799/state/com.google/starred">Google Starred</a></p><p><a title="Validatious 2.0" href="http://validatious.org/">Validatious 2.0</a> is an easy form validation with unobtrusive <a href="http://shaiperednik.com/tag/javascript/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Javascript">JavaScript</a>. Validatious requires no <a href="http://shaiperednik.com/tag/javascript/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Javascript">JavaScript</a> library. However, if you’re already using one, Validatious can easily work with it, and even benefit from it.</p><p>There are several settings allow you to control how and when <a title="Validatious 2.0" href="http://validatious.org/">Validatious</a> does validation, how it displays errors and more. If configuring isn’t enough, callbacks and easy overriding gives you complete control.</p><p>You can also add custom validators with only a couple of lines of JavaScript. If your site’s language is not english, you probably don’t want error messages in english. There are several ways of changing languages as well.</p><p><a title="Validatious 2.0" href="http://validatious.org/"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/731dc_form-validation.jpg" alt="form-validation" width="480" height="240" /></a></p><blockquote><p>Requirements: Javascript Enabled<br /> Demo: <a title="Demo" href="http://validatious.org/learn/examples">http://validatious.org/learn/examples</a><br /> License: BSD License</p></blockquote><div><h3>Related Posts</h3><ul><li><a href="http://www.webappers.com/2007/07/15/ajax-really-easy-real-time-form-validation/" rel="bookmark" title="July 15, 2007">Ajax Really Easy Real Time Form Validation</a></li><li><a href="http://www.webappers.com/2007/09/11/live-validation-validation-as-you-type/" rel="bookmark" title="September 11, 2007">Live Validation – Validation As You Type</a></li><li><a href="http://www.webappers.com/2008/08/11/14-ways-to-learn-from-creative-programmers/" rel="bookmark" title="August 11, 2008">14 Ways to Learn From Creative Programmers</a></li><li><a href="http://www.webappers.com/2008/03/22/google-ajax-language-api-for-detection-and-translation/" rel="bookmark" title="March 22, 2008">Google Ajax Language API for Detection and Translation</a></li><li><a href="http://www.webappers.com/2009/06/12/jquery-inline-form-validation-engine/" rel="bookmark" title="June 12, 2009">jQuery Inline Form Validation Engine</a></li></ul></div><h3>Sponsors</h3><p><a href="http://www.dreamhost.com/r.cgi?311309/signup%7CWEBAPPER">Dreamhost: Get $50 Off with Coupon Code: WEBAPPERS</a></p><div> <a href="http://feeds.feedburner.com/~ff/Webappers?a=4Yzk8wjDv2c:QIiAQVoqPrA:yIl2AUoC8zA"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/40ef2_Webappers?d=yIl2AUoC8zA" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/Webappers?a=4Yzk8wjDv2c:QIiAQVoqPrA:D7DqB2pKExk"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/40ef2_Webappers?i=4Yzk8wjDv2c:QIiAQVoqPrA:D7DqB2pKExk" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/Webappers?a=4Yzk8wjDv2c:QIiAQVoqPrA:V_sGLiPBpWU"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/40ef2_Webappers?i=4Yzk8wjDv2c:QIiAQVoqPrA:V_sGLiPBpWU" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/Webappers?a=4Yzk8wjDv2c:QIiAQVoqPrA:gIN9vFwOqvQ"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/40ef2_Webappers?i=4Yzk8wjDv2c:QIiAQVoqPrA:gIN9vFwOqvQ" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/Webappers?a=4Yzk8wjDv2c:QIiAQVoqPrA:F7zBnMyn0Lo"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/66405_Webappers?i=4Yzk8wjDv2c:QIiAQVoqPrA:F7zBnMyn0Lo" border="0" /></a></div><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/66405_4Yzk8wjDv2c" height="1" width="1" /></p><p><a href="http://feedproxy.google.com/~r/Webappers/~3/4Yzk8wjDv2c/">Go to Source</a></p><p><a href="http://shaiperednik.com/2009/11/easy-form-validation-requires-no-javascript-library-2/" rel="bookmark">Easy Form Validation Requires No Javascript Library</a> originally appeared on <a href="http://shaiperednik.com">Shai Perednik.com</a> on November 4, 2009.</p> ]]></content:encoded> <wfw:commentRss>http://shaiperednik.com/2009/11/easy-form-validation-requires-no-javascript-library-2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Easy Form Validation Requires No Javascript Library</title><link>http://shaiperednik.com/2009/11/easy-form-validation-requires-no-javascript-library/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=easy-form-validation-requires-no-javascript-library</link> <comments>http://shaiperednik.com/2009/11/easy-form-validation-requires-no-javascript-library/#comments</comments> <pubDate>Tue, 03 Nov 2009 21:20:04 +0000</pubDate> <dc:creator>System</dc:creator> <category><![CDATA[My Clippings]]></category> <category><![CDATA[blockquote]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[IO]]></category> <category><![CDATA[Javascript]]></category> <category><![CDATA[ma]]></category> <category><![CDATA[script]]></category> <category><![CDATA[way]]></category><guid isPermaLink="false">http://shaiperednik.com/2009/11/easy-form-validation-requires-no-javascript-library/</guid> <description><![CDATA[Automatically pulled from Google Starred Validatious 2.0 is an easy form validation with unobtrusive JavaScript. Validatious requires no JavaScript library. However, if you’re already using one, Validatious can easily work with it, and even benefit from it. There are several settings allow you to control how and when Validatious does validation, how it displays errors [...]]]></description> <content:encoded><![CDATA[<p>Automatically pulled from <a href="http://www.google.com/reader/shared/user/12161643044555212799/state/com.google/starred">Google Starred</a></p><p><a title="Validatious 2.0" href="http://validatious.org/">Validatious 2.0</a> is an easy form validation with unobtrusive <a href="http://shaiperednik.com/tag/javascript/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Javascript">JavaScript</a>. Validatious requires no <a href="http://shaiperednik.com/tag/javascript/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Javascript">JavaScript</a> library. However, if you’re already using one, Validatious can easily work with it, and even benefit from it.</p><p>There are several settings allow you to control how and when <a title="Validatious 2.0" href="http://validatious.org/">Validatious</a> does validation, how it displays errors and more. If configuring isn’t enough, callbacks and easy overriding gives you complete control.</p><p>You can also add custom validators with only a couple of lines of JavaScript. If your site’s language is not english, you probably don’t want error messages in english. There are several ways of changing languages as well.</p><p><a title="Validatious 2.0" href="http://validatious.org/"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/80ed8_form-validation.jpg" alt="form-validation" width="480" height="240" /></a></p><blockquote><p>Requirements: Javascript Enabled<br /> Demo: <a title="Demo" href="http://validatious.org/learn/examples">http://validatious.org/learn/examples</a><br /> License: BSD License</p></blockquote><div><h3>Related Posts</h3><ul><li><a href="http://www.webappers.com/2007/07/15/ajax-really-easy-real-time-form-validation/" rel="bookmark" title="July 15, 2007">Ajax Really Easy Real Time Form Validation</a></li><li><a href="http://www.webappers.com/2007/09/11/live-validation-validation-as-you-type/" rel="bookmark" title="September 11, 2007">Live Validation – Validation As You Type</a></li><li><a href="http://www.webappers.com/2008/08/11/14-ways-to-learn-from-creative-programmers/" rel="bookmark" title="August 11, 2008">14 Ways to Learn From Creative Programmers</a></li><li><a href="http://www.webappers.com/2008/03/22/google-ajax-language-api-for-detection-and-translation/" rel="bookmark" title="March 22, 2008">Google Ajax Language API for Detection and Translation</a></li><li><a href="http://www.webappers.com/2009/06/12/jquery-inline-form-validation-engine/" rel="bookmark" title="June 12, 2009">jQuery Inline Form Validation Engine</a></li></ul></div><h3>Sponsors</h3><p><a href="http://www.dreamhost.com/r.cgi?311309/signup%7CWEBAPPER">Dreamhost: Get $50 Off with Coupon Code: WEBAPPERS</a></p><p><a href="http://www.webappers.com/2009/11/03/easy-form-validation-requires-no-javascript-library/">Go to Source</a></p><p><a href="http://shaiperednik.com/2009/11/easy-form-validation-requires-no-javascript-library/" rel="bookmark">Easy Form Validation Requires No Javascript Library</a> originally appeared on <a href="http://shaiperednik.com">Shai Perednik.com</a> on November 3, 2009.</p> ]]></content:encoded> <wfw:commentRss>http://shaiperednik.com/2009/11/easy-form-validation-requires-no-javascript-library/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>New Screencast: Editable CSS3 Image Gallery</title><link>http://shaiperednik.com/2009/10/new-screencast-editable-css3-image%c2%a0gallery/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=new-screencast-editable-css3-image%25c2%25a0gallery</link> <comments>http://shaiperednik.com/2009/10/new-screencast-editable-css3-image%c2%a0gallery/#comments</comments> <pubDate>Mon, 19 Oct 2009 03:00:16 +0000</pubDate> <dc:creator>System</dc:creator> <category><![CDATA[My Clippings]]></category> <category><![CDATA[blockquote]]></category> <category><![CDATA[Build]]></category> <category><![CDATA[cli]]></category> <category><![CDATA[css]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[ma]]></category> <category><![CDATA[man]]></category> <category><![CDATA[Photo]]></category> <category><![CDATA[quick]]></category> <category><![CDATA[video]]></category><guid isPermaLink="false">http://shaiperednik.com/2009/10/new-screencast-editable-css3-image%c2%a0gallery/</guid> <description><![CDATA[Automatically pulled from Google Starred We build a pretty typical image gallery design pattern, a grid of images that pop up larger when clicked. But this image gallery page makes use of hot semantic HTML5 markup, loads of visual treats with CSS3 and jQuery, and made editable through the CMS PageLime. Quick reminder, the demo [...]]]></description> <content:encoded><![CDATA[<p>Automatically pulled from <a href="http://www.google.com/reader/shared/user/12161643044555212799/state/com.google/starred">Google Starred</a></p><blockquote><p>We <a href="http://shaiperednik.com/tag/build/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Build">build</a> a pretty typical image gallery design pattern, a grid of images that pop up larger when clicked. But this image gallery page makes use of hot semantic HTML5 markup, loads of visual treats with <a href="http://shaiperednik.com/tag/css/" class="st_tag internal_tag" rel="tag" title="Posts tagged with css">CSS</a>3 and jQuery, and made editable through the CMS PageLime. <a href="http://shaiperednik.com/tag/quick/" class="st_tag internal_tag" rel="tag" title="Posts tagged with quick">Quick</a> reminder, the demo is awesome-est in a WebKit browser (Safari or Chrome).</p></blockquote><p> </p><p><a href="http://css-tricks.com/examples/CSS3PhotoGallery/">View Demo</a>   <a href="http://css-tricks.com/examples/CSS3PhotoGallery.zip">Download Files</a>   <a href="http://css-tricks.com/video-screencasts/74-editable-css3-image-gallery/">View Screencast</a></p><p> </p><p><a href="http://css-tricks.com/video-screencasts/74-editable-css3-image-gallery/"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/632f2_screencast-74-thumb.jpg" width="249" height="154" alt="" /></a></p><div> <a href="http://feeds.feedburner.com/~ff/CssTricks?a=nOUi6oeiN3Q:RrfRNMyzjsE:yIl2AUoC8zA"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/bdcbe_CssTricks?d=yIl2AUoC8zA" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/CssTricks?a=nOUi6oeiN3Q:RrfRNMyzjsE:F7zBnMyn0Lo"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/bdcbe_CssTricks?i=nOUi6oeiN3Q:RrfRNMyzjsE:F7zBnMyn0Lo" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/CssTricks?a=nOUi6oeiN3Q:RrfRNMyzjsE:gIN9vFwOqvQ"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/bdcbe_CssTricks?i=nOUi6oeiN3Q:RrfRNMyzjsE:gIN9vFwOqvQ" border="0" /></a></div><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/1366a_nOUi6oeiN3Q" height="1" width="1" /></p><p><a href="http://feedproxy.google.com/~r/CssTricks/~3/nOUi6oeiN3Q/">Go to Source</a></p><p><a href="http://shaiperednik.com/2009/10/new-screencast-editable-css3-image%c2%a0gallery/" rel="bookmark">New Screencast: Editable CSS3 Image Gallery</a> originally appeared on <a href="http://shaiperednik.com">Shai Perednik.com</a> on October 18, 2009.</p> ]]></content:encoded> <wfw:commentRss>http://shaiperednik.com/2009/10/new-screencast-editable-css3-image%c2%a0gallery/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>New Screencast: Building a Website (2 of 3): HTML/CSS Conversion</title><link>http://shaiperednik.com/2009/10/new-screencast-building-a-website-2-of-3-htmlcss-conversion/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=new-screencast-building-a-website-2-of-3-htmlcss-conversion</link> <comments>http://shaiperednik.com/2009/10/new-screencast-building-a-website-2-of-3-htmlcss-conversion/#comments</comments> <pubDate>Wed, 14 Oct 2009 04:00:42 +0000</pubDate> <dc:creator>System</dc:creator> <category><![CDATA[My Clippings]]></category> <category><![CDATA[blockquote]]></category> <category><![CDATA[Build]]></category> <category><![CDATA[css]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[IO]]></category> <category><![CDATA[ma]]></category> <category><![CDATA[Photo]]></category> <category><![CDATA[video]]></category><guid isPermaLink="false">http://shaiperednik.com/2009/10/new-screencast-building-a-website-2-of-3-htmlcss-conversion/</guid> <description><![CDATA[Automatically pulled from Google Starred In part 2 of this series, we begin the HTML/CSS conversion of the Photoshop mockup we created in part one. We start with a very skeletal project framework. Then we take a look at the Photoshop file layer organization. Then we start from the bottom up, creating the pieces we [...]]]></description> <content:encoded><![CDATA[<p>Automatically pulled from <a href="http://www.google.com/reader/shared/user/12161643044555212799/state/com.google/starred">Google Starred</a></p><blockquote><p>In part 2 of this series, we begin the HTML/<a href="http://shaiperednik.com/tag/css/" class="st_tag internal_tag" rel="tag" title="Posts tagged with css">CSS</a> conversion of the Photoshop mockup we created in part one. We start with a very skeletal project framework. Then we take a look at the Photoshop file layer organization. Then we start from the bottom up, creating the pieces we need from the Photoshop file and writing the HTML and <a href="http://shaiperednik.com/tag/css/" class="st_tag internal_tag" rel="tag" title="Posts tagged with css">CSS</a> we need to get the job done. Much of the work isn’t actually “slicing” the Photoshop file, but looking closely at it and trying to mimic what is done there with correct markup and <a href="http://shaiperednik.com/tag/css/" class="st_tag internal_tag" rel="tag" title="Posts tagged with css">CSS</a> techniques.</p></blockquote><p><a href="http://css-tricks.com/video-screencasts/72-building-a-website-2-of-3-htmlcss-conversion/"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/9fff1_screencast-72-thumb.jpg" width="249" height="154" alt="" /></a></p><div> <a href="http://feeds.feedburner.com/~ff/CssTricks?a=nOUi6oeiN3Q:tuaJoDr8g94:yIl2AUoC8zA"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/9fff1_CssTricks?d=yIl2AUoC8zA" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/CssTricks?a=nOUi6oeiN3Q:tuaJoDr8g94:F7zBnMyn0Lo"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/9fff1_CssTricks?i=nOUi6oeiN3Q:tuaJoDr8g94:F7zBnMyn0Lo" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/CssTricks?a=nOUi6oeiN3Q:tuaJoDr8g94:gIN9vFwOqvQ"><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/9fff1_CssTricks?i=nOUi6oeiN3Q:tuaJoDr8g94:gIN9vFwOqvQ" border="0" /></a></div><p><img src="http://shaiperednik.com/wp-content/plugins/wp-o-matic/cache/ff38c_nOUi6oeiN3Q" height="1" width="1" /></p><p><a href="http://feedproxy.google.com/~r/CssTricks/~3/nOUi6oeiN3Q/">Go to Source</a></p><p><a href="http://shaiperednik.com/2009/10/new-screencast-building-a-website-2-of-3-htmlcss-conversion/" rel="bookmark">New Screencast: Building a Website (2 of 3): HTML/CSS Conversion</a> originally appeared on <a href="http://shaiperednik.com">Shai Perednik.com</a> on October 13, 2009.</p> ]]></content:encoded> <wfw:commentRss>http://shaiperednik.com/2009/10/new-screencast-building-a-website-2-of-3-htmlcss-conversion/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Make EMC Retrospect Email on Events</title><link>http://shaiperednik.com/2009/09/make-emc-retrospect-email-on-events/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=make-emc-retrospect-email-on-events</link> <comments>http://shaiperednik.com/2009/09/make-emc-retrospect-email-on-events/#comments</comments> <pubDate>Tue, 15 Sep 2009 21:46:28 +0000</pubDate> <dc:creator>Shai Perednik</dc:creator> <category><![CDATA[Code]]></category> <category><![CDATA[backup]]></category> <category><![CDATA[blockquote]]></category> <category><![CDATA[email]]></category> <category><![CDATA[emc]]></category> <category><![CDATA[event handler]]></category> <category><![CDATA[Information]]></category> <category><![CDATA[IO]]></category> <category><![CDATA[Mac]]></category> <category><![CDATA[Microsoft]]></category> <category><![CDATA[retrospect]]></category> <category><![CDATA[script]]></category> <category><![CDATA[ssl]]></category> <category><![CDATA[tls]]></category> <category><![CDATA[XP]]></category><guid isPermaLink="false">http://shaiperednik.com/?p=656</guid> <description><![CDATA[EMC Retrospect 7.6 has a built email notification option.  However, its premetive and doesn't allow for custom messages,  alternate ports, or TLS/SSL.So after much digging and hacking I through together the script below which does the job.  This is based on the example vbs script supplied by retrospect, so cudos to them for the initial work.]]></description> <content:encoded><![CDATA[<div class="wp-caption alignleft" style="width: 471px"><a href="http://upload.wikimedia.org/wikipedia/commons/e/ee/Backup_Backup_Backup_-_And_Test_Restores.jpg" rel="lightbox[656]"><img class=" " title="Backup PC" src="http://upload.wikimedia.org/wikipedia/commons/e/ee/Backup_Backup_Backup_-_And_Test_Restores.jpg" alt="Are you backed up?" width="461" height="444" /></a><p class="wp-caption-text">Are you backed up?</p></div><p><a href="http://shaiperednik.com/tag/emc/" class="st_tag internal_tag" rel="tag" title="Posts tagged with emc">EMC</a> <a href="http://shaiperednik.com/tag/retrospect/" class="st_tag internal_tag" rel="tag" title="Posts tagged with retrospect">Retrospect</a> 7.6 has a built <a href="http://shaiperednik.com/tag/email/" class="st_tag internal_tag" rel="tag" title="Posts tagged with email">email</a> notification option.  However, its premetive and doesn’t allow for custom messages,  alternate ports, or <a href="http://shaiperednik.com/tag/tls/" class="st_tag internal_tag" rel="tag" title="Posts tagged with tls">TLS</a>/<a href="http://shaiperednik.com/tag/ssl/" class="st_tag internal_tag" rel="tag" title="Posts tagged with ssl">SSL</a>.</p><p>So after much digging and hacking I through together the <a href="http://shaiperednik.com/tag/script/" class="st_tag internal_tag" rel="tag" title="Posts tagged with script">script</a> below which does the job.  This is based on the example vbs <a href="http://shaiperednik.com/tag/script/" class="st_tag internal_tag" rel="tag" title="Posts tagged with script">script</a> supplied by retrospect, so cudos to them for the initial work.</p><p><a href="http://shaiperednik.com/wp-content/uploads/2009/09/retroeventhandler.vbs">Download retroeventhandler.vbs </a></p><p>Also, note that you will need to change your settings according in the last part of the script.</p><pre class="brush: vb; title: ; notranslate">
'RetroEventHandler.vbs
'
'	  Sample VBScript <a href="http://shaiperednik.com/tag/event-handler/" class="st_tag internal_tag" rel="tag" title="Posts tagged with event handler">event handler</a> for the Retrospect application.
'
'
' Sample call:
' wscript RetroEventHandler.vbs &quot;StartApp&quot; &quot;12/14/99 16:32 PM&quot; &quot;true&quot;
'
'Copyright 2000-2006 EMC Corporation
'

Option Explicit

dim WshShell
Set WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)

dim msgDivider
msgDivider = &quot;:&quot; &amp; vbCrLf &amp; vbCrLf

Call HandleEvent()

' FormatError
'	  Return a string for the passed in error code and error string.
' This is a utility function for the scripts below.
'
Function FormatError(errCode, errMsg)
FormatError = &quot;error #&quot; &amp; errCode &amp; &quot; (&quot; &amp; errMsg &amp; &quot;)&quot;
End Function

'
' FormatSeconds
'     Return a string representing the passed in number of seconds.
' E.g.
'     &quot;3 hours 1 minute&quot;
'     &quot;2 hours 2 seconds&quot;
'
Function FormatSeconds(secondsStr)
dim secStr
dim seconds

' convert string to number of seconds
seconds = 0
On Error Resume Next
seconds = 1 * secondsStr
On Error GoTo 0

secStr = &quot;&quot;
If (seconds &gt;= 86400 * 2) Then
secStr = secStr &amp; (seconds \ 86400) &amp; &quot; days &quot;
seconds = seconds mod 86400
ElseIf (seconds &gt;= 86400) Then
secStr = secStr  &amp; &quot;1 day &quot;
seconds = seconds mod 86400
End If

If (seconds &gt;= 3600 * 2) Then
secStr = secStr &amp; (seconds \ 3600) &amp; &quot; hours &quot;
seconds = seconds mod 3600
ElseIf (seconds &gt;= 3600) Then
secStr = secStr  &amp; &quot;1 hour &quot;
seconds = seconds mod 3600
End If

If (seconds &gt;= 60 * 2) Then
secStr = secStr &amp; (seconds \ 60) &amp; &quot; minutes &quot;
seconds = seconds mod 60
ElseIf (seconds &gt;= 60) Then
secStr = secStr &amp; &quot;1 minute &quot;
seconds = seconds mod 60
End If

If (seconds &gt;= 2) Then
secStr = secStr &amp; seconds &amp; &quot; seconds &quot;
ElseIf (seconds = 1) Then
secStr = secStr &amp; &quot;1 second &quot;
End If

If (Len(secStr) &gt; 2) Then
FormatSeconds = Left(secStr, Len(secStr) - 1)
Else
FormatSeconds = &quot;0 seconds&quot;
End If
End Function

' ReturnResult
'     If result is false, create a file to inform the caller we wish to abort.
' Quit when done.
'
Sub ReturnResult(msg, interventionFile)
Dim fs, f

Set fs = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set f = fs.CreateTextFile(interventionFile)
f.Write msg
f.Close
End Sub

'
' StartApp
'	  Sent when Retrospect launches. wasAutoLaunched is true if Retrospect was
' launched automatically to run a scheduled script.
'
Sub StartApp(startDate, wasAutoLaunched, interventionFile)
Dim msg

If (wasAutoLaunched) Then
msg = &quot;StartApp&quot; &amp; msgDivider &amp; _
&quot;Retrospect autolaunched on &quot; &amp; startDate &amp; &quot;.&quot;
Else
msg = &quot;StartApp&quot; &amp; msgDivider &amp; _
&quot;Retrospect launched on &quot; &amp; startDate &amp; &quot;.&quot;
End If
SendMail msg
End Sub

'
' EndApp
'	  Sent when Retrospect is quiting.
'
Sub EndApp(endDate)
Dim msg

msg = &quot;EndApp&quot; &amp; msgDivider &amp; _
&quot;Retrospect quit on &quot; &amp; endDate &amp; &quot;.&quot;
SendMail msg
End Sub

'
' StartBackupServer
'	  Sent when the BackupServer is started via either a script or manually.
' Return false to prevent <a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">backup</a> server starting
'
Sub StartBackupServer(startDate, interventionFile)
Dim msg

msg = &quot;StartBackupServer&quot; &amp; msgDivider &amp; _
&quot;Retrospect <a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">Backup</a> Server is starting on &quot; &amp; _
startDate &amp; &quot;.&quot; &amp; vbCrLf &amp; _
&quot;Let <a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">Backup</a> Server run?&quot;

SendMail msg
End Sub

'
' StopBackupServer
'	  Sent when <a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">Backup</a> Server stops.
'
Sub StopBackupServer(endDate)
Dim msg

msg =  &quot;StopBackupServer&quot; &amp; msgDivider &amp; _
&quot;Retrospect <a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">Backup</a> Server stopped on &quot; &amp; endDate &amp; &quot;.&quot;
SendMail msg
End Sub

'
' StartScript
'	  Sent when a script is run, either manually or as part of a scheduled
' execution. Return false to prevent script starting
'
Sub StartScript(scriptName, startDate, interventionFile)
Dim msg

msg = &quot;StartScript&quot; &amp; msgDivider &amp; _
&quot;Retrospect script '&quot; &amp; scriptName &amp; &quot;' is starting on &quot; &amp; _
startDate &amp; &quot;.&quot;

SendMail msg
End Sub

'
' EndScript
'	  Sent when a script finishes.
' numErrors is the total number of errors that occured. fatalErrCode is zero if
' the script was able to complete, otherwise it is a negative number for the
' error that caused the script to abort execution. errMsg is &quot;successful&quot; if
' there was no fatal error, otherwise it is the description of the error.
'
Sub EndScript(scriptName, _
numErrors, _
fatalErrCode, _
errMsg)
Dim msg

msg = &quot;EndScript&quot; &amp; msgDivider &amp; &quot;Retrospect script '&quot; &amp; scriptName &amp; &quot;' finished&quot;

If (fatalErrCode &lt;&gt; 0) Then
msg = msg &amp; &quot;.&quot; &amp; vbCrLf &amp; &quot;The script was stopped by &quot; &amp; _
FormatError(fatalErrCode, errMsg) &amp; &quot;.&quot;
ElseIf (numErrors = 0) Then
msg = msg &amp; &quot; with no errors.&quot;
ElseIf (numErrors = 1) Then
msg = msg &amp; &quot; with one non-fatal error.&quot;
Else
msg = msg &amp; &quot; with &quot; &amp; FormatNumber(numErrors,0) &amp; &quot; non-fatal errors.&quot;
End If

SendMail msg
End Sub

' StartSource
'	  Sent immediately before a script backs up a source volume.
' sourceName is the volume name that is being backed up, it will be prefaced
' with &quot;My Computer\&quot; if it is a local volume or the clientName otherwise.
' sourcePath is the file system path of the volume.
'

Sub StartSource(scriptName, sourceName, sourcePath, clientName, interventionFile)
Dim myComputerName
Dim msg

myComputerName = &quot;My Computer&quot;
msg = &quot;StartSource&quot; &amp; msgDivider
If (Left(sourceName, Len(myComputerName)) = myComputerName) Then
sourceName = Right(sourceName, Len(sourceName) - Len(myComputerName) - 1)
msg = msg &amp; &quot;The local volume '&quot; &amp; sourceName &amp; &quot;' at &quot; &amp; sourcePath &amp; _
&quot; is about to be backed up by script '&quot; &amp; scriptName &amp;&quot;'.&quot;
Else
msg = msg &amp; &quot;Client '&quot; &amp; clientName &amp; &quot;'s' volume, '&quot; &amp; sourceName &amp; &quot;' at &quot; &amp; _
sourcePath &amp; &quot; is about to be backed up by &quot; &amp; scriptName &amp; &quot;.&quot;
End If

SendMail msg
End Sub

'
' EndSource
'
'     Sent after a script has completed backing up a source. As above, sourceName
' is prefaced with either the client name or &quot;My Computer\&quot;.
'

Sub EndSource( _
scriptName, _
sourceName, _
sourcePath, _
clientName, _
KBBackedUp, _
numFiles, _
durationInSecs, _
backupStartDate, _
backupStopDate, _
scriptStartDate, _
backupSet, _
backupAction, _
parentVolume, _
numErrors, _
fatalErrCode, _
errMsg)
Dim myComputerName
Dim msg

myComputerName = &quot;My Computer&quot;
msg = &quot;EndSource&quot; &amp; msgDivider

' Volume/Client
If (Left(clientName, Len(myComputerName)) = myComputerName) Then
sourceName = Right(sourceName, Len(sourceName) - Len(myComputerName) - 1)
msg = msg &amp; &quot;The local volume '&quot; &amp; sourceName &amp; &quot;' at &quot; &amp; sourcePath
Else
msg = msg &amp; &quot;Client '&quot; &amp; clientName &amp; &quot;'s' volume, '&quot; &amp; sourceName &amp; _
&quot;' at &quot; &amp; sourcePath
End If

' Errors
If (fatalErrCode &lt;&gt; 0) Then
msg = msg &amp; &quot; stopped by &quot; &amp; FormatError(fatalErrCode, errMsg) &amp; &quot;.&quot;
ElseIf (numErrors = 0) Then
msg = msg &amp; &quot; completed successfully.&quot;
ElseIf (numErrors = 1) Then
msg = msg &amp; &quot; completed with one non-fatal error.&quot;
Else
msg = msg &amp; &quot; completed with &quot; &amp; FormatNumber(numErrors, 0) &amp; &quot; non-fatal errors.&quot;
End If
msg = msg &amp; vbCrlf &amp; &quot;Script '&quot; &amp; scriptName &amp; &quot;' finished a &quot; &amp; backupAction &amp; _
&quot; <a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">backup</a> to '&quot; &amp; backupSet &amp; &quot;'. &quot; &amp; FormatNumber(numFiles, 0) &amp; _
&quot; files (&quot; &amp; FormatNumber(KBBackedUp, 0) &amp; &quot;KB) were backed up in &quot; &amp; _
FormatSeconds(durationInSecs) &amp; &quot;.&quot; &amp; vbCrlf
msg = msg &amp; &quot;The script started on &quot; &amp; scriptStartDate &amp; _
&quot; and the <a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">backup</a> started on &quot; &amp; backupStartDate &amp; _
&quot; and finished on &quot; &amp; backupStopDate &amp; &quot;.&quot;

SendMail msg
End Sub

'
' MediaRequest
'
'     Sent before Retrospect requests media needed for a <a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">backup</a>.
'
'     Return true to fail media request.
'

Sub MediaRequest(mediaLabel, _
mediaName, _
mediaIsKnown, _
secondsWaited, _
interventionFile)
Dim msg

msg = &quot;MediaRequest&quot; &amp; msgDivider &amp; _
&quot;Retrospect is requesting media '&quot; &amp; mediaName &amp; &quot;' (&quot; &amp; mediaLabel &amp; &quot;)&quot;
If (mediaIsKnown) Then
msg = msg &amp; vbCrlf &amp; &quot;Retrospect has backed up to this media before.&quot;
Else
msg = msg &amp; vbCrlf &amp; &quot;This is either a new or unknown media.&quot;
End If
msg = msg &amp; vbCrlf &amp; &quot;Retrospect has waited &quot; &amp; FormatSeconds(secondsWaited*60) &amp; &quot; so far.&quot;
msg = msg &amp; vbCrlf &amp; &quot;Continue with the media request?&quot;

SendMail msg
End Sub

'
' TimedOutMediaRequest
'
'     Sent before Retrospect times out on waiting for a media request. Note that
' the &quot;Media Request Timeout&quot; option in the preferences must be turned on to
' receive this event.
'
'     Return true to reset timeout request.
'

Sub TimedOutMediaRequest(mediaLabel, _
mediaName, _
mediaIsKnown, _
secondsWaited, _
interventionFile)
Dim msg

msg = &quot;TimedOutMediaRequest&quot; &amp; msgDivider &amp; _
&quot;Retrospect's media request for '&quot; &amp; mediaName &amp; &quot;' (&quot; &amp; mediaLabel &amp; _
&quot;) is about to time out after waiting &quot; &amp; FormatSeconds(secondsWaited*60) &amp; &quot;.&quot; &amp; vbCrLf &amp; _
&quot;Let Retrospect time out?&quot;

SendMail msg
End Sub

'
' ScriptCheckFailed
'
'     Sent before Retrospect quits when the next script to execute will not be
' able to run. &quot;Check validity of next script&quot; must be checked in Retrospect's
' preferences (Notification:Alerts) to receive this event.
'

Sub ScriptCheckFailed( _
scriptName, _
nextDate, _
reason, _
errCode, _
errMsg)
Dim msg

msg = &quot;ScriptCheckFailed&quot; &amp; msgDivider &amp; _
&quot;The Retrospect script '&quot; &amp; scriptName &amp; &quot;' will not run on &quot; &amp; _
nextDate &amp; vbCrLf &amp; _
FormatError(errCode, errMsg) &amp; &quot;.&quot; &amp; vbCrLf &amp; _
&quot;Retrospect's dialog: '&quot; &amp; reason &amp; &quot;'&quot;
SendMail msg
End Sub

'
' NextExec
'
'     Sent before Retrospect quits when the next script to execute is able to
' run. &quot;Check validity of next script&quot; must be checked in Retrospect's
' preferences (Notification:Alerts) to receive this event.
'

Sub NextExec(scriptName, nextDate)
Dim msg

msg = &quot;NextExec&quot; &amp; msgDivider
msg = msg &amp; &quot;Script '&quot; &amp; scriptName &amp; &quot;' is scheduled to run on &quot; &amp; _
nextDate &amp; &quot;.&quot;
SendMail msg
End Sub

'
' StopSched
'
'     Sent when an unattended script is scheduled to stop. Return false to keep
' script running.
'

Sub StopSched(scriptName, schedStopDate, interventionFile)
Dim msg

msg = &quot;StopSched&quot; &amp; msgDivider
msg = msg &amp; &quot;Script '&quot; &amp; scriptName &amp; &quot;' is scheduled to stop on &quot; &amp; _
schedStopDate &amp; &quot;.&quot;

msg = msg &amp; vbCrLf &amp; &quot;Let the script stop?&quot;
btnClicked = WshShell.Popup(msg, 120, &quot;RetroEventHandler:StopSched&quot;, 1)
SendMail msg
End Sub

'
' PasswordEntry
'
'     Sent when a password is entered.
'

Sub PasswordEntry( _
actionString, _
attempts, _
errCode, _
errMsg)
Dim msg

msg = &quot;PasswordEntry&quot; &amp; msgDivider
If (errCode &lt;&gt; 0) Then
msg = msg &amp; &quot;Login failed after &quot; &amp; FormatNumber(attempts, 0) &amp; _
&quot; attempts (error #&quot; &amp; errCode &amp; &quot; - &quot; &amp; errMsg &amp; &quot;)&quot; &amp; &quot;.&quot; &amp; _
vbCrLf &amp; &quot;Retrospect's dialog: &quot; &amp; actionString &amp; &quot;&quot;
ElseIf (attempts = 1) Then
msg = msg &amp; &quot;Login successful&quot; &amp; vbCrLf &amp; &quot;Retrospect's dialog: &quot; &amp; _
actionString &amp; &quot;&quot;
Else
msg = msg &amp; &quot;Login successful after &quot; &amp; FormatNumber(attempts, 0) &amp; _
&quot; attempts.&quot; &amp; vbCrLf &amp; &quot;Retrospect's dialog: &quot; &amp; actionString &amp;_
&quot;&quot;
End If
SendMail msg
End Sub

'
' FatalBackupError
'
'     Sent when a unrecoverable error is detected, such as a hardware
' failure
'

Sub FatalBackupError( _
scriptName, _
reason, _
errCode, _
errMsg, _
errZone, _
interventionFile)

Dim msg

msg = &quot;FatalBackupError&quot; &amp; msgDivider
msg = msg &amp; &quot;Script '&quot; &amp; scriptName &amp; &quot;' failed in &quot; &amp; errZone &amp; _
&quot; &quot; &amp; FormatError(errCode, errMsg) &amp; vbCrLf &amp; _
reason &amp; &quot;.&quot; &amp; vbCrLf &amp; _
&quot;Retrospect's dialog: &quot; &amp; &quot;'&quot; &amp; reason &amp; &quot;'&quot; &amp; vbCrLf &amp; _
&quot;Do you want to display a modal dialog?&quot;
SendMail msg
End Sub

'
' HandleEvent
'	  Dispatch event to each possible function above.
'

Sub HandleEvent()
Dim cmdArgs
Dim eventMsg
Dim argNo
Dim debugArgs

Set cmdArgs = WScript.Arguments

If (cmdArgs.Count &lt; 1) Then
WshShell.Popup &quot;This is a sample Retrospect external script written in VBScript.&quot; &amp; _
vbCrLf &amp; _
vbCrLf &amp; &quot;To use this file on the <a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">backup</a> server, move it to Retrospect's directory.&quot; &amp; _
vbCrLf &amp; &quot;To use this file on a client machine, copy it to the directory containing&quot; &amp; _
vbCrLf &amp; &quot;the Retrospect client ('retroclient.exe').&quot;
Exit Sub
Else
eventMsg = cmdArgs(0)
End If

' get args for debugging
debugArgs = &quot;Arguments:&quot;
For argNo = 0 To cmdArgs.Count - 1
debugArgs = debugArgs &amp; vbCrlf &amp; FormatNumber(argNo, 0) &amp; &quot;:&quot; &amp; cmdArgs(argNo)
Next
'WshShell.Popup debugArgs								' Uncomment for debugging

' Handle event
Select Case eventMsg
Case &quot;StartApp&quot;
StartApp cmdArgs(1), cmdArgs(2) = &quot;true&quot;, cmdArgs(3)
Case &quot;EndApp&quot;
EndApp cmdArgs(1)
Case &quot;StartBackupServer&quot;
StartBackupServer cmdArgs(1), cmdArgs(2)
Case &quot;StopBackupServer&quot;
StopBackupServer cmdArgs(1)
Case &quot;StartScript&quot;
StartScript cmdArgs(1), cmdArgs(2), cmdArgs(3)
Case &quot;EndScript&quot;
EndScript cmdArgs(1), cmdArgs(2), cmdArgs(3), cmdArgs(4)
Case &quot;StartSource&quot;
StartSource cmdArgs(1), cmdArgs(2), cmdArgs(3), cmdArgs(4), cmdArgs(5)
Case &quot;EndSource&quot;
EndSource cmdArgs(1), cmdArgs(2), cmdArgs(3), cmdArgs(4), cmdArgs(5), cmdArgs(6), _
cmdArgs(7), cmdArgs(8), cmdArgs(9), cmdArgs(10), cmdArgs(11), _
cmdArgs(12), cmdArgs(13), cmdArgs(14), cmdArgs(15), cmdArgs(16)
Case &quot;MediaRequest&quot;
MediaRequest cmdArgs(1), cmdArgs(2), cmdArgs(3) = &quot;true&quot;, cmdArgs(4), cmdArgs(5)
Case &quot;TimedOutMediaRequest&quot;
TimedOutMediaRequest cmdArgs(1), cmdArgs(2), cmdArgs(3), cmdArgs(4), cmdArgs(5)
Case &quot;ScriptCheckFailed&quot;
ScriptCheckFailed cmdArgs(1), cmdArgs(2), cmdArgs(3), cmdArgs(4), cmdArgs(5)
Case &quot;NextExec&quot;
NextExec cmdArgs(1), DateValue(cmdArgs(2))
Case &quot;StopSched&quot;
StopSched cmdArgs(1), cmdArgs(2), cmdArgs(3)
Case &quot;PasswordEntry&quot;
PasswordEntry cmdArgs(1), cmdArgs(2), cmdArgs(3), cmdArgs(4)
Case &quot;FatalBackupError&quot;
FatalBackupError cmdArgs(1), cmdArgs(2), cmdArgs(3), cmdArgs(4), cmdArgs(5), cmdArgs(6)
Case Else
MsgBox &quot;Unknown command: &quot; &amp; eventMsg
End Select
End Sub

Sub SendMail(strMsg)
Const cdoSendUsingPickup = 1 'Send message using the local SMTP service pickup directory.
Const cdoSendUsingPort = 2 'Send the message using the network (SMTP over the network).

Const cdoAnonymous = 0 'Do not authenticate
Const cdoBasic = 1 'basic (clear-text) authentication
Const cdoNTLM = 2 'NTLM

Dim objMessage

Set objMessage = CreateObject(&quot;CDO.Message&quot;)
objMessage.Subject = &quot;Retrospect <a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">Backup</a>&quot;
objMessage.From = &quot;&quot;&quot;<a href="http://shaiperednik.com/tag/backup/" class="st_tag internal_tag" rel="tag" title="Posts tagged with backup">Backup</a> Server&quot;&quot; &lt;noreply@example.com&gt;&quot;
objMessage.To = &quot;youremail@example.com&quot;
objMessage.TextBody = strMsg

'==This section provides the configuration <a href="http://shaiperednik.com/tag/information/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Information">information</a> for the remote SMTP server.

objMessage.Configuration.Fields.Item _
(&quot;http://schemas.<a href="http://shaiperednik.com/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">microsoft</a>.com/cdo/configuration/sendusing&quot;) = 2

'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item _
(&quot;http://schemas.<a href="http://shaiperednik.com/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">microsoft</a>.com/cdo/configuration/smtpserver&quot;) = &quot;YourSMTP&quot;

'Type of authentication, NONE, Basic (Base64 encoded), NTLM
objMessage.Configuration.Fields.Item _
(&quot;http://schemas.<a href="http://shaiperednik.com/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">microsoft</a>.com/cdo/configuration/smtpauthenticate&quot;) = cdoBasic

'Your UserID on the SMTP server
objMessage.Configuration.Fields.Item _
(&quot;http://schemas.<a href="http://shaiperednik.com/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">microsoft</a>.com/cdo/configuration/sendusername&quot;) = &quot;USERID&quot;

'Your password on the SMTP server
objMessage.Configuration.Fields.Item _
(&quot;http://schemas.<a href="http://shaiperednik.com/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">microsoft</a>.com/cdo/configuration/sendpassword&quot;) = &quot;Password&quot;

'Server port (typically 465,25, or 587)
objMessage.Configuration.Fields.Item _
(&quot;http://schemas.<a href="http://shaiperednik.com/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">microsoft</a>.com/cdo/configuration/smtpserverport&quot;) = 465

'Use SSL for the connection (False or True)
objMessage.Configuration.Fields.Item _
(&quot;http://schemas.<a href="http://shaiperednik.com/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">microsoft</a>.com/cdo/configuration/smtpusessl&quot;) = True

'Connection Timeout in seconds (the maximum time CDO will try to establish a connection to the SMTP server)
objMessage.Configuration.Fields.Item _
(&quot;http://schemas.<a href="http://shaiperednik.com/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">microsoft</a>.com/cdo/configuration/smtpconnectiontimeout&quot;) = 60

objMessage.Configuration.Fields.Update

'==End remote SMTP server configuration section==

objMessage.Send
End Sub</pre><p><a href="http://shaiperednik.com/2009/09/make-emc-retrospect-email-on-events/" rel="bookmark">Make EMC Retrospect Email on Events</a> originally appeared on <a href="http://shaiperednik.com">Shai Perednik.com</a> on September 15, 2009.</p> ]]></content:encoded> <wfw:commentRss>http://shaiperednik.com/2009/09/make-emc-retrospect-email-on-events/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 1/54 queries in 0.289 seconds using disk: basic
Object Caching 2963/3071 objects using disk: basic

Served from: shaiperednik.com @ 2012-02-08 05:10:59 -->
